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