Files
Renderive/Widget/component/Tree/Tree_Model.h
T
2026-08-01 20:09:45 +08:00

64 lines
1.6 KiB
C++

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