FTXUI 6.1.9
C++ functional terminal UI.
Loading...
Searching...
No Matches
component.cpp
Go to the documentation of this file.
1// Copyright 2020 Arthur Sonzogni. Todos los derechos reservados.
2// El uso de este código fuente se rige por la licencia MIT que se puede encontrar en
3// el archivo LICENSE.
4#include <algorithm> // para find_if
5#include <cassert> // para assert
6#include <cstddef> // para size_t
7#include <iterator> // para begin, end
8#include <memory> // para unique_ptr, make_unique
9#include <utility> // para move
10#include <vector> // para vector, __alloc_traits<>::value_type
11
12#include "ftxui/component/captured_mouse.hpp" // for CapturedMouse, CapturedMouseInterface
14#include "ftxui/component/component_base.hpp" // for ComponentBase, Components
15#include "ftxui/component/event.hpp" // for Event
16#include "ftxui/component/screen_interactive.hpp" // for Component, ScreenInteractive
17#include "ftxui/dom/elements.hpp" // for text, Element
18#include "ftxui/dom/node.hpp" // for Node, Elements
19#include "ftxui/screen/box.hpp" // for Box
20
21namespace ftxui::animation {
22class Params;
23} // namespace ftxui::animation
24
25namespace ftxui {
26
27namespace {
28class CaptureMouseImpl : public CapturedMouseInterface {};
29} // namespace
30
34
35/// @brief Devuelve el ComponentBase padre, o nulo si no tiene.
36/// @see Detach
37/// @see Parent
39 return parent_;
40}
41
42/// @brief Accede al hijo en el índice `i`.
44 assert(i < ChildCount()); // NOLINT
45 return children_[i];
46}
47
48/// @brief Devuelve el número de hijos.
50 return children_.size();
51}
52
53/// @brief Devuelve el índice del componente en su padre. -1 si no tiene padre.
55 if (parent_ == nullptr) {
56 return -1;
57 }
58 int index = 0;
59 for (const Component& child : parent_->children_) {
60 if (child.get() == this) {
61 return index;
62 }
63 index++;
64 }
65 return -1; // No alcanzado.
66}
67
68/// @brief Agrega un hijo.
69/// @@param child El hijo a adjuntar.
71 child->Detach();
72 child->parent_ = this;
73 children_.push_back(std::move(child));
74}
75
76/// @brief Desvincula este hijo de su padre.
77/// @see Detach
78/// @see Parent
80 if (parent_ == nullptr) {
81 return;
82 }
83 auto it = std::find_if(std::begin(parent_->children_), //
84 std::end(parent_->children_), //
85 [this](const Component& that) { //
86 return this == that.get();
87 });
88 ComponentBase* parent = parent_;
89 parent_ = nullptr;
90 parent->children_.erase(it); // Podría eliminar |this|.
91}
92
93/// @brief Elimina todos los hijos.
95 while (!children_.empty()) {
96 children_[0]->Detach();
97 }
98}
99
100/// @brief Dibuja el componente.
101/// Construye un ftxui::Element para ser dibujado en la ftxui::Screen representando este
102/// ftxui::ComponentBase. Por favor, anule OnRender() para modificar el renderizado.
104 // Algunos usuarios podrían llamar a `ComponentBase::Render()` desde
105 // `T::OnRender()`. Para evitar la recursión infinita, usamos un indicador.
106 if (in_render) {
108 }
109
110 in_render = true;
111 Element element = OnRender();
112 in_render = false;
113
114 class Wrapper : public Node {
115 public:
116 bool active_ = false;
117
118 Wrapper(Element child, bool active)
119 : Node({std::move(child)}), active_(active) {}
120
121 void SetBox(Box box) override {
122 Node::SetBox(box);
123 children_[0]->SetBox(box);
124 }
125
126 void ComputeRequirement() override {
127 Node::ComputeRequirement();
128 requirement_.focused.component_active = active_;
129 }
130 };
131
132 return std::make_shared<Wrapper>(std::move(element), Active());
133}
134
135/// @brief Dibuja el componente.
136/// Construye un ftxui::Element para ser dibujado en la ftxui::Screen representando este
137/// ftxui::ComponentBase. Esta función está destinada a ser sobrescrita.
139 if (children_.size() == 1) {
140 return children_.front()->Render();
141 }
142
143 return text("Componente no implementado");
144}
145
146/// @brief Llamado en respuesta a un evento.
147/// @param event El evento.
148/// @return Verdadero cuando el evento ha sido manejado.
149/// La implementación predeterminada llama a OnEvent en cada hijo hasta que uno devuelve
150/// verdadero. Si ninguno devuelve verdadero, devuelve falso.
151bool ComponentBase::OnEvent(Event event) { // NOLINT
152 for (Component& child : children_) { // NOLINT
153 if (child->OnEvent(event)) {
154 return true;
155 }
156 }
157 return false;
158}
159
160/// @brief Llamado en respuesta a un evento de animación.
161/// @param params los parámetros de la animación
162/// La implementación predeterminada envía el evento a cada hijo.
164 for (const Component& child : children_) {
165 child->OnAnimation(params);
166 }
167}
168
169/// @brief Devuelve el hijo actualmente activo.
170/// @return el hijo actualmente activo.
172 for (auto& child : children_) {
173 if (child->Focusable()) {
174 return child;
175 }
176 }
177 return nullptr;
178}
179
180/// @brief Devuelve verdadero cuando el componente contiene elementos enfocables.
181/// Los componentes no enfocables se omitirán al navegar con el
182/// teclado.
184 for (const Component& child : children_) { // NOLINT
185 if (child->Focusable()) {
186 return true;
187 }
188 }
189 return false;
190}
191
192/// @brief Devuelve si el elemento es el hijo actualmente activo de su padre.
194 return parent_ == nullptr || parent_->ActiveChild().get() == this;
195}
196
197/// @brief Devuelve si el elemento está enfocado por el usuario.
198/// Verdadero cuando el ComponentBase está enfocado por el usuario. Un elemento está enfocado
199/// cuando es, junto con todos sus ancestros, el ActiveChild() de sus padres, y es
200/// Focusable().
202 const auto* current = this;
203 while (current && current->Active()) {
204 current = current->parent_;
205 }
206 return !current && Focusable();
207}
208
209/// @brief Hace que |child| sea el activo.
210/// @param child el hijo que se activará.
211void ComponentBase::SetActiveChild([[maybe_unused]] ComponentBase* child) {}
212
213/// @brief Hace que |child| sea el activo.
214/// @param child el hijo que se activará.
216 SetActiveChild(child.get());
217}
218
219/// @brief Configura todos los ancestros para dar foco a este componente.
221 ComponentBase* child = this;
222 while (ComponentBase* parent = child->parent_) {
223 parent->SetActiveChild(child);
224 child = parent;
225 }
226}
227
228/// @brief Toma el CapturedMouse si está disponible. Solo hay un componente de
229/// ellos. Representa un componente que toma prioridad sobre otros.
230/// @param event El evento
232 if (event.screen_) {
233 return event.screen_->CaptureMouse();
234 }
235 return std::make_unique<CaptureMouseImpl>();
236}
237
238} // namespace ftxui
virtual bool Focusable() const
Devuelve verdadero cuando el componente contiene elementos enfocables. Los componentes no enfocables ...
bool Focused() const
Devuelve si el elemento está enfocado por el usuario. Verdadero cuando el ComponentBase está enfocado...
CapturedMouse CaptureMouse(const Event &event)
Toma el CapturedMouse si está disponible. Solo hay un componente de ellos. Representa un componente q...
void Add(Component children)
Agrega un hijo. @param child El hijo a adjuntar.
Definition component.cpp:70
Element Render()
Dibuja el componente. Construye un ftxui::Element para ser dibujado en la ftxui::Screen representando...
void TakeFocus()
Configura todos los ancestros para dar foco a este componente.
bool Active() const
Devuelve si el elemento es el hijo actualmente activo de su padre.
ScreenInteractive * screen_
Definition event.hpp:124
virtual Component ActiveChild()
Devuelve el hijo actualmente activo.
void DetachAllChildren()
Elimina todos los hijos.
Definition component.cpp:94
virtual void SetActiveChild(ComponentBase *child)
Hace que |child| sea el activo.
int Index() const
Devuelve el índice del componente en su padre. -1 si no tiene padre.
Definition component.cpp:54
size_t ChildCount() const
Devuelve el número de hijos.
Definition component.cpp:49
ComponentBase * Parent() const
Devuelve el ComponentBase padre, o nulo si no tiene.
Definition component.cpp:38
virtual Element OnRender()
Dibuja el componente. Construye un ftxui::Element para ser dibujado en la ftxui::Screen representando...
virtual bool OnEvent(Event)
Llamado en respuesta a un evento.
void Detach()
Desvincula este hijo de su padre.
Definition component.cpp:79
Component & ChildAt(size_t i)
Accede al hijo en el índice i.
Definition component.cpp:43
virtual ~ComponentBase()
Definition component.cpp:31
virtual void OnAnimation(animation::Params &params)
Llamado en respuesta a un evento de animación.
Implementa el renderizado de sí mismo como ftxui::Element. Implementa la navegación por teclado respo...
Representa un evento. Puede ser un evento de pulsación de tecla, un redimensionamiento de terminal,...
Definition event.hpp:29
Node es la clase base para todos los elementos en el árbol DOM.
Definition node.hpp:37
Element text(std::wstring text)
Muestra un fragmento de texto Unicode.
Definition text.cpp:160
Box es una estructura que representa un área rectangular en un espacio 2D.
Definition box.hpp:16
El espacio de nombres ftxui::animation:: de FTXUI.
Definition animation.hpp:10
El espacio de nombres ftxui:: de FTXUI.
Definition animation.hpp:10
std::unique_ptr< CapturedMouseInterface > CapturedMouse
std::shared_ptr< Node > Element
Definition elements.hpp:22
std::shared_ptr< ComponentBase > Component