FTXUI 6.1.9
C++ functional terminal UI.
Chargement...
Recherche...
Aucune correspondance
src/ftxui/component/renderer.cpp
Aller à la documentation de ce fichier.
1// Copyright 2021 Arthur Sonzogni. Tous droits réservés.
2// L'utilisation de ce code source est régie par la licence MIT qui peut être trouvée
3// dans le fichier LICENSE.
4#include <functional> // for function
5#include <utility> // for move
6
7#include "ftxui/component/component.hpp" // for Make, Renderer
8#include "ftxui/component/component_base.hpp" // for Component, ComponentBase
9#include "ftxui/component/event.hpp" // for Event
10#include "ftxui/component/mouse.hpp" // for Mouse
11#include "ftxui/dom/elements.hpp" // for Element, operator|, reflect
12#include "ftxui/screen/box.hpp" // for Box
13
14namespace ftxui {
15
16/// @brief Renvoie un composant, utilisant |render| pour afficher son interface.
17/// @param render La fonction dessinant l'interface.
18/// @ingroup component
19///
20/// ### Exemple
21///
22/// ```cpp
23/// auto screen = ScreenInteractive::TerminalOutput();
24/// auto renderer = Renderer([] {
25/// return text("My interface");
26/// });
27/// screen.Loop(renderer);
28/// ```
29Component Renderer(std::function<Element()> render) {
30 class Impl : public ComponentBase {
31 public:
32 explicit Impl(std::function<Element()> render)
33 : render_(std::move(render)) {}
34 Element OnRender() override { return render_(); }
35 std::function<Element()> render_;
36 };
37
38 return Make<Impl>(std::move(render));
39}
40
41/// @brief Renvoie un nouveau composant, similaire à |child|, mais utilisant |render| comme événement
42/// Component::Render().
43/// @param child Le composant auquel transmettre les événements.
44/// @param render La fonction dessinant l'interface.
45/// @ingroup component
46///
47/// ### Exemple
48///
49/// ```cpp
50/// auto screen = ScreenInteractive::TerminalOutput();
51/// std::string label = "Click to quit";
52/// auto button = Button(&label, screen.ExitLoopClosure());
53/// auto renderer = Renderer(button, [&] {
54/// return hbox({
55/// text("A button:"),
56/// button->Render(),
57/// });
58/// });
59/// screen.Loop(renderer);
60/// ```
61Component Renderer(Component child, std::function<Element()> render) {
62 Component renderer = Renderer(std::move(render));
63 renderer->Add(std::move(child));
64 return renderer;
65}
66
67/// @brief Renvoie un composant focusable, utilisant |render| pour afficher son interface.
68/// @param render La fonction dessinant l'interface, prenant un booléen indiquant
69/// si le composant est focus ou non.
70/// @ingroup component
71///
72/// ### Exemple
73///
74/// ```cpp
75/// auto screen = ScreenInteractive::TerminalOutput();
76/// auto renderer = Renderer([] (bool focused) {
77/// if (focused)
78/// return text("My interface") | inverted;
79/// else
80/// return text("My interface");
81/// });
82/// screen.Loop(renderer);
83/// ```
84Component Renderer(std::function<Element(bool)> render) {
85 class Impl : public ComponentBase {
86 public:
87 explicit Impl(std::function<Element(bool)> render)
88 : render_(std::move(render)) {}
89
90 private:
91 Element OnRender() override { return render_(Focused()) | reflect(box_); }
92 bool Focusable() const override { return true; }
93 bool OnEvent(Event event) override {
94 if (event.is_mouse() && box_.Contain(event.mouse().x, event.mouse().y)) {
95 if (!CaptureMouse(event)) {
96 return false;
97 }
98
99 TakeFocus();
100 }
101
102 return false;
103 }
104 Box box_;
105
106 std::function<Element(bool)> render_;
107 };
108 return Make<Impl>(std::move(render));
109}
110
111/// @brief Décore un composant, en décorant ce qu'il rend.
112/// @param decorator la fonction modifiant l'élément qu'il rend.
113/// @ingroup component
114///
115/// ### Exemple
116///
117/// ```cpp
118/// auto screen = ScreenInteractive::TerminalOutput();
119/// auto renderer =
120/// Renderer([] { return text("Hello");)
121/// | Renderer(bold)
122/// | Renderer(inverted);
123/// screen.Loop(renderer);
124/// ```
126 return [decorator](Component component) { // NOLINT
127 return Renderer(component, [component, decorator] {
128 return component->Render() | decorator;
129 });
130 };
131}
132
133} // namespace ftxui
void Add(Component children)
Ajoute un enfant. @param child L'enfant à attacher.
Definition component.cpp:70
bool is_mouse() const
Definition event.hpp:108
struct Mouse mouse
Definition event.hpp:143
Il implémente son propre rendu en tant que ftxui::Element. Il implémente la navigation au clavier en ...
Component Renderer(Component child, std::function< Element()>)
Renvoie un nouveau composant, similaire à |child|, mais utilisant |render| comme événement Component:...
Représente un événement. Il peut s'agir d'un événement de touche, d'un redimensionnement de terminal,...
Definition event.hpp:28
Box est une structure qui représente une zone rectangulaire dans un espace 2D.
Definition box.hpp:16
L'espace de noms FTXUI ftxui::
Definition animation.hpp:10
std::shared_ptr< T > Make(Args &&... args)
Definition component.hpp:27
std::shared_ptr< Node > Element
Definition elements.hpp:22
std::function< Element(Element)> ElementDecorator
Definition component.hpp:33
std::function< Component(Component)> ComponentDecorator
Definition component.hpp:32
std::shared_ptr< ComponentBase > Component