FTXUI 7.0.3
C++ functional terminal UI.
Loading...
Searching...
No Matches
catch_event.cpp
Go to the documentation of this file.
1// Copyright 2021 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/component.hpp" // for Make, CatchEvent, ComponentDecorator
8#include "ftxui/component/component_base.hpp" // for Component, ComponentBase
9#include "ftxui/component/event.hpp" // for Event
10
11namespace ftxui {
12
13class CatchEventBase : public ComponentBase {
14 public:
15 // コンストラクタ。
16 explicit CatchEventBase(std::function<bool(Event)> on_event)
17 : on_event_(std::move(on_event)) {}
18
19 // コンポーネントの実装。
20 Component ActiveChild() override {
21 return Active() ? ComponentBase::ActiveChild() : nullptr;
22 }
23
24 bool OnEvent(Event event) override {
25 if (on_event_(event)) {
26 return true;
27 } else {
28 return ComponentBase::OnEvent(event);
29 }
30 }
31
32 protected:
33 std::function<bool(Event)> on_event_;
34};
35
36/// @brief |on_event| を使ってイベントをキャッチするコンポーネントを返します。この
37/// 関数は、イベントが処理された場合はtrueを、そうでない場合はfalseを返す
38/// 必要があります。
39/// @param child ラップされるコンポーネント。
40/// @param on_event インターフェースを描画する関数。
41/// @ingroup component
42///
43/// ### Example
44///
45/// ```cpp
46/// auto screen = App::TerminalOutput();
47/// auto renderer = Renderer([] {
48/// return text("My interface");
49/// });
50/// auto component = CatchEvent(renderer, [&](Event event) {
51/// if (event == Event::Character('q')) {
52/// screen.ExitLoopClosure()();
53/// return true;
54/// }
55/// return false;
56/// });
57/// screen.Loop(component);
58/// ```
60 std::function<bool(Event event)> on_event) {
61 auto out = Make<CatchEventBase>(std::move(on_event));
62 out->Add(std::move(child));
63 return out;
64}
65
66/// @brief |on_event| を使ってイベントをキャッチするコンポーネントを装飾します。この
67/// 関数は、イベントが処理された場合はtrueを、そうでない場合はfalseを返す
68/// 必要があります。
69/// @param on_event インターフェースを描画する関数。
70/// @ingroup component
71///
72/// ### Example
73///
74/// ```cpp
75/// auto screen = App::TerminalOutput();
76/// auto renderer = Renderer([] { return text("Hello world"); });
77/// renderer |= CatchEvent([&](Event event) {
78/// if (event == Event::Character('q')) {
79/// screen.ExitLoopClosure()();
80/// return true;
81/// }
82/// return false;
83/// });
84/// screen.Loop(renderer);
85/// ```
86ComponentDecorator CatchEvent(std::function<bool(Event)> on_event) {
87 return [on_event = std::move(on_event)](Component child) {
88 return CatchEvent(std::move(child), [on_event = on_event](Event event) {
89 return on_event(std::move(event));
90 });
91 };
92}
93
94} // namespace ftxui
FTXUI ftxui::名前空間
Definition animation.hpp:11
std::shared_ptr< T > Make(Args &&... args)
Definition component.hpp:28
std::function< Component(Component)> ComponentDecorator
Definition component.hpp:33
std::shared_ptr< ComponentBase > Component
Definition app.hpp:23
Component CatchEvent(Component child, std::function< bool(Event)>)