52 lines
2.1 KiB
C++
52 lines
2.1 KiB
C++
#pragma once
|
||
#include <vector>
|
||
#include <QMap>
|
||
#include <QVariant>
|
||
#include <QWidget>
|
||
#include "DatasetDetailTab.hpp" // geopro::controller::TabSpec
|
||
|
||
namespace geopro::app {
|
||
|
||
class IDetailView;
|
||
class LoadingOverlay;
|
||
|
||
// 单个数据集详情页:按策略 tabs() 动态建页签 + 右侧「导出」操作。
|
||
// 每页签由工厂造的 IDetailView 承载;lazy 页签首次激活时发 tabNeeded 请求懒加载。
|
||
class DatasetDetailPage : public QWidget {
|
||
Q_OBJECT
|
||
public:
|
||
explicit DatasetDetailPage(QWidget* parent = nullptr);
|
||
|
||
// 按页签集构建页签(首次打开调一次)。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);
|
||
|
||
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 页签的加载遮罩(覆盖该视图)
|
||
};
|
||
|
||
} // namespace geopro::app
|