18 using namespace ftxui;
22 int number_of_threads;
27 std::list<Task> remaining_tasks = {
28 {
"contact server ", 10, 0, 6 * 25},
29 {
"download index.html ", 10, 0, 9 * 25},
30 {
"download script.js ", 1, 0, 3 * 25},
31 {
"download style.js ", 1, 0, 4 * 25},
32 {
"download image.png ", 1, 0, 5 * 25},
33 {
"download big_1.png ", 1, 0, 30 * 25},
34 {
"download icon_1.png ", 1, 0, 7 * 25},
35 {
"download icon_2.png ", 1, 0, 8 * 25},
36 {
"download big_2.png ", 1, 0, 30 * 25},
37 {
"download small_1.png ", 1, 0, 10 * 25},
38 {
"download small_2.png ", 1, 0, 11 * 25},
39 {
"download small_3.png ", 1, 0, 12 * 25},
42 std::list<Task> displayed_task;
44 int remaining_threads = 12;
46 int nb_queued = (int)remaining_tasks.size();
50 auto to_text = [](
int number) {
51 return text(std::to_string(number)) |
size(WIDTH, EQUAL, 3);
54 auto renderTask = [&](
const Task& task) {
55 auto style = (task.downloaded == task.size) ? dim : bold;
57 text(task.name) | style,
59 to_text(task.downloaded),
63 gauge(task.downloaded /
float(task.size)),
67 auto renderSummary = [&]() {
71 to_text(nb_done) | bold,
72 }) | color(Color::Green),
75 to_text(nb_active) | bold,
76 }) | color(Color::RedLight),
79 to_text(nb_queued) | bold,
80 }) | color(Color::Red),
83 return window(text(
" Summary "), summary);
87 std::vector<Element> entries;
88 for (
auto& task : displayed_task) {
89 entries.push_back(renderTask(task));
94 window(text(
" Task "), vbox(std::move(entries))),
104 auto updateModel = [&]() {
105 for (
auto& task : displayed_task) {
106 if (task.downloaded != task.size) {
108 }
else if (task.number_of_threads) {
109 remaining_threads += task.number_of_threads;
110 task.number_of_threads = 0;
116 if (remaining_tasks.size() &&
117 remaining_tasks.front().number_of_threads <= remaining_threads) {
118 remaining_threads -= remaining_tasks.front().number_of_threads;
119 displayed_task.push_back(remaining_tasks.front());
120 remaining_tasks.pop_front();
126 std::string reset_position;
129 auto document = render();
130 auto screen = Screen::Create(Dimension::Full(), Dimension::Fit(document));
131 Render(screen, document);
132 std::cout << reset_position;
134 reset_position = screen.ResetPosition();
137 using namespace std::chrono_literals;
138 std::this_thread::sleep_for(0.01s);
141 if (nb_active + nb_queued == 0) {
148 std::cout << std::endl;