#pragma once #include #include #include #include #include #include #include "DatasetDetailTab.hpp" // geopro::controller::TabSpec namespace geopro::data { class IColorTemplateRepository; } namespace geopro::app { class IDetailView; class LoadingOverlay; // 单个数据集详情页:按策略 tabs() 动态建页签 + 右侧「导出」操作。 // 每页签由工厂造的 IDetailView 承载;lazy 页签首次激活时发 tabNeeded 请求懒加载。 class DatasetDetailPage : public QWidget { Q_OBJECT public: explicit DatasetDetailPage(QWidget* parent = nullptr); // 色阶模板仓储 + projectId 取值回调(注入网格剖面色阶编辑器,须在 build 前设置)。 void setColorTemplateRepo(geopro::data::IColorTemplateRepository* repo, std::function projectIdGetter); // 按页签集构建页签(首次打开调一次)。dsId/ddCode/dsName 用于 tabNeeded。 void build(const QString& dsId, const QString& ddCode, const QString& dsName, const std::vector& tabs); // 页签载荷到达 → 下发给对应视图并标记已加载、隐藏遮罩。 void setTabPayload(int tabIndex, const QVariant& payload); // 页签加载进行中 → 对 lazy 页签显示遮罩(非 lazy 页签无遮罩,幂等忽略)。 void setTabLoading(int tabIndex, bool on); // 清掉本页全部加载遮罩(失败兜底用,不假设页签数;幂等)。 void clearAllLoadingOverlays(); QString dsId() const { return dsId_; } int tabCount() const { return static_cast(tabs_.size()); } signals: // lazy 页签首次激活且未加载 → 请求懒加载。 void tabNeeded(const QString& dsId, const QString& ddCode, int tabIndex); // 分页型页签(paginated)分页器翻页/改每页条数 → 请求按页加载。 void tabPageNeeded(const QString& dsId, const QString& ddCode, int tabIndex, int pageNo, int pageSize); private: QString dsId_; QString ddCode_; QString dsName_; std::vector tabs_; // 与 tabs_ 同序。每个 IDetailView 持有的 QWidget 经 build() 以 this 为父接管, // 生命周期由 Qt 父子树清理(不在此 delete);build() 仅调用一次(见其断言)。 std::vector views_; std::vector loaded_; // 各页签是否已加载(避免重复请求) std::vector requested_; // lazy 页签是否已请求过 QMap overlays_; // lazy 页签的加载遮罩(覆盖该视图) // 色阶模板仓储注入(透传给 makeDetailView → 网格剖面色阶编辑器)。 geopro::data::IColorTemplateRepository* colorTplRepo_ = nullptr; std::function projectIdGetter_; }; } // namespace geopro::app