Merge pull request #8432 from opentx/raphaelcoeffic/getmainzone
2.4: some layout improvements
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -32,29 +32,94 @@ constexpr coord_t TRIM_SQUARE_SIZE = 17;
|
||||
|
||||
class LayoutFactory;
|
||||
|
||||
class Layout: public WidgetsContainer<MAX_LAYOUT_ZONES, MAX_LAYOUT_OPTIONS>
|
||||
#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<MAX_LAYOUT_ZONES, MAX_LAYOUT_OPTIONS> 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<MAX_LAYOUT_ZONES, MAX_LAYOUT_OPTIONS>({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<Window*> 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);
|
||||
|
||||
@@ -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("Layout1x1", "Fullscreen", LBM_LAYOUT_1x1, OPTIONS_LAYOUT_1x1);
|
||||
|
||||
@@ -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("Layout2P1", "2 + 1", LBM_LAYOUT_2P1, OPTIONS_LAYOUT_2P1);
|
||||
|
||||
@@ -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("Layout2x1", "2 x 1", LBM_LAYOUT_2x1, OPTIONS_LAYOUT_2x1);
|
||||
|
||||
@@ -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("Layout2x2", "2 x 2", LBM_LAYOUT_2x2, OPTIONS_LAYOUT_2x2);
|
||||
|
||||
@@ -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("Layout2x4", "2 x 4", LBM_LAYOUT_2x4, OPTIONS_LAYOUT_2x4);
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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;
|
||||
});
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user