FTXUI 6.1.9
C++ functional terminal UI.
载入中...
搜索中...
未找到
flex.cpp
浏览该文件的文档.
1// Copyright 2020 Arthur Sonzogni. 保留所有权利。
2// 本源代码的使用受 MIT 许可协议的约束,该协议可在 LICENSE 文件中找到。
3#include <memory> // for make_shared, __shared_ptr_access
4#include <utility> // for move
5
6#include "ftxui/dom/elements.hpp" // for Element, unpack, filler, flex, flex_grow, flex_shrink, notflex, xflex, xflex_grow, xflex_shrink, yflex, yflex_grow, yflex_shrink
7#include "ftxui/dom/node.hpp" // for Elements, Node
8#include "ftxui/dom/requirement.hpp" // for Requirement
9#include "ftxui/screen/box.hpp" // for Box
10
11namespace ftxui {
12
13namespace {
14
15using FlexFunction = void (*)(Requirement&);
16
17void function_flex_grow(Requirement& r) {
18 r.flex_grow_x = 1;
19 r.flex_grow_y = 1;
20}
21
22void function_xflex_grow(Requirement& r) {
23 r.flex_grow_x = 1;
24}
25
26void function_yflex_grow(Requirement& r) {
27 r.flex_grow_y = 1;
28}
29
30void function_flex_shrink(Requirement& r) {
31 r.flex_shrink_x = 1;
32 r.flex_shrink_y = 1;
33}
34
35void function_xflex_shrink(Requirement& r) {
36 r.flex_shrink_x = 1;
37}
38
39void function_yflex_shrink(Requirement& r) {
40 r.flex_shrink_y = 1;
41}
42
43void function_flex(Requirement& r) {
44 r.flex_grow_x = 1;
45 r.flex_grow_y = 1;
46 r.flex_shrink_x = 1;
47 r.flex_shrink_y = 1;
48}
49
50void function_xflex(Requirement& r) {
51 r.flex_grow_x = 1;
52 r.flex_shrink_x = 1;
53}
54
55void function_yflex(Requirement& r) {
56 r.flex_grow_y = 1;
57 r.flex_shrink_y = 1;
58}
59
60void function_not_flex(Requirement& r) {
61 r.flex_grow_x = 0;
62 r.flex_grow_y = 0;
63 r.flex_shrink_x = 0;
64 r.flex_shrink_y = 0;
65}
66
67class Flex : public Node {
68 public:
69 explicit Flex(FlexFunction f) : f_(f) {}
70 Flex(FlexFunction f, Element child) : Node(unpack(std::move(child))), f_(f) {}
71 void ComputeRequirement() override {
72 requirement_.min_x = 0;
73 requirement_.min_y = 0;
74 if (!children_.empty()) {
75 children_[0]->ComputeRequirement();
76 requirement_ = children_[0]->requirement();
77 }
78 f_(requirement_);
79 }
80
81 void SetBox(Box box) override {
82 Node::SetBox(box);
83 if (children_.empty()) {
84 return;
85 }
86 children_[0]->SetBox(box);
87 }
88
89 FlexFunction f_;
90};
91
92} // namespace
93
94/// @brief 一个元素,它将按比例扩展以填充容器中剩余的空间。
95/// @ingroup dom
97 return std::make_shared<Flex>(function_flex);
98}
99
100/// @brief 使子元素按比例扩展以填充容器中剩余的空间。
101/// @ingroup dom
102///
103/// #### 示例:
104///
105/// ~~~cpp
106/// hbox({
107/// text("left") | border ,
108/// text("middle") | border | flex,
109/// text("right") | border,
110/// });
111/// ~~~
112///
113/// #### 输出:
114///
115/// ~~~bash
116/// ┌────┐┌─────────────────────────────────────────────────────────┐┌─────┐
117/// │left││middle ││right│
118/// └────┘└─────────────────────────────────────────────────────────┘└─────┘
119/// ~~~
121 return std::make_shared<Flex>(function_flex, std::move(child));
122}
123
124/// @brief 在 X 轴上尽可能地扩展/收缩。
125/// @ingroup dom
127 return std::make_shared<Flex>(function_xflex, std::move(child));
128}
129
130/// @brief 在 Y 轴上尽可能地扩展/收缩。
131/// @ingroup dom
133 return std::make_shared<Flex>(function_yflex, std::move(child));
134}
135
136/// @brief 如果可能,进行扩展。
137/// @ingroup dom
139 return std::make_shared<Flex>(function_flex_grow, std::move(child));
140}
141
142/// @brief 如果可能,在 X 轴上进行扩展。
143/// @ingroup dom
145 return std::make_shared<Flex>(function_xflex_grow, std::move(child));
146}
147
148/// @brief 如果可能,在 Y 轴上进行扩展。
149/// @ingroup dom
151 return std::make_shared<Flex>(function_yflex_grow, std::move(child));
152}
153
154/// @brief 如果需要,进行收缩。
155/// @ingroup dom
157 return std::make_shared<Flex>(function_flex_shrink, std::move(child));
158}
159
160/// @brief 如果需要,在 X 轴上进行收缩。
161/// @ingroup dom
163 return std::make_shared<Flex>(function_xflex_shrink, std::move(child));
164}
165
166/// @brief 如果需要,在 Y 轴上进行收缩。
167/// @ingroup dom
169 return std::make_shared<Flex>(function_yflex_shrink, std::move(child));
170}
171
172/// @brief 使元素不可伸缩。
173/// @ingroup dom
175 return std::make_shared<Flex>(function_not_flex, std::move(child));
176}
177
178} // namespace ftxui
FlexFunction f_
virtual void SetBox(Box box)
为绘图元素分配位置和尺寸。
Element xflex(Element)
在 X 轴上尽可能地扩展/收缩。
Element xflex_grow(Element)
如果可能,在 X 轴上进行扩展。
Element flex(Element)
使子元素按比例扩展以填充容器中剩余的空间。
Element yflex(Element)
在 Y 轴上尽可能地扩展/收缩。
Element flex_shrink(Element)
如果需要,进行收缩。
Element yflex_grow(Element)
如果可能,在 Y 轴上进行扩展。
Element flex_grow(Element)
如果可能,进行扩展。
Element notflex(Element)
使元素不可伸缩。
Element xflex_shrink(Element)
如果需要,在 X 轴上进行收缩。
Element filler()
一个元素,它将按比例扩展以填充容器中剩余的空间。
Element yflex_shrink(Element)
如果需要,在 Y 轴上进行收缩。
#include "ftxui/component/component_base.hpp" // 用于 ComponentBase
std::shared_ptr< Node > Element