69 lines
2.9 KiB
C++
69 lines
2.9 KiB
C++
#pragma once
|
||
#include <functional>
|
||
#include <vector>
|
||
#include <QMap>
|
||
#include <QString>
|
||
#include <QVariant>
|
||
#include <QWidget>
|
||
#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<QString()> projectIdGetter);
|
||
|
||
// 按页签集构建页签(首次打开调一次)。dsId/ddCode/dsName 用于 tabNeeded。
|
||
void build(const QString& dsId, const QString& ddCode, const QString& dsName,
|
||
const std::vector<geopro::controller::TabSpec>& 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<int>(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<geopro::controller::TabSpec> tabs_;
|
||
// 与 tabs_ 同序。每个 IDetailView 持有的 QWidget 经 build() 以 this 为父接管,
|
||
// 生命周期由 Qt 父子树清理(不在此 delete);build() 仅调用一次(见其断言)。
|
||
std::vector<IDetailView*> views_;
|
||
std::vector<bool> loaded_; // 各页签是否已加载(避免重复请求)
|
||
std::vector<bool> requested_; // lazy 页签是否已请求过
|
||
QMap<int, LoadingOverlay*> overlays_; // lazy 页签的加载遮罩(覆盖该视图)
|
||
|
||
// 色阶模板仓储注入(透传给 makeDetailView → 网格剖面色阶编辑器)。
|
||
geopro::data::IColorTemplateRepository* colorTplRepo_ = nullptr;
|
||
std::function<QString()> projectIdGetter_;
|
||
};
|
||
|
||
} // namespace geopro::app
|