75 lines
4.0 KiB
C++
75 lines
4.0 KiB
C++
#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/项目根 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<geopro::data::DataSource>& 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
|