FTXUI 6.1.9
C++ functional terminal UI.
Chargement...
Recherche...
Aucune correspondance
src/ftxui/component/menu.cpp
Aller à la documentation de ce fichier.
1// Copyright 2020 Arthur Sonzogni. Tous droits réservés.
2// L'utilisation de ce code source est régie par la licence MIT que l'on peut trouver dans
3// le fichier LICENSE.
4#include <algorithm> // for max, fill_n, reverse
5#include <chrono> // for milliseconds
6#include <ftxui/dom/direction.hpp> // for Direction, Direction::Down, Direction::Left, Direction::Right, Direction::Up
7#include <functional> // for function
8#include <string> // for operator+, string
9#include <utility> // for move
10#include <vector> // for vector, __alloc_traits<>::value_type
11
12#include "ftxui/component/animation.hpp" // for Animator, Linear
13#include "ftxui/component/component.hpp" // for Make, Menu, MenuEntry, Toggle
14#include "ftxui/component/component_base.hpp" // for ComponentBase
15#include "ftxui/component/component_options.hpp" // for MenuOption, MenuEntryOption, UnderlineOption, AnimatedColorOption, AnimatedColorsOption, EntryState
16#include "ftxui/component/event.hpp" // for Event, Event::ArrowDown, Event::ArrowLeft, Event::ArrowRight, Event::ArrowUp, Event::End, Event::Home, Event::PageDown, Event::PageUp, Event::Return, Event::Tab, Event::TabReverse
17#include "ftxui/component/mouse.hpp" // for Mouse, Mouse::Left, Mouse::Released, Mouse::WheelDown, Mouse::WheelUp, Mouse::None
18#include "ftxui/component/screen_interactive.hpp" // for Component
19#include "ftxui/dom/elements.hpp" // for operator|, Element, reflect, Decorator, nothing, Elements, bgcolor, color, hbox, separatorHSelector, separatorVSelector, vbox, xflex, yflex, text, bold, focus, inverted, select
20#include "ftxui/screen/box.hpp" // for Box
21#include "ftxui/screen/color.hpp" // for Color
22#include "ftxui/screen/util.hpp" // for clamp
23#include "ftxui/util/ref.hpp" // for Ref, ConstStringListRef, ConstStringRef
24
25namespace ftxui {
26
27namespace {
28
29Element DefaultOptionTransform(const EntryState& state) {
30 std::string label = (state.active ? "> " : " ") + state.label; // NOLINT
31 Element e = text(std::move(label));
32 if (state.focused) {
33 e = e | inverted;
34 }
35 if (state.active) {
36 e = e | bold;
37 }
38 return e;
39}
40
41bool IsInverted(Direction direction) {
42 switch (direction) {
43 case Direction::Up:
44 case Direction::Left:
45 return true;
46 case Direction::Down:
48 return false;
49 }
50 return false; // NOT_REACHED()
51}
52
53bool IsHorizontal(Direction direction) {
54 switch (direction) {
55 case Direction::Left:
57 return true;
58 case Direction::Down:
59 case Direction::Up:
60 return false;
61 }
62 return false; // NOT_REACHED()
63}
64
65} // namespace
66
67/// @brief Une liste d'éléments. L'utilisateur peut naviguer à travers eux.
68/// @ingroup component
69class MenuBase : public ComponentBase, public MenuOption {
70 public:
71 explicit MenuBase(const MenuOption& option) : MenuOption(option) {}
72
73 bool IsHorizontal() { return ftxui::IsHorizontal(direction); }
74 void OnChange() {
75 if (on_change) {
76 on_change();
77 }
78 }
79
80 void OnEnter() {
81 if (on_enter) {
82 on_enter();
83 }
84 }
85
86 void Clamp() {
87 if (selected() != selected_previous_) {
88 SelectedTakeFocus();
89 }
90 boxes_.resize(size());
91 selected() = util::clamp(selected(), 0, size() - 1);
92 selected_previous_ = util::clamp(selected_previous_, 0, size() - 1);
93 selected_focus_ = util::clamp(selected_focus_, 0, size() - 1);
94 focused_entry() = util::clamp(focused_entry(), 0, size() - 1);
95 }
96
97 void OnAnimation(animation::Params& params) override {
98 animator_first_.OnAnimation(params);
99 animator_second_.OnAnimation(params);
100 for (auto& animator : animator_background_) {
101 animator.OnAnimation(params);
102 }
103 for (auto& animator : animator_foreground_) {
104 animator.OnAnimation(params);
105 }
106 }
107
108 Element OnRender() override {
109 Clamp();
110 UpdateAnimationTarget();
111
112 Elements elements;
113 const bool is_menu_focused = Focused();
114 if (elements_prefix) {
115 elements.push_back(elements_prefix());
116 }
117 elements.reserve(size());
118 for (int i = 0; i < size(); ++i) {
119 if (i != 0 && elements_infix) {
120 elements.push_back(elements_infix());
121 }
122 const bool is_focused = (focused_entry() == i) && is_menu_focused;
123 const bool is_selected = (selected() == i);
124
125 const EntryState state = {
126 entries[i], false, is_selected, is_focused, i,
127 };
128
130 : DefaultOptionTransform) //
131 (state);
132 if (selected_focus_ == i) {
133 element |= focus;
134 }
135 element |= AnimatedColorStyle(i);
136 element |= reflect(boxes_[i]);
137 elements.push_back(element);
138 }
139 if (elements_postfix) {
140 elements.push_back(elements_postfix());
141 }
142
143 if (IsInverted(direction)) {
144 std::reverse(elements.begin(), elements.end());
145 }
146
147 const Element bar = IsHorizontal()
148 ? hbox(std::move(elements))
149 : vbox(std::move(elements));
150
151 if (!underline.enabled) {
152 return bar | reflect(box_);
153 }
154
155 if (IsHorizontal()) {
156 return vbox({
157 bar | xflex,
158 separatorHSelector(first_, second_, //
161 }) |
162 reflect(box_);
163 } else {
164 return hbox({
165 separatorVSelector(first_, second_, //
168 bar | yflex,
169 }) |
170 reflect(box_);
171 }
172 }
173
174 void SelectedTakeFocus() {
175 selected_previous_ = selected();
176 selected_focus_ = selected();
177 }
178
179 void OnUp() {
180 switch (direction) {
181 case Direction::Up:
182 selected()++;
183 break;
184 case Direction::Down:
185 selected()--;
186 break;
187 case Direction::Left:
188 case Direction::Right:
189 break;
190 }
191 }
192
193 void OnDown() {
194 switch (direction) {
195 case Direction::Up:
196 selected()--;
197 break;
198 case Direction::Down:
199 selected()++;
200 break;
201 case Direction::Left:
202 case Direction::Right:
203 break;
204 }
205 }
206
207 void OnLeft() {
208 switch (direction) {
209 case Direction::Left:
210 selected()++;
211 break;
212 case Direction::Right:
213 selected()--;
214 break;
215 case Direction::Down:
216 case Direction::Up:
217 break;
218 }
219 }
220
221 void OnRight() {
222 switch (direction) {
223 case Direction::Left:
224 selected()--;
225 break;
226 case Direction::Right:
227 selected()++;
228 break;
229 case Direction::Down:
230 case Direction::Up:
231 break;
232 }
233 }
234
235 // NOLINTNEXTLINE(readability-function-cognitive-complexity)
236 bool OnEvent(Event event) override {
237 Clamp();
238 if (!CaptureMouse(event)) {
239 return false;
240 }
241
242 if (event.is_mouse()) {
243 return OnMouseEvent(event);
244 }
245
246 if (Focused()) {
247 const int old_selected = selected();
248 if (event == Event::ArrowUp || event == Event::Character('k')) {
249 OnUp();
250 }
251 if (event == Event::ArrowDown || event == Event::Character('j')) {
252 OnDown();
253 }
254 if (event == Event::ArrowLeft || event == Event::Character('h')) {
255 OnLeft();
256 }
257 if (event == Event::ArrowRight || event == Event::Character('l')) {
258 OnRight();
259 }
260 if (event == Event::PageUp) {
261 selected() -= box_.y_max - box_.y_min;
262 }
263 if (event == Event::PageDown) {
264 selected() += box_.y_max - box_.y_min;
265 }
266 if (event == Event::Home) {
267 selected() = 0;
268 }
269 if (event == Event::End) {
270 selected() = size() - 1;
271 }
272 if (event == Event::Tab && size()) {
273 selected() = (selected() + 1) % size();
274 }
275 if (event == Event::TabReverse && size()) {
276 selected() = (selected() + size() - 1) % size();
277 }
278
279 selected() = util::clamp(selected(), 0, size() - 1);
280
281 if (selected() != old_selected) {
283 SelectedTakeFocus();
284 OnChange();
285 return true;
286 }
287 }
288
289 if (event == Event::Return) {
290 OnEnter();
291 return true;
292 }
293
294 return false;
295 }
296
297 bool OnMouseEvent(Event event) {
298 if (event.mouse().button == Mouse::WheelDown ||
299 event.mouse().button == Mouse::WheelUp) {
300 return OnMouseWheel(event);
301 }
302
303 if (event.mouse().button != Mouse::None &&
304 event.mouse().button != Mouse::Left) {
305 return false;
306 }
307 if (!CaptureMouse(event)) {
308 return false;
309 }
310 for (int i = 0; i < size(); ++i) {
311 if (!boxes_[i].Contain(event.mouse().x, event.mouse().y)) {
312 continue;
313 }
314
315 TakeFocus();
316 focused_entry() = i;
317
318 if (event.mouse().button == Mouse::Left &&
319 event.mouse().motion == Mouse::Pressed) {
320 if (selected() != i) {
321 selected() = i;
322 selected_previous_ = selected();
323 OnChange();
324 }
325 return true;
326 }
327 }
328 return false;
329 }
330
331 bool OnMouseWheel(Event event) {
332 if (!box_.Contain(event.mouse().x, event.mouse().y)) {
333 return false;
334 }
335 const int old_selected = selected();
336
337 if (event.mouse().button == Mouse::WheelUp) {
338 selected()--;
339 }
340 if (event.mouse().button == Mouse::WheelDown) {
341 selected()++;
342 }
343
344 selected() = util::clamp(selected(), 0, size() - 1);
345
346 if (selected() != old_selected) {
347 SelectedTakeFocus();
348 OnChange();
349 }
350 return true;
351 }
352
353 void UpdateAnimationTarget() {
354 UpdateColorTarget();
355 UpdateUnderlineTarget();
356 }
357
358 void UpdateColorTarget() {
359 if (size() != int(animation_background_.size())) {
360 animation_background_.resize(size());
361 animation_foreground_.resize(size());
362 animator_background_.clear();
363 animator_foreground_.clear();
364
365 const int len = size();
366 animator_background_.reserve(len);
367 animator_foreground_.reserve(len);
368 for (int i = 0; i < len; ++i) {
369 animation_background_[i] = 0.F;
370 animation_foreground_[i] = 0.F;
371 animator_background_.emplace_back(&animation_background_[i], 0.F,
372 std::chrono::milliseconds(0),
374 animator_foreground_.emplace_back(&animation_foreground_[i], 0.F,
375 std::chrono::milliseconds(0),
377 }
378 }
379
380 const bool is_menu_focused = Focused();
381 for (int i = 0; i < size(); ++i) {
382 const bool is_focused = (focused_entry() == i) && is_menu_focused;
383 const bool is_selected = (selected() == i);
384 float target = is_selected ? 1.F : is_focused ? 0.5F : 0.F; // NOLINT
385 if (animator_background_[i].to() != target) {
386 animator_background_[i] = animation::Animator(
387 &animation_background_[i], target,
390 animator_foreground_[i] = animation::Animator(
391 &animation_foreground_[i], target,
394 }
395 }
396 }
397
398 Decorator AnimatedColorStyle(int i) {
399 Decorator style = nothing;
401 style = style | color(Color::Interpolate(
402 animation_foreground_[i],
405 }
406
408 style = style | bgcolor(Color::Interpolate(
409 animation_background_[i],
412 }
413 return style;
414 }
415
416 void UpdateUnderlineTarget() {
417 if (!underline.enabled) {
418 return;
419 }
420
421 if (FirstTarget() == animator_first_.to() &&
422 SecondTarget() == animator_second_.to()) {
423 return;
424 }
425
426 if (FirstTarget() >= animator_first_.to()) {
427 animator_first_ = animation::Animator(
428 &first_, FirstTarget(), underline.follower_duration,
430
431 animator_second_ = animation::Animator(
432 &second_, SecondTarget(), underline.leader_duration,
434 } else {
435 animator_first_ = animation::Animator(
436 &first_, FirstTarget(), underline.leader_duration,
438
439 animator_second_ = animation::Animator(
440 &second_, SecondTarget(), underline.follower_duration,
442 }
443 }
444
445 bool Focusable() const final { return entries.size(); }
446 int size() const { return int(entries.size()); }
447 float FirstTarget() {
448 if (boxes_.empty()) {
449 return 0.F;
450 }
451 const int value = IsHorizontal() ? boxes_[selected()].x_min - box_.x_min
452 : boxes_[selected()].y_min - box_.y_min;
453 return float(value);
454 }
455 float SecondTarget() {
456 if (boxes_.empty()) {
457 return 0.F;
458 }
459 const int value = IsHorizontal() ? boxes_[selected()].x_max - box_.x_min
460 : boxes_[selected()].y_max - box_.y_min;
461 return float(value);
462 }
463
464 protected:
465 int selected_previous_ = selected();
466 int selected_focus_ = selected();
467
468 // Mouse click support:
469 std::vector<Box> boxes_;
470 Box box_;
471
472 // Animation support:
473 float first_ = 0.F;
474 float second_ = 0.F;
475 animation::Animator animator_first_ = animation::Animator(&first_, 0.F);
476 animation::Animator animator_second_ = animation::Animator(&second_, 0.F);
477 std::vector<animation::Animator> animator_background_;
478 std::vector<animation::Animator> animator_foreground_;
479 std::vector<float> animation_background_;
480 std::vector<float> animation_foreground_;
481};
482
483/// @brief Une liste de texte. L'élément sélectionné est mis en évidence.
484/// @param option une structure contenant tous les paramètres.
485/// @ingroup component
486///
487/// ### Exemple
488///
489/// ```cpp
490/// auto screen = ScreenInteractive::TerminalOutput();
491/// std::vector<std::string> entries = {
492/// "entrée 1",
493/// "entrée 2",
494/// "entrée 3",
495/// };
496/// int selected = 0;
497/// auto menu = Menu({
498/// .entries = &entries,
499/// .selected = &selected,
500/// });
501/// screen.Loop(menu);
502/// ```
503///
504/// ### Sortie
505///
506/// ```bash
507/// > entrée 1
508/// entrée 2
509/// entrée 3
510/// ```
511// NOLINTNEXTLINE
513 return Make<MenuBase>(std::move(option));
514}
515
516/// @brief Une liste de texte. L'élément sélectionné est mis en évidence.
517/// @param entries La liste des entrées du menu.
518/// @param selected L'index de l'élément actuellement sélectionné.
519/// @param option Paramètres optionnels supplémentaires.
520/// @ingroup component
521///
522/// ### Exemple
523///
524/// ```cpp
525/// auto screen = ScreenInteractive::TerminalOutput();
526/// std::vector<std::string> entries = {
527/// "entrée 1",
528/// "entrée 2",
529/// "entrée 3",
530/// };
531/// int selected = 0;
532/// auto menu = Menu(&entries, &selected);
533/// screen.Loop(menu);
534/// ```
535///
536/// ### Sortie
537///
538/// ```bash
539/// > entrée 1
540/// entrée 2
541/// entrée 3
542/// ```
543Component Menu(ConstStringListRef entries, int* selected, MenuOption option) {
544 option.entries = std::move(entries);
545 option.selected = selected;
546 return Menu(option);
547}
548
549/// @brief Une liste horizontale d'éléments. L'utilisateur peut naviguer à travers eux.
550/// @param entries La liste des entrées sélectionnables à afficher.
551/// @param selected Référence l'entrée sélectionnée.
552/// Voir aussi |Menu|.
553/// @ingroup component
554Component Toggle(ConstStringListRef entries, int* selected) {
555 return Menu(std::move(entries), selected, MenuOption::Toggle());
556}
557
558/// @brief Une entrée de menu spécifique. Elles peuvent être placées dans un Container::Vertical pour
559/// former un menu.
560/// @param label Le texte affiché représentant cet élément.
561/// @param option Paramètres optionnels supplémentaires.
562/// @ingroup component
563///
564/// ### Exemple
565///
566/// ```cpp
567/// auto screen = ScreenInteractive::TerminalOutput();
568/// int selected = 0;
569/// auto menu = Container::Vertical({
570/// MenuEntry("entrée 1"),
571/// MenuEntry("entrée 2"),
572/// MenuEntry("entrée 3"),
573/// }, &selected);
574/// screen.Loop(menu);
575/// ```
576///
577/// ### Sortie
578///
579/// ```bash
580/// > entrée 1
581/// entrée 2
582/// entrée 3
583/// ```
585 option.label = std::move(label);
586 return MenuEntry(std::move(option));
587}
588
589/// @brief Une entrée de menu spécifique. Elles peuvent être placées dans un Container::Vertical pour
590/// former un menu.
591/// @param option Les paramètres.
592/// @ingroup component
593///
594/// ### Exemple
595///
596/// ```cpp
597/// auto screen = ScreenInteractive::TerminalOutput();
598/// int selected = 0;
599/// auto menu = Container::Vertical({
600/// MenuEntry({.label = "entrée 1"}),
601/// MenuEntry({.label = "entrée 2"}),
602/// MenuEntry({.label = "entrée 3"}),
603/// }, &selected);
604/// screen.Loop(menu);
605/// ```
606///
607/// ### Sortie
608///
609/// ```bash
610/// > entrée 1
611/// entrée 2
612/// entrée 3
613/// ```
615 class Impl : public ComponentBase, public MenuEntryOption {
616 public:
617 explicit Impl(MenuEntryOption option)
618 : MenuEntryOption(std::move(option)) {}
619
620 private:
621 Element OnRender() override {
622 const bool is_focused = Focused();
623 UpdateAnimationTarget();
624
625 const EntryState state{
626 label(), false, hovered_, is_focused, Index(),
627 };
628
629 Element element = (transform ? transform : DefaultOptionTransform) //
630 (state);
631
632 if (is_focused) {
633 element |= focus;
634 }
635
636 return element | AnimatedColorStyle() | reflect(box_);
637 }
638
639 void UpdateAnimationTarget() {
640 const bool focused = Focused();
641 float target = focused ? 1.F : hovered_ ? 0.5F : 0.F; // NOLINT
642 if (target == animator_background_.to()) {
643 return;
644 }
645 animator_background_ = animation::Animator(
646 &animation_background_, target, animated_colors.background.duration,
647 animated_colors.background.function);
648 animator_foreground_ = animation::Animator(
649 &animation_foreground_, target, animated_colors.foreground.duration,
650 animated_colors.foreground.function);
651 }
652
653 Decorator AnimatedColorStyle() {
654 Decorator style = nothing;
655 if (animated_colors.foreground.enabled) {
656 style = style |
657 color(Color::Interpolate(animation_foreground_,
658 animated_colors.foreground.inactive,
659 animated_colors.foreground.active));
660 }
661
662 if (animated_colors.background.enabled) {
663 style = style |
664 bgcolor(Color::Interpolate(animation_background_,
665 animated_colors.background.inactive,
666 animated_colors.background.active));
667 }
668 return style;
669 }
670
671 bool Focusable() const override { return true; }
672 bool OnEvent(Event event) override {
673 if (!event.is_mouse()) {
674 return false;
675 }
676
677 hovered_ = box_.Contain(event.mouse().x, event.mouse().y);
678
679 if (!hovered_) {
680 return false;
681 }
682
683 if (event.mouse().button == Mouse::Left &&
684 event.mouse().motion == Mouse::Pressed) {
685 TakeFocus();
686 return true;
687 }
688
689 return false;
690 }
691
692 void OnAnimation(animation::Params& params) override {
693 animator_background_.OnAnimation(params);
694 animator_foreground_.OnAnimation(params);
695 }
696
697 Box box_;
698 bool hovered_ = false;
699
700 float animation_background_ = 0.F;
701 float animation_foreground_ = 0.F;
702 animation::Animator animator_background_ =
703 animation::Animator(&animation_background_, 0.F);
704 animation::Animator animator_foreground_ =
705 animation::Animator(&animation_foreground_, 0.F);
706 };
707
708 return Make<Impl>(std::move(option));
709}
710
711} // namespace ftxui
Un adaptateur. Référence une liste de chaînes de caractères.
Definition ref.hpp:116
size_t size() const
Definition ref.hpp:167
Un adaptateur. Possède ou référence une chaîne constante. Par commodité, cette classe convertit plusi...
Definition ref.hpp:94
static const Event TabReverse
Definition event.hpp:55
bool Focused() const
Indique si les éléments sont focusés par l'utilisateur. Vrai lorsque le ComponentBase est focusé par ...
std::function< Element()> elements_prefix
static MenuOption Toggle()
Options standard pour un menu horizontal avec un séparateur. Cela peut être utile pour implémenter un...
animation::Duration follower_duration
CapturedMouse CaptureMouse(const Event &event)
Prend le CapturedMouse si disponible. Il n'y en a qu'un seul composant de eux. Il représente un compo...
animation::easing::Function leader_function
MenuEntryOption entries_option
static const Event PageUp
Definition event.hpp:61
animation::easing::Function function
animation::Duration follower_delay
bool is_mouse() const
Definition event.hpp:108
void TakeFocus()
Configure tous les ancêtres pour donner le focus à ce composant.
std::function< void()> on_enter
UnderlineOption underline
std::function< Element(const EntryState &state)> transform
animation::Duration leader_duration
struct Mouse mouse
Definition event.hpp:143
ConstStringListRef entries
animation::easing::Function follower_function
static const Event ArrowUp
Definition event.hpp:41
static const Event Tab
Definition event.hpp:54
std::function< Element()> elements_infix
static const Event ArrowDown
Definition event.hpp:42
static const Event End
Definition event.hpp:60
Button button
Definition mouse.hpp:30
static const Event Home
Definition event.hpp:59
std::function< Element()> elements_postfix
AnimatedColorsOption animated_colors
std::function< void()> on_change
static const Event PageDown
Definition event.hpp:62
static const Event Return
Definition event.hpp:52
static const Event ArrowLeft
Definition event.hpp:39
animation::Duration leader_delay
Motion motion
Definition mouse.hpp:33
static const Event ArrowRight
Definition event.hpp:40
Il implémente son propre rendu en tant que ftxui::Element. Il implémente la navigation au clavier en ...
Component Menu(MenuOption options)
Une liste de texte. L'élément sélectionné est mis en évidence.
Component MenuEntry(MenuEntryOption options)
Une entrée de menu spécifique. Elles peuvent être placées dans un Container::Vertical pour former un ...
Component Toggle(ConstStringListRef entries, int *selected)
Une liste horizontale d'éléments. L'utilisateur peut naviguer à travers eux.
Représente un événement. Il peut s'agir d'un événement de touche, d'un redimensionnement de terminal,...
Definition event.hpp:28
Option pour le composant MenuEntry.
Option pour le composant Menu.
Decorator bgcolor(Color)
Décore en utilisant une couleur d'arrière-plan.
Element color(const LinearGradient &gradient, Element child)
Définit la couleur de premier plan d'un élément avec un effet de dégradé linéaire.
Element xflex(Element)
Développer/Réduire si possible/nécessaire sur l'axe X.
Definition flex.cpp:129
Element nothing(Element element)
Une décoration qui ne fait absolument rien.
Definition dom/util.cpp:28
Direction
Direction est une énumération qui représente les quatre directions cardinales.
Definition direction.hpp:13
Element bold(Element)
Utilise une police en gras, pour les éléments avec plus d'emphase.
Definition bold.cpp:33
Element yflex(Element)
Développer/Réduire si possible/nécessaire sur l'axe Y.
Definition flex.cpp:135
Element inverted(Element)
Ajoute un filtre qui inversera les couleurs de premier plan et d'arrière-plan.
Definition inverted.cpp:33
Element text(std::wstring text)
Affiche un morceau de texte unicode.
Definition text.cpp:160
Element focus(Element)
Définit l'élément child comme étant celui qui est focalisé parmi ses frères.
Definition frame.cpp:101
Element bgcolor(const LinearGradient &gradient, Element child)
Définit la couleur de fond d'un élément avec un effet de dégradé linéaire.
Decorator color(Color)
Décore en utilisant une couleur de premier plan.
Element vbox(Elements)
Un conteneur affichant les éléments verticalement un par un.
Definition vbox.cpp:96
bool Contain(int x, int y) const
Definition box.cpp:42
int y_min
Definition box.hpp:19
int y_max
Definition box.hpp:20
int x_min
Definition box.hpp:17
static Color Interpolate(float t, const Color &a, const Color &b)
Box est une structure qui représente une zone rectangulaire dans un espace 2D.
Definition box.hpp:16
float Linear(float p)
Modélisé d'après la ligne y = x.
Definition animation.cpp:29
constexpr const T & clamp(const T &v, const T &lo, const T &hi)
Definition util.hpp:11
L'espace de noms FTXUI ftxui::
Definition animation.hpp:10
std::function< Element(Element)> Decorator
Definition elements.hpp:24
Element separatorVSelector(float up, float down, Color unselected_color, Color selected_color)
Dessine une barre verticale, avec la zone entre le haut et le bas colorée différemment.
std::shared_ptr< T > Make(Args &&... args)
Definition component.hpp:27
std::shared_ptr< Node > Element
Definition elements.hpp:22
Element separatorHSelector(float left, float right, Color unselected_color, Color selected_color)
Dessine une barre horizontale, avec la zone entre la gauche et la droite colorée différemment.
Element hbox(Elements)
Un conteneur affichant les éléments horizontalement un par un.
Definition hbox.cpp:94
std::vector< Element > Elements
Definition elements.hpp:23
Decorator reflect(Box &box)
Definition reflect.cpp:43
std::shared_ptr< ComponentBase > Component
arguments pour la transformation depuis |ButtonOption|, |CheckboxOption|, |RadioboxOption|,...