From d0a14cf2a23f2a3c4cf1f59be1acaa41ebfdf94d Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Fri, 16 Apr 2021 09:04:11 +0200 Subject: [PATCH] Moved ViewMainDecoration back to Layout This allows each custom screen to have its own trims/sliders/etc being displayed properly while scrolling from view to view. --- radio/src/gui/colorlcd/layout.cpp | 53 +++++++++++++--- radio/src/gui/colorlcd/layout.h | 21 ++++--- radio/src/gui/colorlcd/screen_setup.cpp | 24 +++---- radio/src/gui/colorlcd/view_main.cpp | 84 +++++++++++-------------- radio/src/gui/colorlcd/view_main.h | 27 +++----- 5 files changed, 114 insertions(+), 95 deletions(-) diff --git a/radio/src/gui/colorlcd/layout.cpp b/radio/src/gui/colorlcd/layout.cpp index b291b16ab..d3eb224c1 100644 --- a/radio/src/gui/colorlcd/layout.cpp +++ b/radio/src/gui/colorlcd/layout.cpp @@ -22,6 +22,7 @@ #include "view_main.h" #include "layouts/trims.h" #include "layouts/sliders.h" +#include "view_main_decoration.h" constexpr uint32_t LAYOUT_REFRESH = 1000 / 2; // 2 Hz @@ -172,6 +173,14 @@ void disposeCustomScreen(unsigned idx) memset(dst, 0, len); } +Layout::Layout(const LayoutFactory * factory, PersistentData * persistentData): + LayoutBase({0, 0, LCD_W, LCD_H}, persistentData), + factory(factory), + decoration(new ViewMainDecoration(this, getRect())) +{ + decorate(); +} + void Layout::create() { memset(persistentData, 0, sizeof(PersistentData)); @@ -205,6 +214,26 @@ void Layout::checkEvents() } } +void Layout::setTrimsVisible(bool visible) +{ + decoration->setTrimsVisible(visible); +} + +void Layout::setSlidersVisible(bool visible) +{ + decoration->setSlidersVisible(visible); +} + +void Layout::setFlightModeVisible(bool visible) +{ + decoration->setFlightModeVisible(visible); +} + +void Layout::adjustDecoration() +{ + decoration->adjustDecoration(); +} + void Layout::decorate() { // Check if deco setting are still up-to-date @@ -222,23 +251,29 @@ void Layout::decorate() // Save settings decorationSettings = checkSettings; - auto viewMain = ViewMain::instance(); - // Set visible decoration - viewMain->setTopbarVisible(hasTopbar()); - viewMain->setSlidersVisible(hasSliders()); - viewMain->setTrimsVisible(hasTrims()); - viewMain->setFlightModeVisible(hasFlightMode()); + ViewMain::instance()->setTopbarVisible(hasTopbar()); + setSlidersVisible(hasSliders()); + setTrimsVisible(hasTrims()); + setFlightModeVisible(hasFlightMode()); // Re-compute positions - viewMain->adjustDecoration(); + adjustDecoration(); // and update relevant windows updateZones(); - invalidate(); + + // probably not needed + //invalidate(); +} + +void Layout::createDecoration() +{ } rect_t Layout::getMainZone() const { - return ViewMain::instance()->getMainZone(); + rect_t zone = decoration->getMainZone(); + return ViewMain::instance()->getMainZone(zone); } + diff --git a/radio/src/gui/colorlcd/layout.h b/radio/src/gui/colorlcd/layout.h index d96aeef0f..6ee989802 100644 --- a/radio/src/gui/colorlcd/layout.h +++ b/radio/src/gui/colorlcd/layout.h @@ -32,6 +32,7 @@ constexpr coord_t TRIM_SQUARE_SIZE = 17; constexpr coord_t MAIN_ZONE_BORDER = 10; class LayoutFactory; +class ViewMainDecoration; #define LAYOUT_COMMON_OPTIONS \ { STR_TOP_BAR, ZoneOption::Bool }, \ @@ -62,12 +63,7 @@ class Layout: public LayoutBase OPTION_LAST_DEFAULT=OPTION_MIRRORED }; - Layout(const LayoutFactory * factory, PersistentData * persistentData): - LayoutBase({0, 0, LCD_W, LCD_H}, persistentData), - factory(factory) - { - decorate(); - } + Layout(const LayoutFactory * factory, PersistentData * persistentData); #if defined(DEBUG_WINDOWS) std::string getName() const override @@ -107,8 +103,17 @@ class Layout: public LayoutBase return getOptionValue(OPTION_MIRRORED)->boolValue; } + // Set decoration visibility + void setTrimsVisible(bool visible); + void setSlidersVisible(bool visible); + void setFlightModeVisible(bool visible); + + // Re-calculate positions + void adjustDecoration(); + protected: - const LayoutFactory * factory; + const LayoutFactory * factory = nullptr; + ViewMainDecoration* decoration = nullptr; // Decoration settings bitmask to detect updates uint8_t decorationSettings = 0; @@ -119,6 +124,8 @@ class Layout: public LayoutBase // Updates settings for trims, sliders, pots, etc... void decorate(); + void createDecoration(); + // Get the available space for widgets rect_t getMainZone() const; }; diff --git a/radio/src/gui/colorlcd/screen_setup.cpp b/radio/src/gui/colorlcd/screen_setup.cpp index e33864e18..ba81f0efa 100644 --- a/radio/src/gui/colorlcd/screen_setup.cpp +++ b/radio/src/gui/colorlcd/screen_setup.cpp @@ -137,17 +137,6 @@ class SetupWidgetsPageSlot: public Button } return 0; - // } - // else { - // Menu * menu = new Menu(this); - // for (auto factory: getRegisteredWidgets()) { - // menu->addLine(factory->getName(), [=]() { - // if (widget) widget->deleteLater(); - // widget = screen->createWidget(slotIndex, factory); - // }); - // } - // } - // return 0; }); } @@ -163,7 +152,7 @@ class SetupWidgetsPage: public FormWindow { public: SetupWidgetsPage(ScreenMenu* menu, uint8_t customScreenIdx): - FormWindow(ViewMain::instance(), {0, 0, LCD_W, LCD_H}, /*OPAQUE |*/ FORM_FORWARD_FOCUS), + FormWindow(ViewMain::instance(), {0, 0, 0, 0}, /*OPAQUE |*/ FORM_FORWARD_FOCUS), menu(menu), customScreenIdx(customScreenIdx) { @@ -173,11 +162,13 @@ class SetupWidgetsPage: public FormWindow auto screen = customScreens[customScreenIdx]; if (screen) { screen->attach(this); - screen->setLeft(0); setRect(screen->getRect()); - } - ViewMain::instance()->bringToTop(); + auto viewMain = ViewMain::instance(); + savedView = viewMain->getCurrentMainView(); + viewMain->setCurrentMainView(customScreenIdx); + viewMain->bringToTop(); + } for (unsigned i = 0; i < screen->getZonesCount(); i++) { auto rect = screen->getZone(i); @@ -203,8 +194,8 @@ class SetupWidgetsPage: public FormWindow auto screen = customScreens[customScreenIdx]; if (screen) { auto viewMain = ViewMain::instance(); - screen->setLeft(viewMain->getMainViewLeftPos(customScreenIdx)); screen->attach(viewMain); + viewMain->setCurrentMainView(customScreenIdx); } FormWindow::deleteLater(detach, trash); @@ -228,6 +219,7 @@ class SetupWidgetsPage: public FormWindow protected: ScreenMenu* menu; uint8_t customScreenIdx; + unsigned savedView = 0; // void paint(BitmapBuffer * dc) override // { diff --git a/radio/src/gui/colorlcd/view_main.cpp b/radio/src/gui/colorlcd/view_main.cpp index 2fc3e2294..62f1e81e5 100644 --- a/radio/src/gui/colorlcd/view_main.cpp +++ b/radio/src/gui/colorlcd/view_main.cpp @@ -62,7 +62,7 @@ ViewMain::ViewMain(): }, NO_FOCUS); #endif - createDecoration(); + createTopbar(); setPageWidth(getParent()->width()); focusWindow = this; @@ -77,29 +77,6 @@ void ViewMain::setTopbarVisible(bool visible) topbar->setVisible(visible); } -void ViewMain::setTrimsVisible(bool visible) -{ - decoration->setTrimsVisible(visible); -} - -void ViewMain::setSlidersVisible(bool visible) -{ - decoration->setSlidersVisible(visible); -} - -void ViewMain::setFlightModeVisible(bool visible) -{ - decoration->setFlightModeVisible(visible); -} - -void ViewMain::adjustDecoration() -{ - // Topbar does not need any computation - // (height() has been set in setTopbarVisible()) - - decoration->adjustDecoration(); -} - unsigned ViewMain::getMainViewsCount() const { return views; @@ -112,7 +89,6 @@ void ViewMain::setMainViewsCount(unsigned views) this->views = views; setInnerWidth(getParent()->width() * views); - //setWidth(getParent()->width() * views); } coord_t ViewMain::getMainViewLeftPos(unsigned view) const @@ -120,15 +96,48 @@ coord_t ViewMain::getMainViewLeftPos(unsigned view) const return getParent()->width() * view; } -rect_t ViewMain::getMainZone() const +rect_t ViewMain::getMainZone(rect_t zone) const { - rect_t zone = decoration->getMainZone(); zone.y += topbar->bottom(); zone.h -= topbar->height(); return zone; } +unsigned ViewMain::getCurrentMainView() const +{ + return g_model.view; +} + +void ViewMain::setCurrentMainView(unsigned view) +{ + if (view < getMainViewsCount()) { + g_model.view = view; + setScrollPositionX(g_model.view * pageWidth); + TRACE("### switched to view #%i", g_model.view); + } +} + +void ViewMain::nextMainView() +{ + auto view = getCurrentMainView(); + if (++view >= getMainViewsCount()) + view = 0; + + setCurrentMainView(view); +} + +void ViewMain::previousMainView() +{ + auto view = getCurrentMainView(); + if (view > 0) + view--; + else + view = getMainViewsCount() - 1; + + setCurrentMainView(view); +} + #if defined(HARDWARE_KEYS) void ViewMain::onEvent(event_t event) { @@ -155,12 +164,7 @@ void ViewMain::onEvent(event_t event) case EVT_KEY_BREAK(KEY_PGDN): killEvents(event); - g_model.view++; - if (g_model.view >= getMainViewsCount()) - g_model.view = 0; - setScrollPositionX(g_model.view * pageWidth); - //customScreens[g_model.view]->setFocus(); - TRACE("### switched to view #%i", g_model.view); + nextMainView(); break; //TODO: these need to go away! @@ -171,13 +175,7 @@ void ViewMain::onEvent(event_t event) case EVT_KEY_LONG(KEY_PGDN): #endif killEvents(event); - if (!g_model.view) - g_model.view = getMainViewsCount() - 1; - else - g_model.view--; - setScrollPositionX(g_model.view * pageWidth); - //customScreens[g_model.view]->setFocus(); - TRACE("### switched to view #%i", g_model.view); + previousMainView(); break; } } @@ -235,12 +233,6 @@ void ViewMain::paint(BitmapBuffer * dc) } } -void ViewMain::createDecoration() -{ - createTopbar(); - decoration = new ViewMainDecoration(this, getRect()); -} - void ViewMain::createTopbar() { topbar = new TopBar(this); diff --git a/radio/src/gui/colorlcd/view_main.h b/radio/src/gui/colorlcd/view_main.h index 4a535768a..9eea9367d 100644 --- a/radio/src/gui/colorlcd/view_main.h +++ b/radio/src/gui/colorlcd/view_main.h @@ -25,7 +25,6 @@ #include class TopBar; -class ViewMainDecoration; class SetupWidgetsPage; class ViewMain: public FormWindow @@ -51,18 +50,12 @@ class ViewMain: public FormWindow } #endif - // Set topbar & decoration visibility + // Set topbar visibility void setTopbarVisible(bool visible); - void setTrimsVisible(bool visible); - void setSlidersVisible(bool visible); - void setFlightModeVisible(bool visible); - - // Re-calculate positions - void adjustDecoration(); // Get the available space in the middle of the screen - // (without decoration) - rect_t getMainZone() const; + // (without topbar) + rect_t getMainZone(rect_t zone) const; unsigned getMainViewsCount() const; void setMainViewsCount(unsigned views); @@ -72,11 +65,15 @@ class ViewMain: public FormWindow protected: static ViewMain * _instance; - unsigned views = 0; - TopBar* topbar = nullptr; - ViewMainDecoration* decoration = nullptr; + unsigned views = 0; + TopBar* topbar = nullptr; friend class SetupWidgetsPage; + + unsigned getCurrentMainView() const; + void setCurrentMainView(unsigned view); + void nextMainView(); + void previousMainView(); #if defined(HARDWARE_KEYS) void onEvent(event_t event) override; @@ -84,11 +81,7 @@ class ViewMain: public FormWindow void paint(BitmapBuffer * dc) override; void openMenu(); - - void createDecoration(); void createTopbar(); - - void nextView(); }; #endif // _VIEW_MAIN_H_