#pragma once #include #include "model/detail/DetailPayloads.hpp" #include "panels/chart/ColorMapService.hpp" #include "panels/chart/IDetailView.hpp" class QComboBox; class QVBoxLayout; class QwtPlot; class QwtPlotRescaler; namespace geopro::app { class ColorBarWidget; class ScatterPlotItem; class ScatterHoverTip; // 原数据图表视图:工具条 + QwtPlot(x 轴顶部、Panner/Magnifier)+ 独立色阶条。 class RawDataChartView : public QWidget, public IDetailView { Q_OBJECT public: explicit RawDataChartView(QWidget* parent = nullptr); ~RawDataChartView() override; // 渲染散点载荷(解包后调内部渲染;渲染代码不变)。 void setData(const geopro::core::ScatterPayload& p); // IDetailView:壳/工厂统一入口。坏/空 variant → 保持空态不崩。 QWidget* widget() override { return this; } void setPayload(const QVariant& payload) override; // 供外部访问(已不再是占位,保留兼容接口返回 plot_) QWidget* plotArea() const; private: // 工具条按载荷类型二选一:反演原数据 = ctor 默认建的 inversion 工具条;measurement = // 首个非空 ScatterToolbarConf 到来时建一次并替换(视觉 1:1)。建好后缓存,后续 setData 复用。 void buildMeasurementToolbar(const geopro::core::ScatterToolbarConf& conf); // 按当前 x/y 下拉选择,从备选列重绘散点(本地,无网络)。code 为下拉项 fieldCode。 void replotForAxis(); // “暂未实现”轻提示(占位按钮/下拉点击)。 void showNotImplemented(QWidget* anchor); geopro::core::ScatterPayload data_; QwtPlot* plot_; QwtPlotRescaler* rescaler_ = nullptr; // 锁定 x:y 真实比尺 ColorBarWidget* colorBar_; // 底部横条(反演原数据) ColorBarWidget* colorBarV_; // 右侧竖条(measurement) QComboBox* chartTypeCombo_ = nullptr; QVBoxLayout* rootLay_ = nullptr; // 顶层竖向布局(用于替换工具条) QWidget* toolbar_ = nullptr; // 当前工具条(inversion 或 measurement) bool measurementToolbar_ = false; // 已建 measurement 工具条 QComboBox* xCombo_ = nullptr; // measurement x 下拉 QComboBox* yCombo_ = nullptr; // measurement y 下拉 // 使用 unique_ptr 管理生命周期;attach 后 QwtPlot 接管绘制,但我们仍持有指针 ColorMapService* colorSvc_ = nullptr; // heap,由 setData 重建 ScatterPlotItem* scatterItem_ = nullptr; ScatterHoverTip* hoverTip_ = nullptr; // 散点 hover 提示(QObject,this 持有) }; } // namespace geopro::app