#include <cmath>
#include <memory>
#include <string>
#include <utility>
#include <vector>
int mouse_x = 0;
int mouse_y = 0;
auto renderer_line_braille = Renderer([&] {
c.DrawText(0, 0, "Plusieurs lignes (braille)");
c.DrawPointLine(mouse_x, mouse_y, 80, 10, Color::Red);
c.DrawPointLine(80, 10, 80, 40, Color::Blue);
c.DrawPointLine(80, 40, mouse_x, mouse_y, Color::Green);
return canvas(std::move(c));
});
auto renderer_line_block = Renderer([&] {
c.DrawText(0, 0, "Plusieurs lignes (bloc)");
c.DrawBlockLine(mouse_x, mouse_y, 80, 10, Color::Red);
c.DrawBlockLine(80, 10, 80, 40, Color::Blue);
c.DrawBlockLine(80, 40, mouse_x, mouse_y, Color::Green);
return canvas(std::move(c));
});
auto renderer_circle_braille = Renderer([&] {
c.DrawText(0, 0, "Un cercle (braille)");
c.DrawPointCircle(mouse_x, mouse_y, 30);
return canvas(std::move(c));
});
auto renderer_circle_block = Renderer([&] {
c.DrawText(0, 0, "Un cercle (bloc)");
c.DrawBlockCircle(mouse_x, mouse_y, 30);
return canvas(std::move(c));
});
auto renderer_circle_filled_braille = Renderer([&] {
c.DrawText(0, 0, "Un cercle rempli (braille)");
c.DrawPointCircleFilled(mouse_x, mouse_y, 30);
return canvas(std::move(c));
});
auto renderer_circle_filled_block = Renderer([&] {
c.DrawText(0, 0, "Un cercle rempli (bloc)");
c.DrawBlockCircleFilled(mouse_x, mouse_y, 30);
return canvas(std::move(c));
});
auto renderer_ellipse_braille = Renderer([&] {
c.DrawText(0, 0, "Une ellipse (braille)");
c.DrawPointEllipse(mouse_x / 2, mouse_y / 2, mouse_x / 2, mouse_y / 2);
return canvas(std::move(c));
});
auto renderer_ellipse_block = Renderer([&] {
c.DrawText(0, 0, "Une ellipse (bloc)");
c.DrawBlockEllipse(mouse_x / 2, mouse_y / 2, mouse_x / 2, mouse_y / 2);
return canvas(std::move(c));
});
auto renderer_ellipse_filled_braille = Renderer([&] {
c.DrawText(0, 0, "Une ellipse remplie (braille)");
c.DrawPointEllipseFilled(mouse_x / 2, mouse_y / 2, mouse_x / 2,
mouse_y / 2);
return canvas(std::move(c));
});
auto renderer_ellipse_filled_block = Renderer([&] {
c.DrawText(0, 0, "Une ellipse remplie (bloc)");
c.DrawBlockEllipseFilled(mouse_x / 2, mouse_y / 2, mouse_x / 2,
mouse_y / 2);
c.DrawBlockEllipse(mouse_x / 2, mouse_y / 2, mouse_x / 2, mouse_y / 2);
return canvas(std::move(c));
});
auto renderer_text = Renderer([&] {
c.DrawText(0, 0, "Un morceau de texte");
c.DrawText(mouse_x, mouse_y, "Ceci est un morceau de texte avec des effets",
});
return canvas(std::move(c));
});
auto renderer_plot_1 = Renderer([&] {
c.DrawText(0, 0, "Un graphique");
std::vector<int> ys(100);
for (int x = 0; x < 100; x++) {
float dx = float(x - mouse_x);
float dy = 50.f;
ys[x] = int(dy + 20 * cos(dx * 0.14) + 10 * sin(dx * 0.42));
}
for (int x = 1; x < 99; x++) {
c.DrawPointLine(x, ys[x], x + 1, ys[x + 1]);
}
return canvas(std::move(c));
});
auto renderer_plot_2 = Renderer([&] {
c.DrawText(0, 0, "Un graphique symétrique rempli");
std::vector<int> ys(100);
for (int x = 0; x < 100; x++) {
ys[x] = int(30 +
10 * cos(x * 0.2 - mouse_x * 0.05) +
5 * sin(x * 0.4) +
5 * sin(x * 0.3 - mouse_y * 0.05));
}
for (int x = 0; x < 100; x++) {
c.DrawPointLine(x, 50 + ys[x], x, 50 - ys[x], Color::Red);
}
return canvas(std::move(c));
});
auto renderer_plot_3 = Renderer([&] {
c.DrawText(0, 0, "Un tracé gaussien 2D");
int size = 15;
float my = (mouse_y - 90) / -5.f;
float mx = (mouse_x - 3 * my) / 5.f;
std::vector<std::vector<float>> ys(size, std::vector<float>(size));
for (int y = 0; y < size; y++) {
for (int x = 0; x < size; x++) {
float dx = x - mx;
float dy = y - my;
ys[y][x] = -1.5 + 3.0 * std::exp(-0.2f * (dx * dx + dy * dy));
}
}
for (int y = 0; y < size; y++) {
for (int x = 0; x < size; x++) {
if (x != 0) {
c.DrawPointLine(
5 * (x - 1) + 3 * (y - 0), 90 - 5 * (y - 0) - 5 * ys[y][x - 1],
5 * (x - 0) + 3 * (y - 0), 90 - 5 * (y - 0) - 5 * ys[y][x]);
}
if (y != 0) {
c.DrawPointLine(
5 * (x - 0) + 3 * (y - 1), 90 - 5 * (y - 1) - 5 * ys[y - 1][x],
5 * (x - 0) + 3 * (y - 0), 90 - 5 * (y - 0) - 5 * ys[y][x]);
}
}
}
return canvas(std::move(c));
});
int selected_tab = 12;
auto tab = Container::Tab(
{
renderer_line_braille,
renderer_line_block,
renderer_circle_braille,
renderer_circle_block,
renderer_circle_filled_braille,
renderer_circle_filled_block,
renderer_ellipse_braille,
renderer_ellipse_block,
renderer_ellipse_filled_braille,
renderer_ellipse_filled_block,
renderer_plot_1,
renderer_plot_2,
renderer_plot_3,
renderer_text,
},
&selected_tab);
auto tab_with_mouse = CatchEvent(tab, [&](
Event e) {
mouse_x = (e.
mouse().x - 1) * 2;
mouse_y = (e.
mouse().y - 1) * 4;
}
return false;
});
std::vector<std::string> tab_titles = {
"ligne (braille)",
"ligne (bloc)",
"cercle (braille)",
"cercle (bloc)",
"cercle rempli (braille)",
"cercle rempli (bloc)",
"ellipse (braille)",
"ellipse (bloc)",
"ellipse remplie (braille)",
"ellipse remplie (bloc)",
"graphique_1 simple",
"graphique_2 rempli",
"graphique_3 3D",
"texte",
};
auto tab_toggle = Menu(&tab_titles, &selected_tab);
auto component = Container::Horizontal({
tab_with_mouse,
tab_toggle,
});
auto component_renderer = Renderer(component, [&] {
return hbox({
tab_with_mouse->Render(),
separator(),
tab_toggle->Render(),
}) |
border;
});
auto screen = ScreenInteractive::FitComponent();
screen.Loop(component_renderer);
return 0;
}
Représente un événement. Il peut s'agir d'un événement de touche, d'un redimensionnement de terminal,...
Canvas est un tampon dessinable associé aux opérations de dessin.
Un caractère Unicode et son style associé.
L'espace de noms FTXUI ftxui::