diff --git a/radio/src/gui/colorlcd/layout.cpp b/radio/src/gui/colorlcd/layout.cpp index 5a995086b..a84c397ca 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,22 +226,55 @@ 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) ); } } + +rect_t Layout::getMainZone(rect_t zone) const +{ + if (hasTopbar()) { + zone.y += MENU_HEADER_HEIGHT; + zone.h -= MENU_HEADER_HEIGHT; + } + + if (hasFlightMode() || hasTrims()) { + zone.h -= TRIM_SQUARE_SIZE; + } + + if (hasSliders()) { +#if NUM_SLIDERS + NUM_POTS > 2 + zone.h -= TRIM_SQUARE_SIZE; +#endif + zone.w -= 2 * TRIM_SQUARE_SIZE; + zone.x += TRIM_SQUARE_SIZE; + } + + if (hasTrims()) { + zone.w -= 2 * TRIM_SQUARE_SIZE; + zone.x += TRIM_SQUARE_SIZE; + } + + if (zone.w % 2 != 0) + zone.w -= 1; + + if (zone.h % 2 != 0) + zone.h -= 1; + + return zone; +} diff --git a/radio/src/gui/colorlcd/layout.h b/radio/src/gui/colorlcd/layout.h index 1be0b623a..bdaf18c30 100644 --- a/radio/src/gui/colorlcd/layout.h +++ b/radio/src/gui/colorlcd/layout.h @@ -32,29 +32,94 @@ 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; public: + + // Common 'ZoneOptionValue's among all layouts + enum { + OPTION_TOPBAR = 0, + OPTION_FM, + OPTION_SLIDERS, + OPTION_TRIMS, + OPTION_MIRRORED, + + OPTION_LAST_DEFAULT=OPTION_MIRRORED + }; + 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(); } + void create() override + { + setOptionValue(OPTION_TOPBAR, OPTION_VALUE_BOOL(true)); + setOptionValue(OPTION_FM, OPTION_VALUE_BOOL(true)); + setOptionValue(OPTION_SLIDERS, OPTION_VALUE_BOOL(true)); + setOptionValue(OPTION_TRIMS, OPTION_VALUE_BOOL(true)); + setOptionValue(OPTION_MIRRORED, OPTION_VALUE_BOOL(false)); + decorate(); + } + inline const LayoutFactory * getFactory() const { 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; TopBar * topBar = nullptr; 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; }; void registerLayout(const LayoutFactory * factory); diff --git a/radio/src/gui/colorlcd/layouts/layout1x1.cpp b/radio/src/gui/colorlcd/layouts/layout1x1.cpp index efa3372d8..ee641b530 100644 --- a/radio/src/gui/colorlcd/layouts/layout1x1.cpp +++ b/radio/src/gui/colorlcd/layouts/layout1x1.cpp @@ -21,12 +21,6 @@ #include "opentx.h" #include "trims.h" -#define HAS_TOPBAR() (persistentData->options[0].value.boolValue == true) -#define HAS_FM() (persistentData->options[1].value.boolValue == true) -#define HAS_SLIDERS() (persistentData->options[2].value.boolValue == true) -#define HAS_TRIMS() (persistentData->options[3].value.boolValue == true) -#define IS_MIRRORED() (persistentData->options[4].value.boolValue == true) - constexpr coord_t border = 10; const uint8_t LBM_LAYOUT_1x1[] = { @@ -34,12 +28,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,73 +38,19 @@ class Layout1x1: public Layout Layout1x1(const LayoutFactory * factory, Layout::PersistentData * persistentData): Layout(factory, persistentData) { - decorate(); } - void create() override - { - Layout::create(); - 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; - decorate(); - } - - void decorate() - { - Layout::decorate(HAS_TOPBAR(), HAS_SLIDERS(), HAS_TRIMS(), HAS_FM()); - } - - unsigned int getZonesCount() const override { return 1; } - rect_t getMainZone(rect_t zone) const - { - if (HAS_TOPBAR()) { - zone.y += MENU_HEADER_HEIGHT; - zone.h -= MENU_HEADER_HEIGHT; - } - - if (HAS_FM() || HAS_TRIMS()) { - zone.h -= TRIM_SQUARE_SIZE; - } - - if (HAS_SLIDERS()) { -#if NUM_SLIDERS + NUM_POTS > 2 - zone.h -= TRIM_SQUARE_SIZE; -#endif - zone.w -= 2 * TRIM_SQUARE_SIZE; - zone.x += TRIM_SQUARE_SIZE; - } - - if (HAS_TRIMS()) { - zone.w -= 2 * TRIM_SQUARE_SIZE; - zone.x += TRIM_SQUARE_SIZE; - } - - return zone; - } - rect_t getZone(unsigned int index) const override { rect_t zone = getMainZone({border, border, LCD_W - 2 * border, LCD_H - 2 * border}); 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..dddd3f5f8 100644 --- a/radio/src/gui/colorlcd/layouts/layout2+1.cpp +++ b/radio/src/gui/colorlcd/layouts/layout2+1.cpp @@ -22,29 +22,15 @@ #include "sliders.h" #include "trims.h" -#define HAS_TOPBAR() (persistentData->options[0].value.boolValue == true) -#define HAS_FM() (persistentData->options[1].value.boolValue == true) -#define HAS_SLIDERS() (persistentData->options[2].value.boolValue == true) -#define HAS_TRIMS() (persistentData->options[3].value.boolValue == true) -#define IS_MIRRORED() (persistentData->options[4].value.boolValue == true) +constexpr coord_t border = 10; const uint8_t LBM_LAYOUT_2P1[] = { #include "mask_layout2+1.lbm" }; 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 } -}; - -const rect_t ZONES_LAYOUT_2P1[3] = { - { 240, 60, 192, 152 }, - { 48, 60, 180, 70 }, - { 48, 142, 180, 70 } + LAYOUT_COMMON_OPTIONS, + LAYOUT_OPTIONS_END }; class Layout2P1: public Layout @@ -53,44 +39,29 @@ class Layout2P1: public Layout Layout2P1(const LayoutFactory * factory, Layout::PersistentData * persistentData): Layout(factory, persistentData) { - decorate(); - } - - void create() override - { - Layout::create(); - 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; - decorate(); - } - - void decorate() - { - Layout::decorate(HAS_TOPBAR(), HAS_SLIDERS(), HAS_TRIMS(), HAS_FM()); } unsigned int getZonesCount() const override { - return DIM(ZONES_LAYOUT_2P1); + return 3; } rect_t getZone(unsigned int index) const override { - return ZONES_LAYOUT_2P1[index]; - } + rect_t zone = getMainZone({border, border, LCD_W - 2 * border, LCD_H - 2 * border}); - void checkEvents() override - { - Layout::checkEvents(); - // TODO call this from the Layout config window - decorate(); + if (index == 0) { + return {isMirrored() ? zone.x : zone.x + zone.w / 2, zone.y,zone.w / 2, zone.h}; + } + else if (index == 1) { + return {isMirrored() ? zone.x + zone.w / 2 : zone.x, zone.y,zone.w / 2, zone.h / 2}; + } + else { + return {isMirrored() ? zone.x + zone.w / 2 : zone.x, zone.y + zone.h / 2,zone.w / 2, zone.h / 2}; + } + + return zone; } - 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..7db4f8c02 100644 --- a/radio/src/gui/colorlcd/layouts/layout2x1.cpp +++ b/radio/src/gui/colorlcd/layouts/layout2x1.cpp @@ -22,23 +22,15 @@ #include "sliders.h" #include "trims.h" -#define HAS_TOPBAR() (persistentData->options[0].value.boolValue == true) -#define HAS_FM() (persistentData->options[1].value.boolValue == true) -#define HAS_SLIDERS() (persistentData->options[2].value.boolValue == true) -#define HAS_TRIMS() (persistentData->options[3].value.boolValue == true) -#define IS_MIRRORED() (persistentData->options[4].value.boolValue == true) +constexpr coord_t border = 10; const uint8_t LBM_LAYOUT_2x1[] = { #include "mask_layout2x1.lbm" }; 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,27 +39,8 @@ class Layout2x1: public Layout Layout2x1(const LayoutFactory * factory, Layout::PersistentData * persistentData): Layout(factory, persistentData) { - decorate(); } - void create() override - { - Layout::create(); - 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; - decorate(); - } - - void decorate() - { - Layout::decorate(HAS_TOPBAR(), HAS_SLIDERS(), HAS_TRIMS(), HAS_FM()); - } - - unsigned int getZonesCount() const override { return 2; @@ -75,27 +48,17 @@ class Layout2x1: public Layout rect_t getZone(unsigned int index) const override { - rect_t zone; - zone.w = (LCD_W-3*10) / 2; - zone.x = (index & 1) ? 20 + zone.w : 10; - if (persistentData->options[0].value.boolValue) { - zone.h = (LCD_H-MENU_HEADER_HEIGHT-2*10); - zone.y = MENU_HEADER_HEIGHT + 10; + rect_t zone = getMainZone({border, border, LCD_W - 2 * border, LCD_H - 2 * border}); + + if (index == 0) { + return {isMirrored() ? zone.x + zone.w / 2 : zone.x, zone.y, zone.w / 2, zone.h}; } else { - zone.h = (LCD_H-2*10); - zone.y = 10; + return {isMirrored() ? zone.x : zone.x + zone.w / 2, zone.y, zone.w / 2, zone.h}; } + 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..05d973b62 100644 --- a/radio/src/gui/colorlcd/layouts/layout2x2.cpp +++ b/radio/src/gui/colorlcd/layouts/layout2x2.cpp @@ -22,23 +22,15 @@ #include "sliders.h" #include "trims.h" -#define HAS_TOPBAR() (persistentData->options[0].value.boolValue == true) -#define HAS_FM() (persistentData->options[1].value.boolValue == true) -#define HAS_SLIDERS() (persistentData->options[2].value.boolValue == true) -#define HAS_TRIMS() (persistentData->options[3].value.boolValue == true) -#define IS_MIRRORED() (persistentData->options[4].value.boolValue == true) +constexpr coord_t border = 10; const uint8_t LBM_LAYOUT_2x2[] = { #include "mask_layout2x2.lbm" }; 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,24 +39,6 @@ class Layout2x2: public Layout Layout2x2(const LayoutFactory * factory, Layout::PersistentData * persistentData): Layout(factory, persistentData) { - decorate(); - } - - void create() override - { - Layout::create(); - 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; - decorate(); - } - - void decorate() - { - Layout::decorate(HAS_TOPBAR(), HAS_SLIDERS(), HAS_TRIMS(), HAS_FM()); } unsigned int getZonesCount() const override @@ -74,31 +48,19 @@ class Layout2x2: public Layout rect_t getZone(unsigned int index) const override { - rect_t zone; - zone.w = (LCD_W-3*10) / 2; - zone.x = (index & 1) ? 20 + zone.w : 10; - if (persistentData->options[0].value.boolValue) { - zone.h = (LCD_H-MENU_HEADER_HEIGHT-3*10) / 2; - zone.y = MENU_HEADER_HEIGHT + 10; - } - else { - zone.h = (LCD_H-3*10) / 2; - zone.y = 10; - } - if (index >= 2) { - zone.y += 10 + zone.h; - } + rect_t zone = getMainZone({border, border, LCD_W - 2 * border, LCD_H - 2 * border}); + + zone.w /= 2; + zone.h /= 2; + + if (index == 1 || index == 3) + zone.y += zone.h; + + if ((!isMirrored() && index > 1) || (isMirrored() && index < 2)) + zone.x += zone.w; + 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..b08009f83 100644 --- a/radio/src/gui/colorlcd/layouts/layout2x4.cpp +++ b/radio/src/gui/colorlcd/layouts/layout2x4.cpp @@ -20,25 +20,32 @@ #include "opentx.h" +constexpr coord_t border = 10; + const uint8_t LBM_LAYOUT_2x4[] = { #include "mask_layout2x4.lbm" }; 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 { public: + + enum { + OPTION_PANEL1_BACKGROUND = OPTION_LAST_DEFAULT + 1, + OPTION_PANEL1_COLOR, + OPTION_PANEL2_BACKGROUND, + OPTION_PANEL2_COLOR + }; + Layout2x4(const LayoutFactory * factory, Layout::PersistentData * persistentData): Layout(factory, persistentData) { @@ -47,14 +54,10 @@ class Layout2x4: public Layout void create() override { Layout::create(); - persistentData->options[0] = ZoneOptionValueTyped { ZOV_Bool, OPTION_VALUE_BOOL(true) }; - persistentData->options[1] = ZoneOptionValueTyped { ZOV_Bool, OPTION_VALUE_BOOL(true) }; - persistentData->options[2] = ZoneOptionValueTyped { ZOV_Bool, OPTION_VALUE_BOOL(true) }; - persistentData->options[3] = ZoneOptionValueTyped { ZOV_Bool, OPTION_VALUE_BOOL(true) }; - persistentData->options[4] = ZoneOptionValueTyped { ZOV_Bool, OPTION_VALUE_BOOL(true) }; - persistentData->options[5] = ZoneOptionValueTyped { ZOV_Unsigned, OPTION_VALUE_UNSIGNED( RGB(77,112,203)) }; - persistentData->options[6] = ZoneOptionValueTyped { ZOV_Bool, OPTION_VALUE_BOOL(true) }; - persistentData->options[7] = ZoneOptionValueTyped { ZOV_Unsigned, OPTION_VALUE_UNSIGNED( RGB(77,112,203)) }; + setOptionValue(OPTION_PANEL1_BACKGROUND, OPTION_VALUE_BOOL(true)); + setOptionValue(OPTION_PANEL1_COLOR, OPTION_VALUE_UNSIGNED( RGB(77,112,203))); + setOptionValue(OPTION_PANEL2_BACKGROUND, OPTION_VALUE_BOOL(true)); + setOptionValue(OPTION_PANEL2_COLOR, OPTION_VALUE_UNSIGNED( RGB(77,112,203))); } unsigned int getZonesCount() const override @@ -64,56 +67,19 @@ class Layout2x4: public Layout rect_t getZone(unsigned int index) const override { - rect_t zone; - zone.x = (index >= 4) ? 260 : 60; - zone.y = 56 + (index % 4) * 42; - zone.w = 160; - zone.h = 32; + rect_t zone = getMainZone({border, border, LCD_W - 2 * border, LCD_H - 2 * border}); + + zone.w /= 2; + zone.h /= 4; + + if ((!isMirrored() && index > 3) || (isMirrored() && index < 4)) { + zone.x += zone.w; + } + + zone.y += (index % 4) * zone.h; + return zone; } - -// virtual void refresh(); }; -//void Layout2x4::refresh() -//{ -// theme->drawBackground(); -// -// if (persistentData->options[0].value.boolValue) { -// drawTopBar(); -// } -// -// if (persistentData->options[1].value.boolValue) { -// // Flight mode -// lcdDrawSizedText(LCD_W / 2 - getTextWidth(g_model.flightModeData[mixerCurrentFlightMode].name, -// sizeof(g_model.flightModeData[mixerCurrentFlightMode].name), -// ZCHAR | FONT(XS)) / 2, -// 232, -// g_model.flightModeData[mixerCurrentFlightMode].name, -// sizeof(g_model.flightModeData[mixerCurrentFlightMode].name), ZCHAR | FONT(XS)); -// } -// -// if (persistentData->options[2].value.boolValue) { -// // Pots and rear sliders positions -// drawMainPots(); -// } -// -// if (persistentData->options[3].value.boolValue) { -// // Trims -// drawTrims(mixerCurrentFlightMode); -// } -// -// if (persistentData->options[4].value.boolValue) { -// lcdSetColor(persistentData->options[5].value.unsignedValue); -// lcdDrawSolidFilledRect(50, 50, 180, 170, CUSTOM_COLOR); -// } -// -// if (persistentData->options[6].value.boolValue) { -// lcdSetColor(persistentData->options[7].value.unsignedValue); -// lcdDrawSolidFilledRect(250, 50, 180, 170, CUSTOM_COLOR); -// } -// -// Layout::refresh(); -//} - BaseLayoutFactory layout2x4("Layout2x4", "2 x 4", LBM_LAYOUT_2x4, OPTIONS_LAYOUT_2x4); diff --git a/radio/src/gui/colorlcd/menu_screen.cpp b/radio/src/gui/colorlcd/menu_screen.cpp index 330ddbedf..5dc29a2c8 100644 --- a/radio/src/gui/colorlcd/menu_screen.cpp +++ b/radio/src/gui/colorlcd/menu_screen.cpp @@ -32,9 +32,10 @@ void ScreenMenu::updateTabs() { removeAllTabs(); + addTab(new ScreenUserInterfacePage()); + for (int index = 0; index < MAX_CUSTOM_SCREENS; index++) { if (customScreens[index]) { - auto tab = new ScreenSetupPage(this, customScreens[index], g_model.screenData[index]); std::string title(STR_MAIN_VIEW_X); title.back() = index + '1'; diff --git a/radio/src/gui/colorlcd/screen_setup.cpp b/radio/src/gui/colorlcd/screen_setup.cpp index ca083cbaa..9a586003a 100644 --- a/radio/src/gui/colorlcd/screen_setup.cpp +++ b/radio/src/gui/colorlcd/screen_setup.cpp @@ -26,6 +26,28 @@ #define SET_DIRTY() storageDirty(EE_MODEL) +ScreenUserInterfacePage::ScreenUserInterfacePage(): + PageTab(STR_USER_INTERFACE, ICON_THEME_SETUP) +{ +} + +void ScreenUserInterfacePage::build(FormWindow * window) +{ + FormGridLayout grid; + + // Theme choice + new StaticText(window, grid.getLabelSlot(), STR_THEME, 0, 0); + // TODO: Theme picklist + grid.nextLine(); + + // Theme options ? + + // Top Bar + new StaticText(window, grid.getLabelSlot(), STR_TOP_BAR, 0, 0); + // TODO: enable settings topbar widgets + grid.nextLine(); +} + ScreenAddPage::ScreenAddPage(ScreenMenu * menu, uint8_t pageIndex): PageTab(), menu(menu), @@ -158,25 +180,35 @@ class SetupWidgetsPageSlot: public Button { widget = screen->getWidget(slotIndex); setPressHandler([=]() -> uint8_t { - Menu * menu = new Menu(this); - menu->addLine(TR_SELECT_WIDGET, [=]() { - Menu * menu = new Menu(this); - for (auto factory: getRegisteredWidgets()) { - menu->addLine(factory->getName(), [=]() { - if (widget) widget->deleteLater(); - widget = screen->createWidget(slotIndex, factory); - }); - } - }); if (widget) { + Menu * menu = new Menu(this); + menu->addLine(TR_SELECT_WIDGET, [=]() { + Menu * menu = new Menu(this); + for (auto factory: getRegisteredWidgets()) { + menu->addLine(factory->getName(), [=]() { + if (widget) widget->deleteLater(); + widget = screen->createWidget(slotIndex, factory); + }); + } + }); menu->addLine(TR_WIDGET_SETTINGS, [=]() { new WidgetSettings(this, widget); }); menu->addLine(STR_REMOVE_WIDGET, [=]() { - widget->deleteLater(); - widget = nullptr; + widget->deleteLater(); + widget = nullptr; }); + 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; }); diff --git a/radio/src/gui/colorlcd/screen_setup.h b/radio/src/gui/colorlcd/screen_setup.h index d8372ffb6..a17f714cc 100644 --- a/radio/src/gui/colorlcd/screen_setup.h +++ b/radio/src/gui/colorlcd/screen_setup.h @@ -22,6 +22,15 @@ #include "layout.h" #include "datastructs.h" +class ScreenUserInterfacePage: public PageTab { + public: + ScreenUserInterfacePage(); + + void build(FormWindow * window) override; + + protected: +}; + class ScreenAddPage: public PageTab { public: ScreenAddPage(ScreenMenu * menu, uint8_t pageIndex); diff --git a/radio/src/gui/colorlcd/widgets/outputs.cpp b/radio/src/gui/colorlcd/widgets/outputs.cpp index 97efed9b2..38c6d240a 100644 --- a/radio/src/gui/colorlcd/widgets/outputs.cpp +++ b/radio/src/gui/colorlcd/widgets/outputs.cpp @@ -79,12 +79,12 @@ class OutputsWidget: public Widget void twoColumns(BitmapBuffer * dc) { - uint8_t endColumn = drawChannels(dc, 0, 0, width() / 2, height(), + uint8_t endColumn = drawChannels(dc, 0, 0, (width() / 2) - 1, height(), persistentData->options[0].value.unsignedValue, persistentData->options[1].value.boolValue, persistentData->options[2].value.unsignedValue); - drawChannels(dc, width() / 2 + 2, 0, width() / 2, height(), endColumn + 1, + drawChannels(dc, width() / 2, 0, (width() / 2) - 1, height(), endColumn + 1, persistentData->options[1].value.boolValue, persistentData->options[2].value.unsignedValue); } diff --git a/radio/src/gui/colorlcd/widgets_container.h b/radio/src/gui/colorlcd/widgets_container.h index d1f020a5d..44302ba57 100644 --- a/radio/src/gui/colorlcd/widgets_container.h +++ b/radio/src/gui/colorlcd/widgets_container.h @@ -104,6 +104,11 @@ class WidgetsContainer: public FormGroup, public WidgetsContainerInterface return &persistentData->options[index].value; } + inline void setOptionValue(unsigned int index, const ZoneOptionValue& value) + { + persistentData->options[index].value = value; + } + unsigned int getZonesCount() const override = 0; rect_t getZone(unsigned int index) const override = 0;