18class Focus :
public Node {
20 explicit Focus(
Elements children) : Node(std::move(children)) {}
22 void ComputeRequirement()
override {
24 requirement_ = children_[0]->requirement();
25 requirement_.focused.enabled =
true;
26 requirement_.focused.node =
this;
27 requirement_.focused.box.x_min = 0;
28 requirement_.focused.box.y_min = 0;
29 requirement_.focused.box.x_max = requirement_.min_x - 1;
30 requirement_.focused.box.y_max = requirement_.min_y - 1;
33 void SetBox(Box box)
override {
35 children_[0]->SetBox(box);
39class Frame :
public Node {
41 Frame(
Elements children,
bool x_frame,
bool y_frame)
42 : Node(std::move(children)), x_frame_(x_frame), y_frame_(y_frame) {}
44 void SetBox(Box box)
override {
46 auto& focused_box = requirement_.focused.box;
47 Box children_box = box;
50 const int external_dimx = box.x_max - box.x_min;
51 const int internal_dimx = std::max(requirement_.min_x, external_dimx);
52 const int focused_dimx = focused_box.x_max - focused_box.x_min;
53 int dx = focused_box.x_min - external_dimx / 2 + focused_dimx / 2;
54 dx = std::max(0, std::min(internal_dimx - external_dimx - 1, dx));
55 children_box.x_min = box.x_min - dx;
56 children_box.x_max = box.x_min + internal_dimx - dx;
60 const int external_dimy = box.y_max - box.y_min;
61 const int internal_dimy = std::max(requirement_.min_y, external_dimy);
62 const int focused_dimy = focused_box.y_max - focused_box.y_min;
63 int dy = focused_box.y_min - external_dimy / 2 + focused_dimy / 2;
64 dy = std::max(0, std::min(internal_dimy - external_dimy - 1, dy));
65 children_box.y_min = box.y_min - dy;
66 children_box.y_max = box.y_min + internal_dimy - dy;
69 children_[0]->SetBox(children_box);
72 void Render(Screen& screen)
override {
73 const AutoReset<Box> stencil(&screen.stencil,
75 children_[0]->Render(screen);
83class FocusCursor :
public Focus {
86 : Focus(std::move(children)), shape_(shape) {}
89 void ComputeRequirement()
override {
90 Focus::ComputeRequirement();
91 requirement_.focused.cursor_shape = shape_;
102 return std::make_shared<Focus>(unpack(std::move(child)));
109 return focus(std::move(child));
119 return std::make_shared<Frame>(unpack(std::move(child)),
true,
true);
127 return std::make_shared<Frame>(unpack(std::move(child)),
true,
false);
135 return std::make_shared<Frame>(unpack(std::move(child)),
false,
true);
148 return std::make_shared<FocusCursor>(unpack(std::move(child)),
162 return std::make_shared<FocusCursor>(unpack(std::move(child)),
176 return std::make_shared<FocusCursor>(unpack(std::move(child)),
190 return std::make_shared<FocusCursor>(unpack(std::move(child)),
204 return std::make_shared<FocusCursor>(unpack(std::move(child)),
218 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.
std::vector< Element > Elements
Element focusCursorUnderline(Element)
Same as focus, but set the cursor shape to be a still underline.
Element yframe(Element)
Same as frame, but only on the y-axis.
Element select(Element e)
Set the child to be the one focused among its siblings.
Element focus(Element)
Set the child to be the one focused among its siblings.
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