Menu: keep the previously focused element with mouse. (#462)

This resolves:
https://github.com/ArthurSonzogni/FTXUI/issues/453
This commit is contained in:
Arthur Sonzogni
2022-08-21 17:23:13 +02:00
committed by GitHub
parent 251306a4bb
commit 3ec765e1f0
3 changed files with 31 additions and 16 deletions

View File

@@ -83,8 +83,13 @@ class MenuBase : public ComponentBase {
}
void Clamp() {
if (*selected_ != selected_previous_) {
SelectedTakeFocus();
}
boxes_.resize(size());
*selected_ = util::clamp(*selected_, 0, size() - 1);
selected_previous_ = util::clamp(selected_previous_, 0, size() - 1);
selected_focus_ = util::clamp(selected_focus_, 0, size() - 1);
focused_entry() = util::clamp(focused_entry(), 0, size() - 1);
}
@@ -115,9 +120,6 @@ class MenuBase : public ComponentBase {
bool is_focused = (focused_entry() == i) && is_menu_focused;
bool is_selected = (*selected_ == i);
auto focus_management = !is_selected ? nothing
: is_menu_focused ? focus
: nothing;
EntryState state = {
entries_[i],
false,
@@ -125,6 +127,9 @@ class MenuBase : public ComponentBase {
is_focused,
};
auto focus_management =
is_menu_focused && (selected_focus_ == i) ? focus : nothing;
Element element =
(option_->entries.transform ? option_->entries.transform
: DefaultOptionTransform) //
@@ -166,6 +171,11 @@ class MenuBase : public ComponentBase {
}
}
void SelectedTakeFocus() {
selected_previous_ = *selected_;
selected_focus_ = *selected_;
}
void OnUp() {
switch (option_->direction) {
case MenuOption::Direction::Up:
@@ -270,6 +280,7 @@ class MenuBase : public ComponentBase {
if (*selected_ != old_selected) {
focused_entry() = *selected_;
SelectedTakeFocus();
OnChange();
return true;
}
@@ -307,6 +318,7 @@ class MenuBase : public ComponentBase {
event.mouse().motion == Mouse::Released) {
if (*selected_ != i) {
*selected_ = i;
selected_previous_ = *selected_;
OnChange();
}
return true;
@@ -331,6 +343,7 @@ class MenuBase : public ComponentBase {
*selected_ = util::clamp(*selected_, 0, size() - 1);
if (*selected_ != old_selected) {
SelectedTakeFocus();
OnChange();
}
return true;
@@ -449,7 +462,9 @@ class MenuBase : public ComponentBase {
protected:
ConstStringListRef entries_;
int* selected_ = nullptr;
int* selected_;
int selected_previous_ = *selected_;
int selected_focus_= *selected_;
Ref<MenuOption> option_;
std::vector<Box> boxes_;