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 adaptador. Referencia una lista de cadenas.
Un adaptador. Posee o referencia una cadena constante. Para mayor comodidad, esta clase convierte múl...
void OnAnimation(Params &)
static const Event TabReverse
bool Focused() const
Devuelve si el elemento está enfocado por el usuario. Verdadero cuando el ComponentBase está enfocado...
std::function< Element()> elements_prefix
static MenuOption Toggle()
Opciones estándar para un menú horizontal con un separador. Esto puede ser útil para implementar una ...
animation::Duration follower_duration
CapturedMouse CaptureMouse(const Event &event)
Toma el CapturedMouse si está disponible. Solo hay un componente de ellos. Representa un componente q...
animation::easing::Function leader_function
MenuEntryOption entries_option
static const Event PageUp
animation::easing::Function function
animation::Duration follower_delay
void TakeFocus()
Configura todos los ancestros para dar foco a este componente.
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
Implementa el renderizado de sí mismo como ftxui::Element. Implementa la navegación por teclado respo...
Component Menu(MenuOption options)
Una lista de texto. El elemento enfocado es seleccionado.
Component MenuEntry(MenuEntryOption options)
Una entrada de menú específica. Se pueden colocar en un Container::Vertical para formar un menú.
Component Toggle(ConstStringListRef entries, int *selected)
Una lista horizontal de elementos. El usuario puede navegar a través de ellos.
Representa un evento. Puede ser un evento de pulsación de tecla, un redimensionamiento de terminal,...
Decorator bgcolor(Color)
Decora usando un color de fondo.
Element xflex(Element)
Expandir/Minimizar si es posible/necesario en el eje X.
Element nothing(Element element)
Una decoración que no hace absolutamente nada.
Direction
Direction es una enumeración que representa las cuatro cardinales direcciones.
Element bold(Element)
Utiliza una fuente en negrita, para elementos con más énfasis.
Element yflex(Element)
Expandir/Minimizar si es posible/necesario en el eje Y.
Element inverted(Element)
Agrega un filtro que invertirá los colores de primer plano y de fondo. colores.
Element text(std::wstring text)
Muestra un fragmento de texto Unicode.
Element focus(Element)
Establece que child sea el elemento enfocado entre sus hermanos.
Decorator color(Color)
Decora usando un color de primer plano.
bool Contain(int x, int y) const
static Color Interpolate(float t, const Color &a, const Color &b)
Box es una estructura que representa un área rectangular en un espacio 2D.
float Linear(float p)
Modelado según la línea y = x.
constexpr const T & clamp(const T &v, const T &lo, const T &hi)
El espacio de nombres ftxui:: de FTXUI.
std::function< Element(Element)> Decorator
Element separatorVSelector(float up, float down, Color unselected_color, Color selected_color)
Dibuja una barra vertical, con el área entre arriba/abajo coloreada de forma diferente.
std::shared_ptr< T > Make(Args &&... args)
std::shared_ptr< Node > Element
Element separatorHSelector(float left, float right, Color unselected_color, Color selected_color)
Dibuja una barra horizontal, con el área entre izquierda/derecha coloreada de forma diferente.
Element hbox(Elements)
Un contenedor que muestra elementos horizontalmente uno por uno.
std::vector< Element > Elements
Decorator reflect(Box &box)
if(IsFullWidth(codepoint))
std::shared_ptr< ComponentBase > Component
AnimatedColorOption foreground
AnimatedColorOption background
Argumentos para la transformación de |ButtonOption|, |CheckboxOption|, |RadioboxOption|,...