From 9d453035314c279779aa2c0d054f2c2b2bbea005 Mon Sep 17 00:00:00 2001 From: gagarinlg Date: Thu, 10 Feb 2022 14:12:09 +0100 Subject: [PATCH] make button lvgl-Event aware --- radio/src/thirdparty/libopenui/src/button.cpp | 35 +++++++++++++++++++ radio/src/thirdparty/libopenui/src/button.h | 8 ++--- radio/src/thirdparty/libopenui/src/window.cpp | 2 +- 3 files changed, 38 insertions(+), 7 deletions(-) diff --git a/radio/src/thirdparty/libopenui/src/button.cpp b/radio/src/thirdparty/libopenui/src/button.cpp index c857c3694..07e165a86 100644 --- a/radio/src/thirdparty/libopenui/src/button.cpp +++ b/radio/src/thirdparty/libopenui/src/button.cpp @@ -22,6 +22,26 @@ #include "font.h" #include "theme.h" +static void lvglEvent(lv_event_t* e) +{ + Button* btn = (Button*)lv_event_get_user_data(e); + if(btn->deleted()) + return; + + btn->onEvent(e); +} + +Button::Button(FormGroup* parent, const rect_t& rect, + std::function pressHandler, + WindowFlags windowFlag, LcdFlags textFlags, + LvglCreate objConstruct) : + FormField(parent, rect, windowFlag, textFlags, objConstruct), + pressHandler(std::move(pressHandler)) +{ + lv_obj_set_style_bg_opa(lvobj, LV_OPA_TRANSP, LV_PART_MAIN); + lv_obj_add_event_cb(lvobj, lvglEvent, LV_EVENT_CLICKED, this); +} + void Button::onPress() { bool check = (pressHandler && pressHandler()); @@ -51,6 +71,21 @@ void Button::onEvent(event_t event) } #endif +void Button::onEvent(lv_event_t* event) +{ + lv_event_code_t code = lv_event_get_code(event); + + TRACE_WINDOWS("%s received lvgl event code 0x%X", getWindowDebugString("Button").c_str(), code); + + if (enabled && code == LV_EVENT_CLICKED) { + onKeyPress(); + onPress(); + } + else { +// FormField::onEvent(event); + } +} + #if defined(HARDWARE_TOUCH) bool Button::onTouchStart(coord_t x, coord_t y) { diff --git a/radio/src/thirdparty/libopenui/src/button.h b/radio/src/thirdparty/libopenui/src/button.h index 695ccf30e..7d2394cc7 100644 --- a/radio/src/thirdparty/libopenui/src/button.h +++ b/radio/src/thirdparty/libopenui/src/button.h @@ -31,12 +31,7 @@ class Button: public FormField Button(FormGroup* parent, const rect_t& rect, std::function pressHandler = nullptr, WindowFlags windowFlags = 0, LcdFlags textFlags = 0, - LvglCreate objConstruct = nullptr) : - FormField(parent, rect, windowFlags, textFlags, objConstruct), - pressHandler(std::move(pressHandler)) - { - lv_obj_set_style_bg_opa(lvobj, LV_OPA_TRANSP, LV_PART_MAIN); - } + LvglCreate objConstruct = nullptr); #if defined(DEBUG_WINDOWS) std::string getName() const override @@ -74,6 +69,7 @@ class Button: public FormField #if defined(HARDWARE_KEYS) void onEvent(event_t event) override; #endif + void onEvent(lv_event_t* e);// override; #if defined(HARDWARE_TOUCH) bool onTouchStart(coord_t x, coord_t y) override; diff --git a/radio/src/thirdparty/libopenui/src/window.cpp b/radio/src/thirdparty/libopenui/src/window.cpp index d077dd1f5..19c154972 100644 --- a/radio/src/thirdparty/libopenui/src/window.cpp +++ b/radio/src/thirdparty/libopenui/src/window.cpp @@ -290,7 +290,7 @@ void Window::setFocus(uint8_t flag, Window * from) if (focusWindow != this) { // synchronize lvgl focused state with libopenui - if (!lv_obj_has_state(lvobj, LV_STATE_FOCUSED)) { + if (lvobj != nullptr && !lv_obj_has_state(lvobj, LV_STATE_FOCUSED)) { lv_obj_add_state(lvobj, LV_STATE_FOCUSED); if (focusWindow != nullptr) { lv_obj_clear_state(focusWindow->lvobj, LV_STATE_FOCUSED | LV_STATE_EDITED);