19 using namespace ftxui;
23 int number_of_threads;
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},
43 std::list<Task> displayed_task;
45 int remaining_threads = 12;
47 int nb_queued = (int)remaining_tasks.size();
51 auto to_text = [](
int number) {
52 return text(std::to_string(number)) | size(WIDTH, EQUAL, 3);
55 auto renderTask = [&](
const Task& task) {
56 auto style = (task.downloaded == task.size) ? dim : bold;
58 text(task.name) | style,
60 to_text(task.downloaded),
64 gauge(task.downloaded /
float(task.size)),
68 auto renderSummary = [&]() {
72 to_text(nb_done) | bold,
73 }) | color(Color::Green),
76 to_text(nb_active) | bold,
77 }) | color(Color::RedLight),
80 to_text(nb_queued) | bold,
81 }) | color(Color::Red),
84 return window(text(
" Summary "), summary);
88 std::vector<Element> entries;
89 for (
auto& task : displayed_task)
90 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)
147 std::cout << std::endl;