38class ResizeDecorator :
public NodeDecorator {
46 : NodeDecorator(std::move(child)),
53 void Render(Screen& screen)
override {
57 for (
int y = box_.y_min; y <= box_.y_max; ++y) {
58 auto& cell = screen.PixelAt(box_.x_min, y);
59 cell.foreground_color =
color_;
60 cell.automerge =
false;
64 for (
int y = box_.y_min; y <= box_.y_max; ++y) {
65 auto& cell = screen.PixelAt(box_.x_max, y);
66 cell.foreground_color =
color_;
67 cell.automerge =
false;
71 for (
int x = box_.x_min; x <= box_.x_max; ++x) {
72 auto& cell = screen.PixelAt(x, box_.y_min);
73 cell.foreground_color =
color_;
74 cell.automerge =
false;
78 for (
int x = box_.x_min; x <= box_.x_max; ++x) {
79 auto& cell = screen.PixelAt(x, box_.y_max);
80 cell.foreground_color =
color_;
81 cell.automerge =
false;
93Element DefaultRenderState(
const WindowRenderState& state) {
104 element = std::make_shared<ResizeDecorator>(
116class WindowImpl :
public ComponentBase,
public WindowOptions {
118 explicit WindowImpl(WindowOptions option) : WindowOptions(std::move(option)) {
129 const bool captureable =
132 const WindowRenderState state = {
139 (resize_right_hover_ || resize_right_) && captureable,
141 (resize_down_hover_ || resize_down_) && captureable,
144 element = render ? render(state) : DefaultRenderState(state);
147 element |=
reflect(box_window_);
148 element |= PositionAndSize(
left(),
top(), width(), height());
154 bool OnEvent(Event event)
final {
159 if (!event.is_mouse()) {
163 mouse_hover_ = box_window_.Contain(event.mouse().x, event.mouse().y);
165 resize_down_hover_ =
false;
166 resize_top_hover_ =
false;
167 resize_left_hover_ =
false;
168 resize_right_hover_ =
false;
171 resize_left_hover_ =
event.mouse().x ==
left() + box_.x_min;
172 resize_right_hover_ =
173 event.mouse().x ==
left() + width() - 1 + box_.x_min;
174 resize_top_hover_ =
event.mouse().y ==
top() + box_.y_min;
175 resize_down_hover_ =
event.mouse().y ==
top() + height() - 1 + box_.y_min;
178 resize_top_hover_ &= resize_top();
179 resize_left_hover_ &= resize_left();
180 resize_down_hover_ &= resize_down();
181 resize_right_hover_ &= resize_right();
184 if (captured_mouse_) {
186 captured_mouse_ =
nullptr;
191 width() =
left() + width() -
event.mouse().x + box_.x_min;
192 left() =
event.mouse().x - box_.x_min;
196 width() =
event.mouse().x - resize_start_x - box_.x_min;
200 height() =
top() + height() -
event.mouse().y + box_.y_min;
201 top() =
event.mouse().y - box_.y_min;
205 height() =
event.mouse().y - resize_start_y - box_.y_min;
209 left() =
event.mouse().x - drag_start_x - box_.x_min;
210 top() =
event.mouse().y - drag_start_y - box_.y_min;
214 width() = std::max<int>(width(),
static_cast<int>(title().
size() + 2));
215 height() = std::max<int>(height(), 2);
229 if (!CaptureMouse(event)) {
242 captured_mouse_ = CaptureMouse(event);
243 if (!captured_mouse_) {
252 resize_start_x =
event.mouse().x - width() - box_.x_min;
253 resize_start_y =
event.mouse().y - height() - box_.y_min;
254 drag_start_x =
event.mouse().x -
left() - box_.x_min;
255 drag_start_y =
event.mouse().y -
top() - box_.y_min;
266 int drag_start_x = 0;
267 int drag_start_y = 0;
268 int resize_start_x = 0;
269 int resize_start_y = 0;
271 bool mouse_hover_ =
false;
278 bool resize_top_hover_ =
false;
279 bool resize_left_hover_ =
false;
280 bool resize_down_hover_ =
false;
281 bool resize_right_hover_ =
false;
Element Render()
コンポーネントを描画します。 このftxui::ComponentBaseを表すftxui::Screen上に描画されるftxui::Elementを構築します。レンダリングを変更するにはOnRende...
static ScreenInteractive * Active()
現在アクティブな画面を返します。アクティブな画面がない場合はヌルを返します。
CapturedMouse CaptureMouse()
マウスをキャプチャできることに関するユニークロックを取得しようとします。
virtual bool OnEvent(Event)
イベントに応じて呼び出されます。
Component Window(WindowOptions option)
ドラッグ可能/サイズ変更可能なウィンドウ。複数のウィンドウを使用するには、それらを Container::Stacked({...})コンポーネントを使用してスタックする必要があります。
friend void Render(Screen &screen, Node *node, Selection &selection)
Element clear_under(Element element)
|child|を描画する前に、下にあるピクセルをクリアします。これは、 dboxと組み合わせて使用すると便利です。
Element text(std::wstring text)
ユニコードテキストを表示します。
Element dim(Element)
強調を抑えたい要素に、明るいフォントを使用します。
void Render(Screen &screen, const Element &element)
要素をftxui::Screenに表示します。
Element vbox(Elements)
要素を縦に一つずつ表示するコンテナ。
Color
Colorは、ターミナルの色サポートを表す列挙型です。
std::function< Element(Element)> Decorator
std::unique_ptr< CapturedMouseInterface > CapturedMouse
std::shared_ptr< T > Make(Args &&... args)
std::shared_ptr< Node > Element
Element hbox(Elements)
要素を水平方向に1つずつ表示するコンテナ。
Element window(Element title, Element content, BorderStyle border=ROUNDED)
Decorator reflect(Box &box)
std::shared_ptr< ComponentBase > Component