diff --git a/radio/src/thirdparty/libopenui/src/button.cpp b/radio/src/thirdparty/libopenui/src/button.cpp index d3d716136..cf28843b4 100644 --- a/radio/src/thirdparty/libopenui/src/button.cpp +++ b/radio/src/thirdparty/libopenui/src/button.cpp @@ -40,12 +40,14 @@ Button::Button(Window* parent, const rect_t& rect, objConstruct ? objConstruct : simple_btn_create), pressHandler(std::move(pressHandler)) { + lv_obj_add_event_cb(lvobj, Button::long_pressed, LV_EVENT_LONG_PRESSED, nullptr); if (windowFlag & BUTTON_CHECKED) lv_obj_add_state(lvobj, LV_STATE_CHECKED); } void Button::check(bool checked) { + if (_deleted) return; if (checked != bool(windowFlags & BUTTON_CHECKED)) { windowFlags ^= BUTTON_CHECKED; update_checked_flag(lvobj, windowFlags); @@ -63,11 +65,16 @@ bool Button::checked() const void Button::onPress() { - bool check = (pressHandler && pressHandler()); - windowFlags = - check ? windowFlags | BUTTON_CHECKED : windowFlags & ~BUTTON_CHECKED; - if (lvobj == nullptr) return; - update_checked_flag(lvobj, windowFlags); + check(pressHandler && pressHandler()); +} + +void Button::onLongPress() +{ + if (longPressHandler) { + check(longPressHandler()); + lv_obj_clear_state(lvobj, LV_STATE_PRESSED); + lv_indev_wait_release(lv_indev_get_act()); + } } void Button::onClicked() @@ -86,6 +93,14 @@ void Button::checkEvents() if (checkHandler) checkHandler(); } +void Button::long_pressed(lv_event_t* e) +{ + auto obj = lv_event_get_target(e); + auto btn = (Button*)lv_obj_get_user_data(obj); + if (obj) btn->onLongPress(); +} + + TextButton::TextButton(Window* parent, const rect_t& rect, std::string text, std::function pressHandler, WindowFlags windowFlags, LcdFlags textFlags) : diff --git a/radio/src/thirdparty/libopenui/src/button.h b/radio/src/thirdparty/libopenui/src/button.h index 56319ff35..0a5aa103c 100644 --- a/radio/src/thirdparty/libopenui/src/button.h +++ b/radio/src/thirdparty/libopenui/src/button.h @@ -25,52 +25,53 @@ constexpr WindowFlags BUTTON_BACKGROUND = FORM_FLAGS_LAST << 1u; constexpr WindowFlags BUTTON_CHECKED = FORM_FLAGS_LAST << 2u; constexpr WindowFlags BUTTON_CHECKED_ON_FOCUS = FORM_FLAGS_LAST << 3u; -class Button: public FormField +class Button : public FormField { - public: - Button(Window* parent, const rect_t& rect, - std::function pressHandler = nullptr, - WindowFlags windowFlags = 0, LcdFlags textFlags = 0, - LvglCreate objConstruct = nullptr); + public: + Button(Window* parent, const rect_t& rect, + std::function pressHandler = nullptr, + WindowFlags windowFlags = 0, LcdFlags textFlags = 0, + LvglCreate objConstruct = nullptr); #if defined(DEBUG_WINDOWS) - std::string getName() const override - { - return "Button"; - } + std::string getName() const override { return "Button"; } #endif - virtual void onPress(); - void onClicked() override; - void checkEvents() override; + virtual void onPress(); + virtual void onLongPress(); - void check(bool checked = true); - bool checked() const; + void onClicked() override; + void checkEvents() override; - void setPressHandler(std::function handler) - { - pressHandler = std::move(handler); - } + void check(bool checked = true); + bool checked() const; - void setCheckHandler(std::function handler) - { - checkHandler = std::move(handler); - } + void setPressHandler(std::function handler) + { + pressHandler = std::move(handler); + } -// #if defined(HARDWARE_KEYS) -// void onEvent(event_t event) override; -// #endif - // void onEvent(lv_event_t* e);// override; + void setLongPressHandler(std::function handler) + { + longPressHandler = std::move(handler); + } + + void setCheckHandler(std::function handler) + { + checkHandler = std::move(handler); + } #if defined(HARDWARE_TOUCH) - bool onTouchEnd(coord_t x, coord_t y) override; + bool onTouchEnd(coord_t x, coord_t y) override; #endif - protected: - std::function pressHandler; - std::function checkHandler; -}; + protected: + std::function pressHandler; + std::function longPressHandler; + std::function checkHandler; + static void long_pressed(lv_event_t* e); +}; class TextButton: public Button {