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 
12 namespace ftxui {
13 
14 namespace {
15 // NOLINTNEXTLINE
16 const 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
283 Element 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