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 <string> // for basic_string, string
6 #include <utility> // for move
7 #include <vector> // for vector, __alloc_traits<>::value_type
8 
9 #include "ftxui/dom/elements.hpp" // for Element, gauge, text, vbox, spinner
10 
11 namespace ftxui {
12 
13 namespace {
14 // NOLINTNEXTLINE
15 const std::vector<std::vector<std::vector<std::string>>> elements = {
16  {
17  {"Replaced by the gauge"},
18  },
19  {
20  {". "},
21  {".. "},
22  {"..."},
23  },
24  {
25  {"|"},
26  {"/"},
27  {"-"},
28  {"\\"},
29  },
30  {
31  {"+"},
32  {"x"},
33  },
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  " /\\O ",
236  " /\\/",
237  " /\\ ",
238  " / \\ ",
239  "LOL LOL",
240  },
241  {
242  " _O ",
243  " //|_ ",
244  " | ",
245  " /| ",
246  " LLOL ",
247  },
248  {
249  " O ",
250  " /_ ",
251  " |\\ ",
252  " / | ",
253  " LOLLOL ",
254  },
255  },
256  {
257  {" ", "_______", " "},
258  {" ", "______/", " "},
259  {" _", "_____/ ", " "},
260  {" _ ", "____/ \\", " "},
261  {" _ ", "___/ \\ ", " \\"},
262  {" _ ", "__/ \\ ", " \\_"},
263  {" _ ", "_/ \\ ", " \\_/"},
264  {" _ ", "/ \\ _", " \\_/ "},
265  {"_ ", " \\ __", " \\_/ "},
266  {" ", "\\ ___", " \\_/ "},
267  {" ", " ___", "\\_/ "},
268  {" ", " _____", "_/ "},
269  {" ", " ______", "/ "},
270  {" ", "_______", " "},
271  },
272 };
273 
274 } // namespace
275 
276 /// @brief Useful to represent the effect of time and/or events. This display an
277 /// ASCII art "video".
278 /// @param charset_index The type of "video".
279 /// @param image_index The "frame" of the video. You need to increase this for
280 /// every "step".
281 /// @ingroup dom
282 Element spinner(int charset_index, size_t image_index) {
283  if (charset_index <= 0) {
284  const int progress_size = 40;
285  image_index %= progress_size;
286  if (image_index > progress_size / 2) {
287  image_index = progress_size - image_index;
288  }
289  return gauge(float(image_index) * 0.05F); // NOLINT
290  }
291  charset_index %= int(elements.size());
292  image_index %= int(elements[charset_index].size());
293  std::vector<Element> lines;
294  for (const auto& it : elements[charset_index][image_index]) {
295  lines.push_back(text(it));
296  }
297  return vbox(std::move(lines));
298 }
299 
300 } // namespace ftxui
Decorator size(WidthOrHeight, Constraint, int value)
Apply a constraint on the size of an element.
Definition: size.cpp:89
std::shared_ptr< Node > Element
Definition: elements.hpp:22
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:282
Element text(std::wstring text)
Display a piece of unicode text.
Definition: text.cpp:119
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