FTXUI 7.0.3
C++ functional terminal UI.
Loading...
Searching...
No Matches
flex.cpp
Go to the documentation of this file.
1// Copyright 2020 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 <memory> // for make_shared, __shared_ptr_access
5#include <utility> // for move
6
7#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
8#include "ftxui/dom/node.hpp" // for Elements, Node
9#include "ftxui/dom/requirement.hpp" // for Requirement
10#include "ftxui/screen/box.hpp" // for Box
11
12namespace ftxui {
13
14namespace {
15
16class Flex : public Node {
17 public:
18 Flex(int grow_x, int grow_y, int shrink_x, int shrink_y)
19 : grow_x_(grow_x),
20 grow_y_(grow_y),
21 shrink_x_(shrink_x),
22 shrink_y_(shrink_y) {}
23 Flex(Element child, int grow_x, int grow_y, int shrink_x, int shrink_y)
24 : Node(unpack(std::move(child))),
25 grow_x_(grow_x),
26 grow_y_(grow_y),
27 shrink_x_(shrink_x),
28 shrink_y_(shrink_y) {}
29
30 void ComputeRequirement() override {
31 requirement_.min_x = 0;
32 requirement_.min_y = 0;
33 if (!children_.empty()) {
34 children_[0]->ComputeRequirement();
35 requirement_ = children_[0]->requirement();
36 }
37 if (grow_x_ != -1) {
38 requirement_.flex_grow_x = grow_x_;
39 }
40 if (grow_y_ != -1) {
41 requirement_.flex_grow_y = grow_y_;
42 }
43 if (shrink_x_ != -1) {
44 requirement_.flex_shrink_x = shrink_x_;
45 }
46 if (shrink_y_ != -1) {
47 requirement_.flex_shrink_y = shrink_y_;
48 }
49 }
50
51 void SetBox(Box box) override {
52 Node::SetBox(box);
53 if (children_.empty()) {
54 return;
55 }
56 children_[0]->SetBox(box);
57 }
58
63};
64
65} // namespace
66
67/// @brief 一個會依照容器中剩餘空間
68/// 按比例擴展的元素。
69/// @ingroup dom
71 return std::make_shared<Flex>(1, 1, 1, 1);
72}
73
74/// @brief 讓子元素依比例擴展以填滿容器中剩餘的空間。
75/// @ingroup dom
76///
77/// #### 範例:
78///
79/// ~~~cpp
80/// hbox({
81/// text("left") | border ,
82/// text("middle") | border | flex,
83/// text("right") | border,
84/// });
85/// ~~~
86///
87/// #### 輸出:
88///
89/// ~~~bash
90/// ┌────┐┌─────────────────────────────────────────────────────────┐┌─────┐
91/// │left││middle ││right│
92/// └────┘└─────────────────────────────────────────────────────────┘└─────┘
93/// ~~~
95 return std::make_shared<Flex>(std::move(child), 1, 1, 1, 1);
96}
97
98/// @brief 在 X 軸上盡可能擴展/在需要時最小化。
99/// @ingroup dom
101 return std::make_shared<Flex>(std::move(child), 1, -1, 1, -1);
102}
103
104/// @brief 在 Y 軸上盡可能擴展/在需要時最小化。
105/// @ingroup dom
107 return std::make_shared<Flex>(std::move(child), -1, 1, -1, 1);
108}
109
110/// @brief 盡可能擴展。
111/// @ingroup dom
113 return std::make_shared<Flex>(std::move(child), 1, 1, -1, -1);
114}
115
116/// @brief 在 X 軸上盡可能擴展。
117/// @ingroup dom
119 return std::make_shared<Flex>(std::move(child), 1, -1, -1, -1);
120}
121
122/// @brief 在 Y 軸上盡可能擴展。
123/// @ingroup dom
125 return std::make_shared<Flex>(std::move(child), -1, 1, -1, -1);
126}
127
128/// @brief 在需要時最小化。
129/// @ingroup dom
131 return std::make_shared<Flex>(std::move(child), -1, -1, 1, 1);
132}
133
134/// @brief 在 X 軸上在需要時最小化。
135/// @ingroup dom
137 return std::make_shared<Flex>(std::move(child), -1, -1, 1, -1);
138}
139
140/// @brief 在 Y 軸上在需要時最小化。
141/// @ingroup dom
143 return std::make_shared<Flex>(std::move(child), -1, -1, -1, 1);
144}
145
146/// @brief 使元素不可伸縮。
147/// @ingroup dom
149 return std::make_shared<Flex>(std::move(child), 0, 0, 0, 0);
150}
151
153 return [grow, shrink](Element child) {
154 return std::make_shared<Flex>(std::move(child), grow, grow, shrink, shrink);
155 };
156}
157
159 return [grow](Element child) {
160 return std::make_shared<Flex>(std::move(child), grow, grow, -1, -1);
161 };
162}
163
165 return [shrink](Element child) {
166 return std::make_shared<Flex>(std::move(child), -1, -1, shrink, shrink);
167 };
168}
169
171 return [grow, shrink](Element child) {
172 return std::make_shared<Flex>(std::move(child), grow, -1, shrink, -1);
173 };
174}
175
177 return [grow](Element child) {
178 return std::make_shared<Flex>(std::move(child), grow, -1, -1, -1);
179 };
180}
181
183 return [shrink](Element child) {
184 return std::make_shared<Flex>(std::move(child), -1, -1, shrink, -1);
185 };
186}
187
189 return [grow, shrink](Element child) {
190 return std::make_shared<Flex>(std::move(child), -1, grow, -1, shrink);
191 };
192}
193
195 return [grow](Element child) {
196 return std::make_shared<Flex>(std::move(child), -1, grow, -1, -1);
197 };
198}
199
201 return [shrink](Element child) {
202 return std::make_shared<Flex>(std::move(child), -1, -1, -1, shrink);
203 };
204}
205
206} // namespace ftxui
int grow_y_
Definition flex.cpp:60
int shrink_y_
Definition flex.cpp:62
int shrink_x_
Definition flex.cpp:61
int grow_x_
Definition flex.cpp:59
Element xflex(Element)
在 X 軸上盡可能擴展/在需要時最小化。
Definition flex.cpp:100
Element xflex_grow(Element)
在 X 軸上盡可能擴展。
Definition flex.cpp:118
Element flex(Element child)
讓子元素依比例擴展以填滿容器中剩餘的空間。
Definition flex.cpp:94
Element yflex(Element)
在 Y 軸上盡可能擴展/在需要時最小化。
Definition flex.cpp:106
Element flex_shrink(Element child)
在需要時最小化。
Definition flex.cpp:130
Element yflex_grow(Element)
在 Y 軸上盡可能擴展。
Definition flex.cpp:124
Element flex_grow(Element child)
盡可能擴展。
Definition flex.cpp:112
Element notflex(Element child)
使元素不可伸縮。
Definition flex.cpp:148
Element xflex_shrink(Element)
在 X 軸上在需要時最小化。
Definition flex.cpp:136
Element filler()
一個會依照容器中剩餘空間 按比例擴展的元素。
Definition flex.cpp:70
Element yflex_shrink(Element)
在 Y 軸上在需要時最小化。
Definition flex.cpp:142
FTXUI ftxui:: 命名空間
Definition animation.hpp:11
Decorator yflex_shrink_factor(int shrink)
Definition flex.cpp:200
std::shared_ptr< Node > Element
Definition elements.hpp:25
Decorator xflex_grow_factor(int grow)
Definition flex.cpp:176
Decorator yflex_grow_factor(int grow)
Definition flex.cpp:194
Decorator yflex_factor(int grow, int shrink)
Definition flex.cpp:188
std::function< Element(Element)> Decorator
Definition elements.hpp:27
Decorator flex_shrink_factor(int shrink)
Definition flex.cpp:164
Decorator flex_grow_factor(int grow)
Definition flex.cpp:158
int shrink
Definition elements.hpp:162
Decorator xflex_shrink_factor(int shrink)
Definition flex.cpp:182
Decorator xflex_factor(int grow, int shrink)
Definition flex.cpp:170
Decorator flex_factor(int grow, int shrink)
Definition flex.cpp:152