geopro/src/controller/DatasetViewState.hpp

54 lines
2.4 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 <QHash>
#include <QObject>
#include <QString>
#include "model/ColorScale.hpp"
namespace geopro::controller {
// 跨视图共享的「单一真源」会话状态,按 dsId 维护。统一所有视图间同步,取代两两接线:
// - 改色阶:任何编辑入口只调 setColorScale(dsId, cs),不再各改各的拷贝;
// - 观察:各视图连一次 colorScaleChanged(dsId),槽里【只重渲染】、【绝不回写】→ 无信号回环;
// - 加载:视图取色阶时先问 hubcolorScale 非空则用之),否则把后端值 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