#pragma once #include #include #include #include #include #include #include #include "DatasetDetailTab.hpp" #include "IDatasetChartStrategy.hpp" namespace geopro::data { class IAsyncDatasetRepository; class DetailLoad; } namespace geopro::controller { // 数据详情通用 tab 引擎编排:双击/页签激活 → 按 loaderKey 异步拉载荷(QVariant) → 发信号给详情面板。 // 无 per-ddCode 分支:页签集由策略 tabs() 描述,载荷经 QVariant 类型擦除。被动视图。 class DatasetDetailController : public QObject { Q_OBJECT public: DatasetDetailController(data::IAsyncDatasetRepository& repo, ChartStrategyRegistry& registry, QObject* parent = nullptr); ~DatasetDetailController() override; // 退出契约(spec §7):abort 全部在飞句柄,避免迟到信号打到已析构 this public slots: // 打开数据集:查策略 → datasetOpened(页签集) → 对每个非 lazy 页签发起 loadTab。 // tmObjectId:数据集所属 TM 对象 id(=白化 structParentId),透传给详情页给白化对话框用;可空。 void openDataset(const QString& dsId, const QString& ddCode, const QString& dsName = QString(), const QString& tmObjectId = QString()); // 加载某页签(lazy 页签首次激活时由壳触发;非 lazy 由 openDataset 自动触发)。 // 分页型页签(如 dd_grid 列表)首载用默认页(pageNo=1/pageSize=0 → 仓储解析默认每页条数)。 void loadTab(const QString& dsId, const QString& ddCode, int tabIndex); // 分页加载某页签(分页器翻页/改每页条数时由壳触发)。pageSize=0 → 仓储用该类型默认值。 void loadTabPaged(const QString& dsId, const QString& ddCode, int tabIndex, int pageNo, int pageSize); void focusDataset(const QString& dsId); signals: void datasetOpened(const QString& dsId, const QString& ddCode, const QString& dsName, const QString& tmObjectId, const std::vector& tabs); void tabLoadStarted(const QString& dsId, int tabIndex); void tabReady(const QString& dsId, int tabIndex, const QVariant& payload); void loadFailed(const QString& dsId, const QString& message); void focusRequested(const QString& dsId); private: // loadTab/loadTabPaged 共用实现:按 (dsId,ddCode,tabIndex) 查 loaderKey,带分页参数异步加载。 void loadTabImpl(const QString& dsId, const QString& ddCode, int tabIndex, int pageNo, int pageSize); data::IAsyncDatasetRepository& repo_; ChartStrategyRegistry& registry_; QMap> inflight_; // 按页签槽位的在飞句柄(§5.0 身份比对) }; } // namespace geopro::controller