FTXUI 6.1.9
C++ functional terminal UI.
载入中...
搜索中...
未找到
src/ftxui/component/renderer.cpp
浏览该文件的文档.
1// 版权所有 2021 Arthur Sonzogni. 保留所有权利。
2// 本源代码的使用受 MIT 许可证的约束,该许可证可在以下文件中找到:
3// LICENSE 文件。
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| 作为
42/// Component::Render() 事件。
43/// @param child 用于转发事件的组件。
44/// @param render 绘制界面的函数。
45/// @ingroup component
46///
47/// ### 示例
48///
49/// ```cpp
50/// auto screen = ScreenInteractive::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/// @param render 绘制界面的函数,接受一个布尔值,指示
69/// 该组件是否被聚焦。
70/// @ingroup component
71///
72/// ### 示例
73///
74/// ```cpp
75/// auto screen = ScreenInteractive::TerminalOutput();
76/// auto renderer = Renderer([] (bool focused) {
77/// if (focused)
78/// return text("My interface") | inverted;
79/// else
80/// return text("My interface");
81/// });
82/// screen.Loop(renderer);
83/// ```
84Component Renderer(std::function<Element(bool)> render) {
85 class Impl : public ComponentBase {
86 public:
87 explicit Impl(std::function<Element(bool)> render)
88 : render_(std::move(render)) {}
89
90 private:
91 Element OnRender() override { return render_(Focused()) | reflect(box_); }
92 bool Focusable() const override { return true; }
93 bool OnEvent(Event event) override {
94 if (event.is_mouse() && box_.Contain(event.mouse().x, event.mouse().y)) {
95 if (!CaptureMouse(event)) {
96 return false;
97 }
98
99 TakeFocus();
100 }
101
102 return false;
103 }
104 Box box_;
105
106 std::function<Element(bool)> render_;
107 };
108 return Make<Impl>(std::move(render));
109}
110
111/// @brief 装饰一个组件,通过装饰其渲染内容。
112/// @param decorator 修改其渲染元素的函数。
113/// @ingroup component
114///
115/// ### 示例
116///
117/// ```cpp
118/// auto screen = ScreenInteractive::TerminalOutput();
119/// auto renderer =
120// Renderer([] { return text("Hello");)
121/// | Renderer(bold)
122/// | Renderer(inverted);
123/// screen.Loop(renderer);
124/// ```
126 return [decorator](Component component) { // NOLINT
127 return Renderer(component, [component, decorator] {
128 return component->Render() | decorator;
129 });
130 };
131}
132
133} // namespace ftxui
bool is_mouse() const
struct Mouse mouse
它将自身实现为 ftxui::Element。它通过响应 ftxui::Event 来实现键盘导航。
Component Renderer(Component child, std::function< Element()>)
返回一个新组件,类似于 |child|,但使用 |render| 作为 Component::Render() 事件。
代表一个事件。它可以是按键事件、终端大小调整等等...
Box是一个表示2D空间中矩形区域的结构体。
定义 box.hpp:15
#include "ftxui/component/component_base.hpp" // 用于 ComponentBase
std::shared_ptr< T > Make(Args &&... args)
std::shared_ptr< Node > Element
std::function< Element(Element)> ElementDecorator
std::function< Component(Component)> ComponentDecorator
std::shared_ptr< ComponentBase > Component