diff --git a/radio/src/gui/colorlcd/CMakeLists.txt b/radio/src/gui/colorlcd/CMakeLists.txt index e7b0674f9..16dd56461 100644 --- a/radio/src/gui/colorlcd/CMakeLists.txt +++ b/radio/src/gui/colorlcd/CMakeLists.txt @@ -53,6 +53,7 @@ set(GUI_SRC radio_diaganas.cpp radio_calibration.cpp view_main.cpp + view_main_decoration.cpp view_channels.cpp view_logical_switches.cpp view_statistics.cpp diff --git a/radio/src/gui/colorlcd/layout.h b/radio/src/gui/colorlcd/layout.h index 2ec985fd2..48b9e9200 100644 --- a/radio/src/gui/colorlcd/layout.h +++ b/radio/src/gui/colorlcd/layout.h @@ -29,6 +29,7 @@ #define MAX_LAYOUT_OPTIONS 10 constexpr coord_t TRIM_LINE_WIDTH = 8; constexpr coord_t TRIM_SQUARE_SIZE = 17; +constexpr coord_t MAIN_ZONE_BORDER = 10; class LayoutFactory; diff --git a/radio/src/gui/colorlcd/radio_calibration.cpp b/radio/src/gui/colorlcd/radio_calibration.cpp index e7e0d933e..2cd07317a 100644 --- a/radio/src/gui/colorlcd/radio_calibration.cpp +++ b/radio/src/gui/colorlcd/radio_calibration.cpp @@ -21,6 +21,7 @@ #include "opentx.h" #include "radio_calibration.h" #include "sliders.h" +#include "view_main_decoration.h" #define XPOT_DELTA 10 #define XPOT_DELAY 5 /* cycles */ @@ -81,51 +82,14 @@ void RadioCalibrationPage::buildBody(FormWindow * window) new StickCalibrationWindow(window, {40, 20, 90, 90}, STICK1, STICK2); new StickCalibrationWindow(window, {LCD_W - 130, 20, 90, 90}, STICK4, STICK3); -#if defined(PCBHORUS) - - new MainViewHorizontalSlider(this, {HMARGIN, LCD_H - TRIM_SQUARE_SIZE, HORIZONTAL_SLIDERS_WIDTH, TRIM_SQUARE_SIZE}, CALIBRATED_POT1); - - if (IS_POT_MULTIPOS(POT2)) { - new MainView6POS(this, {LCD_W / 2 - MULTIPOS_W / 2, LCD_H - TRIM_SQUARE_SIZE, MULTIPOS_W + 1, MULTIPOS_H}, 1); - } - - new MainViewHorizontalSlider(this, {LCD_W - HORIZONTAL_SLIDERS_WIDTH - HMARGIN, LCD_H - TRIM_SQUARE_SIZE, HORIZONTAL_SLIDERS_WIDTH, TRIM_SQUARE_SIZE}, CALIBRATED_POT3); -#if defined(HARDWARE_EXT1) - coord_t yOffset = TOPBAR_HEIGHT / 2; - - if (IS_POT_SLIDER_AVAILABLE(EXT1)) { - new MainViewVerticalSlider(this, {HMARGIN, LCD_H / 2 - VERTICAL_SLIDERS_HEIGHT / 2 + yOffset, TRIM_SQUARE_SIZE, VERTICAL_SLIDERS_HEIGHT / 2}, - CALIBRATED_SLIDER_REAR_LEFT); - new MainViewVerticalSlider(this, {HMARGIN, LCD_H / 2 + yOffset, TRIM_SQUARE_SIZE, VERTICAL_SLIDERS_HEIGHT / 2}, - CALIBRATED_POT_EXT1); - } - else { - new MainViewVerticalSlider(this, {HMARGIN, LCD_H / 2 - VERTICAL_SLIDERS_HEIGHT / 2 + yOffset, TRIM_SQUARE_SIZE, VERTICAL_SLIDERS_HEIGHT}, - CALIBRATED_SLIDER_REAR_LEFT); - } -#endif - -#if defined(HARDWARE_EXT2) - if (IS_POT_SLIDER_AVAILABLE(EXT2)) { - new MainViewVerticalSlider(this, {LCD_W - HMARGIN - TRIM_SQUARE_SIZE, LCD_H / 2 - VERTICAL_SLIDERS_HEIGHT / 2 + yOffset, TRIM_SQUARE_SIZE, - VERTICAL_SLIDERS_HEIGHT / 2}, - CALIBRATED_SLIDER_REAR_RIGHT); - new MainViewVerticalSlider(this, {LCD_W - HMARGIN - TRIM_SQUARE_SIZE, LCD_H / 2 + yOffset, TRIM_SQUARE_SIZE, - VERTICAL_SLIDERS_HEIGHT / 2}, - CALIBRATED_POT_EXT2); - } - else { - new MainViewVerticalSlider(this, {LCD_W - HMARGIN - TRIM_SQUARE_SIZE, LCD_H / 2 - VERTICAL_SLIDERS_HEIGHT / 2 + yOffset, TRIM_SQUARE_SIZE, - VERTICAL_SLIDERS_HEIGHT}, - CALIBRATED_SLIDER_REAR_RIGHT); - } -#endif - -#elif defined(PCBNV14) - new MainViewHorizontalSlider(this, {HMARGIN, LCD_H - TRIM_SQUARE_SIZE, HORIZONTAL_SLIDERS_WIDTH, TRIM_SQUARE_SIZE}, CALIBRATED_POT1); - - new MainViewHorizontalSlider(this, {LCD_W - HORIZONTAL_SLIDERS_WIDTH - HMARGIN, LCD_H - TRIM_SQUARE_SIZE, HORIZONTAL_SLIDERS_WIDTH, TRIM_SQUARE_SIZE}, CALIBRATED_POT2); + rect_t r = { 0, 0, window->width(), window->height() }; + auto deco = new ViewMainDecoration(window, r); + deco->setTrimsVisible(false); + deco->setSlidersVisible(true); + deco->setFlightModeVisible(false); + deco->adjustDecoration(); +#if defined(PCBNV14) new TextButton(window, {LCD_W - 120, LCD_H - 140, 90, 40}, "Next", [=]() -> uint8_t { nextStep(); diff --git a/radio/src/gui/colorlcd/view_main.cpp b/radio/src/gui/colorlcd/view_main.cpp index 386972f33..74e1ecc2d 100644 --- a/radio/src/gui/colorlcd/view_main.cpp +++ b/radio/src/gui/colorlcd/view_main.cpp @@ -28,17 +28,16 @@ #include "topbar.h" #include "layouts/sliders.h" #include "layouts/trims.h" +#include "view_main_decoration.h" #include "opentx.h" -constexpr coord_t MAIN_ZONE_BORDER = 10; - Layout * customScreens[MAX_CUSTOM_SCREENS] = {}; int getMainViewsCount() { for (int index=1; indexsetVisible(visible); } -void ViewMain::setSlidersVisible(bool visible) -{ - // - // Horizontal Sliders - // - sliders[SLIDERS_POT1]->setHeight(visible ? TRIM_SQUARE_SIZE : 0); - - //TODO: might change depending on hardware settings - if (IS_POT_MULTIPOS(POT2)) { - sliders[SLIDERS_POT2]->setHeight(visible ? MULTIPOS_H : 0); - } - else if (IS_POT(POT2)) { - sliders[SLIDERS_POT2]->setHeight(visible ? TRIM_SQUARE_SIZE : 0); - } - -#if defined(HARDWARE_POT3) - sliders[SLIDERS_POT3]->setHeight(visible ? TRIM_SQUARE_SIZE : 0); -#endif - - // - // Vertical sliders - // - sliders[SLIDERS_REAR_LEFT]->setWidth(visible ? TRIM_SQUARE_SIZE : 0); - -#if defined(HARDWARE_EXT1) - //TODO: might change depending on hardware settings - if (IS_POT_SLIDER_AVAILABLE(EXT1)) { - sliders[SLIDERS_EXT1]->setWidth(visible ? TRIM_SQUARE_SIZE : 0); - } -#endif - - sliders[SLIDERS_REAR_RIGHT]->setWidth(visible ? TRIM_SQUARE_SIZE : 0); - -#if defined(HARDWARE_EXT2) - //TODO: might change depending on hardware settings - if (IS_POT_SLIDER_AVAILABLE(EXT2)) { - sliders[SLIDERS_EXT2]->setWidth(visible ? TRIM_SQUARE_SIZE : 0); - } -#endif -} - void ViewMain::setTrimsVisible(bool visible) { - trims[TRIMS_LH]->setHeight(visible ? TRIM_SQUARE_SIZE : 0); - trims[TRIMS_RH]->setHeight(visible ? TRIM_SQUARE_SIZE : 0); + decoration->setTrimsVisible(visible); +} - trims[TRIMS_LV]->setWidth(visible ? TRIM_SQUARE_SIZE : 0); - trims[TRIMS_RV]->setWidth(visible ? TRIM_SQUARE_SIZE : 0); +void ViewMain::setSlidersVisible(bool visible) +{ + decoration->setSlidersVisible(visible); } void ViewMain::setFlightModeVisible(bool visible) { - flightMode->setHeight(visible ? 20 : 0); + decoration->setFlightModeVisible(visible); } void ViewMain::adjustDecoration() { // Topbar does not need any computation // (height() has been set in setTopbarVisible()) - - // Sliders are closer to the edge and must be computed first - // (vertical sliders depends on topbar) - // These are located on the bottom - auto pos = height() - sliders[SLIDERS_POT1]->height(); - sliders[SLIDERS_POT1]->setTop(pos); - - if (sliders[SLIDERS_POT2]) { - auto sl = sliders[SLIDERS_POT2]; - sl->setTop(pos); - if (IS_POT_MULTIPOS(POT2)) { - sl->setWidth(MULTIPOS_W); - } - else { // if !IS_POT(POT2) -> sliders[SLIDERS_POT2] == nullptr - sl->setWidth(HORIZONTAL_SLIDERS_WIDTH); - } - sl->setLeft((width() - sl->width()) / 2); - } - -#if defined(HARDWARE_POT3) - sliders[SLIDERS_POT3]->setTop(pos); -#endif - - // Horizontal trims are on top of horizontal sliders - pos -= trims[TRIMS_LH]->height(); - trims[TRIMS_LH]->setTop(pos); - trims[TRIMS_RH]->setTop(pos); - - // Vertical trims/slider are on top of horizontal sliders with a small margin - auto vertTop = pos - HMARGIN - VERTICAL_SLIDERS_HEIGHT; - - // Left side (vertical) - pos = left(); - sliders[SLIDERS_REAR_LEFT]->setLeft(pos); - sliders[SLIDERS_REAR_LEFT]->setTop(vertTop); - -#if defined(HARDWARE_EXT1) - sliders[SLIDERS_EXT1]->setLeft(pos); - if (IS_POT_SLIDER_AVAILABLE(EXT1)) { - auto rl = sliders[SLIDERS_REAR_LEFT]; - auto e1 = sliders[SLIDERS_EXT1]; - - // If EXT1 is configured as a slider, - // place it bellow rear-left slider (and make them smaller) - rl->setHeight(VERTICAL_SLIDERS_HEIGHT / 2); - e1->setTop(vertTop + rl->height() + HMARGIN/2); - e1->setHeight(rl->height()); - } - else { - auto rl = sliders[SLIDERS_REAR_LEFT]; - auto e1 = sliders[SLIDERS_EXT1]; - - // Otherwise hide the extra slider and make rear-left fullsize - rl->setHeight(VERTICAL_SLIDERS_HEIGHT); - e1->setHeight(0); - } -#endif - - // Right side (vertical) - pos = right() - sliders[SLIDERS_REAR_RIGHT]->width(); - sliders[SLIDERS_REAR_RIGHT]->setLeft(pos); - sliders[SLIDERS_REAR_RIGHT]->setTop(vertTop); - -#if defined(HARDWARE_EXT2) - sliders[SLIDERS_EXT2]->setLeft(pos); - if (IS_POT_SLIDER_AVAILABLE(EXT2)) { - auto rr = sliders[SLIDERS_REAR_RIGHT]; - auto e2 = sliders[SLIDERS_EXT2]; - - // If EXT2 is configured as a slider, - // place it bellow rear-left slider (and make them smaller) - rr->setHeight(VERTICAL_SLIDERS_HEIGHT / 2); - e2->setTop(vertTop + rr->height() + HMARGIN/2); - e2->setHeight(rr->height()); - } - else { - auto rr = sliders[SLIDERS_REAR_RIGHT]; - auto e2 = sliders[SLIDERS_EXT2]; - - // Otherwise hide the extra slider and make rear-left fullsize - rr->setHeight(VERTICAL_SLIDERS_HEIGHT); - e2->setHeight(0); - } -#endif - - // Finally place the vertical trims further from the edge - trims[TRIMS_LV]->setLeft(sliders[SLIDERS_REAR_LEFT]->right()); - trims[TRIMS_LV]->setTop(vertTop); - trims[TRIMS_RV]->setLeft(sliders[SLIDERS_REAR_RIGHT]->left() - trims[TRIMS_RV]->width()); - trims[TRIMS_RV]->setTop(vertTop); - - //TODO: find a proper place for the flight-mode text box + decoration->adjustDecoration(); } rect_t ViewMain::getMainZone() const { - rect_t zone = { - trims[TRIMS_LV]->right() + MAIN_ZONE_BORDER, - topbar->bottom() + MAIN_ZONE_BORDER, - 0, 0 // let's compute them! - }; - - zone.w = trims[TRIMS_RV]->left() - MAIN_ZONE_BORDER - zone.x; - zone.h = trims[TRIMS_LH]->top() - MAIN_ZONE_BORDER - zone.y; - + rect_t zone = decoration->getMainZone(); + zone.y += topbar->bottom(); + zone.h -= topbar->height(); + return zone; } @@ -334,9 +197,7 @@ void ViewMain::paint(BitmapBuffer * dc) void ViewMain::createDecoration() { createTopbar(); - createSliders(); - createTrims(); - createFlightMode(); + decoration = new ViewMainDecoration(this, getRect()); } void ViewMain::createTopbar() @@ -345,93 +206,3 @@ void ViewMain::createTopbar() topbar->load(); } -void ViewMain::createSliders() -{ - // TODO: - // - layout must become really dynamic (see adjustDecoration()) - // - components should be created in "folded" state - // - it should not be required to call hasXXXX() at all - - // fixed size array, so that works - memset(sliders, 0, sizeof(sliders)); - - rect_t r = { - // left - HMARGIN, 0, - HORIZONTAL_SLIDERS_WIDTH, 0 - }; - - sliders[SLIDERS_POT1] = new MainViewHorizontalSlider(this, r, CALIBRATED_POT1); - - r = rect_t { 0, 0, 0, 0 }; - if (IS_POT_MULTIPOS(POT2)) { - sliders[SLIDERS_POT2] = new MainView6POS(this, r, 1); - } - else if (IS_POT(POT2)) { - sliders[SLIDERS_POT2] = new MainViewHorizontalSlider(this, r, CALIBRATED_POT2); - } - -#if defined(HARDWARE_POT3) - r = rect_t { - // right - width() - HORIZONTAL_SLIDERS_WIDTH - HMARGIN, 0, - HORIZONTAL_SLIDERS_WIDTH, 0 - }; - - sliders[SLIDERS_POT3] = new MainViewHorizontalSlider(this, r, CALIBRATED_POT3); -#endif - - r = rect_t { 0, 0, 0, 0 }; - sliders[SLIDERS_REAR_LEFT] = new MainViewVerticalSlider(this, r, CALIBRATED_SLIDER_REAR_LEFT); - sliders[SLIDERS_REAR_RIGHT] = new MainViewVerticalSlider(this, r, CALIBRATED_SLIDER_REAR_RIGHT); - -#if defined(HARDWARE_EXT1) - sliders[SLIDERS_EXT1] = new MainViewVerticalSlider(this, r, CALIBRATED_POT_EXT1); -#endif - -#if defined(HARDWARE_EXT2) - sliders[SLIDERS_EXT2] = new MainViewVerticalSlider(this, r, CALIBRATED_POT_EXT2); -#endif -} - -void ViewMain::createTrims() -{ - // Trim order TRIM_LH, TRIM_LV, TRIM_RV, TRIM_RH - - rect_t r = { - left() + HMARGIN, 0, - HORIZONTAL_SLIDERS_WIDTH, 0 - }; - - trims[TRIMS_LH] = new MainViewHorizontalTrim(this, r, 0); - - r = rect_t { - right() - HORIZONTAL_SLIDERS_WIDTH - HMARGIN, 0, - HORIZONTAL_SLIDERS_WIDTH, 0 - }; - - trims[TRIMS_RH] = new MainViewHorizontalTrim(this, r, 3); - - r = rect_t { - 0, 0, 0, - VERTICAL_SLIDERS_HEIGHT - }; - - trims[TRIMS_LV] = new MainViewVerticalTrim(this, r, 1); - trims[TRIMS_RV] = new MainViewVerticalTrim(this, r, 2); -} - -void ViewMain::createFlightMode() -{ - rect_t r = { - // centered text box (50 pixels from either edge) - // -> re-size once the other components are set - 50, 0, width() - 100, 0 - }; - - std::function getFM = []() -> std::string { - return g_model.flightModeData[mixerCurrentFlightMode].name; - }; - - flightMode = new DynamicText(this, r, getFM, CENTERED); -} diff --git a/radio/src/gui/colorlcd/view_main.h b/radio/src/gui/colorlcd/view_main.h index 1cd241dcf..1c6390181 100644 --- a/radio/src/gui/colorlcd/view_main.h +++ b/radio/src/gui/colorlcd/view_main.h @@ -25,6 +25,7 @@ #include class TopBar; +class ViewMainDecoration; class SetupWidgetsPage; class ViewMain: public FormWindow @@ -50,7 +51,7 @@ class ViewMain: public FormWindow } #endif - // Set decoration visibility + // Set topbar & decoration visibility void setTopbarVisible(bool visible); void setTrimsVisible(bool visible); void setSlidersVisible(bool visible); @@ -66,29 +67,8 @@ class ViewMain: public FormWindow protected: static ViewMain * _instance; - enum { - SLIDERS_POT1 = 0, - SLIDERS_POT2, - SLIDERS_POT3, - SLIDERS_REAR_LEFT, - SLIDERS_EXT1, - SLIDERS_REAR_RIGHT, - SLIDERS_EXT2, - SLIDERS_MAX - }; - - enum { - TRIMS_LH = 0, - TRIMS_LV, - TRIMS_RV, - TRIMS_RH, - TRIMS_MAX - }; - - TopBar* topbar; - Window* sliders[SLIDERS_MAX]; - Window* trims[TRIMS_MAX]; - Window* flightMode; + TopBar* topbar; + ViewMainDecoration* decoration; friend class SetupWidgetsPage; @@ -101,9 +81,6 @@ class ViewMain: public FormWindow void createDecoration(); void createTopbar(); - void createSliders(); - void createTrims(); - void createFlightMode(); }; #endif // _VIEW_MAIN_H_ diff --git a/radio/src/gui/colorlcd/view_main_decoration.cpp b/radio/src/gui/colorlcd/view_main_decoration.cpp new file mode 100644 index 000000000..e16a0ed58 --- /dev/null +++ b/radio/src/gui/colorlcd/view_main_decoration.cpp @@ -0,0 +1,287 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "view_main_decoration.h" +#include "layout.h" + +// because of IS_POT_MULTIPOS() and pal +#include "opentx.h" + +// these 2 need things from opentx.h +#include "layouts/sliders.h" +#include "layouts/trims.h" + +#include "board.h" + +void ViewMainDecoration::setSlidersVisible(bool visible) +{ + // + // Horizontal Sliders + // + sliders[SLIDERS_POT1]->setHeight(visible ? TRIM_SQUARE_SIZE : 0); + + //TODO: might change depending on hardware settings + if (IS_POT_MULTIPOS(POT2)) { + sliders[SLIDERS_POT2]->setHeight(visible ? MULTIPOS_H : 0); + } + else if (IS_POT(POT2)) { + sliders[SLIDERS_POT2]->setHeight(visible ? TRIM_SQUARE_SIZE : 0); + } + +#if defined(HARDWARE_POT3) + sliders[SLIDERS_POT3]->setHeight(visible ? TRIM_SQUARE_SIZE : 0); +#endif + + // + // Vertical sliders + // + sliders[SLIDERS_REAR_LEFT]->setWidth(visible ? TRIM_SQUARE_SIZE : 0); + +#if defined(HARDWARE_EXT1) + //TODO: might change depending on hardware settings + if (IS_POT_SLIDER_AVAILABLE(EXT1)) { + sliders[SLIDERS_EXT1]->setWidth(visible ? TRIM_SQUARE_SIZE : 0); + } +#endif + + sliders[SLIDERS_REAR_RIGHT]->setWidth(visible ? TRIM_SQUARE_SIZE : 0); + +#if defined(HARDWARE_EXT2) + //TODO: might change depending on hardware settings + if (IS_POT_SLIDER_AVAILABLE(EXT2)) { + sliders[SLIDERS_EXT2]->setWidth(visible ? TRIM_SQUARE_SIZE : 0); + } +#endif +} + +void ViewMainDecoration::setTrimsVisible(bool visible) +{ + trims[TRIMS_LH]->setHeight(visible ? TRIM_SQUARE_SIZE : 0); + trims[TRIMS_RH]->setHeight(visible ? TRIM_SQUARE_SIZE : 0); + + trims[TRIMS_LV]->setWidth(visible ? TRIM_SQUARE_SIZE : 0); + trims[TRIMS_RV]->setWidth(visible ? TRIM_SQUARE_SIZE : 0); +} + +void ViewMainDecoration::setFlightModeVisible(bool visible) +{ + flightMode->setHeight(visible ? 20 : 0); +} + +void ViewMainDecoration::adjustDecoration() +{ + // Sliders are closer to the edge and must be computed first + + // These are located on the bottom + auto pos = bottom() - sliders[SLIDERS_POT1]->height(); + sliders[SLIDERS_POT1]->setTop(pos); + + if (sliders[SLIDERS_POT2]) { + auto sl = sliders[SLIDERS_POT2]; + sl->setTop(pos); + if (IS_POT_MULTIPOS(POT2)) { + sl->setWidth(MULTIPOS_W); + } + else { // if !IS_POT(POT2) -> sliders[SLIDERS_POT2] == nullptr + sl->setWidth(HORIZONTAL_SLIDERS_WIDTH); + } + sl->setLeft((width() - sl->width()) / 2); + } + +#if defined(HARDWARE_POT3) + sliders[SLIDERS_POT3]->setTop(pos); +#endif + + // Horizontal trims are on top of horizontal sliders + pos -= trims[TRIMS_LH]->height(); + trims[TRIMS_LH]->setTop(pos); + trims[TRIMS_RH]->setTop(pos); + + // Vertical trims/slider are on top of horizontal sliders with a small margin + auto vertTop = pos - HMARGIN - VERTICAL_SLIDERS_HEIGHT; + + // Left side (vertical) + pos = left(); + sliders[SLIDERS_REAR_LEFT]->setLeft(pos); + sliders[SLIDERS_REAR_LEFT]->setTop(vertTop); + +#if defined(HARDWARE_EXT1) + sliders[SLIDERS_EXT1]->setLeft(pos); + if (IS_POT_SLIDER_AVAILABLE(EXT1)) { + auto rl = sliders[SLIDERS_REAR_LEFT]; + auto e1 = sliders[SLIDERS_EXT1]; + + // If EXT1 is configured as a slider, + // place it bellow rear-left slider (and make them smaller) + rl->setHeight(VERTICAL_SLIDERS_HEIGHT / 2); + e1->setTop(vertTop + rl->height() + HMARGIN/2); + e1->setHeight(rl->height()); + } + else { + auto rl = sliders[SLIDERS_REAR_LEFT]; + auto e1 = sliders[SLIDERS_EXT1]; + + // Otherwise hide the extra slider and make rear-left fullsize + rl->setHeight(VERTICAL_SLIDERS_HEIGHT); + e1->setHeight(0); + } +#endif + + // Right side (vertical) + pos = right() - sliders[SLIDERS_REAR_RIGHT]->width(); + sliders[SLIDERS_REAR_RIGHT]->setLeft(pos); + sliders[SLIDERS_REAR_RIGHT]->setTop(vertTop); + +#if defined(HARDWARE_EXT2) + sliders[SLIDERS_EXT2]->setLeft(pos); + if (IS_POT_SLIDER_AVAILABLE(EXT2)) { + auto rr = sliders[SLIDERS_REAR_RIGHT]; + auto e2 = sliders[SLIDERS_EXT2]; + + // If EXT2 is configured as a slider, + // place it bellow rear-left slider (and make them smaller) + rr->setHeight(VERTICAL_SLIDERS_HEIGHT / 2); + e2->setTop(vertTop + rr->height() + HMARGIN/2); + e2->setHeight(rr->height()); + } + else { + auto rr = sliders[SLIDERS_REAR_RIGHT]; + auto e2 = sliders[SLIDERS_EXT2]; + + // Otherwise hide the extra slider and make rear-left fullsize + rr->setHeight(VERTICAL_SLIDERS_HEIGHT); + e2->setHeight(0); + } +#endif + + // Finally place the vertical trims further from the edge + trims[TRIMS_LV]->setLeft(sliders[SLIDERS_REAR_LEFT]->right()); + trims[TRIMS_LV]->setTop(vertTop); + trims[TRIMS_RV]->setLeft(sliders[SLIDERS_REAR_RIGHT]->left() - trims[TRIMS_RV]->width()); + trims[TRIMS_RV]->setTop(vertTop); + + //TODO: find a proper place for the flight-mode text box +} + +rect_t ViewMainDecoration::getMainZone() const +{ + rect_t zone = { + trims[TRIMS_LV]->right() + MAIN_ZONE_BORDER, + /*topbar->bottom() +*/ MAIN_ZONE_BORDER, + 0, 0 // let's compute them! + }; + + zone.w = trims[TRIMS_RV]->left() - MAIN_ZONE_BORDER - zone.x; + zone.h = trims[TRIMS_LH]->top() - MAIN_ZONE_BORDER - zone.y; + + return zone; +} + +void ViewMainDecoration::createSliders() +{ + // TODO: + // - layout must become really dynamic (see adjustDecoration()) + // - components should be created in "folded" state + // - it should not be required to call hasXXXX() at all + + // fixed size array, so that works + memset(sliders, 0, sizeof(sliders)); + + rect_t r = { + // left + HMARGIN, 0, + HORIZONTAL_SLIDERS_WIDTH, 0 + }; + + sliders[SLIDERS_POT1] = new MainViewHorizontalSlider(this, r, CALIBRATED_POT1); + + r = rect_t { 0, 0, 0, 0 }; + if (IS_POT_MULTIPOS(POT2)) { + sliders[SLIDERS_POT2] = new MainView6POS(this, r, 1); + } + else if (IS_POT(POT2)) { + sliders[SLIDERS_POT2] = new MainViewHorizontalSlider(this, r, CALIBRATED_POT2); + } + +#if defined(HARDWARE_POT3) + r = rect_t { + // right + width() - HORIZONTAL_SLIDERS_WIDTH - HMARGIN, 0, + HORIZONTAL_SLIDERS_WIDTH, 0 + }; + + sliders[SLIDERS_POT3] = new MainViewHorizontalSlider(this, r, CALIBRATED_POT3); +#endif + + r = rect_t { 0, 0, 0, 0 }; + sliders[SLIDERS_REAR_LEFT] = new MainViewVerticalSlider(this, r, CALIBRATED_SLIDER_REAR_LEFT); + sliders[SLIDERS_REAR_RIGHT] = new MainViewVerticalSlider(this, r, CALIBRATED_SLIDER_REAR_RIGHT); + +#if defined(HARDWARE_EXT1) + sliders[SLIDERS_EXT1] = new MainViewVerticalSlider(this, r, CALIBRATED_POT_EXT1); +#endif + +#if defined(HARDWARE_EXT2) + sliders[SLIDERS_EXT2] = new MainViewVerticalSlider(this, r, CALIBRATED_POT_EXT2); +#endif +} + +void ViewMainDecoration::createTrims() +{ + // Trim order TRIM_LH, TRIM_LV, TRIM_RV, TRIM_RH + + rect_t r = { + left() + HMARGIN, 0, + HORIZONTAL_SLIDERS_WIDTH, 0 + }; + + trims[TRIMS_LH] = new MainViewHorizontalTrim(this, r, 0); + + r = rect_t { + right() - HORIZONTAL_SLIDERS_WIDTH - HMARGIN, 0, + HORIZONTAL_SLIDERS_WIDTH, 0 + }; + + trims[TRIMS_RH] = new MainViewHorizontalTrim(this, r, 3); + + r = rect_t { + 0, 0, 0, + VERTICAL_SLIDERS_HEIGHT + }; + + trims[TRIMS_LV] = new MainViewVerticalTrim(this, r, 1); + trims[TRIMS_RV] = new MainViewVerticalTrim(this, r, 2); +} + +void ViewMainDecoration::createFlightMode() +{ + rect_t r = { + // centered text box (50 pixels from either edge) + // -> re-size once the other components are set + 50, 0, width() - 100, 0 + }; + + std::function getFM = []() -> std::string { + return g_model.flightModeData[mixerCurrentFlightMode].name; + }; + + flightMode = new DynamicText(this, r, getFM, CENTERED); +} + diff --git a/radio/src/gui/colorlcd/view_main_decoration.h b/radio/src/gui/colorlcd/view_main_decoration.h new file mode 100644 index 000000000..3a35e1a63 --- /dev/null +++ b/radio/src/gui/colorlcd/view_main_decoration.h @@ -0,0 +1,83 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#pragma once + +#include "window.h" + +class ViewMainDecoration: public Window +{ + public: + ViewMainDecoration(Window * parent, const rect_t & rect): + Window(parent, rect) + { + createSliders(); + createTrims(); + createFlightMode(); + } + + // Set decoration visibility + 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; + + protected: + +#if defined(DEBUG_WINDOWS) + virtual std::string getName() const + { + return "ViewMainDecoration"; + } +#endif + + enum { + SLIDERS_POT1 = 0, + SLIDERS_POT2, + SLIDERS_POT3, + SLIDERS_REAR_LEFT, + SLIDERS_EXT1, + SLIDERS_REAR_RIGHT, + SLIDERS_EXT2, + SLIDERS_MAX + }; + + enum { + TRIMS_LH = 0, + TRIMS_LV, + TRIMS_RV, + TRIMS_RH, + TRIMS_MAX + }; + + Window* sliders[SLIDERS_MAX]; + Window* trims[TRIMS_MAX]; + Window* flightMode; + + void createSliders(); + void createTrims(); + void createFlightMode(); +};