From 752954fec5efdddfe942ba2e2f6582054fc84a6d Mon Sep 17 00:00:00 2001 From: philmoz Date: Fri, 22 Sep 2023 15:34:32 +1000 Subject: [PATCH] fix(color): Update background color on user interface page when theme changed (#4078) * Update background color on user interface page when theme is changed. * Refresh without redrawing entire page when theme changes. * chore: Remove completed TODOs, formatting --- .../gui/colorlcd/screen_user_interface.cpp | 135 ++++++++++-------- .../src/gui/colorlcd/screen_user_interface.h | 2 + 2 files changed, 77 insertions(+), 60 deletions(-) diff --git a/radio/src/gui/colorlcd/screen_user_interface.cpp b/radio/src/gui/colorlcd/screen_user_interface.cpp index cabc37f83..a79ca9b63 100644 --- a/radio/src/gui/colorlcd/screen_user_interface.cpp +++ b/radio/src/gui/colorlcd/screen_user_interface.cpp @@ -24,37 +24,6 @@ #include "file_preview.h" #include "menu_screen.h" -struct ThemeDetails : public Window { - ThemeDetails(Window* parent, ThemeFile* theme) : Window(parent, rect_t{}) - { - // vertical flow layout - lv_obj_set_flex_flow(lvobj, LV_FLEX_FLOW_COLUMN); - lv_obj_set_style_pad_row(lvobj, 2, LV_PART_MAIN); - - // make the object fill the grid cell - lv_obj_set_style_grid_cell_x_align(lvobj, LV_GRID_ALIGN_STRETCH, 0); - - // TODO: translation - new StaticText(this, rect_t{}, "Author", 0, - COLOR_THEME_PRIMARY1 | FONT(BOLD)); - auto txt = new StaticText(this, rect_t{}, theme->getAuthor(), 0, - COLOR_THEME_PRIMARY1); - - // labels default to LV_SIZE_CONTENT, - // which could overflow the width avail - auto obj = txt->getLvObj(); - lv_obj_set_width(obj, lv_pct(100)); - - // TODO: translation - new StaticText(this, rect_t{}, "Description", 0, - COLOR_THEME_PRIMARY1 | FONT(BOLD)); - txt = new StaticText(this, rect_t{}, theme->getInfo(), 0, - COLOR_THEME_PRIMARY1); - obj = txt->getLvObj(); - lv_obj_set_width(obj, lv_pct(100)); - } -}; - #if LCD_W > LCD_H // landscape // form grid @@ -85,6 +54,76 @@ static const lv_coord_t theme_row_dsc[] = {LV_GRID_CONTENT, LV_GRID_CONTENT, constexpr coord_t MAX_PREVIEW_WIDTH = (100 * LV_DPI_DEF) / 57; constexpr coord_t MAX_PREVIEW_HEIGHT = LV_DPI_DEF; +class ThemeView : public FormWindow +{ + public: + ThemeView(Window* parent) : FormWindow(parent, rect_t{}) + { + padAll(0); + setFlexLayout(LV_FLEX_FLOW_COLUMN, 0); + + update(); + } + + void update() + { + auto tp = ThemePersistance::instance(); + auto theme = tp->getCurrentTheme(); + + if (theme) { + if (!details) { + FlexGridLayout theme_grid(theme_col_dsc, theme_row_dsc); + auto line = newLine(&theme_grid); + + details = new Window(line, rect_t{}); + // vertical flow layout + lv_obj_set_flex_flow(details->getLvObj(), LV_FLEX_FLOW_COLUMN); + lv_obj_set_style_pad_row(details->getLvObj(), 2, LV_PART_MAIN); + + // make the object fill the grid cell + lv_obj_set_style_grid_cell_x_align(details->getLvObj(), LV_GRID_ALIGN_STRETCH, 0); + + new StaticText(details, rect_t{}, STR_AUTHOR, 0, COLOR_THEME_PRIMARY1 | FONT(BOLD)); + author = new StaticText(details, rect_t{}, "", 0, COLOR_THEME_PRIMARY1); + + // labels default to LV_SIZE_CONTENT, + // which could overflow the width avail + lv_obj_set_width(author->getLvObj(), lv_pct(100)); + + new StaticText(details, rect_t{}, STR_DESCRIPTION, 0, COLOR_THEME_PRIMARY1 | FONT(BOLD)); + description = new StaticText(details, rect_t{}, "", 0, COLOR_THEME_PRIMARY1); + + lv_obj_set_width(description->getLvObj(), lv_pct(100)); + + preview = new FilePreview(line, rect_t{}, false); + + // center within cell + lv_obj_set_style_grid_cell_x_align(preview->getLvObj(), LV_GRID_ALIGN_CENTER, 0); + } + + author->setText(theme->getAuthor()); + description->setText(theme->getInfo()); + + auto themeImage = theme->getThemeImageFileNames(); + if (themeImage.size() > 0) { + preview->setFile(themeImage[0].c_str()); + + // adjust width according to max + preview->setWidth(min(MAX_PREVIEW_WIDTH, preview->getBitmapWidth())); + preview->setHeight(min(MAX_PREVIEW_HEIGHT, preview->getBitmapHeight())); + } else { + preview->setFile(""); + } + } + } + + protected: + Window* details = nullptr; + FilePreview* preview = nullptr; + StaticText* author = nullptr; + StaticText* description = nullptr; +}; + ScreenUserInterfacePage::ScreenUserInterfacePage(ScreenMenu* menu): PageTab(STR_USER_INTERFACE, ICON_THEME_SETUP), menu(menu) @@ -126,36 +165,12 @@ void ScreenUserInterfacePage::build(FormWindow* window) tp->setThemeIndex(value); tp->applyTheme(value); tp->setDefaultTheme(value); - - // TODO: shouldn't be necessary, would be better to send LV_EVENT_CHANGED - window->clear(); - build(window); + TabsGroup::refreshTheme(); + themeView->update(); }); - auto theme = tp->getCurrentTheme(); - FilePreview* preview = nullptr; - - if (theme) { - FlexGridLayout theme_grid(theme_col_dsc, theme_row_dsc); - line = window->newLine(&theme_grid); - - new ThemeDetails(line, theme); - - auto themeImage = theme->getThemeImageFileNames(); - if (themeImage.size() > 0) { - preview = new FilePreview(line, rect_t{}, false); - preview->setFile(themeImage[0].c_str()); - - // adjust width according to max - preview->setWidth(min(MAX_PREVIEW_WIDTH, preview->getBitmapWidth())); - preview->setHeight(min(MAX_PREVIEW_HEIGHT, preview->getBitmapHeight())); - - // center within cell - auto obj = preview->getLvObj(); - lv_obj_set_style_grid_cell_x_align(obj, LV_GRID_ALIGN_CENTER, 0); - } - } - - window->updateSize(); + grid.setColSpan(2); + line = window->newLine(&grid); + themeView = new ThemeView(line); } diff --git a/radio/src/gui/colorlcd/screen_user_interface.h b/radio/src/gui/colorlcd/screen_user_interface.h index 6f90ee572..7f1bc19e1 100644 --- a/radio/src/gui/colorlcd/screen_user_interface.h +++ b/radio/src/gui/colorlcd/screen_user_interface.h @@ -24,6 +24,7 @@ #include "tabsgroup.h" class ScreenMenu; +class ThemeView; class ScreenUserInterfacePage : public PageTab { @@ -34,4 +35,5 @@ class ScreenUserInterfacePage : public PageTab protected: ScreenMenu* menu; + ThemeView* themeView = nullptr; };