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. All rights reserved.
2// このソースコードの使用は、LICENSE ファイルにある MIT ライセンスによって管理されています。
3#include <chrono> // for operator""s, chrono_literals
4#include <ftxui/dom/elements.hpp> // for operator|, text, Element, hbox, bold, color, filler, separator, vbox, window, gauge, Fit, size, dim, EQUAL, WIDTH
5#include <ftxui/screen/screen.hpp> // for Full, Screen
6#include <iostream> // for cout, endl, ostream
7#include <list> // for list, operator==, _List_iterator, _List_iterator<>::_Self
8#include <memory> // for allocator, shared_ptr, allocator_traits<>::value_type
9#include <string> // for string, operator<<, to_string
10#include <thread> // for sleep_for
11#include <utility> // for move
12#include <vector> // for vector
13
14#include "ftxui/dom/node.hpp" // for Render
15#include "ftxui/screen/color.hpp" // for Color, Color::Green, Color::Red, Color::RedLight, ftxui
16
17int main() {
18 using namespace ftxui;
19
20 struct Task {
21 std::string name;
22 int number_of_threads;
23 int downloaded;
24 int size;
25 };
26
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},
40 };
41
42 std::list<Task> displayed_task;
43
44 int remaining_threads = 12;
45
46 int nb_queued = (int)remaining_tasks.size();
47 int nb_active = 0;
48 int nb_done = 0;
49
50 auto to_text = [](int number) {
51 return text(std::to_string(number)) | size(WIDTH, EQUAL, 3);
52 };
53
54 auto renderTask = [&](const Task& task) {
55 auto style = (task.downloaded == task.size) ? dim : bold;
56 return hbox({
57 text(task.name) | style,
58 separator(),
59 to_text(task.downloaded),
60 text("/"),
61 to_text(task.size),
62 separator(),
63 gauge(task.downloaded / float(task.size)),
64 });
65 };
66
67 auto renderSummary = [&]() {
68 auto summary = vbox({
69 hbox({
70 text("- done: "),
71 to_text(nb_done) | bold,
72 }) | color(Color::Green),
73 hbox({
74 text("- active: "),
75 to_text(nb_active) | bold,
76 }) | color(Color::RedLight),
77 hbox({
78 text("- queue: "),
79 to_text(nb_queued) | bold,
80 }) | color(Color::Red),
81 });
82
83 return window(text(" Summary "), summary);
84 };
85
86 auto render = [&]() {
87 std::vector<Element> entries;
88 for (auto& task : displayed_task) {
89 entries.push_back(renderTask(task));
90 }
91
92 return vbox({
93 // タスク一覧
94 window(text(" Task "), vbox(std::move(entries))),
95
96 // 概要
97 hbox({
98 renderSummary(),
99 filler(),
100 }),
101 });
102 };
103
104 auto updateModel = [&]() {
105 for (auto& task : displayed_task) {
106 if (task.downloaded != task.size) {
107 task.downloaded++;
108 } else if (task.number_of_threads) {
109 remaining_threads += task.number_of_threads;
110 task.number_of_threads = 0;
111 nb_active--;
112 nb_done++;
113 }
114 }
115
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();
121 nb_queued--;
122 nb_active++;
123 }
124 };
125
126 std::string reset_position;
127 for (;;) {
128 // 描画
129 auto document = render();
130 auto screen = Screen::Create(Dimension::Full(), Dimension::Fit(document));
131 Render(screen, document);
132 std::cout << reset_position;
133 screen.Print();
134 reset_position = screen.ResetPosition();
135
136 // 時間をシミュレート
137 using namespace std::chrono_literals;
138 std::this_thread::sleep_for(0.01s);
139
140 // 終了
141 if (nb_active + nb_queued == 0) {
142 break;
143 }
144
145 // 次のフレームのためにモデルを更新
146 updateModel();
147 }
148 std::cout << std::endl;
149}
Element window(Element title, Element content, BorderStyle border)
要素の周囲にタイトルとボーダーを持つウィンドウを描画します。
FTXUI ftxui:: 名前空間
Definition animation.hpp:9
std::variant< Event, Closure, AnimationTask > Task
Definition task.hpp:13
int main()
return size
Definition string.cpp:1516