FTXUI 6.1.9
C++ functional terminal UI.
Loading...
Searching...
No Matches
package_manager.cpp
Go to the documentation of this file.
1// Copyright 2020 Arthur Sonzogni. Todos los derechos reservados.
2// El uso de este código fuente se rige por la licencia MIT que se puede encontrar en
3// el archivo LICENSE.
4#include <chrono> // for operator""s, chrono_literals
5#include <ftxui/dom/elements.hpp> // for operator|, text, Element, hbox, bold, color, filler, separator, vbox, window, gauge, Fit, size, dim, EQUAL, WIDTH
6#include <ftxui/screen/screen.hpp> // for Full, Screen
7#include <iostream> // for cout, endl, ostream
8#include <list> // for list, operator==, _List_iterator, _List_iterator<>::_Self
9#include <memory> // for allocator, shared_ptr, allocator_traits<>::value_type
10#include <string> // for string, operator<<, to_string
11#include <thread> // for sleep_for
12#include <utility> // for move
13#include <vector> // for vector
14
15#include "ftxui/dom/node.hpp" // for Render
16#include "ftxui/screen/color.hpp" // for Color, Color::Green, Color::Red, Color::RedLight, ftxui
17
18int main() {
19 using namespace ftxui;
20
21 struct Task {
22 std::string name;
23 int number_of_threads;
24 int downloaded;
25 int size;
26 };
27
28 std::list<Task> remaining_tasks = {
29 {"contact server ", 10, 0, 6 * 25},
30 {"download index.html ", 10, 0, 9 * 25},
31 {"download script.js ", 1, 0, 3 * 25},
32 {"download style.js ", 1, 0, 4 * 25},
33 {"download image.png ", 1, 0, 5 * 25},
34 {"download big_1.png ", 1, 0, 30 * 25},
35 {"download icon_1.png ", 1, 0, 7 * 25},
36 {"download icon_2.png ", 1, 0, 8 * 25},
37 {"download big_2.png ", 1, 0, 30 * 25},
38 {"download small_1.png ", 1, 0, 10 * 25},
39 {"download small_2.png ", 1, 0, 11 * 25},
40 {"download small_3.png ", 1, 0, 12 * 25},
41 };
42
43 std::list<Task> displayed_task;
44
45 int remaining_threads = 12;
46
47 int nb_queued = (int)remaining_tasks.size();
48 int nb_active = 0;
49 int nb_done = 0;
50
51 auto to_text = [](int number) {
52 return text(std::to_string(number)) | size(WIDTH, EQUAL, 3);
53 };
54
55 auto renderTask = [&](const Task& task) {
56 auto style = (task.downloaded == task.size) ? dim : bold;
57 return hbox({
58
59 text(task.name) | style,
60
61 separator(),
62 to_text(task.downloaded),
63 text("/"),
64 to_text(task.size),
65
66 separator(),
67 gauge(task.downloaded / float(task.size)),
68 });
69 };
70
71 auto renderSummary = [&]() {
72 auto summary = vbox({
73
74 hbox({
75
76 text("- done: "),
77 to_text(nb_done) | bold,
78
79 }) | color(Color::Green),
80
81 hbox({
82
83 text("- active: "),
84 to_text(nb_active) | bold,
85
86 }) | color(Color::RedLight),
87
88 hbox({
89
90 text("- queue: "),
91 to_text(nb_queued) | bold,
92
93 }) | color(Color::Red),
94
95 });
96
97 return window(text(" Summary "), summary);
98 };
99
100 auto render = [&]() {
101 std::vector<Element> entries;
102 for (auto& task : displayed_task) {
103 entries.push_back(renderTask(task));
104 }
105
106 return vbox({
107
108 // Lista de tareas.
109 window(text(" Task "), vbox(std::move(entries))),
110
111 // Resumen.
112 hbox({
113
114 renderSummary(),
115 filler(),
116
117 }),
118 });
119 };
120
121 auto updateModel = [&]() {
122 for (auto& task : displayed_task) {
123 if (task.downloaded != task.size) {
124 task.downloaded++;
125 } else if (task.number_of_threads) {
126 remaining_threads += task.number_of_threads;
127 task.number_of_threads = 0;
128 nb_active--;
129 nb_done++;
130 }
131
132 }
133
134 if (remaining_tasks.size() &&
135 remaining_tasks.front().number_of_threads <= remaining_threads) {
136 remaining_threads -= remaining_tasks.front().number_of_threads;
137 displayed_task.push_back(remaining_tasks.front());
138 remaining_tasks.pop_front();
139 nb_queued--;
140 nb_active++;
141 }
142
143 };
144
145 std::string reset_position;
146
147 for (;;) {
148 // Dibujar.
149 auto document = render();
150 auto screen = Screen::Create(Dimension::Full(), Dimension::Fit(document));
151 Render(screen, document);
152 std::cout << reset_position;
153 screen.Print();
154 reset_position = screen.ResetPosition();
155
156 // Simular tiempo.
157 using namespace std::chrono_literals;
158 std::this_thread::sleep_for(0.01s);
159
160 // Salir
161 if (nb_active + nb_queued == 0) {
162 break;
163
164 }
165
166 // Actualizar el modelo para el siguiente fotograma.
167 updateModel();
168 }
169 std::cout << std::endl;
170}
auto screen
Element vbox(Elements children)
Un contenedor que muestra elementos verticalmente uno por uno.
Definition vbox.cpp:95
return dimx size(HEIGHT, EQUAL, dimy)
return EQUAL
return window(text(title)|hcenter|bold, text("contenido")|hcenter|dim)|size(WIDTH
return hbox({ text(std::to_string(int(progress *100))+"% ")|size(WIDTH, EQUAL, 5), gauge(progress), })
El espacio de nombres ftxui:: de FTXUI.
Definition animation.hpp:10
std::variant< Event, Closure, AnimationTask > Task
Definition task.hpp:14
int main()