FTXUI  0.11.1
C++ functional terminal UI.
spinner.cpp
Go to the documentation of this file.
1 #include <stddef.h> // for size_t
2 #include <memory> // for allocator, allocator_traits<>::value_type
3 #include <string> // for basic_string, string
4 #include <utility> // for move
5 #include <vector> // for vector, __alloc_traits<>::value_type
6 
7 #include "ftxui/dom/elements.hpp" // for Element, gauge, text, vbox, spinner
8 
9 namespace ftxui {
10 
11 static const std::vector<std::vector<std::vector<std::string>>> elements = {
12  {
13  {"Replaced by the gauge"},
14  },
15  {
16  {". "},
17  {".. "},
18  {"..."},
19  },
20  {
21  {"|"},
22  {"/"},
23  {"-"},
24  {"\\"},
25  },
26  {
27  {"+"},
28  {"x"},
29  },
30  {
31  {"| "},
32  {"|| "},
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  " /\\O ",
229  " /\\/",
230  " /\\ ",
231  " / \\ ",
232  "LOL LOL",
233  },
234  {
235  " _O ",
236  " //|_ ",
237  " | ",
238  " /| ",
239  " LLOL ",
240  },
241  {
242  " O ",
243  " /_ ",
244  " |\\ ",
245  " / | ",
246  " LOLLOL ",
247  }}};
248 
249 /// @brief Useful to represent the effect of time and/or events. This display an
250 /// ASCII art "video".
251 /// @param charset_index The type of "video".
252 /// @param image_index The "frame" of the video. You need to increase this for
253 /// every "step".
254 /// @ingroup dom
255 Element spinner(int charset_index, size_t image_index) {
256  if (charset_index == 0) {
257  image_index %= 40;
258  if (image_index > 20)
259  image_index = 40 - image_index;
260  return gauge(image_index * 0.05);
261  }
262  charset_index %= elements.size();
263  image_index %= elements[charset_index].size();
264  std::vector<Element> lines;
265  for (const auto& it : elements[charset_index][image_index])
266  lines.push_back(text(it));
267  return vbox(std::move(lines));
268 }
269 
270 } // namespace ftxui
271 
272 // Copyright 2020 Arthur Sonzogni. All rights reserved.
273 // Use of this source code is governed by the MIT license that can be found in
274 // the LICENSE file.
std::shared_ptr< Node > Element
Definition: elements.hpp:16
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:255
Element text(std::wstring text)
Display a piece of unicode text.
Definition: text.cpp:106
Element gauge(float ratio)
Draw a high definition progress bar.
Definition: gauge.cpp:75
Element vbox(Elements)
A container displaying elements vertically one by one.
Definition: vbox.cpp:77