21 using namespace ftxui;
27 auto renderer_line_braille = Renderer([&] {
29 c.DrawText(0, 0,
"Several lines (braille)");
30 c.DrawPointLine(mouse_x, mouse_y, 80, 10, Color::Red);
31 c.DrawPointLine(80, 10, 80, 40, Color::Blue);
32 c.DrawPointLine(80, 40, mouse_x, mouse_y, Color::Green);
33 return canvas(std::move(c));
37 auto renderer_line_block = Renderer([&] {
39 c.DrawText(0, 0,
"Several lines (block)");
40 c.DrawBlockLine(mouse_x, mouse_y, 80, 10, Color::Red);
41 c.DrawBlockLine(80, 10, 80, 40, Color::Blue);
42 c.DrawBlockLine(80, 40, mouse_x, mouse_y, Color::Green);
43 return canvas(std::move(c));
47 auto renderer_circle_braille = Renderer([&] {
49 c.DrawText(0, 0,
"A circle (braille)");
50 c.DrawPointCircle(mouse_x, mouse_y, 30);
51 return canvas(std::move(c));
55 auto renderer_circle_block = Renderer([&] {
57 c.DrawText(0, 0,
"A circle (block)");
58 c.DrawBlockCircle(mouse_x, mouse_y, 30);
59 return canvas(std::move(c));
63 auto renderer_circle_filled_braille = Renderer([&] {
65 c.DrawText(0, 0,
"A circle filled (braille)");
66 c.DrawPointCircleFilled(mouse_x, mouse_y, 30);
67 return canvas(std::move(c));
71 auto renderer_circle_filled_block = Renderer([&] {
73 c.DrawText(0, 0,
"A circle filled (block)");
74 c.DrawBlockCircleFilled(mouse_x, mouse_y, 30);
75 return canvas(std::move(c));
79 auto renderer_ellipse_braille = Renderer([&] {
81 c.DrawText(0, 0,
"An ellipse (braille)");
82 c.DrawPointEllipse(mouse_x / 2, mouse_y / 2, mouse_x / 2, mouse_y / 2);
83 return canvas(std::move(c));
87 auto renderer_ellipse_block = Renderer([&] {
89 c.DrawText(0, 0,
"An ellipse (block)");
90 c.DrawBlockEllipse(mouse_x / 2, mouse_y / 2, mouse_x / 2, mouse_y / 2);
91 return canvas(std::move(c));
95 auto renderer_ellipse_filled_braille = Renderer([&] {
97 c.DrawText(0, 0,
"A filled ellipse (braille)");
98 c.DrawPointEllipseFilled(mouse_x / 2, mouse_y / 2, mouse_x / 2,
100 return canvas(std::move(c));
104 auto renderer_ellipse_filled_block = Renderer([&] {
105 auto c =
Canvas(100, 100);
106 c.DrawText(0, 0,
"A filled ellipse (block)");
107 c.DrawBlockEllipseFilled(mouse_x / 2, mouse_y / 2, mouse_x / 2,
109 c.DrawBlockEllipse(mouse_x / 2, mouse_y / 2, mouse_x / 2, mouse_y / 2);
110 return canvas(std::move(c));
114 auto renderer_text = Renderer([&] {
115 auto c =
Canvas(100, 100);
116 c.DrawText(0, 0,
"A piece of text");
117 c.DrawText(mouse_x, mouse_y,
"This is a piece of text with effects",
123 return canvas(std::move(c));
126 auto renderer_plot_1 = Renderer([&] {
127 auto c =
Canvas(100, 100);
128 c.DrawText(0, 0,
"A graph");
130 std::vector<int> ys(100);
131 for (
int x = 0; x < 100; x++) {
132 float dx = float(x - mouse_x);
134 ys[x] = int(dy + 20 * cos(dx * 0.14) + 10 * sin(dx * 0.42));
136 for (
int x = 1; x < 99; x++) {
137 c.DrawPointLine(x, ys[x], x + 1, ys[x + 1]);
140 return canvas(std::move(c));
143 auto renderer_plot_2 = Renderer([&] {
144 auto c =
Canvas(100, 100);
145 c.DrawText(0, 0,
"A symmetrical graph filled");
146 std::vector<int> ys(100);
147 for (
int x = 0; x < 100; x++) {
149 10 * cos(x * 0.2 - mouse_x * 0.05) +
151 5 * sin(x * 0.3 - mouse_y * 0.05));
153 for (
int x = 0; x < 100; x++) {
154 c.DrawPointLine(x, 50 + ys[x], x, 50 - ys[x], Color::Red);
157 return canvas(std::move(c));
160 auto renderer_plot_3 = Renderer([&] {
161 auto c =
Canvas(100, 100);
162 c.DrawText(0, 0,
"A 2D gaussian plot");
167 float my = (mouse_y - 90) / -5.f;
168 float mx = (mouse_x - 3 * my) / 5.f;
169 std::vector<std::vector<float>> ys(size, std::vector<float>(size));
170 for (
int y = 0; y < size; y++) {
171 for (
int x = 0; x < size; x++) {
174 ys[y][x] = -1.5f + 3.0f * std::exp(-0.2f * (dx * dx + dy * dy));
177 for (
int y = 0; y < size; y++) {
178 for (
int x = 0; x < size; x++) {
181 static_cast<int>(5 * (x - 1) + 3 * (y - 0)),
182 static_cast<int>(90 - 5 * (y - 0) - 5 * ys[y][x - 1]),
183 static_cast<int>(5 * (x - 0) + 3 * (y - 0)),
184 static_cast<int>(90 - 5 * (y - 0) - 5 * ys[y][x]));
188 static_cast<int>(5 * (x - 0) + 3 * (y - 1)),
189 static_cast<int>(90 - 5 * (y - 1) - 5 * ys[y - 1][x]),
190 static_cast<int>(5 * (x - 0) + 3 * (y - 0)),
191 static_cast<int>(90 - 5 * (y - 0) - 5 * ys[y][x]));
196 return canvas(std::move(c));
199 int selected_tab = 12;
200 auto tab = Container::Tab(
202 renderer_line_braille,
204 renderer_circle_braille,
205 renderer_circle_block,
206 renderer_circle_filled_braille,
207 renderer_circle_filled_block,
208 renderer_ellipse_braille,
209 renderer_ellipse_block,
210 renderer_ellipse_filled_braille,
211 renderer_ellipse_filled_block,
222 auto tab_with_mouse = CatchEvent(tab, [&](
Event e) {
224 mouse_x = (e.
mouse().x - 1) * 2;
225 mouse_y = (e.
mouse().y - 1) * 4;
230 std::vector<std::string> tab_titles = {
235 "circle filled (braille)",
236 "circle filled (block)",
239 "ellipse filled (braille)",
240 "ellipse filled (block)",
246 auto tab_toggle = Menu(&tab_titles, &selected_tab);
248 auto component = Container::Horizontal({
254 auto component_renderer = Renderer(component, [&] {
256 tab_with_mouse->Render(),
258 tab_toggle->Render(),
263 auto screen = App::FitComponent();
264 screen.Loop(component_renderer);