From 8ff01377088ff2b3e80a7667b6c97638a859e60a Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Mon, 5 Apr 2021 18:32:28 +0200 Subject: [PATCH] unify common layout settings --- radio/src/gui/colorlcd/layout.cpp | 61 +++++++++----------- radio/src/gui/colorlcd/layout.h | 46 ++++++++++++++- radio/src/gui/colorlcd/layouts/layout1x1.cpp | 26 ++------- radio/src/gui/colorlcd/layouts/layout2+1.cpp | 23 +------- radio/src/gui/colorlcd/layouts/layout2x1.cpp | 23 +------- radio/src/gui/colorlcd/layouts/layout2x2.cpp | 23 +------- radio/src/gui/colorlcd/layouts/layout2x4.cpp | 7 +-- 7 files changed, 84 insertions(+), 125 deletions(-) diff --git a/radio/src/gui/colorlcd/layout.cpp b/radio/src/gui/colorlcd/layout.cpp index a375689c5..f48d025eb 100644 --- a/radio/src/gui/colorlcd/layout.cpp +++ b/radio/src/gui/colorlcd/layout.cpp @@ -97,14 +97,14 @@ void loadCustomScreens() } } -void Layout::decorate(bool topbar, bool sliders, bool trims, bool flightMode) +void Layout::decorate() { // check if deco setting are still up-to-date uint8_t checkSettings = - (topbar ? 1 << 0 : 0) | - (sliders ? 1 << 1 : 0) | - (trims ? 1 << 2 : 0) | - (flightMode ? 1 << 3 : 0); + (hasTopbar() ? 1 << 0 : 0) | + (hasSliders() ? 1 << 1 : 0) | + (hasTrims() ? 1 << 2 : 0) | + (hasFlightMode() ? 1 << 3 : 0); if (checkSettings == decorationSettings) { // everything ok, exit! @@ -123,16 +123,16 @@ void Layout::decorate(bool topbar, bool sliders, bool trims, bool flightMode) // save settings decorationSettings = checkSettings; - - if (topbar) { + + if (hasTopbar()) { topBar = new TopBar(this); topBar->load(); decorations.push_back(topBar); } - if (sliders) { + if (hasSliders()) { #if defined(HARDWARE_EXT1) || defined(HARDWARE_EXT2) - coord_t yOffset = (trims ? - TRIM_SQUARE_SIZE : 0) + (topbar ? TOPBAR_HEIGHT / 2 : 0); + coord_t yOffset = (hasTrims() ? - TRIM_SQUARE_SIZE : 0) + (hasTopbar() ? TOPBAR_HEIGHT / 2 : 0); #endif decorations.push_back( @@ -163,17 +163,17 @@ void Layout::decorate(bool topbar, bool sliders, bool trims, bool flightMode) #if defined(HARDWARE_EXT1) if (IS_POT_SLIDER_AVAILABLE(EXT1)) { decorations.push_back( - new MainViewVerticalSlider(this, {HMARGIN, LCD_H / 2 - VERTICAL_SLIDERS_HEIGHT(topbar) / 2 + yOffset, TRIM_SQUARE_SIZE, VERTICAL_SLIDERS_HEIGHT(topbar) / 2}, + new MainViewVerticalSlider(this, {HMARGIN, LCD_H / 2 - VERTICAL_SLIDERS_HEIGHT(hasTopbar()) / 2 + yOffset, TRIM_SQUARE_SIZE, VERTICAL_SLIDERS_HEIGHT(hasTopbar()) / 2}, [=] { return calibratedAnalogs[CALIBRATED_SLIDER_REAR_LEFT]; }) ); decorations.push_back( - new MainViewVerticalSlider(this, {HMARGIN, LCD_H / 2 + yOffset, TRIM_SQUARE_SIZE, VERTICAL_SLIDERS_HEIGHT(topbar) / 2}, + new MainViewVerticalSlider(this, {HMARGIN, LCD_H / 2 + yOffset, TRIM_SQUARE_SIZE, VERTICAL_SLIDERS_HEIGHT(hasTopbar()) / 2}, [=] { return calibratedAnalogs[CALIBRATED_POT_EXT1]; }) ); } else { decorations.push_back( - new MainViewVerticalSlider(this, {HMARGIN, LCD_H / 2 - VERTICAL_SLIDERS_HEIGHT(topbar) / 2 + yOffset, TRIM_SQUARE_SIZE, VERTICAL_SLIDERS_HEIGHT(topbar)}, + new MainViewVerticalSlider(this, {HMARGIN, LCD_H / 2 - VERTICAL_SLIDERS_HEIGHT(hasTopbar()) / 2 + yOffset, TRIM_SQUARE_SIZE, VERTICAL_SLIDERS_HEIGHT(hasTopbar())}, [=] { return calibratedAnalogs[CALIBRATED_SLIDER_REAR_LEFT]; }) ); } @@ -182,33 +182,33 @@ void Layout::decorate(bool topbar, bool sliders, bool trims, bool flightMode) #if defined(HARDWARE_EXT2) if (IS_POT_SLIDER_AVAILABLE(EXT2)) { decorations.push_back( - new MainViewVerticalSlider(this, {LCD_W - HMARGIN - TRIM_SQUARE_SIZE, LCD_H / 2 - VERTICAL_SLIDERS_HEIGHT(topbar) / 2 + yOffset, TRIM_SQUARE_SIZE, - VERTICAL_SLIDERS_HEIGHT(topbar) / 2}, + new MainViewVerticalSlider(this, {LCD_W - HMARGIN - TRIM_SQUARE_SIZE, LCD_H / 2 - VERTICAL_SLIDERS_HEIGHT(hasTopbar()) / 2 + yOffset, TRIM_SQUARE_SIZE, + VERTICAL_SLIDERS_HEIGHT(hasTopbar()) / 2}, [=] { return calibratedAnalogs[CALIBRATED_SLIDER_REAR_RIGHT]; }) ); decorations.push_back( new MainViewVerticalSlider(this, {LCD_W - HMARGIN - TRIM_SQUARE_SIZE, LCD_H / 2 + yOffset, TRIM_SQUARE_SIZE, - VERTICAL_SLIDERS_HEIGHT(topbar) / 2}, + VERTICAL_SLIDERS_HEIGHT(hasTopbar()) / 2}, [=] { return calibratedAnalogs[CALIBRATED_POT_EXT2]; }) ); } else { decorations.push_back( - new MainViewVerticalSlider(this, {LCD_W - HMARGIN - TRIM_SQUARE_SIZE, LCD_H / 2 - VERTICAL_SLIDERS_HEIGHT(topbar) / 2 + yOffset, TRIM_SQUARE_SIZE, - VERTICAL_SLIDERS_HEIGHT(topbar)}, + new MainViewVerticalSlider(this, {LCD_W - HMARGIN - TRIM_SQUARE_SIZE, LCD_H / 2 - VERTICAL_SLIDERS_HEIGHT(hasTopbar()) / 2 + yOffset, TRIM_SQUARE_SIZE, + VERTICAL_SLIDERS_HEIGHT(hasTopbar())}, [=] { return calibratedAnalogs[CALIBRATED_SLIDER_REAR_RIGHT]; }) ); } #endif } - if (trims) { + if (hasTrims()) { #if defined(HARDWARE_POT3) || defined(HARDWARE_EXT1) - coord_t xOffset = sliders? TRIM_SQUARE_SIZE : 0; + coord_t xOffset = hasSliders() ? TRIM_SQUARE_SIZE : 0; #else coord_t xOffset = 0; #endif - coord_t yOffset = (trims ? - TRIM_SQUARE_SIZE : 0); + coord_t yOffset = (hasTrims() ? - TRIM_SQUARE_SIZE : 0); // Trim order TRIM_LH, TRIM_LV, TRIM_RV, TRIM_RH @@ -226,20 +226,20 @@ void Layout::decorate(bool topbar, bool sliders, bool trims, bool flightMode) // Left decorations.push_back( - new MainViewVerticalTrim(this, {HMARGIN + xOffset, LCD_H /2 - VERTICAL_SLIDERS_HEIGHT(topbar) / 2 + yOffset + (topbar ? TOPBAR_HEIGHT / 2 : 0), TRIM_SQUARE_SIZE, VERTICAL_SLIDERS_HEIGHT(topbar)}, + new MainViewVerticalTrim(this, {HMARGIN + xOffset, LCD_H /2 - VERTICAL_SLIDERS_HEIGHT(hasTopbar()) / 2 + yOffset + (hasTopbar() ? TOPBAR_HEIGHT / 2 : 0), TRIM_SQUARE_SIZE, VERTICAL_SLIDERS_HEIGHT(hasTopbar())}, [=] { return getTrimValue(mixerCurrentFlightMode, 1); }) ); // Right decorations.push_back( - new MainViewVerticalTrim(this, {LCD_W - HMARGIN - TRIM_SQUARE_SIZE - xOffset, LCD_H /2 - VERTICAL_SLIDERS_HEIGHT(topbar) / 2 + yOffset + (topbar ? TOPBAR_HEIGHT / 2 : 0), TRIM_SQUARE_SIZE, VERTICAL_SLIDERS_HEIGHT(topbar)}, + new MainViewVerticalTrim(this, {LCD_W - HMARGIN - TRIM_SQUARE_SIZE - xOffset, LCD_H /2 - VERTICAL_SLIDERS_HEIGHT(hasTopbar()) / 2 + yOffset + (hasTopbar() ? TOPBAR_HEIGHT / 2 : 0), TRIM_SQUARE_SIZE, VERTICAL_SLIDERS_HEIGHT(hasTopbar())}, [=] { return getTrimValue(mixerCurrentFlightMode, 2); }) ); } - if (flightMode) { + if (hasFlightMode()) { decorations.push_back( - new DynamicText(this, {50, LCD_H - 4 - (sliders? 2 * TRIM_SQUARE_SIZE: TRIM_SQUARE_SIZE), LCD_W - 100, 20}, [=] { + new DynamicText(this, {50, LCD_H - 4 - (hasSliders() ? 2 * TRIM_SQUARE_SIZE: TRIM_SQUARE_SIZE), LCD_W - 100, 20}, [=] { return g_model.flightModeData[mixerCurrentFlightMode].name; }, CENTERED) ); @@ -248,21 +248,16 @@ void Layout::decorate(bool topbar, bool sliders, bool trims, bool flightMode) rect_t Layout::getMainZone(rect_t zone) const { - bool hasTopbar = getOptionValue(OPTION_TOPBAR)->boolValue; - bool hasFM = getOptionValue(OPTION_FM)->boolValue; - bool hasSliders = getOptionValue(OPTION_SLIDERS)->boolValue; - bool hasTrims = getOptionValue(OPTION_TRIMS)->boolValue; - - if (hasTopbar) { + if (hasTopbar()) { zone.y += MENU_HEADER_HEIGHT; zone.h -= MENU_HEADER_HEIGHT; } - if (hasFM || hasTrims) { + if (hasFlightMode() || hasTrims()) { zone.h -= TRIM_SQUARE_SIZE; } - if (hasSliders) { + if (hasSliders()) { #if NUM_SLIDERS + NUM_POTS > 2 zone.h -= TRIM_SQUARE_SIZE; #endif @@ -270,7 +265,7 @@ rect_t Layout::getMainZone(rect_t zone) const zone.x += TRIM_SQUARE_SIZE; } - if (hasTrims) { + if (hasTrims()) { zone.w -= 2 * TRIM_SQUARE_SIZE; zone.x += TRIM_SQUARE_SIZE; } diff --git a/radio/src/gui/colorlcd/layout.h b/radio/src/gui/colorlcd/layout.h index 402468d48..b387c2fb6 100644 --- a/radio/src/gui/colorlcd/layout.h +++ b/radio/src/gui/colorlcd/layout.h @@ -32,7 +32,19 @@ constexpr coord_t TRIM_SQUARE_SIZE = 17; class LayoutFactory; -class Layout: public WidgetsContainer +#define LAYOUT_COMMON_OPTIONS \ + { STR_TOP_BAR, ZoneOption::Bool }, \ + { STR_FLIGHT_MODE, ZoneOption::Bool }, \ + { STR_SLIDERS, ZoneOption::Bool }, \ + { STR_TRIMS, ZoneOption::Bool }, \ + { STR_MIRROR, ZoneOption::Bool } + +#define LAYOUT_OPTIONS_END \ + { nullptr, ZoneOption::Bool } + +typedef WidgetsContainer LayoutBase; + +class Layout: public LayoutBase { friend class LayoutFactory; @@ -48,9 +60,10 @@ class Layout: public WidgetsContainer }; Layout(const LayoutFactory * factory, PersistentData * persistentData): - WidgetsContainer({0, 0, LCD_W, LCD_H}, persistentData), + LayoutBase({0, 0, LCD_W, LCD_H}, persistentData), factory(factory) { + decorate(); } inline const LayoutFactory * getFactory() const @@ -58,7 +71,31 @@ class Layout: public WidgetsContainer return factory; } - void decorate(bool topbar, bool sliders, bool trims, bool flightMode); + void checkEvents() override + { + LayoutBase::checkEvents(); + decorate(); + } + + bool hasTopbar() const { + return getOptionValue(OPTION_TOPBAR)->boolValue; + } + + bool hasFlightMode() const { + return getOptionValue(OPTION_FM)->boolValue; + } + + bool hasSliders() const { + return getOptionValue(OPTION_SLIDERS)->boolValue; + } + + bool hasTrims() const { + return getOptionValue(OPTION_TRIMS)->boolValue; + } + + bool isMirrored() const { + return getOptionValue(OPTION_MIRRORED)->boolValue; + } protected: const LayoutFactory * factory; @@ -66,6 +103,9 @@ class Layout: public WidgetsContainer uint8_t decorationSettings = 0; std::list decorations; + // adds trims, sliders, pots, etc... + void decorate(); + // get the Zone rect without decoration rect_t getMainZone(rect_t zone) const; }; diff --git a/radio/src/gui/colorlcd/layouts/layout1x1.cpp b/radio/src/gui/colorlcd/layouts/layout1x1.cpp index 74ebf1c82..13dcf0cd1 100644 --- a/radio/src/gui/colorlcd/layouts/layout1x1.cpp +++ b/radio/src/gui/colorlcd/layouts/layout1x1.cpp @@ -34,12 +34,8 @@ const uint8_t LBM_LAYOUT_1x1[] = { }; const ZoneOption OPTIONS_LAYOUT_1x1[] = { - { STR_TOP_BAR, ZoneOption::Bool }, - { STR_FLIGHT_MODE, ZoneOption::Bool }, - { STR_SLIDERS, ZoneOption::Bool }, - { STR_TRIMS, ZoneOption::Bool }, - { STR_MIRROR, ZoneOption::Bool }, - { nullptr, ZoneOption::Bool } + LAYOUT_COMMON_OPTIONS, + LAYOUT_OPTIONS_END }; class Layout1x1: public Layout @@ -48,27 +44,23 @@ class Layout1x1: public Layout Layout1x1(const LayoutFactory * factory, Layout::PersistentData * persistentData): Layout(factory, persistentData) { - decorate(); } void create() override { Layout::create(); + // TODO: make this common to all layouts as well persistentData->options[0].value.boolValue = true; persistentData->options[1].value.boolValue = true; persistentData->options[2].value.boolValue = true; persistentData->options[3].value.boolValue = true; persistentData->options[4].value.boolValue = false; persistentData->options[5].value.boolValue = false; + + // TODO: really needed? decorate(); } - void decorate() - { - Layout::decorate(HAS_TOPBAR(), HAS_SLIDERS(), HAS_TRIMS(), HAS_FM()); - } - - unsigned int getZonesCount() const override { return 1; @@ -80,14 +72,6 @@ class Layout1x1: public Layout return zone; } - - void checkEvents() override - { - Layout::checkEvents(); - decorate(); - } - protected: - uint8_t value = 0; }; BaseLayoutFactory layout1x1("Layout1x1", "Fullscreen", LBM_LAYOUT_1x1, OPTIONS_LAYOUT_1x1); diff --git a/radio/src/gui/colorlcd/layouts/layout2+1.cpp b/radio/src/gui/colorlcd/layouts/layout2+1.cpp index ed40c6a7f..989775d71 100644 --- a/radio/src/gui/colorlcd/layouts/layout2+1.cpp +++ b/radio/src/gui/colorlcd/layouts/layout2+1.cpp @@ -33,12 +33,8 @@ const uint8_t LBM_LAYOUT_2P1[] = { }; const ZoneOption OPTIONS_LAYOUT_2P1[] = { - { STR_TOP_BAR, ZoneOption::Bool }, - { STR_FLIGHT_MODE, ZoneOption::Bool }, - { STR_SLIDERS, ZoneOption::Bool }, - { STR_TRIMS, ZoneOption::Bool }, - { STR_MIRROR, ZoneOption::Bool }, - { nullptr, ZoneOption::Bool } + LAYOUT_COMMON_OPTIONS, + LAYOUT_OPTIONS_END }; const rect_t ZONES_LAYOUT_2P1[3] = { @@ -53,7 +49,6 @@ class Layout2P1: public Layout Layout2P1(const LayoutFactory * factory, Layout::PersistentData * persistentData): Layout(factory, persistentData) { - decorate(); } void create() override @@ -68,11 +63,6 @@ class Layout2P1: public Layout decorate(); } - void decorate() - { - Layout::decorate(HAS_TOPBAR(), HAS_SLIDERS(), HAS_TRIMS(), HAS_FM()); - } - unsigned int getZonesCount() const override { return DIM(ZONES_LAYOUT_2P1); @@ -82,15 +72,6 @@ class Layout2P1: public Layout { return ZONES_LAYOUT_2P1[index]; } - - void checkEvents() override - { - Layout::checkEvents(); - // TODO call this from the Layout config window - decorate(); - } - protected: - uint8_t value = 0; }; BaseLayoutFactory layout2P1("Layout2P1", "2 + 1", LBM_LAYOUT_2P1, OPTIONS_LAYOUT_2P1); diff --git a/radio/src/gui/colorlcd/layouts/layout2x1.cpp b/radio/src/gui/colorlcd/layouts/layout2x1.cpp index 67610c614..2e9f1f875 100644 --- a/radio/src/gui/colorlcd/layouts/layout2x1.cpp +++ b/radio/src/gui/colorlcd/layouts/layout2x1.cpp @@ -33,12 +33,8 @@ const uint8_t LBM_LAYOUT_2x1[] = { }; const ZoneOption OPTIONS_LAYOUT_2x1[] = { - { STR_TOP_BAR, ZoneOption::Bool }, - { STR_FLIGHT_MODE, ZoneOption::Bool }, - { STR_SLIDERS, ZoneOption::Bool }, - { STR_TRIMS, ZoneOption::Bool }, - { STR_MIRROR, ZoneOption::Bool }, - { nullptr, ZoneOption::Bool } + LAYOUT_COMMON_OPTIONS, + LAYOUT_OPTIONS_END }; class Layout2x1: public Layout @@ -47,7 +43,6 @@ class Layout2x1: public Layout Layout2x1(const LayoutFactory * factory, Layout::PersistentData * persistentData): Layout(factory, persistentData) { - decorate(); } void create() override @@ -62,12 +57,6 @@ class Layout2x1: public Layout decorate(); } - void decorate() - { - Layout::decorate(HAS_TOPBAR(), HAS_SLIDERS(), HAS_TRIMS(), HAS_FM()); - } - - unsigned int getZonesCount() const override { return 2; @@ -88,14 +77,6 @@ class Layout2x1: public Layout } return zone; } - - void checkEvents() override - { - Layout::checkEvents(); - decorate(); - } - protected: - uint8_t value = 0; }; BaseLayoutFactory Layout2x1("Layout2x1", "2 x 1", LBM_LAYOUT_2x1, OPTIONS_LAYOUT_2x1); diff --git a/radio/src/gui/colorlcd/layouts/layout2x2.cpp b/radio/src/gui/colorlcd/layouts/layout2x2.cpp index 37bf4515b..59c346c8e 100644 --- a/radio/src/gui/colorlcd/layouts/layout2x2.cpp +++ b/radio/src/gui/colorlcd/layouts/layout2x2.cpp @@ -33,12 +33,8 @@ const uint8_t LBM_LAYOUT_2x2[] = { }; const ZoneOption OPTIONS_LAYOUT_2x2[] = { - { STR_TOP_BAR, ZoneOption::Bool }, - { STR_FLIGHT_MODE, ZoneOption::Bool }, - { STR_SLIDERS, ZoneOption::Bool }, - { STR_TRIMS, ZoneOption::Bool }, - { STR_MIRROR, ZoneOption::Bool }, - { nullptr, ZoneOption::Bool } + LAYOUT_COMMON_OPTIONS, + LAYOUT_OPTIONS_END }; class Layout2x2: public Layout @@ -47,7 +43,6 @@ class Layout2x2: public Layout Layout2x2(const LayoutFactory * factory, Layout::PersistentData * persistentData): Layout(factory, persistentData) { - decorate(); } void create() override @@ -62,11 +57,6 @@ class Layout2x2: public Layout decorate(); } - void decorate() - { - Layout::decorate(HAS_TOPBAR(), HAS_SLIDERS(), HAS_TRIMS(), HAS_FM()); - } - unsigned int getZonesCount() const override { return 4; @@ -90,15 +80,6 @@ class Layout2x2: public Layout } return zone; } - - void checkEvents() override - { - Layout::checkEvents(); - decorate(); - } - - protected: - uint8_t value = 0; }; BaseLayoutFactory layout2x2("Layout2x2", "2 x 2", LBM_LAYOUT_2x2, OPTIONS_LAYOUT_2x2); diff --git a/radio/src/gui/colorlcd/layouts/layout2x4.cpp b/radio/src/gui/colorlcd/layouts/layout2x4.cpp index a9bf78e76..5a5d183ed 100644 --- a/radio/src/gui/colorlcd/layouts/layout2x4.cpp +++ b/radio/src/gui/colorlcd/layouts/layout2x4.cpp @@ -25,15 +25,12 @@ const uint8_t LBM_LAYOUT_2x4[] = { }; const ZoneOption OPTIONS_LAYOUT_2x4[] = { - { "Top bar", ZoneOption::Bool }, - { "Flight mode", ZoneOption::Bool }, - { "Sliders", ZoneOption::Bool }, - { "Trims", ZoneOption::Bool }, + LAYOUT_COMMON_OPTIONS, { "Panel1 background", ZoneOption::Bool }, { " Color", ZoneOption::Color }, { "Panel2 background", ZoneOption::Bool }, { " Color", ZoneOption::Color }, - { nullptr, ZoneOption::Bool } + LAYOUT_OPTIONS_END }; class Layout2x4: public Layout