50 lines
1.3 KiB
C++
50 lines
1.3 KiB
C++
#pragma once
|
||
|
||
#include <QObject>
|
||
#include "LayerTreeNode.h"
|
||
|
||
/**
|
||
* LayerTree:独立的目录树管理类
|
||
* - 管理 root
|
||
* - 提供插入/移除节点的 API
|
||
* - 提供可见性级联与父节点三态更新的静态工具
|
||
*
|
||
* 注意:beginInsertRows/endInsertRows 等 Qt Model 变更通知应由 Model 驱动调用,
|
||
* LayerTree 只负责维护数据结构正确性。
|
||
*/
|
||
class LayerTree : public QObject
|
||
{
|
||
Q_OBJECT
|
||
public:
|
||
explicit LayerTree(QObject* parent = nullptr);
|
||
~LayerTree() override;
|
||
|
||
LayerTree(const LayerTree&) = delete;
|
||
LayerTree& operator=(const LayerTree&) = delete;
|
||
|
||
LayerTreeNode* root() const;
|
||
|
||
// 插入:parent 为 nullptr 表示 root;row=-1 表示 append
|
||
LayerTreeNode* insertNode(LayerTreeNode* parent, int row, LayerTreeNode* node);
|
||
|
||
// 移除:不 delete,返回被移除节点(调用者负责 delete 或重新插入)
|
||
LayerTreeNode* removeNode(LayerTreeNode* parent, int row);
|
||
|
||
// 可见性逻辑(供 Model 调用)
|
||
static void setChildrenVisible(LayerTreeNode* n, Qt::CheckState state);
|
||
static void updateParentVisibleFromChildren(LayerTreeNode* parent);
|
||
|
||
static inline bool isLayer(LayerTreeNode* node)
|
||
{
|
||
return node && node->type() == LayerTreeNode::Type::Layer;
|
||
}
|
||
|
||
static inline bool isGroup(LayerTreeNode* node)
|
||
{
|
||
return node && node->type() == LayerTreeNode::Type::Group;
|
||
}
|
||
|
||
private:
|
||
LayerTreeNode* m_root = nullptr; // owned
|
||
};
|