FTXUI 6.1.9
C++ functional terminal UI.
Chargement...
Recherche...
Aucune correspondance
frame.cpp
Aller à la documentation de ce fichier.
1// Droits d'auteur 2020 Arthur Sonzogni. Tous droits réservés.
2// L'utilisation de ce code source est régie par la licence MIT qui peut être trouvée dans
3// le fichier LICENSE.
4#include <algorithm> // for max, min
5#include <memory> // for make_shared, __shared_ptr_access
6#include <utility> // for move
7
8#include "ftxui/dom/elements.hpp" // for Element, unpack, Elements, focus, frame, select, xframe, yframe
9#include "ftxui/dom/node.hpp" // for Node, Elements
10#include "ftxui/dom/requirement.hpp" // for Requirement
11#include "ftxui/screen/box.hpp" // for Box
12#include "ftxui/screen/screen.hpp" // for Screen, Screen::Cursor
13#include "ftxui/util/autoreset.hpp" // for AutoReset
14
15namespace ftxui {
16
17namespace {
18class Focus : public Node {
19 public:
20 explicit Focus(Elements children) : Node(std::move(children)) {}
21
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;
31 }
32
33 void SetBox(Box box) override {
34 Node::SetBox(box);
35 children_[0]->SetBox(box);
36 }
37};
38
39class Frame : public Node {
40 public:
41 Frame(Elements children, bool x_frame, bool y_frame)
42 : Node(std::move(children)), x_frame_(x_frame), y_frame_(y_frame) {}
43
44 void SetBox(Box box) override {
45 Node::SetBox(box);
46 auto& focused_box = requirement_.focused.box;
47 Box children_box = box;
48
49 if (x_frame_) {
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;
57 }
58
59 if (y_frame_) {
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;
67 }
68
69 children_[0]->SetBox(children_box);
70 }
71
72 void Render(Screen& screen) override {
73 const AutoReset<Box> stencil(&screen.stencil,
74 Box::Intersection(box_, screen.stencil));
75 children_[0]->Render(screen);
76 }
77
78 private:
79 bool x_frame_;
80 bool y_frame_;
81};
82
83class FocusCursor : public Focus {
84 public:
85 FocusCursor(Elements children, Screen::Cursor::Shape shape)
86 : Focus(std::move(children)), shape_(shape) {}
87
88 private:
89 void ComputeRequirement() override {
90 Focus::ComputeRequirement(); // NOLINT
91 requirement_.focused.cursor_shape = shape_;
92 }
94};
95
96} // namespace
97
98/// @brief Définit l'élément `child` comme étant celui qui est focalisé parmi ses frères.
99/// @param child L'élément à focaliser.
100/// @ingroup dom
102 return std::make_shared<Focus>(unpack(std::move(child)));
103}
104
105/// Ceci est obsolète. Utilisez `focus` à la place.
106/// @brief Définit l'élément `child` comme étant celui qui est focalisé parmi ses frères.
107/// @param child L'élément à focaliser.
109 return focus(std::move(child));
110}
111
112/// @brief Permet à un élément d'être affiché dans une zone 'virtuelle'. Sa taille peut
113/// être plus grande que son conteneur. Dans ce cas, seule une plus petite partie est
114/// affichée. La vue est défilable pour rendre l'élément focalisé visible.
115/// @see frame
116/// @see xframe
117/// @see yframe
119 return std::make_shared<Frame>(unpack(std::move(child)), true, true);
120}
121
122/// @brief Identique à `frame`, mais seulement sur l'axe x.
123/// @see frame
124/// @see xframe
125/// @see yframe
127 return std::make_shared<Frame>(unpack(std::move(child)), true, false);
128}
129
130/// @brief Identique à `frame`, mais seulement sur l'axe y.
131/// @see frame
132/// @see xframe
133/// @see yframe
135 return std::make_shared<Frame>(unpack(std::move(child)), false, true);
136}
137
138/// @brief Identique à `focus`, mais définit la forme du curseur comme un bloc fixe.
139/// @see focus
140/// @see focusCursorBlock
141/// @see focusCursorBlockBlinking
142/// @see focusCursorBar
143/// @see focusCursorBarBlinking
144/// @see focusCursorUnderline
145/// @see focusCursorUnderlineBlinking
146/// @ingroup dom
148 return std::make_shared<FocusCursor>(unpack(std::move(child)),
150}
151
152/// @brief Identique à `focus`, mais définit la forme du curseur comme un bloc clignotant.
153/// @see focus
154/// @see focusCursorBlock
155/// @see focusCursorBlockBlinking
156/// @see focusCursorBar
157/// @see focusCursorBarBlinking
158/// @see focusCursorUnderline
159/// @see focusCursorUnderlineBlinking
160/// @ingroup dom
162 return std::make_shared<FocusCursor>(unpack(std::move(child)),
164}
165
166/// @brief Identique à `focus`, mais définit la forme du curseur comme un bloc fixe.
167/// @see focus
168/// @see focusCursorBlock
169/// @see focusCursorBlockBlinking
170/// @see focusCursorBar
171/// @see focusCursorBarBlinking
172/// @see focusCursorUnderline
173/// @see focusCursorUnderlineBlinking
174/// @ingroup dom
176 return std::make_shared<FocusCursor>(unpack(std::move(child)),
178}
179
180/// @brief Identique à `focus`, mais définit la forme du curseur comme une barre clignotante.
181/// @see focus
182/// @see focusCursorBlock
183/// @see focusCursorBlockBlinking
184/// @see focusCursorBar
185/// @see focusCursorBarBlinking
186/// @see focusCursorUnderline
187/// @see focusCursorUnderlineBlinking
188/// @ingroup dom
190 return std::make_shared<FocusCursor>(unpack(std::move(child)),
192}
193
194/// @brief Identique à `focus`, mais définit la forme du curseur comme un soulignement fixe.
195/// @see focus
196/// @see focusCursorBlock
197/// @see focusCursorBlockBlinking
198/// @see focusCursorBar
199/// @see focusCursorBarBlinking
200/// @see focusCursorUnderline
201/// @see focusCursorUnderlineBlinking
202/// @ingroup dom
204 return std::make_shared<FocusCursor>(unpack(std::move(child)),
206}
207
208/// @brief Identique à `focus`, mais définit la forme du curseur comme un soulignement clignotant.
209/// @see focus
210/// @see focusCursorBlock
211/// @see focusCursorBlockBlinking
212/// @see focusCursorBar
213/// @see focusCursorBarBlinking
214/// @see focusCursorUnderline
215/// @see focusCursorUnderlineBlinking
216/// @ingroup dom
218 return std::make_shared<FocusCursor>(unpack(std::move(child)),
220}
221
222} // namespace ftxui
auto screen
virtual void SetBox(Box box)
Assigne une position et une dimension à un élément pour le dessin.
Definition node.cpp:41
virtual void ComputeRequirement()
Calcule l'espace nécessaire à un élément.
Definition node.cpp:20
Element focusCursorBarBlinking(Element)
Identique à focus, mais définit la forme du curseur comme une barre clignotante.
Definition frame.cpp:189
Element focusCursorUnderlineBlinking(Element)
Identique à focus, mais définit la forme du curseur comme un soulignement clignotant.
Definition frame.cpp:217
Element focusCursorBar(Element)
Identique à focus, mais définit la forme du curseur comme un bloc fixe.
Definition frame.cpp:175
Element focusCursorBlock(Element)
Identique à focus, mais définit la forme du curseur comme un bloc fixe.
Definition frame.cpp:147
Element focusCursorUnderline(Element)
Identique à focus, mais définit la forme du curseur comme un soulignement fixe.
Definition frame.cpp:203
Element focus(Element)
Définit l'élément child comme étant celui qui est focalisé parmi ses frères.
Definition frame.cpp:101
Element focusCursorBlockBlinking(Element)
Identique à focus, mais définit la forme du curseur comme un bloc clignotant.
Definition frame.cpp:161
static auto Intersection(Box a, Box b) -> Box
Definition box.cpp:11
L'espace de noms FTXUI ftxui::
Definition animation.hpp:10
std::shared_ptr< Node > Element
Definition elements.hpp:22
Element xframe(Element)
Identique à frame, mais seulement sur l'axe x.
Definition frame.cpp:126
std::vector< Element > Elements
Definition elements.hpp:23
Element yframe(Element)
Identique à frame, mais seulement sur l'axe y.
Definition frame.cpp:134
Element select(Element e)
Définit l'élément child comme étant celui qui est focalisé parmi ses frères.
Definition frame.cpp:108
Element frame(Element)
Permet à un élément d'être affiché dans une zone 'virtuelle'. Sa taille peut être plus grande que son...
Definition frame.cpp:118
void Render(Screen &screen, const Element &element)