FTXUI 7.0.3
C++ functional terminal UI.
Loading...
Searching...
No Matches
src/ftxui/component/renderer.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, 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 |render| を使ってインターフェースを描画するコンポーネントを返します。
17/// @param render インターフェースを描画する関数。
18/// @ingroup component
19///
20/// ### Example
21///
22/// ```cpp
23/// auto screen = App::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 |child| に似た、|render| をComponent::Render()イベントとして
42/// 使用する新しいComponentを返します。
43/// @param child イベントを転送するコンポーネント。
44/// @param render インターフェースを描画する関数。
45/// @ingroup component
46///
47/// ### Example
48///
49/// ```cpp
50/// auto screen = App::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 |render| を使ってインターフェースを描画するフォーカス可能な
68/// コンポーネントを返します。
69/// @param render インターフェースを描画する関数で、コンポーネントが
70/// フォーカスされているかどうかを示すブール値を受け取ります。
71/// @ingroup component
72///
73/// ### Example
74///
75/// ```cpp
76/// auto screen = App::TerminalOutput();
77/// auto renderer = Renderer([] (bool focused) {
78/// if (focused)
79/// return text("My interface") | inverted;
80/// else
81/// return text("My interface");
82/// });
83/// screen.Loop(renderer);
84/// ```
85Component Renderer(std::function<Element(bool)> render) {
86 class Impl : public ComponentBase {
87 public:
88 explicit Impl(std::function<Element(bool)> render)
89 : render_(std::move(render)) {}
90
91 private:
92 Element OnRender() override { return render_(Focused()) | reflect(box_); }
93 bool Focusable() const override { return true; }
94 bool OnEvent(Event event) override {
95 if (event.is_mouse() && box_.Contain(event.mouse().x, event.mouse().y)) {
96 if (!CaptureMouse(event)) {
97 return false;
98 }
99
100 TakeFocus();
101 }
102
103 return false;
104 }
105 Box box_;
106
107 std::function<Element(bool)> render_;
108 };
109 return Make<Impl>(std::move(render));
110}
111
112/// @brief コンポーネントが描画するものを装飾することで、コンポーネントを
113/// 装飾します。
114/// @param decorator コンポーネントが描画する要素を変更する関数。
115/// @ingroup component
116///
117/// ### Example
118///
119/// ```cpp
120/// auto screen = App::TerminalOutput();
121/// auto renderer =
122/// Renderer([] { return text("Hello"); })
123/// | Renderer(bold)
124/// | Renderer(inverted);
125/// screen.Loop(renderer);
126/// ```
128 return [decorator](Component component) { // NOLINT
129 return Renderer(component, [component, decorator] {
130 return component->Render() | decorator;
131 });
132 };
133}
134
135} // namespace ftxui
Component Renderer(Component child, std::function< Element()>)
|child| に似た、|render| をComponent::Render()イベントとして 使用する新しいComponentを返します。
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< Element(Element)> ElementDecorator
Definition component.hpp:34
std::function< Component(Component)> ComponentDecorator
Definition component.hpp:33
std::shared_ptr< ComponentBase > Component
Definition app.hpp:23