FTXUI 6.1.9
C++ functional terminal UI.
Loading...
Searching...
No Matches
frame.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 <algorithm> // for max, min
5#include <memory> // for make_shared, __shared_ptr_access
6#include <utility> // for move
7
8#include "ftxui/dom/elements.hpp" // for Element, unpack, Elements, focus, frame, select, xframe, yframe
9#include "ftxui/dom/node.hpp" // for Node, Elements
10#include "ftxui/dom/requirement.hpp" // for Requirement
11#include "ftxui/screen/box.hpp" // for Box
12#include "ftxui/screen/screen.hpp" // for Screen, Screen::Cursor
13#include "ftxui/util/autoreset.hpp" // for AutoReset
14
15namespace ftxui {
16
17namespace {
18class Focus : public Node {
19 public:
20 explicit Focus(Elements children) : Node(std::move(children)) {}
21
22 void ComputeRequirement() override {
24 requirement_ = children_[0]->requirement();
25 requirement_.focused.enabled = true;
26 requirement_.focused.node = this;
27 requirement_.focused.box.x_min = 0;
28 requirement_.focused.box.y_min = 0;
29 requirement_.focused.box.x_max = requirement_.min_x - 1;
30 requirement_.focused.box.y_max = requirement_.min_y - 1;
31 }
32
33 void SetBox(Box box) override {
34 Node::SetBox(box);
35 children_[0]->SetBox(box);
36 }
37};
38
39class Frame : public Node {
40 public:
41 Frame(Elements children, bool x_frame, bool y_frame)
42 : Node(std::move(children)), x_frame_(x_frame), y_frame_(y_frame) {}
43
44 void SetBox(Box box) override {
45 Node::SetBox(box);
46 auto& focused_box = requirement_.focused.box;
47 Box children_box = box;
48
49 if (x_frame_) {
50 const int external_dimx = box.x_max - box.x.min;
51 const int internal_dimx = std::max(requirement_.min_x, external_dimx);
52 const int focused_dimx = focused_box.x_max - focused_box.x_min;
53 int dx = focused_box.x_min - external_dimx / 2 + focused_dimx / 2;
54 dx = std::max(0, std::min(internal_dimx - external_dimx - 1, dx));
55 children_box.x_min = box.x_min - dx;
56 children_box.x_max = box.x_min + internal_dimx - dx;
57 }
58
59 if (y_frame_) {
60 const int external_dimy = box.y_max - box.y_min;
61 const int internal_dimy = std::max(requirement_.min_y, external_dimy);
62 const int focused_dimy = focused_box.y_max - focused_box.y_min;
63 int dy = focused_box.y_min - external_dimy / 2 + focused_dimy / 2;
64 dy = std::max(0, std::min(internal_dimy - external_dimy - 1, dy));
65 children_box.y_min = box.y_min - dy;
66 children_box.y_max = box.y_min + internal_dimy - dy;
67 }
68
69 children_[0]->SetBox(children_box);
70 }
71
72 void Render(Screen& screen) override {
73 const AutoReset<Box> stencil(&screen.stencil,
74 Box::Intersection(box_, screen.stencil));
75 children_[0]->Render(screen);
76 }
77
78 private:
79 bool x_frame_;
80 bool y_frame_;
81};
82
83class FocusCursor : public Focus {
84 public:
85 FocusCursor(Elements children, Screen::Cursor::Shape shape)
86 : Focus(std::move(children)), shape_(shape) {}
87
88 private:
89 void ComputeRequirement() override {
90 Focus::ComputeRequirement(); // NOLINT
91 requirement_.focused.cursor_shape = shape_;
92 }
94};
95
96} // namespace
97
98/// @brief 子要素を兄弟要素の中でフォーカスされたものとして設定します。
99/// @param child フォーカスされる要素。
100/// @ingroup dom
102 return std::make_shared<Focus>(unpack(std::move(child)));
103}
104
105/// これは非推奨です。代わりに `focus` を使用してください。
106/// @brief 子要素を兄弟要素の中でフォーカスされたものとして設定します。
107/// @param child フォーカスされる要素。
109 return focus(std::move(child));
110}
111
112/// @brief 要素を「仮想」領域内に表示できるようにします。そのサイズはコンテナよりも大きくすることができます。
113/// この場合、より小さい部分のみが表示されます。フォーカスされた要素を表示するためにビューはスクロール可能です。
114/// @see frame
115/// @see xframe
116/// @see yframe
118 return std::make_shared<Frame>(unpack(std::move(child)), true, true);
119}
120
121/// @brief `frame` と同じですが、x軸のみに適用されます。
122/// @see frame
123/// @see xframe
124/// @see yframe
126 return std::make_shared<Frame>(unpack(std::move(child)), true, false);
127}
128
129/// @brief `frame` と同じですが、y軸のみに適用されます。
130/// @see frame
131/// @see xframe
132/// @see yframe
134 return std::make_shared<Frame>(unpack(std::move(child)), false, true);
135}
136
137/// @brief `focus` と同じですが、カーソル形状を静止ブロックに設定します。
138/// @see focus
139/// @see focusCursorBlock
140/// @see focusCursorBlockBlinking
141/// @see focusCursorBar
142/// @see focusCursorBarBlinking
143/// @see focusCursorUnderline
144/// @see focusCursorUnderlineBlinking
145/// @ingroup dom
147 return std::make_shared<FocusCursor>(unpack(std::move(child)),
149}
150
151/// @brief `focus` と同じですが、カーソル形状を点滅ブロックに設定します。
152/// @see focus
153/// @see focusCursorBlock
154/// @see focusCursorBlockBlinking
155/// @see focusCursorBar
156/// @see focusCursorBarBlinking
157/// @see focusCursorUnderline
158/// @see focusCursorUnderlineBlinking
159/// @ingroup dom
161 return std::make_shared<FocusCursor>(unpack(std::move(child)),
163}
164
165/// @brief `focus` と同じですが、カーソル形状を静止ブロックに設定します。
166/// @see focus
167/// @see focusCursorBlock
168/// @see focusCursorBlockBlinking
169/// @see focusCursorBar
170/// @see focusCursorBarBlinking
171/// @see focusCursorUnderline
172/// @see focusCursorUnderlineBlinking
173/// @ingroup dom
175 return std::make_shared<FocusCursor>(unpack(std::move(child)),
177}
178
179/// @brief `focus` と同じですが、カーソル形状を点滅バーに設定します。
180/// @see focus
181/// @see focusCursorBlock
182/// @see focusCursorBlockBlinking
183/// @see focusCursorBar
184/// @see focusCursorBarBlinking
185/// @see focusCursorUnderline
186/// @see focusCursorUnderlineBlinking
187/// @ingroup dom
189 return std::make_shared<FocusCursor>(unpack(std::move(child)),
191}
192
193/// @brief `focus` と同じですが、カーソル形状を静止下線に設定します。
194/// @see focus
195/// @see focusCursorBlock
196/// @see focusCursorBlockBlinking
197/// @see focusCursorBar
198/// @see focusCursorBarBlinking
199/// @see focusCursorUnderline
200/// @see focusCursorUnderlineBlinking
201/// @ingroup dom
203 return std::make_shared<FocusCursor>(unpack(std::move(child)),
205}
206
207/// @brief `focus` と同じですが、カーソル形状を点滅下線に設定します。
208/// @see focus
209/// @see focusCursorBlock
210/// @see focusCursorBlockBlinking
211/// @see focusCursorBar
212/// @see focusCursorBarBlinking
213/// @see focusCursorUnderline
214/// @see focusCursorUnderlineBlinking
215/// @ingroup dom
217 return std::make_shared<FocusCursor>(unpack(std::move(child)),
219}
220
221} // namespace ftxui
virtual void SetBox(Box box)
描画のために要素に位置と次元を割り当てます。
Definition node.cpp:41
virtual void ComputeRequirement()
要素が必要とするスペースを計算します。
Definition node.cpp:20
Element focusCursorBarBlinking(Element)
focus と同じですが、カーソル形状を点滅バーに設定します。
Definition frame.cpp:188
Element focusCursorUnderlineBlinking(Element)
focus と同じですが、カーソル形状を点滅下線に設定します。
Definition frame.cpp:216
Element focusCursorBar(Element)
focus と同じですが、カーソル形状を静止ブロックに設定します。
Definition frame.cpp:174
Element focusCursorBlock(Element)
focus と同じですが、カーソル形状を静止ブロックに設定します。
Definition frame.cpp:146
Element focusCursorUnderline(Element)
focus と同じですが、カーソル形状を静止下線に設定します。
Definition frame.cpp:202
Element focus(Element)
子要素を兄弟要素の中でフォーカスされたものとして設定します。
Definition frame.cpp:101
void Render(Screen &screen, const Element &element)
要素をftxui::Screenに表示します。
Definition node.cpp:84
Element focusCursorBlockBlinking(Element)
focus と同じですが、カーソル形状を点滅ブロックに設定します。
Definition frame.cpp:160
static auto Intersection(Box a, Box b) -> Box
Definition box.cpp:10
FTXUI ftxui:: 名前空間
Definition animation.hpp:9
std::shared_ptr< Node > Element
Definition elements.hpp:21
Element xframe(Element)
frame と同じですが、x軸のみに適用されます。
Definition frame.cpp:125
std::vector< Element > Elements
Definition elements.hpp:22
Element yframe(Element)
frame と同じですが、y軸のみに適用されます。
Definition frame.cpp:133
Element select(Element e)
子要素を兄弟要素の中でフォーカスされたものとして設定します。
Definition frame.cpp:108
Element frame(Element)
要素を「仮想」領域内に表示できるようにします。そのサイズはコンテナよりも大きくすることができます。 この場合、より小さい部分のみが表示されます。フォーカスされた要素を表示するためにビューはスクロール可能...
Definition frame.cpp:117