#pragma once #include #include #include #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 scales_; }; } // namespace geopro::controller