From 3971a70d26c47158c4a3eca60aa958abb7c9bc53 Mon Sep 17 00:00:00 2001 From: philmoz Date: Mon, 27 Nov 2023 23:02:41 +1100 Subject: [PATCH] fix(color): Long press and filtering in Switch Choice popup (#4362) --- radio/src/gui/colorlcd/switchchoice.cpp | 13 ++++++++++--- radio/src/gui/colorlcd/switchchoice.h | 3 ++- radio/src/thirdparty/libopenui/src/choice.cpp | 2 +- radio/src/thirdparty/libopenui/src/choice.h | 2 ++ 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/radio/src/gui/colorlcd/switchchoice.cpp b/radio/src/gui/colorlcd/switchchoice.cpp index 8806f9f6b..78d2ca6fe 100644 --- a/radio/src/gui/colorlcd/switchchoice.cpp +++ b/radio/src/gui/colorlcd/switchchoice.cpp @@ -76,13 +76,13 @@ class SwitchChoiceMenuToolbar : public MenuToolbar invertBtn->setPressHandler([=]() { lv_obj_clear_state(invertBtn->getLvObj(), LV_STATE_FOCUSED); - longPress(); + invertChoice(); return choice->inverted; }); #endif } - void longPress() + void invertChoice() { SwitchChoice* switchChoice = (SwitchChoice*)choice; switchChoice->inverted = !switchChoice->inverted; @@ -94,6 +94,14 @@ class SwitchChoiceMenuToolbar : public MenuToolbar #endif } + void longPress() + { + lv_indev_t* indev = lv_indev_get_act(); + if (indev->driver->type == LV_INDEV_TYPE_KEYPAD) { + invertChoice(); + } + } + protected: MenuToolbarButton* invertBtn = nullptr; }; @@ -153,7 +161,6 @@ SwitchChoice::SwitchChoice(Window* parent, const rect_t& rect, int vmin, val = swtch; } if (val && (!isValueAvailable || isValueAvailable(val))) { - // if (filtered) fillMenu(menu); tb->resetFilter(); menu->select(getIndexFromValue(val)); } diff --git a/radio/src/gui/colorlcd/switchchoice.h b/radio/src/gui/colorlcd/switchchoice.h index 8d941b66f..cbde651e8 100644 --- a/radio/src/gui/colorlcd/switchchoice.h +++ b/radio/src/gui/colorlcd/switchchoice.h @@ -39,12 +39,13 @@ class SwitchChoice : public Choice protected: friend SwitchChoiceMenuToolbar; - bool inverted = false; bool inMenu = false; void setValue(int value) override; int getIntValue() const override; + void invertChoice(); + #if defined(DEBUG_WINDOWS) std::string getName() const override { return "SwitchChoice"; } #endif diff --git a/radio/src/thirdparty/libopenui/src/choice.cpp b/radio/src/thirdparty/libopenui/src/choice.cpp index d7f52b737..54fef4c4b 100644 --- a/radio/src/thirdparty/libopenui/src/choice.cpp +++ b/radio/src/thirdparty/libopenui/src/choice.cpp @@ -201,7 +201,7 @@ void Choice::fillMenu(Menu* menu, const FilterFct& filter) selectedIx0 = -1; for (int i = vmin; i <= vmax; ++i) { if (filter && !filter(i)) continue; - if (isValueAvailable && !isValueAvailable(i)) continue; + if (isValueAvailable && !isValueAvailable(inverted ? -i : i)) continue; if (textHandler) { menu->addLineBuffered(textHandler(i), [=]() { setValue(i); }); } else if (unsigned(i - vmin) < values.size()) { diff --git a/radio/src/thirdparty/libopenui/src/choice.h b/radio/src/thirdparty/libopenui/src/choice.h index 11568fbb2..3cbb12382 100644 --- a/radio/src/thirdparty/libopenui/src/choice.h +++ b/radio/src/thirdparty/libopenui/src/choice.h @@ -181,6 +181,8 @@ class Choice : public ChoiceBase protected: friend class MenuToolbar; + bool inverted = false; + std::string getLabelText() override; std::vector values; int vmin = 0;