29Element DefaultOptionTransform(
const EntryState& state) {
30 std::string label = (state.active ?
"> " :
" ") + state.label;
69class MenuBase :
public ComponentBase,
public MenuOption {
71 explicit MenuBase(
const MenuOption& option) : MenuOption(option) {}
73 bool IsHorizontal() {
return ftxui::IsHorizontal(
direction); }
87 if (
selected() != selected_previous_) {
90 boxes_.resize(size());
92 selected_previous_ =
util::clamp(selected_previous_, 0, size() - 1);
93 selected_focus_ =
util::clamp(selected_focus_, 0, size() - 1);
97 void OnAnimation(animation::Params& params)
override {
100 for (
auto& animator : animator_background_) {
101 animator.OnAnimation(params);
103 for (
auto& animator : animator_foreground_) {
104 animator.OnAnimation(params);
110 UpdateAnimationTarget();
113 const bool is_menu_focused =
Focused();
117 elements.reserve(size());
118 for (
int i = 0; i < size(); ++i) {
122 const bool is_focused = (
focused_entry() == i) && is_menu_focused;
123 const bool is_selected = (
selected() == i);
125 const EntryState state = {
126 entries[i],
false, is_selected, is_focused, i,
130 : DefaultOptionTransform)
132 if (selected_focus_ == i) {
135 element |= AnimatedColorStyle(i);
137 elements.push_back(element);
144 std::reverse(elements.begin(), elements.end());
147 const Element bar = IsHorizontal()
148 ?
hbox(std::move(elements))
149 : vbox(std::move(elements));
152 return bar | reflect(box_);
155 if (IsHorizontal()) {
174 void SelectedTakeFocus() {
236 bool OnEvent(Event event)
override {
242 if (event.is_mouse()) {
243 return OnMouseEvent(event);
247 const int old_selected =
selected();
297 bool OnMouseEvent(Event event) {
300 return OnMouseWheel(event);
310 for (
int i = 0; i < size(); ++i) {
311 if (!boxes_[i].Contain(event.mouse().x, event.mouse().y)) {
331 bool OnMouseWheel(Event event) {
332 if (!box_.
Contain(event.mouse().x, event.mouse().y)) {
335 const int old_selected =
selected();
353 void UpdateAnimationTarget() {
355 UpdateUnderlineTarget();
358 void UpdateColorTarget() {
359 if (size() !=
int(animation_background_.size())) {
360 animation_background_.resize(size());
361 animation_foreground_.resize(size());
362 animator_background_.clear();
363 animator_foreground_.clear();
365 const int len = size();
366 animator_background_.reserve(len);
367 animator_foreground_.reserve(len);
368 for (
int i = 0; i < len; ++i) {
369 animation_background_[i] = 0.F;
370 animation_foreground_[i] = 0.F;
371 animator_background_.emplace_back(&animation_background_[i], 0.F,
372 std::chrono::milliseconds(0),
374 animator_foreground_.emplace_back(&animation_foreground_[i], 0.F,
375 std::chrono::milliseconds(0),
380 const bool is_menu_focused =
Focused();
381 for (
int i = 0; i < size(); ++i) {
382 const bool is_focused = (
focused_entry() == i) && is_menu_focused;
383 const bool is_selected = (
selected() == i);
384 float target = is_selected ? 1.F : is_focused ? 0.5F : 0.F;
385 if (animator_background_[i].to() != target) {
386 animator_background_[i] = animation::Animator(
387 &animation_background_[i], target,
390 animator_foreground_[i] = animation::Animator(
391 &animation_foreground_[i], target,
402 animation_foreground_[i],
409 animation_background_[i],
416 void UpdateUnderlineTarget() {
421 if (FirstTarget() == animator_first_.
to() &&
422 SecondTarget() == animator_second_.
to()) {
426 if (FirstTarget() >= animator_first_.
to()) {
427 animator_first_ = animation::Animator(
431 animator_second_ = animation::Animator(
435 animator_first_ = animation::Animator(
439 animator_second_ = animation::Animator(
445 bool Focusable() const final {
return entries.
size(); }
447 float FirstTarget() {
448 if (boxes_.empty()) {
451 const int value = IsHorizontal() ? boxes_[
selected()].x_min - box_.
x_min
455 float SecondTarget() {
456 if (boxes_.empty()) {
459 const int value = IsHorizontal() ? boxes_[
selected()].x_max - box_.
x_min
465 int selected_previous_ =
selected();
469 std::vector<Box> boxes_;
475 animation::Animator animator_first_ = animation::Animator(&first_, 0.F);
476 animation::Animator animator_second_ = animation::Animator(&second_, 0.F);
477 std::vector<animation::Animator> animator_background_;
478 std::vector<animation::Animator> animator_foreground_;
479 std::vector<float> animation_background_;
480 std::vector<float> animation_foreground_;
544 option.
entries = std::move(entries);
585 option.
label = std::move(label);
622 const bool is_focused = Focused();
623 UpdateAnimationTarget();
626 label(),
false, hovered_, is_focused, Index(),
629 Element element = (transform ? transform : DefaultOptionTransform)
636 return element | AnimatedColorStyle() | reflect(box_);
639 void UpdateAnimationTarget() {
640 const bool focused = Focused();
641 float target = focused ? 1.F : hovered_ ? 0.5F : 0.F;
642 if (target == animator_background_.to()) {
646 &animation_background_, target, animated_colors.background.duration,
647 animated_colors.background.function);
649 &animation_foreground_, target, animated_colors.foreground.duration,
650 animated_colors.foreground.function);
655 if (animated_colors.foreground.enabled) {
657 color(Color::Interpolate(animation_foreground_,
658 animated_colors.foreground.inactive,
659 animated_colors.foreground.active));
662 if (animated_colors.background.enabled) {
664 bgcolor(Color::Interpolate(animation_background_,
665 animated_colors.background.inactive,
666 animated_colors.background.active));
671 bool Focusable()
const override {
return true; }
672 bool OnEvent(
Event event)
override {
677 hovered_ = box_.Contain(event.
mouse().
x, event.
mouse().
y);
693 animator_background_.OnAnimation(params);
694 animator_foreground_.OnAnimation(params);
698 bool hovered_ =
false;
700 float animation_background_ = 0.F;
701 float animation_foreground_ = 0.F;
Un adaptateur. Référence une liste de chaînes de caractères.
Un adaptateur. Possède ou référence une chaîne constante. Par commodité, cette classe convertit plusi...
void OnAnimation(Params &)
static const Event TabReverse
bool Focused() const
Indique si les éléments sont focusés par l'utilisateur. Vrai lorsque le ComponentBase est focusé par ...
std::function< Element()> elements_prefix
static MenuOption Toggle()
Options standard pour un menu horizontal avec un séparateur. Cela peut être utile pour implémenter un...
animation::Duration follower_duration
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...
animation::easing::Function leader_function
MenuEntryOption entries_option
static const Event PageUp
animation::easing::Function function
animation::Duration follower_delay
void TakeFocus()
Configure tous les ancêtres pour donner le focus à ce composant.
std::function< void()> on_enter
UnderlineOption underline
std::function< Element(const EntryState &state)> transform
animation::Duration leader_duration
animation::Duration duration
ConstStringListRef entries
animation::easing::Function follower_function
static const Event ArrowUp
std::function< Element()> elements_infix
static const Event ArrowDown
std::function< Element()> elements_postfix
AnimatedColorsOption animated_colors
std::function< void()> on_change
static const Event PageDown
static const Event Return
static const Event ArrowLeft
animation::Duration leader_delay
static const Event ArrowRight
Il implémente son propre rendu en tant que ftxui::Element. Il implémente la navigation au clavier en ...
Component Menu(MenuOption options)
Une liste de texte. L'élément sélectionné est mis en évidence.
Component MenuEntry(MenuEntryOption options)
Une entrée de menu spécifique. Elles peuvent être placées dans un Container::Vertical pour former un ...
Component Toggle(ConstStringListRef entries, int *selected)
Une liste horizontale d'éléments. L'utilisateur peut naviguer à travers eux.
Représente un événement. Il peut s'agir d'un événement de touche, d'un redimensionnement de terminal,...
Decorator bgcolor(Color)
Décore en utilisant une couleur d'arrière-plan.
Element color(const LinearGradient &gradient, Element child)
Définit la couleur de premier plan d'un élément avec un effet de dégradé linéaire.
Element xflex(Element)
Développer/Réduire si possible/nécessaire sur l'axe X.
Element nothing(Element element)
Une décoration qui ne fait absolument rien.
Direction
Direction est une énumération qui représente les quatre directions cardinales.
Element bold(Element)
Utilise une police en gras, pour les éléments avec plus d'emphase.
Element yflex(Element)
Développer/Réduire si possible/nécessaire sur l'axe Y.
Element inverted(Element)
Ajoute un filtre qui inversera les couleurs de premier plan et d'arrière-plan.
Element text(std::wstring text)
Affiche un morceau de texte unicode.
Element focus(Element)
Définit l'élément child comme étant celui qui est focalisé parmi ses frères.
Element bgcolor(const LinearGradient &gradient, Element child)
Définit la couleur de fond d'un élément avec un effet de dégradé linéaire.
Decorator color(Color)
Décore en utilisant une couleur de premier plan.
Element vbox(Elements)
Un conteneur affichant les éléments verticalement un par un.
bool Contain(int x, int y) const
static Color Interpolate(float t, const Color &a, const Color &b)
Box est une structure qui représente une zone rectangulaire dans un espace 2D.
float Linear(float p)
Modélisé d'après la ligne y = x.
constexpr const T & clamp(const T &v, const T &lo, const T &hi)
L'espace de noms FTXUI ftxui::
std::function< Element(Element)> Decorator
Element separatorVSelector(float up, float down, Color unselected_color, Color selected_color)
Dessine une barre verticale, avec la zone entre le haut et le bas colorée différemment.
std::shared_ptr< T > Make(Args &&... args)
std::shared_ptr< Node > Element
Element separatorHSelector(float left, float right, Color unselected_color, Color selected_color)
Dessine une barre horizontale, avec la zone entre la gauche et la droite colorée différemment.
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
AnimatedColorOption foreground
AnimatedColorOption background
arguments pour la transformation depuis |ButtonOption|, |CheckboxOption|, |RadioboxOption|,...