54 lines
2.4 KiB
C++
54 lines
2.4 KiB
C++
#pragma once
|
||
#include <QHash>
|
||
#include <QObject>
|
||
#include <QString>
|
||
|
||
#include "model/ColorScale.hpp"
|
||
|
||
namespace geopro::controller {
|
||
|
||
// 跨视图共享的「单一真源」会话状态,按 dsId 维护。统一所有视图间同步,取代两两接线:
|
||
// - 改色阶:任何编辑入口只调 setColorScale(dsId, cs),不再各改各的拷贝;
|
||
// - 观察:各视图连一次 colorScaleChanged(dsId),槽里【只重渲染】、【绝不回写】→ 无信号回环;
|
||
// - 加载:视图取色阶时先问 hub(colorScale 非空则用之),否则把后端值 seed 进来当真源。
|
||
// 新增同步项(可见性/选中/值域…)= 加一个字段 + 一个 xxxChanged(dsId) 信号,沿用同一套机制。
|
||
//
|
||
// 作用域:数据集的「默认/共享色阶」(后端 businessCode=""),被 反演散点/网格/帘面/体 共用(同一条后端
|
||
// 记录)。measurement(businessCode="R0") 为单视图、无跨视图伙伴,暂不入此层(清晰边界,非欠债)。
|
||
class DatasetViewState : public QObject {
|
||
Q_OBJECT
|
||
public:
|
||
explicit DatasetViewState(QObject* parent = nullptr) : QObject(parent) {}
|
||
|
||
bool hasColorScale(const QString& dsId) const { return scales_.contains(dsId); }
|
||
|
||
// 无记录返回 nullptr(调用方据此兜底为自带值)。
|
||
const geopro::core::ColorScale* colorScale(const QString& dsId) const {
|
||
auto it = scales_.constFind(dsId);
|
||
return it == scales_.constEnd() ? nullptr : &it.value();
|
||
}
|
||
|
||
// 用户编辑应用:写入真源并广播。观察者据此重渲染。
|
||
void setColorScale(const QString& dsId, const geopro::core::ColorScale& cs) {
|
||
scales_.insert(dsId, cs);
|
||
emit colorScaleChanged(dsId);
|
||
}
|
||
|
||
// 首次从后端加载得到色阶时播种:已有则不覆盖、不广播(避免加载即触发重建/存盘)。
|
||
void seedColorScale(const QString& dsId, const geopro::core::ColorScale& cs) {
|
||
if (!scales_.contains(dsId)) scales_.insert(dsId, cs);
|
||
}
|
||
|
||
// 清除某 ds 的色阶真源(不广播):体被以新参数重建(如雷达切增益模式→值域大变)时调,
|
||
// 让下次 seedColorScale 用重建后的新色阶,而非沿用旧窗口。
|
||
void clearColorScale(const QString& dsId) { scales_.remove(dsId); }
|
||
|
||
signals:
|
||
void colorScaleChanged(const QString& dsId);
|
||
|
||
private:
|
||
QHash<QString, geopro::core::ColorScale> scales_;
|
||
};
|
||
|
||
} // namespace geopro::controller
|