FTXUI 7.0.3
C++ functional terminal UI.
Loading...
Searching...
No Matches
hoverable.cpp
Go to the documentation of this file.
1// Copyright 2022 Arthur Sonzogni. All rights reserved.
2// Use of this source code is governed by the MIT license that can be found in
3// the LICENSE file.
4#include <functional> // for function
5#include <utility> // for move
6
7#include "ftxui/component/app.hpp" // for Component, App
8#include "ftxui/component/component.hpp" // for ComponentDecorator, Hoverable, Make
9#include "ftxui/component/component_base.hpp" // for ComponentBase
10#include "ftxui/component/event.hpp" // for Event
11#include "ftxui/component/mouse.hpp" // for Mouse
12#include "ftxui/dom/elements.hpp" // for operator|, reflect, Element
13#include "ftxui/screen/box.hpp" // for Box
14
15namespace ftxui {
16
17namespace {} // namespace
18
19/// @brief コンポーネントをラップします。マウスでホバーされているかどうかを知る機能を提供します。
20/// @param component ラップされたコンポーネント。
21/// @param hover コンポーネントがホバーされているかどうかを反映する値。
22/// @ingroup component
23///
24/// ### 例
25///
26/// ```cpp
27/// auto button = Button("exit", screen.ExitLoopClosure());
28/// bool hover = false;
29/// auto button_hover = Hoverable(button, &hover);
30/// ```
31// NOLINTNEXTLINE
32Component Hoverable(Component component, bool* hover) {
33 class Impl : public ComponentBase {
34 public:
35 Impl(Component component, bool* hover)
36 : component_(std::move(component)), hover_(hover) {
37 Add(component_);
38 }
39
40 private:
41 Element OnRender() override {
42 return ComponentBase::OnRender() | reflect(box_);
43 }
44
45 bool OnEvent(Event event) override {
46 if (event.is_mouse()) {
47 *hover_ = box_.Contain(event.mouse().x, event.mouse().y) &&
48 CaptureMouse(event);
49 }
50
51 return ComponentBase::OnEvent(event);
52 }
53
54 Component component_;
55 bool* hover_;
56 Box box_;
57 };
58
59 return Make<Impl>(component, hover);
60}
61
62/// @brief コンポーネントをラップします。コールバックを使用します。
63/// @param component ラップされたコンポーネント。
64/// @param on_enter OnEnterコールバック
65/// @param on_leave OnLeaveコールバック
66/// @ingroup component
67///
68/// ### 例
69///
70/// ```cpp
71/// auto button = Button("exit", screen.ExitLoopClosure());
72/// bool hover = false;
73/// auto button_hover = Hoverable(button, &hover);
74/// ```
76 std::function<void()> on_enter,
77 std::function<void()> on_leave) {
78 class Impl : public ComponentBase {
79 public:
80 Impl(Component component,
81 std::function<void()> on_enter,
82 std::function<void()> on_leave)
83 : component_(std::move(component)),
84 on_enter_(std::move(on_enter)),
85 on_leave_(std::move(on_leave)) {
86 Add(component_);
87 }
88
89 private:
90 Element OnRender() override {
91 return ComponentBase::OnRender() | reflect(box_);
92 }
93
94 bool OnEvent(Event event) override {
95 if (event.is_mouse()) {
96 const bool hover = box_.Contain(event.mouse().x, event.mouse().y) &&
97 CaptureMouse(event);
98 if (hover != hover_) {
99 App::PostEventOrExecute(hover ? on_enter_ : on_leave_);
100 }
101 hover_ = hover;
102 }
103
104 return ComponentBase::OnEvent(event);
105 }
106
107 Component component_;
108 Box box_;
109 bool hover_ = false;
110 std::function<void()> on_enter_;
111 std::function<void()> on_leave_;
112 };
113
114 return Make<Impl>(std::move(component), std::move(on_enter),
115 std::move(on_leave));
116}
117
118/// @brief コンポーネントをラップします。マウスでホバーされているかどうかを知る機能を提供します。
119/// @param hover コンポーネントがホバーされているかどうかを反映する値。
120/// @ingroup component
121///
122/// ### 例
123///
124/// ```cpp
125/// bool hover = false;
126/// auto button = Button("exit", screen.ExitLoopClosure());
127/// button |= Hoverable(&hover);
128/// ```
130 return [hover](Component component) {
131 return Hoverable(std::move(component), hover);
132 };
133}
134
135/// @brief コンポーネントをラップします。マウスでホバーされているかどうかを知る機能を提供します。
136/// @param on_enter マウスがコンポーネントをホバーしたときに呼び出されます。
137/// @param on_leave マウスがコンポーネントから離れたときに呼び出されます。
138/// @ingroup component
139///
140/// ### 例
141///
142/// ```cpp
143/// auto button = Button("exit", screen.ExitLoopClosure());
144/// int on_enter_cnt = 0;
145/// int on_leave_cnt = 0;
146/// button |= Hoverable(
147/// [&]{ on_enter_cnt++; },
148/// [&]{ on_leave_cnt++; }
149/// );
150/// ```
151// NOLINTNEXTLINE
152ComponentDecorator Hoverable(std::function<void()> on_enter,
153 // NOLINTNEXTLINE
154 std::function<void()> on_leave) {
155 return [on_enter, on_leave](Component component) {
156 return Hoverable(std::move(component), on_enter, on_leave);
157 };
158}
159
160/// @brief コンポーネントをラップします。マウスでホバーされているかどうかを知る機能を提供します。
161/// @param component ラップされたコンポーネント。
162/// @param on_change マウスがコンポーネントに入ったとき、または離れたときに呼び出されます。
163/// @ingroup component
164///
165/// ### 例
166///
167/// ```cpp
168/// auto button = Button("exit", screen.ExitLoopClosure());
169/// bool hovered = false;
170/// auto button_hoverable = Hoverable(button,
171/// [&](bool hover) { hovered = hover;});
172/// ```
173// NOLINTNEXTLINE
174Component Hoverable(Component component, std::function<void(bool)> on_change) {
175 return Hoverable(
176 std::move(component), //
177 [on_change] { on_change(true); }, //
178 [on_change] { on_change(false); } //
179 );
180}
181
182/// @brief コンポーネントをラップします。マウスでホバーされているかどうかを知る機能を提供します。
183/// @param on_change マウスがコンポーネントに入ったとき、または離れたときに呼び出されます。
184/// @ingroup component
185///
186/// ### 例
187///
188/// ```cpp
189/// auto button = Button("exit", screen.ExitLoopClosure());
190/// bool hovered = false;
191/// button |= Hoverable([&](bool hover) { hovered = hover;});
192/// ```
193// NOLINTNEXTLINE
194ComponentDecorator Hoverable(std::function<void(bool)> on_change) {
195 return [on_change](Component component) {
196 return Hoverable(std::move(component), on_change);
197 };
198}
199
200} // namespace ftxui
Component Hoverable(Component component, bool *hover)
コンポーネントをラップします。マウスでホバーされているかどうかを知る機能を提供します。
Definition hoverable.cpp:32
FTXUI ftxui::名前空間
Definition animation.hpp:11
std::shared_ptr< T > Make(Args &&... args)
Definition component.hpp:28
std::shared_ptr< Node > Element
Definition elements.hpp:25
std::function< Component(Component)> ComponentDecorator
Definition component.hpp:33
std::shared_ptr< ComponentBase > Component
Definition app.hpp:23