Files
Renderive/Widget/component/Tree/Tree_Model.h
T
2026-07-29 18:08:57 +08:00

64 lines
1.5 KiB
C++

#pragma once
#include <QString>
#include <functional>
#include <stack>
#include <utility>
#include <vector>
namespace Psc {
class Node {
public:
explicit Node();
// 判断状态
int index();
bool is_root();
bool is_leaf();
bool is_first();
bool is_last();
Node* previous();
Node* next();
Node* last_child();
Node* first_child();
Node* root();
int get_deep();
// 遍历值
std::vector<Node*> deep_traversed();
std::vector<Node*> sequence_traversed();
std::vector<Node*> descendants();
Node* par = nullptr;
std::vector<Node*> sons;
QString text;
bool expand = true;
int height = 20;
void add_child(Node* child) {
sons.push_back(child);
child->par = this;
}
};
struct Tree_Pos {
Node* p{};
int depth{};
int node_pos{};
int offset{};
int pos() {
return node_pos + offset;
}
std::stack<std::pair<Node*, int>> rest;
};
class Tree_Model {
public:
std::vector<Node*> roots;
int tab_pixel_size = 8;
int png_len = 20;
int tab_width = 10;
int space = 4;
int height();
int width() {
return 1000;
}
};
Tree_Pos get_pos(int pos, const std::vector<Node*>& roots, int space);
std::vector<Node*> deep_traversed(const std::vector<Node*>& nodes);
using Node_Call_Back = const std::function<void(Node*, int, int)>&;
void select_node(const std::vector<Node*>& roots, int view_y, int length, int space, Node_Call_Back call_back);
} // namespace Psc