FTXUI 6.1.9
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// このソースコードの使用は、LICENSEファイルにあるMITライセンスによって管理されています。
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/// ### 例
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 |child|に似ていますが、|render|をComponent::Render()イベントとして使用する新しいコンポーネントを返します。
42/// @param child イベントを転送するコンポーネント。
43/// @param render インターフェースを描画する関数。
44/// @ingroup component
45///
46/// ### 例
47///
48/// ```cpp
49/// auto screen = ScreenInteractive::TerminalOutput();
50/// std::string label = "Click to quit";
51/// auto button = Button(&label, screen.ExitLoopClosure());
52/// auto renderer = Renderer(button, [&] {
53/// return hbox({
54/// text("A button:"),
55/// button->Render(),
56/// });
57/// });
58/// screen.Loop(renderer);
59/// ```
60Component Renderer(Component child, std::function<Element()> render) {
61 Component renderer = Renderer(std::move(render));
62 renderer->Add(std::move(child));
63 return renderer;
64}
65
66/// @brief インターフェースを描画するために|render|を使用するフォーカス可能なコンポーネントを返します。
67/// @param render コンポーネントがフォーカスされているかどうかを示すブール値を受け取るインターフェースを描画する関数。
68/// @ingroup component
69///
70/// ### 例
71///
72/// ```cpp
73/// auto screen = ScreenInteractive::TerminalOutput();
74/// auto renderer = Renderer([] (bool focused) {
75/// if (focused)
76/// return text("My interface") | inverted;
77/// else
78/// return text("My interface");
79/// });
80/// screen.Loop(renderer);
81/// ```
82Component Renderer(std::function<Element(bool)> render) {
83 class Impl : public ComponentBase {
84 public:
85 explicit Impl(std::function<Element(bool)> render)
86 : render_(std::move(render)) {}
87
88 private:
89 Element OnRender() override { return render_(Focused()) | reflect(box_); }
90 bool Focusable() const override { return true; }
91 bool OnEvent(Event event) override {
92 if (event.is_mouse() && box_.Contain(event.mouse().x, event.mouse().y)) {
93 if (!CaptureMouse(event)) {
94 return false;
95 }
96
97 TakeFocus();
98 }
99
100 return false;
101 }
102 Box box_;
103
104 std::function<Element(bool)> render_;
105 };
106 return Make<Impl>(std::move(render));
107}
108
109/// @brief コンポーネントがレンダリングするものを装飾することによって、コンポーネントを装飾します。
110/// @param decorator 要素をレンダリングする関数。
111/// @ingroup component
112///
113/// ### 例
114///
115/// ```cpp
116/// auto screen = ScreenInteractive::TerminalOutput();
117/// auto renderer =
118// Renderer([] { return text("Hello");)
119/// | Renderer(bold)
120/// | Renderer(inverted);
121/// screen.Loop(renderer);
122/// ```
123ComponentDecorator Renderer(ElementDecorator decorator) { // NOLINT
124 return [decorator](Component component) { // NOLINT
125 return Renderer(component, [component, decorator] {
126 return component->Render() | decorator;
127 });
128 };
129}
130
131} // namespace ftxui
void Add(Component children)
子を追加します。 @param child 添付する子。
Definition component.cpp:69
bool is_mouse() const
Definition event.hpp:108
struct Mouse mouse
Definition event.hpp:143
ftxui::Elementとして自身のレンダリングを実装します。ftxui::Eventに応答してキーボードナビゲーションを実装します。
Component Renderer(Component child, std::function< Element()>)
|child|に似ていますが、|render|をComponentRender()イベントとして使用する新しいコンポーネントを返します。
イベントを表します。キープレスイベント、ターミナルのリサイズなど、さまざまなイベントがあります。
Definition event.hpp:28
Boxは、2D空間における矩形領域を表す構造体です。
Definition box.hpp:14
FTXUI ftxui:: 名前空間
Definition animation.hpp:9
std::shared_ptr< T > Make(Args &&... args)
Definition component.hpp:26
std::shared_ptr< Node > Element
Definition elements.hpp:21
std::shared_ptr< ComponentBase > Component