FTXUI 6.1.9
C++ functional terminal UI.
Chargement...
Recherche...
Aucune correspondance
menu_style.cpp
Aller à la documentation de ce fichier.
1// Copyright 2020 Arthur Sonzogni. All rights reserved.
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 <array> // pour array
5#include <chrono> // pour milliseconds
6#include <functional> // pour function
7#include <memory> // pour __shared_ptr_access, shared_ptr, allocator
8#include <string> // pour string, char_traits, operator+, basic_string
9#include <vector> // pour vector
10
11#include "ftxui/component/animation.hpp" // pour ElasticOut, Linear
12#include "ftxui/component/component.hpp" // pour Menu, Horizontal, Renderer, Vertical
13#include "ftxui/component/component_base.hpp" // pour ComponentBase
14#include "ftxui/component/component_options.hpp" // pour MenuOption, EntryState, MenuEntryOption, AnimatedColorOption, AnimatedColorsOption, UnderlineOption
15#include "ftxui/component/mouse.hpp" // pour ftxui
16#include "ftxui/component/screen_interactive.hpp" // pour Component, ScreenInteractive
17#include "ftxui/dom/elements.hpp" // pour separator, operator|, Element, text, bgcolor, hbox, bold, color, filler, border, vbox, borderDouble, dim, flex, hcenter
18#include "ftxui/screen/color.hpp" // pour Color, Color::Red, Color::Black, Color::Yellow, Color::Blue, Color::Default, Color::White
19
20using namespace ftxui;
21
22Component VMenu1(std::vector<std::string>* entries, int* selected);
23Component VMenu2(std::vector<std::string>* entries, int* selected);
24Component VMenu3(std::vector<std::string>* entries, int* selected);
25Component VMenu4(std::vector<std::string>* entries, int* selected);
26Component VMenu5(std::vector<std::string>* entries, int* selected);
27Component VMenu6(std::vector<std::string>* entries, int* selected);
28Component VMenu7(std::vector<std::string>* entries, int* selected);
29Component VMenu8(std::vector<std::string>* entries, int* selected);
30Component HMenu1(std::vector<std::string>* entries, int* selected);
31Component HMenu2(std::vector<std::string>* entries, int* selected);
32Component HMenu3(std::vector<std::string>* entries, int* selected);
33Component HMenu4(std::vector<std::string>* entries, int* selected);
34Component HMenu5(std::vector<std::string>* entries, int* selected);
35
36int main() {
38
39 std::vector<std::string> entries{
40 "Monkey", "Dog", "Cat", "Bird", "Elephant", "Cat",
41 };
42 std::array<int, 12> selected = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
43
44 auto vmenu_1_ = VMenu1(&entries, &selected[0]);
45 auto vmenu_2_ = VMenu2(&entries, &selected[1]);
46 auto vmenu_3_ = VMenu3(&entries, &selected[2]);
47 auto vmenu_4_ = VMenu4(&entries, &selected[3]);
48 auto vmenu_5_ = VMenu5(&entries, &selected[4]);
49 auto vmenu_6_ = VMenu6(&entries, &selected[5]);
50 auto vmenu_7_ = VMenu7(&entries, &selected[6]);
51 auto vmenu_8_ = VMenu8(&entries, &selected[7]);
52
53 auto hmenu_1_ = HMenu1(&entries, &selected[8]);
54 auto hmenu_2_ = HMenu2(&entries, &selected[9]);
55 auto hmenu_3_ = HMenu3(&entries, &selected[10]);
56 auto hmenu_4_ = HMenu4(&entries, &selected[11]);
57 auto hmenu_5_ = HMenu5(&entries, &selected[12]);
58
59 auto container = Container::Vertical({
60 Container::Horizontal({
61 vmenu_1_,
62 vmenu_2_,
63 vmenu_3_,
64 vmenu_4_,
65 vmenu_5_,
66 vmenu_6_,
67 vmenu_7_,
68 vmenu_8_,
69 }),
70 hmenu_1_,
71 hmenu_2_,
72 hmenu_3_,
73 hmenu_4_,
74 hmenu_5_,
75 });
76
77 auto renderer = Renderer(container, [&] {
78 return //
79 hbox({
80 vbox({
81 hbox({
82 vmenu_1_->Render(),
83 separator(),
84 vmenu_2_->Render(),
85 separator(),
86 vmenu_3_->Render(),
87 separator(),
88 vmenu_4_->Render(),
89 separator(),
90 vmenu_5_->Render(),
91 vmenu_6_->Render(),
92 separator(),
93 vmenu_7_->Render(),
94 separator(),
95 vmenu_8_->Render(),
96 }),
97 separator(),
98 hmenu_1_->Render(),
99 separator(),
100 hmenu_2_->Render(),
101 separator(),
102 hmenu_3_->Render(),
103 separator(),
104 hmenu_4_->Render(),
105 hmenu_5_->Render(),
106 }) | border,
107 filler(),
108 });
109 });
110
111 screen.Loop(renderer);
112}
113
114Component VMenu1(std::vector<std::string>* entries, int* selected) {
115 auto option = MenuOption::Vertical();
116 option.entries_option.transform = [](EntryState state) {
117 state.label = (state.active ? "> " : " ") + state.label;
118 Element e = text(state.label);
119 if (state.focused) {
120 e = e | bgcolor(Color::Blue);
121 }
122 if (state.active) {
123 e = e | bold;
124 }
125 return e;
126 };
127 return Menu(entries, selected, option);
128}
129
130Component VMenu2(std::vector<std::string>* entries, int* selected) {
131 auto option = MenuOption::Vertical();
132 option.entries_option.transform = [](EntryState state) {
133 state.label += (state.active ? " <" : " ");
134 Element e = hbox(filler(), text(state.label));
135 if (state.focused) {
136 e = e | bgcolor(Color::Red);
137 }
138 if (state.active) {
139 e = e | bold;
140 }
141 return e;
142 };
143 return Menu(entries, selected, option);
144}
145
146Component VMenu3(std::vector<std::string>* entries, int* selected) {
147 auto option = MenuOption::Vertical();
148 option.entries_option.transform = [](EntryState state) {
149 Element e = state.active ? text("[" + state.label + "]")
150 : text(" " + state.label + " ");
151 if (state.focused) {
152 e = e | bold;
153 }
154
155 if (state.focused) {
156 e = e | color(Color::Blue);
157 }
158 if (state.active) {
159 e = e | bold;
160 }
161 return e;
162 };
163 return Menu(entries, selected, option);
164}
165
166Component VMenu4(std::vector<std::string>* entries, int* selected) {
167 auto option = MenuOption::Vertical();
168 option.entries_option.transform = [](EntryState state) {
169 if (state.active && state.focused) {
170 return text(state.label) | color(Color::Yellow) | bgcolor(Color::Black) |
171 bold;
172 }
173
174 if (state.active) {
175 return text(state.label) | color(Color::Yellow) | bgcolor(Color::Black);
176 }
177 if (state.focused) {
178 return text(state.label) | color(Color::Black) | bgcolor(Color::Yellow) |
179 bold;
180 }
181 return text(state.label) | color(Color::Black) | bgcolor(Color::Yellow);
182 };
183 return Menu(entries, selected, option);
184}
185
186Component VMenu5(std::vector<std::string>* entries, int* selected) {
187 auto option = MenuOption::Vertical();
188 option.entries_option.transform = [](EntryState state) {
189 auto element = text(state.label);
190 if (state.active && state.focused) {
191 return element | borderDouble;
192 }
193 if (state.active) {
194 return element | border;
195 }
196 if (state.focused) {
197 return element | bold;
198 }
199 return element;
200 };
201 return Menu(entries, selected, option);
202}
203
204Component VMenu6(std::vector<std::string>* entries, int* selected) {
205 auto option = MenuOption::VerticalAnimated();
206 option.underline.color_inactive = Color::Default;
207 option.underline.color_active = Color::Red;
208 option.underline.SetAnimationFunction(animation::easing::Linear);
209 return Menu(entries, selected, option);
210}
211
212Component VMenu7(std::vector<std::string>* entries, int* selected) {
213 auto option = MenuOption::Vertical();
214 option.entries_option.animated_colors.foreground.enabled = true;
215 option.entries_option.animated_colors.background.enabled = true;
216 option.entries_option.animated_colors.background.active = Color::Red;
217 option.entries_option.animated_colors.background.inactive = Color::Black;
218 option.entries_option.animated_colors.foreground.active = Color::White;
219 option.entries_option.animated_colors.foreground.inactive = Color::Red;
220 return Menu(entries, selected, option);
221}
222
223Component VMenu8(std::vector<std::string>* entries, int* selected) {
224 auto option = MenuOption::Vertical();
225 option.entries_option.animated_colors.foreground.Set(
226 Color::Red, Color::White, std::chrono::milliseconds(500));
227 return Menu(entries, selected, option);
228}
229
230Component HMenu1(std::vector<std::string>* entries, int* selected) {
231 return Menu(entries, selected, MenuOption::Horizontal());
232}
233
234Component HMenu2(std::vector<std::string>* entries, int* selected) {
235 return Menu(entries, selected, MenuOption::Toggle());
236}
237
238Component HMenu3(std::vector<std::string>* entries, int* selected) {
239 auto option = MenuOption::Toggle();
240 option.elements_infix = [] { return text(" 🮣🮠 "); };
241
242 return Menu(entries, selected, option);
243}
244
245Component HMenu4(std::vector<std::string>* entries, int* selected) {
246 return Menu(entries, selected, MenuOption::HorizontalAnimated());
247}
248
249Component HMenu5(std::vector<std::string>* entries, int* selected) {
250 auto option = MenuOption::HorizontalAnimated();
251 option.underline.SetAnimation(std::chrono::milliseconds(1500),
252 animation::easing::ElasticOut);
253 option.entries_option.transform = [](EntryState state) {
254 Element e = text(state.label) | hcenter | flex;
255 if (state.active && state.focused) {
256 e = e | bold;
257 }
258 if (!state.focused && !state.active) {
259 e = e | dim;
260 }
261 return e;
262 };
263 option.underline.color_inactive = Color::Default;
264 option.underline.color_active = Color::Red;
265 return Menu(entries, selected, option);
266}
auto screen
static ScreenInteractive TerminalOutput()
static MenuOption Toggle()
Options standard pour un menu horizontal avec un séparateur. Cela peut être utile pour implémenter un...
static MenuOption Horizontal()
Options standard pour un menu horizontal. Cela peut être utile pour implémenter une barre d'onglets.
static MenuOption VerticalAnimated()
Options standard pour un menu vertical animé. Cela peut être utile pour implémenter une liste d'éléme...
static MenuOption Vertical()
Options standard pour un menu vertical. Cela peut être utile pour implémenter une liste d'éléments sé...
static MenuOption HorizontalAnimated()
Options standard pour un menu horizontal animé. Cela peut être utile pour implémenter une barre d'ong...
Component Menu(MenuOption options)
Une liste de texte. L'élément sélectionné est mis en évidence.
Component Renderer(Component child, std::function< Element()>)
Renvoie un nouveau composant, similaire à |child|, mais utilisant |render| comme événement Component:...
virtual void Render(Screen &screen)
Decorator bgcolor(Color)
Décore en utilisant une couleur d'arrière-plan.
Element borderDouble(Element)
Dessine une double bordure autour de l'élément.
Element flex(Element)
Permet à un élément enfant de s'étendre proportionnellement à l'espace restant dans un conteneur.
Definition flex.cpp:123
Element bold(Element)
Utilise une police en gras, pour les éléments avec plus d'emphase.
Definition bold.cpp:33
Element text(std::wstring text)
Affiche un morceau de texte unicode.
Definition text.cpp:160
Element separator()
Dessine une séparation verticale ou horizontale entre deux autres éléments.
Element filler()
Un élément qui occupera proportionnellement l'espace disponible dans un conteneur.
Definition flex.cpp:98
Element dim(Element)
Utilise une police de caractères claire, pour les éléments moins mis en valeur.
Definition dim.cpp:33
Element border(Element)
Dessine une bordure autour de l'élément.
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
Component HMenu5(std::vector< std::string > *entries, int *selected)
Component HMenu4(std::vector< std::string > *entries, int *selected)
Component VMenu5(std::vector< std::string > *entries, int *selected)
Component HMenu1(std::vector< std::string > *entries, int *selected)
Component HMenu2(std::vector< std::string > *entries, int *selected)
Component VMenu2(std::vector< std::string > *entries, int *selected)
Component HMenu3(std::vector< std::string > *entries, int *selected)
Component VMenu1(std::vector< std::string > *entries, int *selected)
int main()
Component VMenu3(std::vector< std::string > *entries, int *selected)
Component VMenu6(std::vector< std::string > *entries, int *selected)
Component VMenu7(std::vector< std::string > *entries, int *selected)
Component VMenu8(std::vector< std::string > *entries, int *selected)
Component VMenu4(std::vector< std::string > *entries, int *selected)
L'espace de noms FTXUI ftxui::
Definition animation.hpp:10
std::shared_ptr< Node > Element
Definition elements.hpp:22
Element hbox(Elements)
Un conteneur affichant les éléments horizontalement un par un.
Definition hbox.cpp:94
std::shared_ptr< ComponentBase > Component
arguments pour la transformation depuis |ButtonOption|, |CheckboxOption|, |RadioboxOption|,...