FTXUI 6.1.9
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// このソースコードの使用は、LICENSE ファイルにある MIT ライセンスによって管理されています。
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/// #### Examples:
104///
105/// ~~~cpp
106/// hbox({
107/// text("left") | border ,
108/// text("middle") | border | flex,
109/// text("right") | border,
110/// });
111/// ~~~
112///
113/// #### Output:
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_
Definition flex.cpp:89
virtual void SetBox(Box box)
描画のために要素に位置と次元を割り当てます。
Definition node.cpp:41
Element xflex(Element)
必要に応じてX軸上で拡大・縮小します。
Definition flex.cpp:126
Element xflex_grow(Element)
可能であればX軸上で拡大します。
Definition flex.cpp:144
Element flex(Element)
子要素をコンテナに残されたスペースに比例して拡大させます。
Definition flex.cpp:120
Element yflex(Element)
必要に応じてY軸上で拡大・縮小します。
Definition flex.cpp:132
Element flex_shrink(Element)
必要であれば最小化します。
Definition flex.cpp:156
Element yflex_grow(Element)
可能であればY軸上で拡大します。
Definition flex.cpp:150
Element flex_grow(Element)
可能であれば拡大します。
Definition flex.cpp:138
Element notflex(Element)
要素を柔軟にしないようにします。
Definition flex.cpp:174
Element xflex_shrink(Element)
必要であればX軸上で最小化します。
Definition flex.cpp:162
Element filler()
コンテナに残されたスペースに比例して拡大する要素。
Definition flex.cpp:96
Element yflex_shrink(Element)
必要であればY軸上で最小化します。
Definition flex.cpp:168
FTXUI ftxui:: 名前空間
Definition animation.hpp:9
std::shared_ptr< Node > Element
Definition elements.hpp:21