diff --git a/examples/dom/package_manager.cpp b/examples/dom/package_manager.cpp index 2ba5009..21c803a 100644 --- a/examples/dom/package_manager.cpp +++ b/examples/dom/package_manager.cpp @@ -21,24 +21,23 @@ int main(int argc, const char *argv[]) }; std::list remaining_tasks = { - {L"contact server " , 10 , 0 , 6*25} , - {L"download index.html " , 10 , 0 , 9*25} , - {L"download script.js " , 1 , 0 , 3*25} , - {L"download style.js " , 1 , 0 , 4*25} , - {L"download image.png " , 1 , 0 , 5*25} , - {L"download big_1.png " , 1 , 0 , 30*25} , - {L"download icon_1.png " , 1 , 0 , 7*25} , - {L"download icon_2.png " , 1 , 0 , 8*25} , - {L"download big_2.png " , 1 , 0 , 30*25} , - {L"download small_1.png " , 1 , 0 , 10*25} , - {L"download small_2.png " , 1 , 0 , 11*25} , - {L"download small_3.png " , 1 , 0 , 12*25} , + {L"contact server ", 10, 0, 6 * 25}, + {L"download index.html ", 10, 0, 9 * 25}, + {L"download script.js ", 1, 0, 3 * 25}, + {L"download style.js ", 1, 0, 4 * 25}, + {L"download image.png ", 1, 0, 5 * 25}, + {L"download big_1.png ", 1, 0, 30 * 25}, + {L"download icon_1.png ", 1, 0, 7 * 25}, + {L"download icon_2.png ", 1, 0, 8 * 25}, + {L"download big_2.png ", 1, 0, 30 * 25}, + {L"download small_1.png ", 1, 0, 10 * 25}, + {L"download small_2.png ", 1, 0, 11 * 25}, + {L"download small_3.png ", 1, 0, 12 * 25}, }; std::list displayed_task; int remaining_threads = 12; - std::string reset_position; int nb_queued = remaining_tasks.size(); int nb_active = 0; @@ -50,55 +49,50 @@ int main(int argc, const char *argv[]) t = L" " + t; return text(t); }; - - for(;;) { - std::vector entries; - for(auto& task : displayed_task) { - auto style = (task.downloaded == task.size) ? dim : bold; - entries.push_back( - hbox( - text(task.name) | style, - separator(), - to_text(task.downloaded), - text(L"/"), - to_text(task.size), - separator(), - gauge(task.downloaded / float(task.size)) + + auto renderTask = [&](const Task& task) { + auto style = (task.downloaded == task.size) ? dim : bold; + return + hbox( + text(task.name) | style, + separator(), + to_text(task.downloaded), + text(L"/"), + to_text(task.size), + separator(), + gauge(task.downloaded / float(task.size)) + ); + }; + + auto renderSummary = [&]() { + return + window(text(L" Summary "), + vbox( + hbox(text(L"- done: "), to_text(nb_done) | bold) | color(Color::Green), + hbox(text(L"- active: "), to_text(nb_active) | bold ) | color(Color::RedLight), + hbox(text(L"- queue: "), to_text(nb_queued) | bold) | color(Color::Red) ) ); - } + }; - auto document = + auto render = [&](){ + std::vector entries; + for(auto& task : displayed_task) + entries.push_back(renderTask(task)); + + return vbox( + // List of tasks. window(text(L" Task "), vbox(std::move(entries)) ), - hbox( - window(text(L" Summary "), - vbox( - hbox(text(L"- done: "), to_text(nb_done) | bold) | color(Color::Green), - hbox(text(L"- active: "), to_text(nb_active) | bold ) | color(Color::RedLight), - hbox(text(L"- queue: "), to_text(nb_queued) | bold) | color(Color::Red) - ) - ) - ) + + // Summary. + hbox(renderSummary(), filler()) ); + }; - // Draw. - //if (step != 0) screen.Clear(); - auto screen = ftxui::Screen::TerminalOutput(document); - Render(screen, document.get()); - std::cout << reset_position << screen.ToString() << std::flush; - reset_position = screen.ResetPosition(); - - // Simulate time. - using namespace std::chrono_literals; - std::this_thread::sleep_for(0.01s); - - if (nb_active + nb_queued == 0) - break; - - // Update the model. + auto updateModel = [&](){ for(auto& task : displayed_task) { if (task.downloaded != task.size) { task.downloaded++; @@ -118,6 +112,28 @@ int main(int argc, const char *argv[]) nb_queued--; nb_active++; } + }; + + std::string reset_position; + for(;;) { + + // Draw. + auto document = render(); + auto screen = ftxui::Screen::TerminalOutput(document); + Render(screen, document.get()); + std::cout << reset_position << screen.ToString() << std::flush; + reset_position = screen.ResetPosition(); + + // Simulate time. + using namespace std::chrono_literals; + std::this_thread::sleep_for(0.01s); + + // Exit + if (nb_active + nb_queued == 0) + break; + + // Update the model for the next frame. + updateModel(); } std::cout << std::endl; }