FTXUI 6.1.9
C++ functional terminal UI.
Loading...
Searching...
No Matches
flexbox_gallery.cpp
Go to the documentation of this file.
1// Copyright 2020 Arthur Sonzogni. All rights reserved.
2// このソースコードの使用は、LICENSEファイルにあるMITライセンスに準拠しています。
3#include <stddef.h> // size_t用
4#include <memory> // shared_ptr, __shared_ptr_access, アロケータ用
5#include <string> // string, basic_string, to_string, operator+, char_traits用
6#include <vector> // vector用
7
8#include "ftxui/component/captured_mouse.hpp" // FTXUIライブラリ用
9#include "ftxui/component/component.hpp" // Radiobox, Vertical, Checkbox, Horizontal, Renderer, ResizableSplitBottom, ResizableSplitRightコンポーネント用
10#include "ftxui/component/component_base.hpp" // ComponentBase用
11#include "ftxui/component/screen_interactive.hpp" // ScreenInteractive用
12#include "ftxui/dom/elements.hpp" // text, window, operator|, vbox, hbox, Element, flexbox, bgcolor, filler, flex, size, border, hcenter, color, EQUAL, bold, dim, notflex, xflex_grow, yflex_grow, HEIGHT, WIDTH要素用
13#include "ftxui/dom/flexbox_config.hpp" // FlexboxConfig, FlexboxConfig::AlignContent, FlexboxConfig::JustifyContent, FlexboxConfig::AlignContent::Center, FlexboxConfig::AlignItems, FlexboxConfig::Direction, FlexboxConfig::JustifyContent::Center, FlexboxConfig::Wrap設定用
14#include "ftxui/screen/color.hpp" // Color, Color::Black色用
15
16using namespace ftxui;
17
18int main() {
19 auto screen = ScreenInteractive::Fullscreen();
20
21 int direction_index = 0;
22 int wrap_index = 0;
23 int justify_content_index = 0;
24 int align_items_index = 0;
25 int align_content_index = 0;
26
27 std::vector<std::string> directions = {
28 "行",
29 "行反転",
30 "列",
31 "列反転",
32 };
33
34 std::vector<std::string> wraps = {
35 "折り返さない",
36 "折り返す",
37 "折り返し反転",
38 };
39
40 std::vector<std::string> justify_content = {
41 "フレックス開始", "フレックス終了", "中央", "ストレッチ",
42 "均等配置(間隔あり)", "均等配置(周囲間隔あり)", "均等配置(均等間隔)",
43 };
44
45 std::vector<std::string> align_items = {
46 "フレックス開始",
47 "フレックス終了",
48 "中央",
49 "ストレッチ",
50 };
51
52 std::vector<std::string> align_content = {
53 "フレックス開始", "フレックス終了", "中央", "ストレッチ",
54 "均等配置(間隔あり)", "均等配置(周囲間隔あり)", "均等配置(均等間隔)",
55 };
56
57 auto radiobox_direction = Radiobox(&directions, &direction_index);
58 auto radiobox_wrap = Radiobox(&wraps, &wrap_index);
59 auto radiobox_justify_content =
60 Radiobox(&justify_content, &justify_content_index);
61 auto radiobox_align_items = Radiobox(&align_items, &align_items_index);
62 auto radiobox_align_content = Radiobox(&align_content, &align_content_index);
63
64 bool element_xflex_grow = false;
65 bool element_yflex_grow = false;
66 bool group_xflex_grow = true;
67 bool group_yflex_grow = true;
68 auto checkbox_element_xflex_grow =
69 Checkbox("要素 |= xflex_grow", &element_xflex_grow);
70 auto checkbox_element_yflex_grow =
71 Checkbox("要素 |= yflex_grow", &element_yflex_grow);
72 auto checkbox_group_xflex_grow =
73 Checkbox("グループ |= xflex_grow", &group_xflex_grow);
74 auto checkbox_group_yflex_grow =
75 Checkbox("グループ |= yflex_grow", &group_yflex_grow);
76
77 auto make_box = [&](size_t dimx, size_t dimy, size_t index) {
78 std::string title = std::to_string(dimx) + "x" + std::to_string(dimy);
79 auto element = window(text(title) | hcenter | bold,
80 text(std::to_string(index)) | hcenter | dim) |
81 size(WIDTH, EQUAL, dimx) | size(HEIGHT, EQUAL, dimy) |
82 bgcolor(Color::HSV(index * 25, 255, 255)) |
84 if (element_xflex_grow) {
85 element = element | xflex_grow;
86 }
87 if (element_yflex_grow) {
88 element = element | yflex_grow;
89 }
90 return element;
91 };
92
93 auto content_renderer = Renderer([&] {
94 FlexboxConfig config;
95 config.direction = static_cast<FlexboxConfig::Direction>(direction_index);
96 config.wrap = static_cast<FlexboxConfig::Wrap>(wrap_index);
97 config.justify_content =
98 static_cast<FlexboxConfig::JustifyContent>(justify_content_index);
99 config.align_items =
100 static_cast<FlexboxConfig::AlignItems>(align_items_index);
101 config.align_content =
102 static_cast<FlexboxConfig::AlignContent>(align_content_index);
103
104 auto group = flexbox(
105 {
106 make_box(8, 4, 0),
107 make_box(9, 6, 1),
108 make_box(11, 6, 2),
109 make_box(10, 4, 3),
110 make_box(13, 7, 4),
111 make_box(12, 4, 5),
112 make_box(12, 5, 6),
113 make_box(10, 4, 7),
114 make_box(12, 4, 8),
115 make_box(10, 5, 9),
116 },
117 config);
118
119 group = group | bgcolor(Color::Black);
120
121 group = group | notflex;
122
123 if (!group_xflex_grow) {
124 group = hbox(group, filler());
125 }
126 if (!group_yflex_grow) {
127 group = vbox(group, filler());
128 }
129
130 group = group | flex;
131 return group;
132 });
133
134 auto center = FlexboxConfig()
137 int space_right = 10;
138 int space_bottom = 1;
139 content_renderer = ResizableSplitRight(
140 Renderer([&] { return flexbox({text("サイズ変更可能")}, center); }),
141 content_renderer, &space_right);
142 content_renderer = ResizableSplitBottom(
143 Renderer([&] { return flexbox({text("サイズ変更可能")}, center); }),
144 content_renderer, &space_bottom);
145
146 auto main_container = Container::Vertical({
147 Container::Horizontal({
148 radiobox_direction,
149 radiobox_wrap,
150 Container::Vertical({
151 checkbox_element_xflex_grow,
152 checkbox_element_yflex_grow,
153 checkbox_group_xflex_grow,
154 checkbox_group_yflex_grow,
155 }),
156 }),
157 Container::Horizontal({
158 radiobox_justify_content,
159 radiobox_align_items,
160 radiobox_align_content,
161 }),
162 content_renderer,
163 });
164
165 auto main_renderer = Renderer(main_container, [&] {
166 return vbox({
167 vbox({hbox({
168 window(text("FlexboxConfig::方向"),
169 radiobox_direction->Render()),
170 window(text("FlexboxConfig::折り返し"), radiobox_wrap->Render()),
171 window(text("その他:"),
172 vbox({
173 checkbox_element_xflex_grow->Render(),
174 checkbox_element_yflex_grow->Render(),
175 checkbox_group_xflex_grow->Render(),
176 checkbox_group_yflex_grow->Render(),
177 })),
178 }),
179 hbox({
180 window(text("FlexboxConfig::コンテンツ配置"),
181 radiobox_justify_content->Render()),
182 window(text("FlexboxConfig::アイテム配置"),
183 radiobox_align_items->Render()),
184 window(text("FlexboxConfig::コンテンツ整列"),
185 radiobox_align_content->Render()),
186 })}),
187 content_renderer->Render() | flex | border,
188 });
189 });
190
191 screen.Loop(main_renderer);
192
193 return 0;
194}
Element make_box(int x, int y)
static ScreenInteractive Fullscreen()
Component Radiobox(RadioboxOption options)
1つだけ選択できる要素のリスト。
Component Renderer(Component child, std::function< Element()>)
|child|に似ていますが、|render|をComponentRender()イベントとして使用する新しいコンポーネントを返します。
Component ResizableSplitRight(Component main, Component back, int *main_size)
2つのコンポーネント間の水平分割。マウスで設定可能。
Component ResizableSplitBottom(Component main, Component back, int *main_size)
2つのコンポーネント間の垂直分割。マウスで設定可能。
Component Checkbox(CheckboxOption options)
チェック可能な要素を描画します。
@ Center
アイテムは交差軸の中央に配置されます。
virtual void Render(Screen &screen)
要素をftxui::Screenに表示します。
Definition node.cpp:59
JustifyContent justify_content
@ Center
アイテムは行の中央に配置されます。
FlexboxConfig & Set(FlexboxConfig::Direction)
フレックスボックスの方向を設定します。
Decorator bgcolor(Color)
背景色を使用して装飾します。
Element xflex_grow(Element)
可能であればX軸上で拡大します。
Definition flex.cpp:144
Element flex(Element)
子要素をコンテナに残されたスペースに比例して拡大させます。
Definition flex.cpp:120
Element center(Element)
要素を水平方向および垂直方向に中央揃えします。
Element text(std::wstring text)
ユニコードテキストを表示します。
Definition text.cpp:160
Element yflex_grow(Element)
可能であればY軸上で拡大します。
Definition flex.cpp:150
Element notflex(Element)
要素を柔軟にしないようにします。
Definition flex.cpp:174
Element filler()
コンテナに残されたスペースに比例して拡大する要素。
Definition flex.cpp:96
Decorator color(Color)
前景色を使用して装飾します。
Element vbox(Elements)
要素を縦に一つずつ表示するコンテナ。
Definition vbox.cpp:94
FlexboxConfigは、flexboxコンテナのレイアウトプロパティを定義する構成構造体です。
static Color HSV(uint8_t hue, uint8_t saturation, uint8_t value)
HSV表現から色を構築します。 https://en.wikipedia.org/wiki/HSL_and_HSV.
FTXUI ftxui:: 名前空間
Definition animation.hpp:9
Element flexbox(Elements, FlexboxConfig config=FlexboxConfig())
行/列に要素を表示し、一杯になると次の列/行に折り返すことができるコンテナ。
Definition flexbox.cpp:250
Element hbox(Elements)
要素を水平方向に1つずつ表示するコンテナ。
Definition hbox.cpp:93
Element border(Element)
Element window(Element title, Element content, BorderStyle border=ROUNDED)
return size
Definition string.cpp:1516