geopro/src/app/panels/DatasetDetailPage.hpp

69 lines
2.9 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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 父子树清理(不在此 deletebuild() 仅调用一次(见其断言)。
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