#pragma once #include #include #include #include "model/detail/DetailPayloads.hpp" #include "panels/chart/IDetailView.hpp" class QTableView; namespace geopro::app { // TablePayload 驱动的只读表模型(列标题来自 TableColumn,单元为预格式化 QString)。 class TablePayloadModel : public QAbstractTableModel { Q_OBJECT public: explicit TablePayloadModel(QObject* parent = nullptr); void setPayload(const geopro::core::TablePayload& payload); int rowCount(const QModelIndex& parent = QModelIndex()) const override; int columnCount(const QModelIndex& parent = QModelIndex()) const override; QVariant data(const QModelIndex& index, int role) const override; QVariant headerData(int section, Qt::Orientation orientation, int role) const override; // 列渲染种类(供委托判断是否画开关)。越界返回 Text。 geopro::core::TableColumnKind columnKind(int column) const; private: geopro::core::TablePayload payload_; }; // Toggle 列委托:把单元值("1"=ON/"0"=OFF)画成蓝色药丸开关(仅展示状态,暂不联动散点)。 // Text 列回退到默认绘制。 class ToggleSwitchDelegate : public QStyledItemDelegate { Q_OBJECT public: explicit ToggleSwitchDelegate(const TablePayloadModel* model, QObject* parent = nullptr); void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override; // Toggle 列返回贴合开关的窄尺寸(供 ResizeToContents 不至于撑宽);其余回退默认。 QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const override; private: const TablePayloadModel* model_; // 不拥有 }; // 通用数据列表视图:IDetailView + QTableView。measurement/grid/trajectory 列表共用。 class DataTableView : public QWidget, public IDetailView { Q_OBJECT public: explicit DataTableView(QWidget* parent = nullptr); QWidget* widget() override { return this; } void setPayload(const QVariant& payload) override; // 坏/空 variant → 保持空态不崩 private: QTableView* table_; TablePayloadModel* model_; }; } // namespace geopro::app