FTXUI 6.1.9
C++ functional terminal UI.
Loading...
Searching...
No Matches
hoverable.cpp
Go to the documentation of this file.
1// Copyright 2022 Arthur Sonzogni. Todos los derechos reservados.
2// El uso de este código fuente se rige por la licencia MIT que se puede encontrar en
3// el archivo LICENSE.
4#include <functional> // for function
5#include <utility> // for move
6
7#include "ftxui/component/component.hpp" // for ComponentDecorator, Hoverable, Make
8#include "ftxui/component/component_base.hpp" // for ComponentBase
9#include "ftxui/component/event.hpp" // for Event
10#include "ftxui/component/mouse.hpp" // for Mouse
11#include "ftxui/component/screen_interactive.hpp" // for Component, ScreenInteractive
12#include "ftxui/dom/elements.hpp" // for operator|, reflect, Element
13#include "ftxui/screen/box.hpp" // for Box
14
15namespace ftxui {
16
17namespace {
18
19void Post(std::function<void()> f) {
20 if (auto* screen = ScreenInteractive::Active()) {
21 screen->Post(std::move(f));
22 return;
23 }
24 f();
25}
26
27} // namespace
28
29/// @brief Envuelve un componente. Permite saber si el ratón lo está "hovering".
30/// @param component El componente envuelto.
31/// @param hover El valor que refleja si el componente está siendo "hovering" o no.
32/// @ingroup component
33///
34/// ### Ejemplo
35///
36/// ```cpp
37/// auto button = Button("exit", screen.ExitLoopClosure());
38/// bool hover = false;
39/// auto button_hover = Hoverable(button, &hover);
40/// ```
41// NOLINTNEXTLINE
42Component Hoverable(Component component, bool* hover) {
43 class Impl : public ComponentBase {
44 public:
45 Impl(Component component, bool* hover)
46 : component_(std::move(component)), hover_(hover) {
47 Add(component_);
48 }
49
50 private:
51 Element OnRender() override {
52 return ComponentBase::OnRender() | reflect(box_);
53 }
54
55 bool OnEvent(Event event) override {
56 if (event.is_mouse()) {
57 *hover_ = box_.Contain(event.mouse().x, event.mouse().y) &&
58 CaptureMouse(event);
59 }
60
61 return ComponentBase::OnEvent(event);
62 }
63
64 Component component_;
65 bool* hover_;
66 Box box_;
67 };
68
69 return Make<Impl>(component, hover);
70}
71
72/// @brief Envuelve un componente. Utiliza callbacks.
73/// @param component El componente envuelto.
74/// @param on_enter Callback OnEnter (al entrar el ratón)
75/// @param on_leave Callback OnLeave (al salir el ratón)
76/// @ingroup component
77///
78/// ### Ejemplo
79///
80/// ```cpp
81/// auto button = Button("exit", screen.ExitLoopClosure());
82/// bool hover = false;
83/// auto button_hover = Hoverable(button, &hover);
84/// ```
86 std::function<void()> on_enter,
87 std::function<void()> on_leave) {
88 class Impl : public ComponentBase {
89 public:
90 Impl(Component component,
91 std::function<void()> on_enter,
92 std::function<void()> on_leave)
93 : component_(std::move(component)),
94 on_enter_(std::move(on_enter)),
95 on_leave_(std::move(on_leave)) {
96 Add(component_);
97 }
98
99 private:
100 Element OnRender() override {
101 return ComponentBase::OnRender() | reflect(box_);
102 }
103
104 bool OnEvent(Event event) override {
105 if (event.is_mouse()) {
106 const bool hover = box_.Contain(event.mouse().x, event.mouse().y) &&
107 CaptureMouse(event);
108 if (hover != hover_) {
109 Post(hover ? on_enter_ : on_leave_);
110 }
111 hover_ = hover;
112 }
113
114 return ComponentBase::OnEvent(event);
115 }
116
117 Component component_;
118 Box box_;
119 bool hover_ = false;
120 std::function<void()> on_enter_;
121 std::function<void()> on_leave_;
122 };
123
124 return Make<Impl>(std::move(component), std::move(on_enter),
125 std::move(on_leave));
126}
127
128/// @brief Envuelve un componente. Permite saber si el ratón lo está "hovering".
129/// @param hover El valor que refleja si el componente está siendo "hovering" o no.
130/// @ingroup component
131///
132/// ### Ejemplo
133///
134/// ```cpp
135/// bool hover = false;
136/// auto button = Button("exit", screen.ExitLoopClosure());
137/// button |= Hoverable(&hover);
138/// ```
140 return [hover](Component component) {
141 return Hoverable(std::move(component), hover);
142 };
143}
144
145/// @brief Envuelve un componente. Permite saber si el ratón lo está "hovering".
146/// @param on_enter se llama cuando el ratón entra en el componente.
147/// @param on_leave se llama cuando el ratón sale del componente.
148/// @ingroup component
149///
150/// ### Ejemplo
151///
152/// ```cpp
153/// auto button = Button("exit", screen.ExitLoopClosure());
154/// int on_enter_cnt = 0;
155/// int on_leave_cnt = 0;
156/// button |= Hoverable(
157/// [&]{ on_enter_cnt++; },
158/// [&]{ on_leave_cnt++; }
159/// );
160/// ```
161// NOLINTNEXTLINE
162ComponentDecorator Hoverable(std::function<void()> on_enter,
163 // NOLINTNEXTLINE
164 std::function<void()> on_leave) {
165 return [on_enter, on_leave](Component component) {
166 return Hoverable(std::move(component), on_enter, on_leave);
167 };
168}
169
170/// @brief Envuelve un componente. Permite saber si el ratón lo está "hovering".
171/// @param component el componente envuelto.
172/// @param on_change se llama cuando el ratón entra o sale del componente.
173/// @ingroup component
174///
175/// ### Ejemplo
176///
177/// ```cpp
178/// auto button = Button("exit", screen.ExitLoopClosure());
179/// bool hovered = false;
180/// auto button_hoverable = Hoverable(button,
181/// [&](bool hover) { hovered = hover;});
182/// ```
183// NOLINTNEXTLINE
184Component Hoverable(Component component, std::function<void(bool)> on_change) {
185 return Hoverable(
186 std::move(component), //
187 [on_change] { on_change(true); }, //
188 [on_change] { on_change(false); } //
189 );
190}
191
192/// @brief Envuelve un componente. Permite saber si el ratón lo está "hovering".
193/// @param on_change se llama cuando el ratón entra o sale del componente.
194/// @ingroup component
195///
196/// ### Ejemplo
197///
198/// ```cpp
199/// auto button = Button("exit", screen.ExitLoopClosure());
200/// bool hovered = false;
201/// button |= Hoverable([&](bool hover) { hovered = hover;});
202/// ```
203// NOLINTNEXTLINE
204ComponentDecorator Hoverable(std::function<void(bool)> on_change) {
205 return [on_change](Component component) {
206 return Hoverable(std::move(component), on_change);
207 };
208}
209
210} // namespace ftxui
auto screen
bool is_mouse() const
Definition event.hpp:109
struct Mouse mouse
Definition event.hpp:144
static ScreenInteractive * Active()
Devuelve la pantalla actualmente activa, o nulo si no hay ninguna.
Implementa el renderizado de sí mismo como ftxui::Element. Implementa la navegación por teclado respo...
Component Hoverable(Component component, bool *hover)
Envuelve un componente. Permite saber si el ratón lo está "hovering".
Definition hoverable.cpp:42
Representa un evento. Puede ser un evento de pulsación de tecla, un redimensionamiento de terminal,...
Definition event.hpp:29
Box es una estructura que representa un área rectangular en un espacio 2D.
Definition box.hpp:16
El espacio de nombres ftxui:: de 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< Component(Component)> ComponentDecorator
Definition component.hpp:32
std::shared_ptr< ComponentBase > Component