FTXUI 7.0.3
C++ functional terminal UI.
Loading...
Searching...
No Matches
ftxui / component

title-img

Le module ftxui::component définit la logique qui produit des composants interactifs qui répondent aux événements utilisateur (clavier, souris, etc.).

La section Example fournit une collection d'exemples.

Un ftxui::App définit une boucle principale qui rend un composant.

Un ftxui::Component est un pointeur partagé vers un ftxui::ComponentBase. Ce dernier définit :

  • ftxui::ComponentBase::Render(): Comment rendre l'interface.
  • ftxui::ComponentBase::OnEvent(): Comment réagir aux événements.
  • ftxui::ComponentBase::Add(): Construit une relation parent/enfant entre deux composants. L'arbre des composants est utilisé pour définir comment naviguer à l'aide du clavier.

Les ftxui::Element sont utilisés pour rendre une seule trame.

Les ftxui::Component sont utilisés pour rendre une interface utilisateur dynamique, produisant plusieurs trames et mettant à jour son état sur les événements.

Galerie de plusieurs composants. (démo)

image

Tous les composants prédéfinis sont disponibles dans "ftxui/dom/component.hpp"

// Copyright 2021 Arthur Sonzogni. All rights reserved.
// Use of this source code is governed by the MIT license that can be found in
// the LICENSE file.
#ifndef FTXUI_COMPONENT_HPP
#define FTXUI_COMPONENT_HPP
#include <functional> // for function
#include <memory> // for make_shared, shared_ptr
#include <utility> // for forward
#include "ftxui/component/component_base.hpp" // for Component, Components
#include "ftxui/component/component_options.hpp" // for ButtonOption, CheckboxOption, MenuOption
#include "ftxui/dom/elements.hpp" // for Element
#include "ftxui/util/ref.hpp" // for ConstRef, Ref, ConstStringRef, ConstStringListRef, StringRef
namespace ftxui {
struct ButtonOption;
struct CheckboxOption;
struct Event;
struct InputOption;
struct MenuOption;
struct RadioboxOption;
struct MenuEntryOption;
template <class T, class... Args>
std::shared_ptr<T> Make(Args&&... args) {
return std::make_shared<T>(std::forward<Args>(args)...);
}
// Opérateur pipe pour décorer les composants.
using ComponentDecorator = std::function<Component(Component)>;
using ElementDecorator = std::function<Element(Element)>;
FTXUI_EXPORT(COMPONENT)
FTXUI_EXPORT(COMPONENT)
FTXUI_EXPORT(COMPONENT)
FTXUI_EXPORT(COMPONENT)
namespace Container {
FTXUI_EXPORT(COMPONENT) Component Vertical(Components children, int* selector);
FTXUI_EXPORT(COMPONENT)
FTXUI_EXPORT(COMPONENT) Component Tab(Components children, int* selector);
} // namespace Container
FTXUI_EXPORT(COMPONENT) Component Button(ButtonOption options);
FTXUI_EXPORT(COMPONENT)
Component Button(ConstStringRef label,
std::function<void()> on_click,
ButtonOption options = ButtonOption::Simple());
FTXUI_EXPORT(COMPONENT) Component Checkbox(CheckboxOption options);
FTXUI_EXPORT(COMPONENT)
Component Checkbox(ConstStringRef label,
bool* checked,
CheckboxOption options = CheckboxOption::Simple());
FTXUI_EXPORT(COMPONENT) Component Input(InputOption options = {});
FTXUI_EXPORT(COMPONENT)
Component Input(StringRef content, InputOption options = {});
FTXUI_EXPORT(COMPONENT)
Component Input(StringRef content,
StringRef placeholder,
InputOption options = {});
FTXUI_EXPORT(COMPONENT) Component Menu(MenuOption options);
FTXUI_EXPORT(COMPONENT)
Component Menu(ConstStringListRef entries,
int* selected_,
MenuOption options = MenuOption::Vertical());
FTXUI_EXPORT(COMPONENT) Component MenuEntry(MenuEntryOption options);
FTXUI_EXPORT(COMPONENT)
Component MenuEntry(ConstStringRef label, MenuEntryOption options = {});
FTXUI_EXPORT(COMPONENT) Component Radiobox(RadioboxOption options);
FTXUI_EXPORT(COMPONENT)
Component Radiobox(ConstStringListRef entries,
int* selected_,
RadioboxOption options = {});
FTXUI_EXPORT(COMPONENT)
Component Dropdown(ConstStringListRef entries, int* selected);
FTXUI_EXPORT(COMPONENT) Component Dropdown(DropdownOption options);
FTXUI_EXPORT(COMPONENT)
Component Toggle(ConstStringListRef entries, int* selected);
// Constructeur de curseur général :
template <typename T>
Component Slider(SliderOption<T> options);
extern template FTXUI_EXPORT(COMPONENT) Component Slider(SliderOption<int8_t>);
extern template FTXUI_EXPORT(COMPONENT) Component Slider(SliderOption<int16_t>);
extern template FTXUI_EXPORT(COMPONENT) Component Slider(SliderOption<int32_t>);
extern template FTXUI_EXPORT(COMPONENT) Component Slider(SliderOption<int64_t>);
extern template FTXUI_EXPORT(COMPONENT) Component Slider(SliderOption<uint8_t>);
extern template FTXUI_EXPORT(COMPONENT) Component
Slider(SliderOption<uint16_t>);
extern template FTXUI_EXPORT(COMPONENT) Component
Slider(SliderOption<uint32_t>);
extern template FTXUI_EXPORT(COMPONENT) Component
Slider(SliderOption<uint64_t>);
extern template FTXUI_EXPORT(COMPONENT) Component Slider(SliderOption<float>);
extern template FTXUI_EXPORT(COMPONENT) Component Slider(SliderOption<double>);
// Raccourci sans le constructeur `SliderOption` :
FTXUI_EXPORT(COMPONENT)
Component Slider(ConstStringRef label,
Ref<int> value,
ConstRef<int> min = 0,
ConstRef<int> max = 100,
ConstRef<int> increment = 5);
FTXUI_EXPORT(COMPONENT)
Component Slider(ConstStringRef label,
Ref<float> value,
ConstRef<float> min = 0.f,
ConstRef<float> max = 100.f,
ConstRef<float> increment = 5.f);
FTXUI_EXPORT(COMPONENT)
Component Slider(ConstStringRef label,
Ref<long> value,
ConstRef<long> min = 0L,
ConstRef<long> max = 100L,
ConstRef<long> increment = 5L);
FTXUI_EXPORT(COMPONENT)
Component ResizableSplit(ResizableSplitOption options);
FTXUI_EXPORT(COMPONENT)
FTXUI_EXPORT(COMPONENT)
FTXUI_EXPORT(COMPONENT)
FTXUI_EXPORT(COMPONENT)
FTXUI_EXPORT(COMPONENT)
Component Renderer(Component child, std::function<Element()>);
FTXUI_EXPORT(COMPONENT) Component Renderer(std::function<Element()>);
FTXUI_EXPORT(COMPONENT)
Component Renderer(std::function<Element(bool /* focused */)>);
FTXUI_EXPORT(COMPONENT)
Component CatchEvent(Component child, std::function<bool(Event)>);
FTXUI_EXPORT(COMPONENT)
ComponentDecorator CatchEvent(std::function<bool(Event)> on_event);
FTXUI_EXPORT(COMPONENT) Component Maybe(Component, const bool* show);
FTXUI_EXPORT(COMPONENT) Component Maybe(Component, std::function<bool()>);
FTXUI_EXPORT(COMPONENT) ComponentDecorator Maybe(const bool* show);
FTXUI_EXPORT(COMPONENT) ComponentDecorator Maybe(std::function<bool()>);
FTXUI_EXPORT(COMPONENT)
Component Modal(Component main, Component modal, const bool* show_modal);
FTXUI_EXPORT(COMPONENT)
ComponentDecorator Modal(Component modal, const bool* show_modal);
FTXUI_EXPORT(COMPONENT)
Component Collapsible(ConstStringRef label,
Component child,
Ref<bool> show = false);
FTXUI_EXPORT(COMPONENT)
Component Hoverable(Component component, bool* hover);
FTXUI_EXPORT(COMPONENT)
std::function<void()> on_enter,
std::function<void()> on_leave);
FTXUI_EXPORT(COMPONENT)
std::function<void(bool)> on_change);
FTXUI_EXPORT(COMPONENT) ComponentDecorator Hoverable(bool* hover);
FTXUI_EXPORT(COMPONENT)
ComponentDecorator Hoverable(std::function<void()> on_enter,
std::function<void()> on_leave);
FTXUI_EXPORT(COMPONENT)
ComponentDecorator Hoverable(std::function<void(bool)> on_change);
FTXUI_EXPORT(COMPONENT) Component Window(WindowOptions option);
} // namespace ftxui
#endif /* end of include guard: FTXUI_COMPONENT_HPP */
#define FTXUI_EXPORT(component)
Definition export.hpp:24
Component Button(ConstStringRef label, std::function< void()> on_click, ButtonOption options=ButtonOption::Simple())
Dessine un bouton. Exécute une fonction lorsqu'il est cliqué.
Component ResizableSplitTop(Component main, Component back, int *main_size)
Une division verticale entre deux composants, configurable en utilisant la souris.
Component Horizontal(Components children, int *selector)
Une liste de composants, dessinés un par un horizontalement et navigués horizontalement en utilisant ...
Component Toggle(ConstStringListRef entries, int *selected)
Une liste horizontale d'éléments. L'utilisateur peut naviguer à travers eux.
FTXUI_EXPORT(COMPONENT) ComponentDecorator Maybe(std Component Modal(Component main, Component modal, const bool *show_modal)
Definition modal.cpp:18
Component Renderer(Component child, std::function< Element()>)
Retourne un nouveau Component, similaire à |child|, mais utilisant |render| comme événement Component...
Component Hoverable(Component component, bool *hover)
Encapsule un composant. Donne la possibilité de savoir s'il est survolé par la souris.
Definition hoverable.cpp:33
Component Checkbox(ConstStringRef label, bool *checked, CheckboxOption options=CheckboxOption::Simple())
Dessine un élément cochable.
Component Vertical(Components children)
Une liste de composants, dessinés un par un verticalement et navigués verticalement en utilisant les ...
Component Maybe(Component child, std::function< bool()> show)
Décore un composant |child|. Il est affiché uniquement lorsque |show| retourne vrai.
Component ResizableSplitRight(Component main, Component back, int *main_size)
Une division horizontale entre deux composants, configurable en utilisant la souris.
Component Input(StringRef content, InputOption options={})
Une boîte de saisie pour éditer du texte.
Component Dropdown(ConstStringListRef entries, int *selected)
Un menu déroulant.
Component Stacked(Components children)
Une liste de composants à empiler les uns sur les autres. Les événements sont propagés au premier com...
Component Radiobox(ConstStringListRef entries, int *selected_, RadioboxOption options={})
Une liste d'éléments, où un seul peut être sélectionné.
Component ResizableSplitBottom(Component main, Component back, int *main_size)
Une division verticale entre deux composants, configurable en utilisant la souris.
Component Menu(ConstStringListRef entries, int *selected_, MenuOption options=MenuOption::Vertical())
Une liste de texte. L'élément focalisé est sélectionné.
Component ResizableSplitLeft(Component main, Component back, int *main_size)
Une division horizontale entre deux composants, configurable en utilisant la souris.
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...
Component MenuEntry(ConstStringRef label, MenuEntryOption options={})
Une entrée de menu spécifique. Elles peuvent être placées dans un Container::Vertical pour former un ...
Component Window(std::string title, Component component)
L'espace de noms FTXUI ftxui::Container::
L'espace de noms FTXUI ftxui::
Definition animation.hpp:11
std::shared_ptr< T > Make(Args &&... args)
Definition component.hpp:28
std::shared_ptr< Node > Element
Definition elements.hpp:25
std::function< Element(Element)> ElementDecorator
Definition component.hpp:34
std::vector< Component > Components
Component ResizableSplit(ResizableSplitOption options)
Une séparation entre deux composants.
Component operator|(Component component, ComponentDecorator decorator)
Component Collapsible(ConstStringRef label, Component child, Ref< bool > show=false)
Un composant repliable. Il affiche une case à cocher avec une flèche. Une fois activé,...
Component Slider(SliderOption< T > options)
Un curseur dans n'importe quelle direction.
int value
Definition elements.hpp:195
Component & operator|=(Component &component, ComponentDecorator decorator)
const bool * show
std::function< Component(Component)> ComponentDecorator
Definition component.hpp:33
std::shared_ptr< ComponentBase > Component
Definition app.hpp:23
Component CatchEvent(Component child, std::function< bool(Event)>)

Input

Exemple:

image

Produit par : ftxui::Input() de "ftxui/component/component.hpp"

Saisie filtrée

On peut filtrer les caractères reçus par le composant de saisie, en utilisant ftxui::CatchEvent.

std::string phone_number;
Component input = Input(&phone_number, "phone number");
// Filter out non-digit characters.
input |= CatchEvent([&](Event event) {
return event.is_character() && !std::isdigit(event.character()[0]);
});
// Filter out characters past the 10th one.
input |= CatchEvent([&](Event event) {
return event.is_character() && phone_number.size() >= 10;
});

Menu

Définit un objet menu. Il contient une liste d'entrées, dont une est sélectionnée.

Exemple:

image

Produit par : ftxui::Menu() de "ftxui/component/component.hpp"

Bascule

Un type de menu spécial. Les entrées sont affichées horizontalement.

Exemple:

image

Produit par : ftxui::Toggle() de "ftxui/component/component.hpp"

Case à cocher

Ce composant définit une case à cocher. C'est une seule entrée qui peut être activée/désactivée.

Exemple:

image

Produit par : ftxui::Checkbox() de "ftxui/component/component.hpp"

Bouton radio

Un composant bouton radio. C'est une liste d'entrées, où une seule peut être activée.

Exemple:

image

Produit par : ftxui::Radiobox() de "ftxui/component/component.hpp"

Menu déroulant

Un menu déroulant est un composant qui, lorsqu'il est ouvert, affiche une liste d'éléments parmi lesquels l'utilisateur peut choisir.

Exemple:

youtube-video-gif (3)

Produit par : ftxui::Dropdown() de "ftxui/component/component.hpp"

Curseur

Représente un objet curseur composé d'une plage avec des intervalles intermédiaires binés. Il peut être créé par ftxui::Slider().

Exemple:

image

Produit par : ftxui::Slider() de "ftxui/component/component.hpp"

Rendu

Produit par : ftxui::Renderer() de ftxui/component/component.hpp. Ce composant décore un autre en utilisant une fonction différente pour rendre une interface.

Exemple:

auto inner = [...]
auto renderer = Renderer(inner, [&] {
return inner->Render() | border
});

ftxui::Renderer supporte également le modèle de décorateur de composant :

auto component = [...]
component = component
| Renderer([](Element e) { return e | border))
| Renderer(bold)

Comme raccourci, vous pouvez également composer un composant avec un décorateur d'élément :

auto component = [...]
component = component | border | bold;

Intercepter un événement

Produit par : ftxui::CatchEvent() de ftxui/component/component.hpp. Ce composant décore d'autres composants, interceptant les événements avant le composant sous-jacent.

Exemples:

auto screen = App::TerminalOutput();
auto renderer = Renderer([] {
return text("My interface");
});
auto component = CatchEvent(renderer, [&](Event event) {
if (event == Event::Character('q')) {
screen.ExitLoopClosure()();
return true;
}
return false;
});
screen.Loop(component);

Le ftxui::CatchEvent peut également être utilisé comme décorateur :

component = component
| CatchEvent(handler_1)
| CatchEvent(handler_2)
| CatchEvent(handler_3)
;

Rétractable

Utile pour les éléments visuels dont la visibilité peut être activée ou désactivée par l'utilisateur. Essentiellement, c'est la combinaison des composants ftxui::Checkbox() et ftxui::Maybe().

auto collapsible = Collapsible("Show more", inner_element);

Peut-être

Produit par : ftxui::Maybe() de ftxui/component/component.hpp. Ce composant peut être utilisé pour afficher/masquer tout autre composant via un booléen ou un prédicat.

Exemple avec un booléen :

bool show = true;
auto component = Renderer([]{ return "Hello World!"; });
auto maybe_component = Maybe(component, &show)

Exemple avec un prédicat :

auto component = Renderer([]{ return "Hello World!"; });
auto maybe_component = Maybe(component, [&] { return time > 10; })

Comme d'habitude, ftxui::Maybe peut également être utilisé comme décorateur :

component = component
| Maybe(&a_boolean)
| Maybe([&] { return time > 10; })
;

Conteneur

Horizontal

Produit par : ftxui::Container::Horizontal() de "ftxui/component/component.hpp". Il affiche une liste de composants horizontalement et gère la navigation au clavier/souris.

Vertical

Produit par : ftxui::Container::Vertical() de "ftxui/component/component.hpp". Il affiche une liste de composants verticalement et gère la navigation au clavier/souris.

Onglet

Produit par : ftxui::Container::Tab() de "ftxui/component/component.hpp". Il prend une liste de composants et n'en affiche qu'un seul. C'est utile pour implémenter une barre d'onglets.

Vertical :

ezgif com-gif-maker (1)

Horizontal :

ezgif com-gif-maker (2)

Séparateur redimensionnable

Il définit une séparation horizontale ou verticale entre deux composants enfants. La position du séparateur est variable et contrôlable à l'aide de la souris. Il existe quatre séparateurs possibles :

Exemple:

ezgif com-gif-maker

Forcer un nouveau rendu de trame.

Généralement, ftxui::App::Loop() est responsable de dessiner une nouvelle trame chaque fois qu'un nouveau groupe d'événements (par exemple clavier, souris, redimensionnement de fenêtre, etc.) a été traité. Cependant, vous pourriez vouloir réagir à des événements arbitraires inconnus de FTXUI. Pour ce faire, vous devez poster des événements à l'aide de ftxui::App::PostEvent (ceci est thread-safe) via un thread. Vous devrez poster l'événement ftxui::Event::Custom.

Exemple:

screen->PostEvent(Event::Custom);

Si vous n'avez pas besoin de traiter un nouvel événement, vous pouvez utiliser :

screen->RequestAnimationFrame();

à la place.