geopro/src/app/panels/ObjectTreePanel.hpp

75 lines
4.0 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 <QList>
#include <QStringList>
#include <QWidget>
#include <vector>
#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<data::StructNode>& nodes);
void showMessage(const QString& message); // 错误/空状态占位
// 快速筛选器(按类型批量勾选/反选 TM 叶子;驱动既有 checkedTmsChanged 合并发射)。
void setAllTmsChecked(bool checked); // 全选 / 全不选
void invertTmChecks(); // 反选
// 面板「新建对象」按钮用:新建对象的父节点 id。
// 优先当前选中节点 id未选中时回落到项目根节点 id树空则空串。
QString currentParentForNew() const;
// 编辑 TM 用:取某对象的父 GS/项目根 idTM 上溯到最近的 GS/根祖先)。
// GS/根本身无需父 → 返回空串;找不到该对象或无 GS/根祖先 → 空串。
QString parentObjectId(const QString& objectId) const;
// 面板「新建对象」按钮按类型决定菜单:当前选中节点的 confType1=GS/项目根2=TM0=未选)。
// 选 项目根/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<geopro::data::DataSource>& sources);
// 右键菜单动作action 取值见 .cppobjectId/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