FTXUI 6.1.9
C++ functional terminal UI.
Chargement...
Recherche...
Aucune correspondance
component.cpp
Aller à la documentation de ce fichier.
1// Copyright 2020 Arthur Sonzogni. Tous droits réservés.
2// L'utilisation de ce code source est régie par la licence MIT qui peut être trouvée dans
3// le fichier LICENSE.
4#include <algorithm> // for find_if
5#include <cassert> // for assert
6#include <cstddef> // for size_t
7#include <iterator> // for begin, end
8#include <memory> // for unique_ptr, make_unique
9#include <utility> // for move
10#include <vector> // for 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 Retourne le ComponentBase parent, ou nul s'il n'y en a pas.
36/// @see Detach
37/// @see Parent
39 return parent_;
40}
41
42/// @brief Accède à l'enfant à l'index `i`.
44 assert(i < ChildCount()); // NOLINT
45 return children_[i];
46}
47
48/// @brief Retourne le nombre d'enfants.
50 return children_.size();
51}
52
53/// @brief Retourne l'index du composant dans son parent. -1 si pas de parent.
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; // Not reached.
66}
67
68/// @brief Ajoute un enfant.
69/// @@param child L'enfant à attacher.
71 child->Detach();
72 child->parent_ = this;
73 children_.push_back(std::move(child));
74}
75
76/// @brief Détache cet enfant de son parent.
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); // Might delete |this|.
91}
92
93/// @brief Supprime tous les enfants.
95 while (!children_.empty()) {
96 children_[0]->Detach();
97 }
98}
99
100/// @brief Dessine le composant.
101/// Construit un ftxui::Element à dessiner sur l'écran ftxui::Screen représentant ce
102/// ftxui::ComponentBase. Veuillez surcharger OnRender() pour modifier le rendu.
104 // Some users might call `ComponentBase::Render()` from
105 // `T::OnRender()`. To avoid infinite recursion, we use a flag.
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 Dessine le composant.
136/// Construit un ftxui::Element à dessiner sur l'écran ftxui::Screen représentant ce
137/// ftxui::ComponentBase. Cette fonction est destinée à être surchargée.
139 if (children_.size() == 1) {
140 return children_.front()->Render();
141 }
142
143 return text("Not implemented component");
144}
145
146/// @brief Appelé en réponse à un événement.
147/// @param event L'événement.
148/// @return Vrai si l'événement a été géré.
149/// L'implémentation par défaut appelle OnEvent sur chaque enfant jusqu'à ce que l'un d'eux retourne
150/// vrai. Si aucun ne retourne vrai, retourne faux.
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 Appelé en réponse à un événement d'animation.
161/// @param params les paramètres de l'animation
162/// L'implémentation par défaut distribue l'événement à chaque enfant.
164 for (const Component& child : children_) {
165 child->OnAnimation(params);
166 }
167}
168
169/// @brief Retourne l'enfant actuellement actif.
170/// @return l'enfant actuellement actif.
172 for (auto& child : children_) {
173 if (child->Focusable()) {
174 return child;
175 }
176 }
177 return nullptr;
178}
179
180/// @brief Retourne vrai si le composant contient des éléments focusables.
181/// Les composants non focusables seront ignorés lors de la navigation au
182/// clavier.
184 for (const Component& child : children_) { // NOLINT
185 if (child->Focusable()) {
186 return true;
187 }
188 }
189 return false;
190}
191
192/// @brief Indique si l'élément est l'enfant actuellement actif de son parent.
194 return parent_ == nullptr || parent_->ActiveChild().get() == this;
195}
196
197/// @brief Indique si les éléments sont focusés par l'utilisateur.
198/// Vrai lorsque le ComponentBase est focusé par l'utilisateur. Un élément est focusé
199/// lorsqu'il est, avec tous ses ancêtres, l'ActiveChild() de leurs parents, et qu'il est
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 Fait du |child| l'élément "actif".
210/// @param child l'enfant à activer.
211void ComponentBase::SetActiveChild([[maybe_unused]] ComponentBase* child) {}
212
213/// @brief Fait du |child| l'élément "actif".
214/// @param child l'enfant à activer.
216 SetActiveChild(child.get());
217}
218
219/// @brief Configure tous les ancêtres pour donner le focus à ce composant.
221 ComponentBase* child = this;
222 while (ComponentBase* parent = child->parent_) {
223 parent->SetActiveChild(child);
224 child = parent;
225 }
226}
227
228/// @brief Prend le CapturedMouse si disponible. Il n'y en a qu'un seul composant de
229/// eux. Il représente un composant prenant la priorité sur les autres.
230/// @param event L'événement
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
Retourne vrai si le composant contient des éléments focusables. Les composants non focusables seront ...
bool Focused() const
Indique si les éléments sont focusés par l'utilisateur. Vrai lorsque le ComponentBase est focusé par ...
CapturedMouse CaptureMouse(const Event &event)
Prend le CapturedMouse si disponible. Il n'y en a qu'un seul composant de eux. Il représente un compo...
void Add(Component children)
Ajoute un enfant. @param child L'enfant à attacher.
Definition component.cpp:70
Element Render()
Dessine le composant. Construit un ftxui::Element à dessiner sur l'écran ftxui::Screen représentant c...
void TakeFocus()
Configure tous les ancêtres pour donner le focus à ce composant.
bool Active() const
Indique si l'élément est l'enfant actuellement actif de son parent.
ScreenInteractive * screen_
Definition event.hpp:123
virtual Component ActiveChild()
Retourne l'enfant actuellement actif.
void DetachAllChildren()
Supprime tous les enfants.
Definition component.cpp:94
virtual void SetActiveChild(ComponentBase *child)
Fait du |child| l'élément "actif".
int Index() const
Retourne l'index du composant dans son parent. -1 si pas de parent.
Definition component.cpp:54
size_t ChildCount() const
Retourne le nombre d'enfants.
Definition component.cpp:49
ComponentBase * Parent() const
Retourne le ComponentBase parent, ou nul s'il n'y en a pas.
Definition component.cpp:38
virtual Element OnRender()
Dessine le composant. Construit un ftxui::Element à dessiner sur l'écran ftxui::Screen représentant c...
virtual bool OnEvent(Event)
Appelé en réponse à un événement.
void Detach()
Détache cet enfant de son parent.
Definition component.cpp:79
Component & ChildAt(size_t i)
Accède à l'enfant à l'index i.
Definition component.cpp:43
virtual ~ComponentBase()
Definition component.cpp:31
virtual void OnAnimation(animation::Params &params)
Appelé en réponse à un événement d'animation.
Il implémente son propre rendu en tant que ftxui::Element. Il implémente la navigation au clavier en ...
Représente un événement. Il peut s'agir d'un événement de touche, d'un redimensionnement de terminal,...
Definition event.hpp:28
Node est la classe de base pour tous les éléments de l'arbre DOM.
Definition node.hpp:36
Element text(std::wstring text)
Affiche un morceau de texte unicode.
Definition text.cpp:160
Box est une structure qui représente une zone rectangulaire dans un espace 2D.
Definition box.hpp:16
Le namespace FTXUI ftxui::animation::
Definition animation.hpp:10
L'espace de noms FTXUI ftxui::
Definition animation.hpp:10
std::unique_ptr< CapturedMouseInterface > CapturedMouse
std::shared_ptr< Node > Element
Definition elements.hpp:22
std::shared_ptr< ComponentBase > Component