16Node::Node() =
default;
17Node::Node(
Elements children) : children_(std::move(children)) {}
18Node::~Node() =
default;
21void Node::ComputeRequirement() {
22 if (children_.empty()) {
25 for (
auto& child : children_) {
26 child->ComputeRequirement();
30 requirement_ = children_[0]->requirement();
33 for (
size_t i = 1; i < children_.size(); ++i) {
34 if (requirement_.focused.Prefer(children_[i]->requirement().focused)) {
35 requirement_.focused = children_[i]->requirement().focused;
41void Node::SetBox(Box box) {
46void Node::Select(Selection& selection) {
48 if (Box::Intersection(selection.GetBox(), box_).IsEmpty()) {
53 for (
auto& child : children_) {
54 child->Select(selection);
59void Node::Render(Screen& screen) {
60 for (
auto& child : children_) {
61 child->Render(screen);
65void Node::Check(Status* status) {
66 for (
auto& child : children_) {
69 status->need_iteration |= (status->iteration == 0);
72std::string Node::GetSelectedContent(Selection& selection) {
75 for (
auto& child : children_) {
76 content += child->GetSelectedContent(selection);
82void Node::Reserved1() {}
83void Node::Reserved2() {}
84void Node::Reserved3() {}
85void Node::Reserved4() {}
86void Node::Reserved5() {}
87void Node::Reserved6() {}
88void Node::Reserved7() {}
89void Node::Reserved8() {}
105void Render(Screen& screen, Node*
node, Selection& selection) {
109 box.x_max = screen.dimx() - 1;
110 box.y_max = screen.dimy() - 1;
113 node->Check(&status);
114 const int max_iterations = 20;
115 while (status.need_iteration && status.iteration < max_iterations) {
117 node->ComputeRequirement();
123 status.need_iteration =
false;
125 node->Check(&status);
129 if (!selection.IsEmpty()) {
130 node->Select(selection);
133 bool use_cursor =
node->requirement().focused.enabled;
134 if (!Terminal::GetQuirks().CursorHiding() &&
135 node->requirement().focused.cursor_shape ==
136 Screen::Cursor::Shape::Hidden) {
158 screen.SetCursor(Screen::Cursor{
159 node->requirement().focused.node->box_.x_min,
160 node->requirement().focused.node->box_.y_min,
161 node->requirement().focused.cursor_shape,
164 screen.SetCursor(Screen::Cursor{
167 Screen::Cursor::Shape::Hidden,
172 screen.stencil = box;
173 node->Render(screen);
176 screen.ApplyShader();
181 Selection& selection) {
185 box.x_max = screen.dimx() - 1;
186 box.y_max = screen.dimy() - 1;
189 node->Check(&status);
190 const int max_iterations = 20;
191 while (status.need_iteration && status.iteration < max_iterations) {
193 node->ComputeRequirement();
199 status.need_iteration =
false;
201 node->Check(&status);
205 node->Select(selection);
208 return node->GetSelectedContent(selection);
The FTXUI ftxui:: namespace.
std::string GetNodeSelectedContent(Screen &screen, Node *node, Selection &selection)
std::shared_ptr< Node > Element
std::vector< Element > Elements
void Render(Screen &screen, Node *node, Selection &selection)