Add index to EntryState

This commit is contained in:
ake 2024-09-29 23:28:33 +02:00
parent dfb9558eaf
commit d16359cf8b
8 changed files with 66 additions and 0 deletions

View File

@ -44,6 +44,7 @@ class ComponentBase {
ComponentBase* Parent() const;
Component& ChildAt(size_t i);
size_t ChildCount() const;
int IndexOf(ComponentBase* child) const;
void Add(Component children);
void Detach();
void DetachAllChildren();

View File

@ -25,6 +25,7 @@ struct EntryState {
bool state; ///< The state of the button/checkbox/radiobox
bool active; ///< Whether the entry is the active one.
bool focused; ///< Whether the entry is one focused by the user.
int index; ///< Index of the entry when applicable or -1.
};
struct UnderlineOption {

View File

@ -53,6 +53,7 @@ class ButtonBase : public ComponentBase, public ButtonOption {
false,
active,
focused_or_hover,
-1,
};
auto element = (transform ? transform : DefaultTransform) //

View File

@ -32,6 +32,7 @@ class CheckboxBase : public ComponentBase, public CheckboxOption {
*checked,
is_active,
is_focused || hovered_,
-1,
};
auto element = (transform ? transform : CheckboxOption::Simple().transform)(
entry_state);

View File

@ -51,6 +51,18 @@ size_t ComponentBase::ChildCount() const {
return children_.size();
}
/// @brief Return index of child or -1 if not found.
/// @ingroup component
int ComponentBase::IndexOf(ComponentBase* child) const {
int index = 0;
for (Component c : children_) {
if (&(*c) == child)
return index;
index++;
}
return -1;
}
/// @brief Add a child.
/// @@param child The child to be attached.
/// @ingroup component

View File

@ -127,6 +127,7 @@ class MenuBase : public ComponentBase, public MenuOption {
false,
is_selected,
is_focused,
i,
};
auto focus_management = (selected_focus_ != i) ? nothing
@ -630,6 +631,7 @@ Component MenuEntry(MenuEntryOption option) {
false,
hovered_,
focused,
Parent()->IndexOf(this),
};
const Element element =

View File

@ -226,5 +226,52 @@ TEST(MenuTest, AnimationsVertical) {
}
}
TEST(MenuTest, EntryIndex) {
int selected = 0;
std::vector<std::string> entries = {"0", "1", "2"};
auto option = MenuOption::Vertical();
option.entries = &entries;
option.selected = &selected;
option.entries_option.transform = [&](const EntryState& state) {
int curidx = std::stoi(state.label);
EXPECT_EQ(state.index, curidx);
return text(state.label);
};
auto menu = Menu(option);
menu->OnEvent(Event::ArrowDown);
menu->OnEvent(Event::ArrowDown);
menu->OnEvent(Event::Return);
entries.resize(2);
(void)menu->Render();
}
TEST(MenuTest, MenuEntryIndex) {
int selected = 0;
MenuEntryOption option;
option.transform = [&](const EntryState& state) {
int curidx = std::stoi(state.label);
EXPECT_EQ(state.index, curidx);
return text(state.label);
};
auto menu = Container::Vertical(
{
MenuEntry("0", option),
MenuEntry("1", option),
MenuEntry("2", option),
},
&selected);
menu->OnEvent(Event::ArrowDown);
menu->OnEvent(Event::ArrowDown);
menu->OnEvent(Event::Return);
for(int idx = 0; idx < menu->ChildCount(); idx++)
{
auto child = menu->ChildAt(idx);
EXPECT_EQ(menu->IndexOf(&(*child)), idx);
}
}
} // namespace ftxui
// NOLINTEND

View File

@ -44,6 +44,7 @@ class RadioboxBase : public ComponentBase, public RadioboxOption {
selected() == i,
is_selected,
is_focused,
i,
};
auto element =
(transform ? transform : RadioboxOption::Simple().transform)(state);