18 class Select :
public Node {
20 explicit Select(
Elements children) : Node(std::move(children)) {}
22 void ComputeRequirement()
override {
24 requirement_ = children_[0]->requirement();
25 auto& selected_box = requirement_.selected_box;
26 selected_box.x_min = 0;
27 selected_box.y_min = 0;
28 selected_box.x_max = requirement_.min_x - 1;
29 selected_box.y_max = requirement_.min_y - 1;
33 void SetBox(Box box)
override {
35 children_[0]->SetBox(box);
39 class Focus :
public Select {
43 void ComputeRequirement()
override {
44 Select::ComputeRequirement();
48 void Render(Screen& screen)
override {
68 #if !defined(FTXUI_MICROSOFT_TERMINAL_FALLBACK)
69 screen.SetCursor(Screen::Cursor{
72 Screen::Cursor::Shape::Hidden,
78 class Frame :
public Node {
80 Frame(
Elements children,
bool x_frame,
bool y_frame)
81 : Node(std::move(children)), x_frame_(x_frame), y_frame_(y_frame) {}
83 void ComputeRequirement()
override {
85 requirement_ = children_[0]->requirement();
88 void SetBox(Box box)
override {
90 auto& selected_box = requirement_.selected_box;
91 Box children_box = box;
94 const int external_dimx = box.x_max - box.x_min;
95 const int internal_dimx = std::max(requirement_.min_x, external_dimx);
96 const int focused_dimx = selected_box.x_max - selected_box.x_min;
97 int dx = selected_box.x_min - external_dimx / 2 + focused_dimx / 2;
98 dx = std::max(0, std::min(internal_dimx - external_dimx - 1, dx));
99 children_box.x_min = box.x_min - dx;
100 children_box.x_max = box.x_min + internal_dimx - dx;
104 const int external_dimy = box.y_max - box.y_min;
105 const int internal_dimy = std::max(requirement_.min_y, external_dimy);
106 const int focused_dimy = selected_box.y_max - selected_box.y_min;
107 int dy = selected_box.y_min - external_dimy / 2 + focused_dimy / 2;
108 dy = std::max(0, std::min(internal_dimy - external_dimy - 1, dy));
109 children_box.y_min = box.y_min - dy;
110 children_box.y_max = box.y_min + internal_dimy - dy;
113 children_[0]->SetBox(children_box);
116 void Render(Screen& screen)
override {
117 const AutoReset<Box> stencil(&screen.stencil,
119 children_[0]->Render(screen);
127 class FocusCursor :
public Focus {
130 : Focus(std::move(children)), shape_(shape) {}
133 void Render(Screen& screen)
override {
135 screen.SetCursor(Screen::Cursor{
150 return std::make_shared<Select>(unpack(std::move(child)));
157 return std::make_shared<Focus>(unpack(std::move(child)));
167 return std::make_shared<Frame>(unpack(std::move(child)),
true,
true);
175 return std::make_shared<Frame>(unpack(std::move(child)),
true,
false);
183 return std::make_shared<Frame>(unpack(std::move(child)),
false,
true);
196 return std::make_shared<FocusCursor>(unpack(std::move(child)),
210 return std::make_shared<FocusCursor>(unpack(std::move(child)),
224 return std::make_shared<FocusCursor>(unpack(std::move(child)),
238 return std::make_shared<FocusCursor>(unpack(std::move(child)),
252 return std::make_shared<FocusCursor>(unpack(std::move(child)),
266 return std::make_shared<FocusCursor>(unpack(std::move(child)),
virtual void SetBox(Box box)
Assign a position and a dimension to an element for drawing.
virtual void ComputeRequirement()
Compute how much space an elements needs.
Element focusCursorBarBlinking(Element)
Same as focus, but set the cursor shape to be a blinking bar.
std::shared_ptr< Node > Element
Element xframe(Element)
Same as frame, but only on the x-axis.
Element focusCursorUnderlineBlinking(Element)
Same as focus, but set the cursor shape to be a blinking underline.
Element focusCursorBar(Element)
Same as focus, but set the cursor shape to be a still block.
Element focusCursorBlock(Element)
Same as focus, but set the cursor shape to be a still block.
Element focusCursorUnderline(Element)
Same as focus, but set the cursor shape to be a still underline.
std::vector< Element > Elements
Element yframe(Element)
Same as frame, but only on the y-axis.
Element select(Element)
Set the child to be the one selected among its siblings.
Element focus(Element)
Set the child to be the one in focus globally.
Element frame(Element)
Allow an element to be displayed inside a 'virtual' area. It size can be larger than its container....
void Render(Screen &screen, const Element &element)
Display an element on a ftxui::Screen.
Element focusCursorBlockBlinking(Element)
Same as focus, but set the cursor shape to be a blinking block.
static auto Intersection(Box a, Box b) -> Box