39class ResizeDecorator :
public NodeDecorator {
47 : NodeDecorator(std::move(child)),
58 for (
int y = box_.y_min; y <= box_.y_max; ++y) {
59 auto& cell =
screen.PixelAt(box_.x_min, y);
60 cell.foreground_color =
color_;
61 cell.automerge =
false;
65 for (
int y = box_.y_min; y <= box_.y_max; ++y) {
66 auto& cell =
screen.PixelAt(box_.x_max, y);
67 cell.foreground_color =
color_;
68 cell.automerge =
false;
72 for (
int x = box_.x_min; x <= box_.x_max; ++x) {
73 auto& cell =
screen.PixelAt(x, box_.y_min);
74 cell.foreground_color =
color_;
75 cell.automerge =
false;
79 for (
int x = box_.x_min; x <= box_.x_max; ++x) {
80 auto& cell =
screen.PixelAt(x, box_.y_max);
81 cell.foreground_color =
color_;
82 cell.automerge =
false;
94Element DefaultRenderState(
const WindowRenderState& state) {
105 element = std::make_shared<ResizeDecorator>(
117class WindowImpl :
public ComponentBase,
public WindowOptions {
119 explicit WindowImpl(WindowOptions option) : WindowOptions(std::move(option)) {
130 const bool captureable =
133 const WindowRenderState state = {
140 (resize_right_hover_ || resize_right_) && captureable,
142 (resize_down_hover_ || resize_down_) && captureable,
145 element = render ? render(state) : DefaultRenderState(state);
148 element |=
reflect(box_window_);
149 element |= PositionAndSize(
left(),
top(), width(), height());
155 bool OnEvent(Event event)
final {
160 if (!event.is_mouse()) {
164 mouse_hover_ = box_window_.Contain(event.mouse().x, event.mouse().y);
166 resize_down_hover_ =
false;
167 resize_top_hover_ =
false;
168 resize_left_hover_ =
false;
169 resize_right_hover_ =
false;
172 resize_left_hover_ =
event.mouse().x ==
left() + box_.x_min;
173 resize_right_hover_ =
174 event.mouse().x ==
left() + width() - 1 + box_.x_min;
175 resize_top_hover_ =
event.mouse().y ==
top() + box_.y_min;
176 resize_down_hover_ =
event.mouse().y ==
top() + height() - 1 + box_.y_min;
179 resize_top_hover_ &= resize_top();
180 resize_left_hover_ &= resize_left();
181 resize_down_hover_ &= resize_down();
182 resize_right_hover_ &= resize_right();
185 if (captured_mouse_) {
187 captured_mouse_ =
nullptr;
192 width() =
left() + width() -
event.mouse().x + box_.x_min;
193 left() =
event.mouse().x - box_.x_min;
197 width() =
event.mouse().x - resize_start_x - box_.x_min;
201 height() =
top() + height() -
event.mouse().y + box_.y_min;
202 top() =
event.mouse().y - box_.y_min;
206 height() =
event.mouse().y - resize_start_y - box_.y_min;
210 left() =
event.mouse().x - drag_start_x - box_.x_min;
211 top() =
event.mouse().y - drag_start_y - box_.y_min;
215 width() = std::max<int>(width(),
static_cast<int>(
title().
size() + 2));
216 height() = std::max<int>(height(), 2);
230 if (!CaptureMouse(event)) {
243 captured_mouse_ = CaptureMouse(event);
244 if (!captured_mouse_) {
253 resize_start_x =
event.mouse().x - width() - box_.x_min;
254 resize_start_y =
event.mouse().y - height() - box_.y_min;
255 drag_start_x =
event.mouse().x -
left() - box_.x_min;
256 drag_start_y =
event.mouse().y -
top() - box_.y_min;
267 int drag_start_x = 0;
268 int drag_start_y = 0;
269 int resize_start_x = 0;
270 int resize_start_y = 0;
272 bool mouse_hover_ =
false;
279 bool resize_top_hover_ =
false;
280 bool resize_left_hover_ =
false;
281 bool resize_down_hover_ =
false;
282 bool resize_right_hover_ =
false;
Element Render()
Dibuja el componente. Construye un ftxui::Element para ser dibujado en la ftxui::Screen representando...
static ScreenInteractive * Active()
Devuelve la pantalla actualmente activa, o nulo si no hay ninguna.
CapturedMouse CaptureMouse()
Intenta obtener el bloqueo único para poder capturar el ratón.
virtual bool OnEvent(Event)
Llamado en respuesta a un evento.
Component Window(WindowOptions option)
Una ventana arrastrable y redimensionable. Para usar varias, deben apilarse usando el componente Cont...
friend void Render(Screen &screen, Node *node, Selection &selection)
Element window(Element title, Element content, BorderStyle border=ROUNDED)
Draw window with a title and a border around the element.
Element clear_under(Element element)
Antes de dibujar |child|, limpia los píxeles de abajo. Esto es útil en combinación con dbox.
Decorator size(WidthOrHeight, Constraint, int value)
Aplica una restricción al tamaño de un elemento.
Element text(std::wstring text)
Muestra un fragmento de texto Unicode.
Element dim(Element)
Usa una fuente clara para elementos con menos énfasis.
void Render(Screen &screen, const Element &element)
Muestra un elemento en un ftxui::Screen.
Color
Color es una enumeración que representa el soporte de color de la terminal.
El espacio de nombres ftxui:: de FTXUI.
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)
Un contenedor que muestra elementos horizontalmente uno por uno.
Decorator reflect(Box &box)
std::shared_ptr< ComponentBase > Component