geopro/src/controller/DatasetDetailController.hpp

51 lines
2.8 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 <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