From 9de387834a57727b60390c4bce104df709a140c3 Mon Sep 17 00:00:00 2001 From: philmoz Date: Fri, 23 May 2025 10:57:09 +1000 Subject: [PATCH] feat(color): reduce lag in scrolling main view when using model info widget (#6296) --- radio/src/gui/colorlcd/libui/static.cpp | 8 ++++++ radio/src/gui/colorlcd/libui/static.h | 1 + .../src/gui/colorlcd/mainview/topbar_impl.cpp | 26 +++++++------------ radio/src/gui/colorlcd/mainview/view_main.cpp | 26 +++++++++++++------ radio/src/gui/colorlcd/widgets/modelbmp.cpp | 26 +++++++++---------- 5 files changed, 50 insertions(+), 37 deletions(-) diff --git a/radio/src/gui/colorlcd/libui/static.cpp b/radio/src/gui/colorlcd/libui/static.cpp index 9a41b0c3a..c12112b4c 100644 --- a/radio/src/gui/colorlcd/libui/static.cpp +++ b/radio/src/gui/colorlcd/libui/static.cpp @@ -301,6 +301,14 @@ void StaticBitmap::setSource(const char *filename) } } +void StaticBitmap::clearSource() +{ + if (img) delete img; + img = nullptr; + if (canvas) lv_obj_del(canvas); + canvas = nullptr; +} + StaticBitmap::~StaticBitmap() { if (img) delete img; diff --git a/radio/src/gui/colorlcd/libui/static.h b/radio/src/gui/colorlcd/libui/static.h index 58b333440..b29217c9c 100644 --- a/radio/src/gui/colorlcd/libui/static.h +++ b/radio/src/gui/colorlcd/libui/static.h @@ -178,6 +178,7 @@ class StaticBitmap : public Window #endif void setSource(const char *filename); + void clearSource(); bool hasImage() const; protected: diff --git a/radio/src/gui/colorlcd/mainview/topbar_impl.cpp b/radio/src/gui/colorlcd/mainview/topbar_impl.cpp index ae4753d00..3ff0a55f6 100644 --- a/radio/src/gui/colorlcd/mainview/topbar_impl.cpp +++ b/radio/src/gui/colorlcd/mainview/topbar_impl.cpp @@ -73,30 +73,24 @@ rect_t TopBar::getZone(unsigned int index) const void TopBar::setVisible(float visible) // 0.0 -> 1.0 { + coord_t y = 0; if (visible == 0.0) { - setTop(-(int)EdgeTxStyles::MENU_HEADER_HEIGHT); - } - else if (visible == 1.0) { - setTop(0); - } - else if (visible > 0.0 && visible < 1.0){ - float top = - (float)EdgeTxStyles::MENU_HEADER_HEIGHT * (1.0 - visible); - setTop((coord_t)top); + y = -EdgeTxStyles::MENU_HEADER_HEIGHT; + } else if (visible > 0.0 && visible < 1.0){ + y = -(float)EdgeTxStyles::MENU_HEADER_HEIGHT * (1.0 - visible); } + if (y != top()) setTop(y); } void TopBar::setEdgeTxButtonVisible(float visible) // 0.0 -> 1.0 { + coord_t y = 0; if (visible == 0.0) { - headerIcon->setTop(-(int)EdgeTxStyles::MENU_HEADER_HEIGHT); - } - else if (visible == 1.0) { - headerIcon->setTop(0); - } - else if (visible > 0.0 && visible < 1.0){ - float top = - (float)EdgeTxStyles::MENU_HEADER_HEIGHT * (1.0 - visible); - headerIcon->setTop((coord_t)top); + y = -EdgeTxStyles::MENU_HEADER_HEIGHT; + } else if (visible > 0.0 && visible < 1.0){ + y = -(float)EdgeTxStyles::MENU_HEADER_HEIGHT * (1.0 - visible); } + if (y != headerIcon->top()) headerIcon->setTop(y); } coord_t TopBar::getVisibleHeight(float visible) const // 0.0 -> 1.0 diff --git a/radio/src/gui/colorlcd/mainview/view_main.cpp b/radio/src/gui/colorlcd/mainview/view_main.cpp index 0b5e56b91..1993bbc42 100644 --- a/radio/src/gui/colorlcd/mainview/view_main.cpp +++ b/radio/src/gui/colorlcd/mainview/view_main.cpp @@ -52,17 +52,26 @@ static void saveViewId(unsigned view) } } +static void tile_view_scroll_begin(lv_event_t * e) +{ + lv_anim_t* a = (lv_anim_t*)lv_event_get_param(e); + if (a) a->time = 0; +} + static void tile_view_scroll(lv_event_t* e) { - // (void)e; auto viewMain = ViewMain::instance(); if (viewMain) { - if (lv_event_get_code(e) == LV_EVENT_SCROLL_END) { - auto view = viewMain->getCurrentMainView(); - saveViewId(view); - } else { - viewMain->updateTopbarVisibility(); - } + viewMain->updateTopbarVisibility(); + } +} + +static void tile_view_scroll_end(lv_event_t* e) +{ + auto viewMain = ViewMain::instance(); + if (viewMain) { + auto view = viewMain->getCurrentMainView(); + saveViewId(view); } } @@ -81,8 +90,9 @@ ViewMain::ViewMain() : lv_obj_add_flag(tile_view, LV_OBJ_FLAG_EVENT_BUBBLE); lv_obj_set_user_data(tile_view, this); + lv_obj_add_event_cb(tile_view, tile_view_scroll_begin, LV_EVENT_SCROLL_BEGIN, NULL); lv_obj_add_event_cb(tile_view, tile_view_scroll, LV_EVENT_SCROLL, nullptr); - lv_obj_add_event_cb(tile_view, tile_view_scroll, LV_EVENT_SCROLL_END, + lv_obj_add_event_cb(tile_view, tile_view_scroll_end, LV_EVENT_SCROLL_END, nullptr); // create last to be on top diff --git a/radio/src/gui/colorlcd/widgets/modelbmp.cpp b/radio/src/gui/colorlcd/widgets/modelbmp.cpp index d08486023..bced4ef8e 100644 --- a/radio/src/gui/colorlcd/widgets/modelbmp.cpp +++ b/radio/src/gui/colorlcd/widgets/modelbmp.cpp @@ -38,15 +38,13 @@ class ModelBitmapWidget : public Widget etx_obj_add_style(lvobj, styles->bg_opacity_cover, LV_PART_MAIN | ETX_STATE_BG_FILL); - char s[LEN_MODEL_NAME + 1]; - strAppend(s, g_model.header.name, LEN_MODEL_NAME); - label = new StaticText(this, rect_t{}, s); + label = new StaticText(this, rect_t{}, ""); label->hide(); - image = new StaticImage(this, rect_t{0, 0, width(), height()}); + image = new StaticBitmap(this, {0, 0, width(), height()}); image->hide(); - update(); + checkEvents(); } void checkEvents() override @@ -55,8 +53,6 @@ class ModelBitmapWidget : public Widget if (getHash() != deps_hash) { update(); - // Force bitmap redraw - invalidate(); } char s[LEN_MODEL_NAME + 1]; @@ -95,24 +91,28 @@ class ModelBitmapWidget : public Widget else lv_obj_clear_state(lvobj, ETX_STATE_BG_FILL); - if (!image->hasImage() || deps_hash != getHash()) { + coord_t w = width(); + coord_t h = height() - (isLarge ? LARGE_IMG_H : 0); + bool sizeChg = (w != image->width()) || (h != image->height()); + + if (sizeChg) + image->setRect({0, isLarge ? LARGE_IMG_H : 0, w, h}); + + if (!image->hasImage() || deps_hash != getHash() || sizeChg) { if (g_model.header.bitmap[0]) { char filename[LEN_BITMAP_NAME + 1]; strAppend(filename, g_model.header.bitmap, LEN_BITMAP_NAME); std::string fullpath = std::string(BITMAPS_PATH PATH_SEPARATOR) + filename; - image->setSource(fullpath); + image->setSource(fullpath.c_str()); } else { image->clearSource(); } deps_hash = getHash(); } - image->setRect( - {0, isLarge ? LARGE_IMG_H : 0, width(), height() - (isLarge ? LARGE_IMG_H : 0)}); image->show(image->hasImage()); - image->setZoom(); label->show(isLarge || !image->hasImage()); } @@ -123,7 +123,7 @@ class ModelBitmapWidget : public Widget bool isLarge = false; uint32_t deps_hash = 0; StaticText* label = nullptr; - StaticImage* image = nullptr; + StaticBitmap* image = nullptr; uint32_t getHash() { return hash(g_model.header.bitmap, LEN_BITMAP_NAME); }