diff --git a/radio/src/gui/colorlcd/choiceex.cpp b/radio/src/gui/colorlcd/choiceex.cpp index 88974b87c..735f03b65 100644 --- a/radio/src/gui/colorlcd/choiceex.cpp +++ b/radio/src/gui/colorlcd/choiceex.cpp @@ -28,13 +28,12 @@ void ChoiceEx::setLongPressHandler(std::function handler) ChoiceEx::ChoiceEx(FormGroup * parent, const rect_t & rect, int vmin, int vmax, std::function getValue, std::function setValue, WindowFlags windowFlags) : Choice(parent, rect, vmin, vmax, getValue, setValue, windowFlags) { +#if defined(HARDWARE_TOUCH) + duration10ms = 0; +#endif } -bool ChoiceEx::onTouchEnd(coord_t x, coord_t y) -{ - return Choice::onTouchEnd(x,y); -} - +#if defined(HARDWARE_KEYS) void ChoiceEx::onEvent(event_t event) { if (event == EVT_KEY_LONG(KEY_ENTER)) { @@ -47,4 +46,54 @@ void ChoiceEx::onEvent(event_t event) Choice::onEvent(event); } +#endif + +#if defined(HARDWARE_TOUCH) +bool ChoiceEx::onTouchStart(coord_t x, coord_t y) +{ + if (duration10ms == 0) { + duration10ms = get_tmr10ms(); + } + + return Choice::onTouchStart(x, y); +} + +bool ChoiceEx::isLongPress() +{ + tmr10ms_t curTimer = get_tmr10ms(); + return (duration10ms != 0 && curTimer - duration10ms > LONG_PRESS_10MS); +} + +void ChoiceEx::checkEvents(void) +{ + event_t event = getEvent(); + + if (isLongPress()) { + if (longPressHandler) { + longPressHandler(event); + duration10ms = 0; + } + } + + if (hasFocus()) + onEvent(event); + else + pushEvent(event); +} + + +bool ChoiceEx::onTouchEnd(coord_t x, coord_t y) +{ + if (isLongPress()) { + if (longPressHandler) { + longPressHandler(0); + duration10ms = 0; + return false; + } + } + + duration10ms = 0; + return Choice::onTouchEnd(x,y); +} +#endif diff --git a/radio/src/gui/colorlcd/choiceex.h b/radio/src/gui/colorlcd/choiceex.h index bdf7f9792..5a3f33cda 100644 --- a/radio/src/gui/colorlcd/choiceex.h +++ b/radio/src/gui/colorlcd/choiceex.h @@ -32,16 +32,22 @@ class ChoiceEx : public Choice #if defined(HARDWARE_TOUCH) bool onTouchEnd(coord_t x, coord_t y) override; + bool onTouchStart(coord_t x, coord_t y) override; + void checkEvents(void) override; + bool isLongPress(); #endif #if defined(DEBUG_WINDOWS) std::string getName() const override { - return "CurvesListChoice"; + return "ChoceEx"; } #endif protected: std::function longPressHandler = nullptr; +#if defined(HARDWARE_TOUCH) + tmr10ms_t duration10ms; +#endif };