#pragma once #include #include #include #include #include "repo/RepoTypes.hpp" class QTreeWidget; class QTreeWidgetItem; class QLabel; namespace geopro::app { // 被动对象树:项目根 → GS → TM(叶子=TM,可勾选)。数据来自控制器;自身不发请求。 class ObjectTreePanel : public QWidget { Q_OBJECT public: explicit ObjectTreePanel(QWidget* parent = nullptr); // 用扁平结构节点重建树(内部调 dto::buildStructTree)。 void setStructure(const QString& projectName, const std::vector& nodes); void showMessage(const QString& message); // 错误/空状态占位 // 快速筛选器(按类型批量勾选/反选 TM 叶子;驱动既有 checkedTmsChanged 合并发射)。 void setAllTmsChecked(bool checked); // 全选 / 全不选 void invertTmChecks(); // 反选 // 面板「新建对象」按钮用:新建对象的父节点 id。 // 优先当前选中节点 id;未选中时回落到项目根节点 id;树空则空串。 QString currentParentForNew() const; // 编辑 TM 用:取某对象的父 GS/项目根 id(TM 上溯到最近的 GS/根祖先)。 // GS/根本身无需父 → 返回空串;找不到该对象或无 GS/根祖先 → 空串。 QString parentObjectId(const QString& objectId) const; // 面板「新建对象」按钮按类型决定菜单:当前选中节点的 confType(1=GS/项目根,2=TM,0=未选)。 // 选 项目根/GS → 可新建 GS + TM;选 TM → 仅新建 TM(同级)。 int currentSelectedConfType() const; protected: // 区分「选中」与「勾选」手势:监视 viewport 鼠标按下是否落在复选框指示区, // 落在复选框上则该次 itemClicked 不发 objectClicked(避免勾选顺带重载数据集列表)。 bool eventFilter(QObject* watched, QEvent* event) override; signals: // confType: 1=GS 2=TM。单击行(驱动数据列表 + 对象属性)。 void objectClicked(const QString& objectId, int confType); // 单击行(含项目根,带 typeId/name/isRoot):驱动对象属性面板的可编辑表单。 void objectSelectedForEdit(const QString& objectId, int confType, const QString& typeId, const QString& name, bool isRoot); // 当前全部被勾选的 TM 叶子 id(已合并发射)。【旧信号,Task 12 接线切换后删除】 void checkedTmsChanged(const QStringList& tmObjectIds); // 当前全部被勾选的数据源并集(TM + GS 自身 ds 开 + 项目根直挂 ds),按 {id,confType} 去重(spec §6)。 void checkedSourcesChanged(const QList& sources); // 右键菜单动作(action 取值见 .cpp;objectId/confType/typeId 为右键命中项,name 用于确认框/标题)。 void contextActionRequested(const QString& action, const QString& objectId, int confType, const QString& typeId, const QString& name); private: // GS 三态(停用 Qt::ItemIsAutoTristate,手动维护):据自身 ds 开关 + 子 TM 勾选聚合(spec §6)。 void recomputeGsState(QTreeWidgetItem* gs); void recomputeAllGsStates(); // 遍历全树对每个非根 GS 调 recomputeGsState void setAllChildTmChecked(QTreeWidgetItem* gs, bool checked); // 批量设子 TM(内部 SignalBlocker) bool allTmChecked(QTreeWidgetItem* gs) const; // GS 下子 TM 是否全勾(无子 TM=false) // 收集勾选源并集(TM + GS 自身 ds + 项目根直挂 ds),去重后发 checkedSourcesChanged(兼发旧 checkedTmsChanged)。 void emitCheckedSources(); QTreeWidget* tree_ = nullptr; // Qt 原生标准树(复选框/箭头由 Fusion 绘制,清晰可控) QLabel* hint_ = nullptr; bool checkPending_ = false; // 勾选合并发射防重入 bool pressOnCheckbox_ = false; // 最近一次鼠标按下是否落在复选框指示区 }; } // namespace geopro::app