From f8f2258a79e7c56a490c138ee978274e1bfe3687 Mon Sep 17 00:00:00 2001 From: philmoz Date: Fri, 23 Dec 2022 12:08:22 +1100 Subject: [PATCH] fix(ui): Update flight mode color on startup/theme edited/theme changed (#2928) --- radio/src/gui/colorlcd/layouts/layout_factory_impl.cpp | 8 ++++++++ radio/src/gui/colorlcd/layouts/layout_factory_impl.h | 3 +++ radio/src/gui/colorlcd/theme_manager.cpp | 7 +++++++ radio/src/gui/colorlcd/view_main.cpp | 9 +++++++++ radio/src/gui/colorlcd/view_main.h | 5 +++++ radio/src/gui/colorlcd/view_main_decoration.cpp | 10 ++++++++++ radio/src/gui/colorlcd/view_main_decoration.h | 2 +- .../src/gui/colorlcd/widgets/widgets_container_impl.h | 1 + radio/src/gui/colorlcd/widgets_container.h | 1 + 9 files changed, 45 insertions(+), 1 deletion(-) diff --git a/radio/src/gui/colorlcd/layouts/layout_factory_impl.cpp b/radio/src/gui/colorlcd/layouts/layout_factory_impl.cpp index 2f4b9123f..b92e0fed8 100644 --- a/radio/src/gui/colorlcd/layouts/layout_factory_impl.cpp +++ b/radio/src/gui/colorlcd/layouts/layout_factory_impl.cpp @@ -81,6 +81,14 @@ void Layout::setFlightModeVisible(bool visible) decoration->setFlightModeVisible(visible); } +void Layout::updateFromTheme() +{ + // Hack to fix flight mode color on main view + // Required because theme is loaded after the main view has been created + if (decoration) + decoration->setFlightModeColor(); +} + void Layout::adjustLayout() { // Check if deco setting are still up-to-date diff --git a/radio/src/gui/colorlcd/layouts/layout_factory_impl.h b/radio/src/gui/colorlcd/layouts/layout_factory_impl.h index 1f84544ca..0d4f8e49c 100644 --- a/radio/src/gui/colorlcd/layouts/layout_factory_impl.h +++ b/radio/src/gui/colorlcd/layouts/layout_factory_impl.h @@ -95,6 +95,9 @@ class Layout: public LayoutBase void setSlidersVisible(bool visible); void setFlightModeVisible(bool visible); + // Update from theme settings + void updateFromTheme() override; + // Updates settings for trims, sliders, pots, etc... void adjustLayout() override; diff --git a/radio/src/gui/colorlcd/theme_manager.cpp b/radio/src/gui/colorlcd/theme_manager.cpp index 99b975d48..493cccb97 100644 --- a/radio/src/gui/colorlcd/theme_manager.cpp +++ b/radio/src/gui/colorlcd/theme_manager.cpp @@ -19,6 +19,7 @@ * GNU General Public License for more details. */ #include "theme_manager.h" +#include "view_main.h" #define MAX_FILES 9 ThemePersistance themePersistance; @@ -327,6 +328,12 @@ void ThemeFile::applyTheme() applyColors(); applyBackground(); OpenTxTheme::instance()->update(false); + + // Update views with new theme + // Currently, on startup, active theme is loaded after ViewMain is created so ViewMain instance is defined + // In case this changes, we call getInstance() here to avoid creating ViewMain + if (ViewMain::getInstance()) + ViewMain::getInstance()->updateFromTheme(); } // avoid leaking memory diff --git a/radio/src/gui/colorlcd/view_main.cpp b/radio/src/gui/colorlcd/view_main.cpp index ecdb0e26e..fda6a6306 100644 --- a/radio/src/gui/colorlcd/view_main.cpp +++ b/radio/src/gui/colorlcd/view_main.cpp @@ -236,6 +236,15 @@ void ViewMain::updateTopbarVisibility() } } +// Update screens after theme loaded / changed +void ViewMain::updateFromTheme() +{ + for (int i = 0; i < MAX_CUSTOM_SCREENS; i += 1) { + if (customScreens[i]) + customScreens[i]->updateFromTheme(); + } +} + void ViewMain::onEvent(event_t event) { #if defined(HARDWARE_KEYS) diff --git a/radio/src/gui/colorlcd/view_main.h b/radio/src/gui/colorlcd/view_main.h index 88fd1772c..89b5dc63e 100644 --- a/radio/src/gui/colorlcd/view_main.h +++ b/radio/src/gui/colorlcd/view_main.h @@ -46,6 +46,8 @@ class ViewMain: public Window return _instance; } + static ViewMain* getInstance() { return _instance; } + #if defined(DEBUG_WINDOWS) std::string getName() const override { @@ -59,6 +61,9 @@ class ViewMain: public Window void disableTopbar(); void updateTopbarVisibility(); bool enableWidgetSelect(bool enable); + + // Update after theme loaded / changed + void updateFromTheme(); // Get the available space in the middle of the screen // (without topbar) diff --git a/radio/src/gui/colorlcd/view_main_decoration.cpp b/radio/src/gui/colorlcd/view_main_decoration.cpp index 70a14aef5..30514a7c5 100644 --- a/radio/src/gui/colorlcd/view_main_decoration.cpp +++ b/radio/src/gui/colorlcd/view_main_decoration.cpp @@ -98,6 +98,16 @@ void ViewMainDecoration::setFlightModeVisible(bool visible) } } +void ViewMainDecoration::setFlightModeColor() +{ + // Hack to fix flight mode color on main view + // Required because theme is loaded after the main view has been created + if (flightMode) { + lv_obj_set_style_text_color(flightMode->getLvObj(), makeLvColor(COLOR_THEME_SECONDARY1), 0); + flightMode->invalidate(); + } +} + rect_t ViewMainDecoration::getMainZone() const { // update layout first diff --git a/radio/src/gui/colorlcd/view_main_decoration.h b/radio/src/gui/colorlcd/view_main_decoration.h index c2543a03b..6d63472a2 100644 --- a/radio/src/gui/colorlcd/view_main_decoration.h +++ b/radio/src/gui/colorlcd/view_main_decoration.h @@ -34,7 +34,7 @@ class ViewMainDecoration void setTrimsVisible(bool visible); void setSlidersVisible(bool visible); void setFlightModeVisible(bool visible); - + void setFlightModeColor(); // Get the available space in the middle of the screen // (without decoration) diff --git a/radio/src/gui/colorlcd/widgets/widgets_container_impl.h b/radio/src/gui/colorlcd/widgets/widgets_container_impl.h index 2f59ad79b..32c4c0e61 100644 --- a/radio/src/gui/colorlcd/widgets/widgets_container_impl.h +++ b/radio/src/gui/colorlcd/widgets/widgets_container_impl.h @@ -141,6 +141,7 @@ class WidgetsContainerImpl : public WidgetsContainer } void adjustLayout() override {} + void updateFromTheme() override {}; protected: PersistentData* persistentData; diff --git a/radio/src/gui/colorlcd/widgets_container.h b/radio/src/gui/colorlcd/widgets_container.h index 333a6f8e3..79f736397 100644 --- a/radio/src/gui/colorlcd/widgets_container.h +++ b/radio/src/gui/colorlcd/widgets_container.h @@ -88,6 +88,7 @@ class WidgetsContainer: public Window virtual void removeWidget(unsigned int index) = 0; virtual void adjustLayout() = 0; virtual void updateZones() = 0; + virtual void updateFromTheme() = 0; };