mirror of
https://github.com/ArthurSonzogni/FTXUI.git
synced 2024-11-24 11:40:34 +08:00
Add index to EntryState
This commit is contained in:
parent
dfb9558eaf
commit
d16359cf8b
@ -44,6 +44,7 @@ class ComponentBase {
|
|||||||
ComponentBase* Parent() const;
|
ComponentBase* Parent() const;
|
||||||
Component& ChildAt(size_t i);
|
Component& ChildAt(size_t i);
|
||||||
size_t ChildCount() const;
|
size_t ChildCount() const;
|
||||||
|
int IndexOf(ComponentBase* child) const;
|
||||||
void Add(Component children);
|
void Add(Component children);
|
||||||
void Detach();
|
void Detach();
|
||||||
void DetachAllChildren();
|
void DetachAllChildren();
|
||||||
|
@ -25,6 +25,7 @@ struct EntryState {
|
|||||||
bool state; ///< The state of the button/checkbox/radiobox
|
bool state; ///< The state of the button/checkbox/radiobox
|
||||||
bool active; ///< Whether the entry is the active one.
|
bool active; ///< Whether the entry is the active one.
|
||||||
bool focused; ///< Whether the entry is one focused by the user.
|
bool focused; ///< Whether the entry is one focused by the user.
|
||||||
|
int index; ///< Index of the entry when applicable or -1.
|
||||||
};
|
};
|
||||||
|
|
||||||
struct UnderlineOption {
|
struct UnderlineOption {
|
||||||
|
@ -53,6 +53,7 @@ class ButtonBase : public ComponentBase, public ButtonOption {
|
|||||||
false,
|
false,
|
||||||
active,
|
active,
|
||||||
focused_or_hover,
|
focused_or_hover,
|
||||||
|
-1,
|
||||||
};
|
};
|
||||||
|
|
||||||
auto element = (transform ? transform : DefaultTransform) //
|
auto element = (transform ? transform : DefaultTransform) //
|
||||||
|
@ -32,6 +32,7 @@ class CheckboxBase : public ComponentBase, public CheckboxOption {
|
|||||||
*checked,
|
*checked,
|
||||||
is_active,
|
is_active,
|
||||||
is_focused || hovered_,
|
is_focused || hovered_,
|
||||||
|
-1,
|
||||||
};
|
};
|
||||||
auto element = (transform ? transform : CheckboxOption::Simple().transform)(
|
auto element = (transform ? transform : CheckboxOption::Simple().transform)(
|
||||||
entry_state);
|
entry_state);
|
||||||
|
@ -51,6 +51,18 @@ size_t ComponentBase::ChildCount() const {
|
|||||||
return children_.size();
|
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.
|
/// @brief Add a child.
|
||||||
/// @@param child The child to be attached.
|
/// @@param child The child to be attached.
|
||||||
/// @ingroup component
|
/// @ingroup component
|
||||||
|
@ -127,6 +127,7 @@ class MenuBase : public ComponentBase, public MenuOption {
|
|||||||
false,
|
false,
|
||||||
is_selected,
|
is_selected,
|
||||||
is_focused,
|
is_focused,
|
||||||
|
i,
|
||||||
};
|
};
|
||||||
|
|
||||||
auto focus_management = (selected_focus_ != i) ? nothing
|
auto focus_management = (selected_focus_ != i) ? nothing
|
||||||
@ -630,6 +631,7 @@ Component MenuEntry(MenuEntryOption option) {
|
|||||||
false,
|
false,
|
||||||
hovered_,
|
hovered_,
|
||||||
focused,
|
focused,
|
||||||
|
Parent()->IndexOf(this),
|
||||||
};
|
};
|
||||||
|
|
||||||
const Element element =
|
const Element element =
|
||||||
|
@ -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
|
} // namespace ftxui
|
||||||
// NOLINTEND
|
// NOLINTEND
|
||||||
|
@ -44,6 +44,7 @@ class RadioboxBase : public ComponentBase, public RadioboxOption {
|
|||||||
selected() == i,
|
selected() == i,
|
||||||
is_selected,
|
is_selected,
|
||||||
is_focused,
|
is_focused,
|
||||||
|
i,
|
||||||
};
|
};
|
||||||
auto element =
|
auto element =
|
||||||
(transform ? transform : RadioboxOption::Simple().transform)(state);
|
(transform ? transform : RadioboxOption::Simple().transform)(state);
|
||||||
|
Loading…
Reference in New Issue
Block a user