FTXUI 6.1.9
C++ functional terminal UI.
Chargement...
Recherche...
Aucune correspondance
src/ftxui/component/dropdown.cpp
Aller à la documentation de ce fichier.
1// Copyright 2021 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.
5#include <functional> // for function
6#include <string> // for string
7
8#include <utility>
9#include "ftxui/component/component.hpp" // for Maybe, Checkbox, Make, Radiobox, Vertical, Dropdown
10#include "ftxui/component/component_base.hpp" // for Component, ComponentBase
11#include "ftxui/component/component_options.hpp" // for CheckboxOption, EntryState
12#include "ftxui/dom/elements.hpp" // for operator|, Element, border, filler, operator|=, separator, size, text, vbox, frame, vscroll_indicator, hbox, HEIGHT, LESS_THAN, bold, inverted
13#include "ftxui/screen/util.hpp" // for clamp
14#include "ftxui/util/ref.hpp" // for ConstStringListRef
15
16namespace ftxui {
17
18/// @brief Un menu déroulant.
19/// @ingroup component
20/// @param entries La liste des entrées à afficher.
21/// @param selected L'index de l'entrée sélectionnée.
22Component Dropdown(ConstStringListRef entries, int* selected) {
23 DropdownOption option;
24 option.radiobox.entries = std::move(entries);
25 option.radiobox.selected = selected;
26 return Dropdown(option);
27}
28
29/// @brief Un menu déroulant.
30/// @ingroup component
31/// @param option Les options du menu déroulant.
32// NOLINTNEXTLINE
34 class Impl : public ComponentBase, public DropdownOption {
35 public:
36 explicit Impl(DropdownOption option) : DropdownOption(std::move(option)) {
37 FillDefault();
38 checkbox_ = Checkbox(checkbox);
39 radiobox_ = Radiobox(radiobox);
40
41 Add(Container::Vertical({
42 checkbox_,
43 Maybe(radiobox_, checkbox.checked),
44 }));
45 }
46
47 Element OnRender() override {
48 selected_ =
49 util::clamp(radiobox.selected(), 0, int(radiobox.entries.size()) - 1);
50 selected_ = util::clamp(selected_(), 0, int(radiobox.entries.size()) - 1);
51
52 if (selected_() >= 0 && selected_() < int(radiobox.entries.size())) {
53 title_ = radiobox.entries[selected_()];
54 }
55
56 return transform(*open_, checkbox_->Render(), radiobox_->Render());
57 }
58
59 // Basculer le focus entre la case à cocher et la boîte radio lors de la sélection.
60 bool OnEvent(ftxui::Event event) override {
61 const bool open_old = open_();
62 const int selected_old = selected_();
63 bool handled = ComponentBase::OnEvent(event);
64
65 // Transférer le focus à la boîte radio lorsque le menu déroulant est ouvert.
66 if (!open_old && open_()) {
67 radiobox_->TakeFocus();
68 }
69
70 // Fermer automatiquement le menu déroulant lorsque l'utilisateur sélectionne un élément, même si l'élément
71 // est le même que le précédent.
72 if (open_old && open_()) {
73 const bool should_close =
74 (selected_() != selected_old) || //
75 (event == Event::Return) || //
76 (event == Event::Character(' ')) || //
77 (event == Event::Escape) || //
78 (event.is_mouse() && event.mouse().button == Mouse::Left &&
79 event.mouse().motion == Mouse::Pressed);
80
81 if (should_close) {
82 checkbox_->TakeFocus();
83 open_ = false;
84 handled = true;
85 }
86 }
87
88 return handled;
89 }
90
91 void FillDefault() {
92 open_ = checkbox.checked;
93 selected_ = radiobox.selected;
94 checkbox.checked = &*open_;
95 radiobox.selected = &*selected_;
96 checkbox.label = &title_;
97
98 if (!checkbox.transform) {
99 checkbox.transform = [](const EntryState& s) {
100 auto prefix = text(s.state ? "↓ " : "→ "); // NOLINT
101 auto t = text(s.label);
102 if (s.active) {
103 t |= bold;
104 }
105 if (s.focused) {
106 t |= inverted;
107 }
108 return hbox({prefix, t});
109 };
110 }
111
112 if (!transform) {
113 transform = [](bool is_open, Element checkbox_element,
114 Element radiobox_element) {
115 if (is_open) {
116 const int max_height = 12;
117 return vbox({
118 std::move(checkbox_element),
119 separator(),
120 std::move(radiobox_element) | vscroll_indicator | frame |
121 size(HEIGHT, LESS_THAN, max_height),
122 }) |
123 border;
124 }
125 return vbox({std::move(checkbox_element), filler()}) | border;
126 };
127 }
128 }
129
130 private:
131 Ref<bool> open_;
132 Ref<int> selected_;
133 Component checkbox_;
134 Component radiobox_;
135 std::string title_;
136 };
137
138 return Make<Impl>(option);
139}
140
141} // namespace ftxui
Un adaptateur. Référence une liste de chaînes de caractères.
Definition ref.hpp:116
Un adaptateur. Possède ou référence un objet mutable.
Definition ref.hpp:46
struct Mouse mouse
Definition event.hpp:143
ConstStringListRef entries
Button button
Definition mouse.hpp:30
Motion motion
Definition mouse.hpp:33
Il implémente son propre rendu en tant que ftxui::Element. Il implémente la navigation au clavier en ...
Component Dropdown(ConstStringListRef entries, int *selected)
Un menu déroulant.
Option pour le composant Dropdown.Un menu déroulant est une case à cocher qui ouvre/ferme une radiobo...
Représente un événement. Il peut s'agir d'un événement de touche, d'un redimensionnement de terminal,...
Definition event.hpp:28
L'espace de noms FTXUI ftxui::
Definition animation.hpp:10
std::shared_ptr< T > Make(Args &&... args)
Definition component.hpp:27
std::shared_ptr< Node > Element
Definition elements.hpp:22
@ LESS_THAN
Definition elements.hpp:161
std::shared_ptr< ComponentBase > Component
arguments pour la transformation depuis |ButtonOption|, |CheckboxOption|, |RadioboxOption|,...