FTXUI  5.0.0
C++ functional terminal UI.
spinner.cpp
Go to the documentation of this file.
1// Copyright 2020 Arthur Sonzogni. All rights reserved.
2// Use of this source code is governed by the MIT license that can be found in
3// the LICENSE file.
4#include <cstddef> // for size_t
5#include <memory> // for allocator, allocator_traits<>::value_type
6#include <string> // for basic_string, string
7#include <utility> // for move
8#include <vector> // for vector, __alloc_traits<>::value_type
9
10#include "ftxui/dom/elements.hpp" // for Element, gauge, text, vbox, spinner
11
12namespace ftxui {
13
14namespace {
15// NOLINTNEXTLINE
16const std::vector<std::vector<std::vector<std::string>>> elements = {
17 {
18 {"Replaced by the gauge"},
19 },
20 {
21 {". "},
22 {".. "},
23 {"..."},
24 },
25 {
26 {"|"},
27 {"/"},
28 {"-"},
29 {"\\"},
30 },
31 {
32 {"+"},
33 {"x"},
34 },
35 {
36 {"| "},
37 {"|| "},
38 {"|||"},
39 },
40 {
41 {"←"},
42 {"↖"},
43 {"↑"},
44 {"↗"},
45 {"→"},
46 {"↘"},
47 {"↓"},
48 {"↙"},
49 },
50 {
51 {"▁"},
52 {"▂"},
53 {"▃"},
54 {"▄"},
55 {"▅"},
56 {"▆"},
57 {"▇"},
58 {"█"},
59 {"▇"},
60 {"▆"},
61 {"▅"},
62 {"▄"},
63 {"▃"},
64 {"▁"},
65 },
66 {
67 {"▉"},
68 {"▊"},
69 {"▋"},
70 {"▌"},
71 {"▍"},
72 {"▎"},
73 {"▏"},
74 {"▎"},
75 {"▍"},
76 {"▌"},
77 {"▋"},
78 {"▊"},
79 },
80 {
81 {"▖"},
82 {"▘"},
83 {"▝"},
84 {"▗"},
85 },
86 {
87 {"◢"},
88 {"◣"},
89 {"◤"},
90 {"◥"},
91 },
92 {
93 {"◰"},
94 {"◳"},
95 {"◲"},
96 {"◱"},
97 },
98 {
99 {"◴"},
100 {"◷"},
101 {"◶"},
102 {"◵"},
103 },
104 {
105 {"◐"},
106 {"◓"},
107 {"◑"},
108 {"◒"},
109 },
110 {
111 {"◡"},
112 {"⊙"},
113 {"◠"},
114 },
115 {
116 {"⠁"},
117 {"⠂"},
118 {"⠄"},
119 {"⡀"},
120 {"⢀"},
121 {"⠠"},
122 {"⠐"},
123 {"⠈"},
124 },
125 {
126 {"⠋"},
127 {"⠙"},
128 {"⠹"},
129 {"⠸"},
130 {"⠼"},
131 {"⠴"},
132 {"⠦"},
133 {"⠧"},
134 {"⠇"},
135 {"⠏"},
136 },
137 {
138 {"(*----------)"}, {"(-*---------)"}, {"(--*--------)"},
139 {"(---*-------)"}, {"(----*------)"}, {"(-----*-----)"},
140 {"(------*----)"}, {"(-------*---)"}, {"(--------*--)"},
141 {"(---------*-)"}, {"(----------*)"}, {"(---------*-)"},
142 {"(--------*--)"}, {"(-------*---)"}, {"(------*----)"},
143 {"(-----*-----)"}, {"(----*------)"}, {"(---*-------)"},
144 {"(--*--------)"}, {"(-*---------)"},
145 },
146 {
147 {"[ ]"},
148 {"[= ]"},
149 {"[== ]"},
150 {"[=== ]"},
151 {"[==== ]"},
152 {"[===== ]"},
153 {"[======]"},
154 {"[===== ]"},
155 {"[==== ]"},
156 {"[=== ]"},
157 {"[== ]"},
158 {"[= ]"},
159 },
160 {
161 {"[ ]"},
162 {"[= ]"},
163 {"[== ]"},
164 {"[=== ]"},
165 {"[==== ]"},
166 {"[===== ]"},
167 {"[======]"},
168 {"[ =====]"},
169 {"[ ====]"},
170 {"[ ===]"},
171 {"[ ==]"},
172 {"[ =]"},
173 },
174 {
175 {"[== ]"},
176 {"[== ]"},
177 {"[== ]"},
178 {"[== ]"},
179 {"[== ]"},
180 {" [== ]"},
181 {"[ == ]"},
182 {"[ == ]"},
183 {"[ ==]"},
184 {"[ ==]"},
185 {"[ ==]"},
186 {"[ ==]"},
187 {"[ ==]"},
188 {"[ ==] "},
189 {"[ == ]"},
190 {"[ == ]"},
191 },
192 {
193 {
194 " ─╮",
195 " │",
196 " ",
197 },
198 {
199 " ╮",
200 " │",
201 " ╯",
202 },
203 {
204 " ",
205 " │",
206 " ─╯",
207 },
208 {
209 " ",
210 " ",
211 "╰─╯",
212 },
213 {
214 " ",
215 "│ ",
216 "╰─ ",
217 },
218 {
219 "╭ ",
220 "│ ",
221 "╰ ",
222 },
223 {
224 "╭─ ",
225 "│ ",
226 " ",
227 },
228 {
229 "╭─╮",
230 " ",
231 " ",
232 },
233 },
234 {
235 {
236 " /\\O ",
237 " /\\/",
238 " /\\ ",
239 " / \\ ",
240 "LOL LOL",
241 },
242 {
243 " _O ",
244 " //|_ ",
245 " | ",
246 " /| ",
247 " LLOL ",
248 },
249 {
250 " O ",
251 " /_ ",
252 " |\\ ",
253 " / | ",
254 " LOLLOL ",
255 },
256 },
257 {
258 {" ", "_______", " "},
259 {" ", "______/", " "},
260 {" _", "_____/ ", " "},
261 {" _ ", "____/ \\", " "},
262 {" _ ", "___/ \\ ", " \\"},
263 {" _ ", "__/ \\ ", " \\_"},
264 {" _ ", "_/ \\ ", " \\_/"},
265 {" _ ", "/ \\ _", " \\_/ "},
266 {"_ ", " \\ __", " \\_/ "},
267 {" ", "\\ ___", " \\_/ "},
268 {" ", " ___", "\\_/ "},
269 {" ", " _____", "_/ "},
270 {" ", " ______", "/ "},
271 {" ", "_______", " "},
272 },
273};
274
275} // namespace
276
277/// @brief Useful to represent the effect of time and/or events. This display an
278/// ASCII art "video".
279/// @param charset_index The type of "video".
280/// @param image_index The "frame" of the video. You need to increase this for
281/// every "step".
282/// @ingroup dom
283Element spinner(int charset_index, size_t image_index) {
284 if (charset_index <= 0) {
285 const int progress_size = 40;
286 image_index %= progress_size;
287 if (image_index > progress_size / 2) {
288 image_index = progress_size - image_index;
289 }
290 return gauge(float(image_index) * 0.05F); // NOLINT
291 }
292 charset_index %= int(elements.size());
293 image_index %= int(elements[charset_index].size());
294 std::vector<Element> lines;
295 for (const auto& it : elements[charset_index][image_index]) {
296 lines.push_back(text(it));
297 }
298 return vbox(std::move(lines));
299}
300
301} // namespace ftxui
Decorator size(WidthOrHeight, Constraint, int value)
Apply a constraint on the size of an element.
Definition: size.cpp:90
std::shared_ptr< Node > Element
Definition: elements.hpp:23
Element spinner(int charset_index, size_t image_index)
Useful to represent the effect of time and/or events. This display an ASCII art "video".
Definition: spinner.cpp:283
Element text(std::wstring text)
Display a piece of unicode text.
Definition: text.cpp:120
Element gauge(float progress)
Draw a high definition progress bar.
Definition: gauge.cpp:293
Element vbox(Elements)
A container displaying elements vertically one by one.
Definition: vbox.cpp:83