18class ContainerBase :
public ComponentBase {
20 ContainerBase(
Components children,
int* selector)
21 : selector_(selector ? selector : &selected_) {
23 Add(std::move(child));
28 bool OnEvent(Event event)
override {
29 if (event.is_mouse()) {
30 return OnMouseEvent(event);
37 if (ActiveChild() && ActiveChild()->OnEvent(event)) {
41 return EventHandler(event);
53 for (
size_t i = 0; i <
children_.size(); ++i) {
55 *selector_ =
static_cast<int>(i);
63 virtual bool EventHandler(Event ) {
return false; }
65 virtual bool OnMouseEvent(Event event) {
70 int* selector_ =
nullptr;
72 void MoveSelector(
int dir) {
73 for (
int i = *selector_ + dir; i >= 0 && i < int(
children_.size());
82 void MoveSelectorWrap(
int dir) {
86 for (
size_t offset = 1; offset <
children_.size(); ++offset) {
97class VerticalContainer :
public ContainerBase {
99 using ContainerBase::ContainerBase;
105 elements.push_back(it->Render());
107 if (elements.empty()) {
113 bool EventHandler(Event event)
override {
114 const int old_selected = *selector_;
122 for (
int i = 0; i < box_.
y_max - box_.
y_min; ++i) {
127 for (
int i = 0; i < box_.
y_max - box_.
y_min; ++i) {
132 for (
size_t i = 0; i <
children_.size(); ++i) {
137 for (
size_t i = 0; i <
children_.size(); ++i) {
142 MoveSelectorWrap(+1);
145 MoveSelectorWrap(-1);
148 *selector_ = std::max(0, std::min(
int(
children_.size()) - 1, *selector_));
149 return old_selected != *selector_;
152 bool OnMouseEvent(Event event)
override {
153 if (ContainerBase::OnMouseEvent(event)) {
162 if (!box_.
Contain(event.mouse().x, event.mouse().y)) {
166 const int old_selected = *selector_;
173 *selector_ = std::max(0, std::min(
int(
children_.size()) - 1, *selector_));
175 return old_selected != *selector_;
181class HorizontalContainer :
public ContainerBase {
183 using ContainerBase::ContainerBase;
189 elements.push_back(it->Render());
191 if (elements.empty()) {
192 return text(
"Empty container");
194 return hbox(std::move(elements));
197 bool EventHandler(Event event)
override {
198 const int old_selected = *selector_;
206 MoveSelectorWrap(+1);
209 MoveSelectorWrap(-1);
212 *selector_ = std::max(0, std::min(
int(
children_.size()) - 1, *selector_));
213 return old_selected != *selector_;
217class TabContainer :
public ContainerBase {
219 using ContainerBase::ContainerBase;
222 const Component active_child = ActiveChild();
224 return active_child->Render();
226 return text(
"Empty container");
229 bool Focusable()
const override {
236 bool OnMouseEvent(Event event)
override {
237 return ActiveChild() && ActiveChild()->OnEvent(event);
241class StackedContainer :
public ContainerBase {
243 explicit StackedContainer(
Components children)
244 : ContainerBase(std::move(children), nullptr) {}
250 elements.push_back(child->Render());
253 std::reverse(elements.begin(), elements.end());
254 return dbox(std::move(elements));
257 bool Focusable() const final {
259 if (child->Focusable()) {
282 [child](
const Component& c) { return c.get() == child; });
286 std::rotate(
children_.begin(), it, it + 1);
289 bool OnEvent(Event event)
final {
291 if (child->OnEvent(event)) {
318 return Vertical(std::move(children),
nullptr);
340 return std::make_shared<VerticalContainer>(std::move(children), selector);
361 return Horizontal(std::move(children),
nullptr);
383 return std::make_shared<HorizontalContainer>(std::move(children), selector);
406 return std::make_shared<TabContainer>(std::move(children), selector);
433 return std::make_shared<StackedContainer>(std::move(children));
static const Event TabReverse
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 ...
static const Event PageUp
void Add(Component children)
Ajoute un enfant. @param child L'enfant à attacher.
static const Event ArrowUp
static const Event ArrowDown
virtual bool OnEvent(Event)
Appelé en réponse à un événement.
static const Event PageDown
static const Event ArrowLeft
static const Event ArrowRight
Component Horizontal(Components children)
Une liste de composants, dessinés un par un horizontalement et navigués horizontalement en utilisant ...
Component Vertical(Components children)
Une liste de composants, dessinés un par un verticalement et navigués verticalement en utilisant les ...
Component Stacked(Components children)
Une liste de composants à empiler les uns sur les autres. Les événements sont propagés au premier com...
Component Tab(Components children, int *selector)
Une liste de composants, où un seul est dessiné et interagit avec à la fois. Le |selector| donne l'in...
Element text(std::wstring text)
Affiche un morceau de texte unicode.
Element dbox(Elements)
Empile plusieurs éléments les uns sur les autres.
Element vbox(Elements)
Un conteneur affichant les éléments verticalement un par un.
bool Contain(int x, int y) const
L'espace de noms FTXUI ftxui::Container::
L'espace de noms FTXUI ftxui::
std::shared_ptr< Node > Element
std::vector< Component > Components
Element hbox(Elements)
Un conteneur affichant les éléments horizontalement un par un.
std::vector< Element > Elements
Decorator reflect(Box &box)
std::shared_ptr< ComponentBase > Component