51 lines
2.8 KiB
C++
51 lines
2.8 KiB
C++
#pragma once
|
||
#include <string>
|
||
#include <vector>
|
||
#include <QMap>
|
||
#include <QObject>
|
||
#include <QPointer>
|
||
#include <QString>
|
||
#include <QVariant>
|
||
#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<controller::TabSpec>& 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<int, QPointer<data::DetailLoad>> inflight_; // 按页签槽位的在飞句柄(§5.0 身份比对)
|
||
};
|
||
} // namespace geopro::controller
|