chore(color): color UI code cleanup - round 3 (#5351)

This commit is contained in:
philmoz
2024-08-01 10:05:52 +10:00
committed by GitHub
parent a362feed91
commit 23df4f63bb
104 changed files with 554 additions and 824 deletions
+1 -1
View File
@@ -541,7 +541,7 @@ void ModuleOptions::update()
if (!optionsAvailable) {
// no options available
line = form->newLine(grid);
new StaticText(line, rect_t{}, STR_NO_TX_OPTIONS, 0);
new StaticText(line, rect_t{}, STR_NO_TX_OPTIONS);
} else {
// some options available
if (optionsAvailable & (1 << MODULE_OPTION_EXTERNAL_ANTENNA)) {
+10 -11
View File
@@ -219,30 +219,29 @@ ComboChannelBar::ComboChannelBar(Window* parent, const rect_t& rect,
uint8_t _channel, bool isInHeader) :
Window(parent, rect), channel(_channel)
{
LcdFlags textColor =
isInHeader ? COLOR_THEME_PRIMARY2 : COLOR_THEME_SECONDARY1;
LcdColorIndex txtColIdx = isInHeader ? COLOR_THEME_PRIMARY2_INDEX : COLOR_THEME_SECONDARY1_INDEX;
outputChannelBar = new OutputChannelBar(
this, {ChannelBar::LMARGIN, ChannelBar::BAR_HEIGHT + ChannelBar::TMARGIN, width() - ChannelBar::LMARGIN, ChannelBar::BAR_HEIGHT},
this, {PAD_TINY, ChannelBar::BAR_HEIGHT + PAD_TINY, width() - PAD_TINY, ChannelBar::BAR_HEIGHT},
channel, isInHeader);
new MixerChannelBar(
this,
{ChannelBar::LMARGIN, (2 * ChannelBar::BAR_HEIGHT) + ChannelBar::TMARGIN + 1, width() - ChannelBar::LMARGIN, ChannelBar::BAR_HEIGHT},
{PAD_TINY, (2 * ChannelBar::BAR_HEIGHT) + PAD_TINY + 1, width() - PAD_TINY, ChannelBar::BAR_HEIGHT},
channel);
// Channel number
char chanString[] = TR_CH "32 ";
strAppendSigned(&chanString[2], channel + 1, 2);
new StaticText(this, {ChannelBar::LMARGIN, 0, LV_SIZE_CONTENT, ChannelBar::VAL_H}, chanString,
textColor | FONT(XS) | LEFT);
new StaticText(this, {PAD_TINY, 0, LV_SIZE_CONTENT, ChannelBar::VAL_H}, chanString,
txtColIdx, FONT(XS) | LEFT);
// Channel name
if (g_model.limitData[channel].name[0]) {
char nm[LEN_CHANNEL_NAME + 1];
strAppend(nm, g_model.limitData[channel].name, LEN_CHANNEL_NAME);
new StaticText(this, {ChannelBar::LMARGIN + ChannelBar::VAL_W, 0, LV_SIZE_CONTENT, ChannelBar::VAL_H}, nm,
textColor | FONT(XS) | LEFT);
new StaticText(this, {PAD_TINY + ChannelBar::VAL_W, 0, LV_SIZE_CONTENT, ChannelBar::VAL_H}, nm,
txtColIdx, FONT(XS) | LEFT);
}
// Channel value in µS
@@ -254,12 +253,12 @@ ComboChannelBar::ComboChannelBar(Window* parent, const rect_t& rect,
return calcRESXto100(channelOutputs[channel]);
return PPM_CH_CENTER(channel) + channelOutputs[channel] / 2;
},
textColor | FONT(XS) | RIGHT, "", suffix);
txtColIdx, FONT(XS) | RIGHT, "", suffix);
// Override icon
#if defined(OVERRIDE_CHANNEL_FUNCTION)
overrideIcon = new StaticIcon(
this, 0, 5, ICON_CHAN_MONITOR_LOCKED, textColor);
this, 0, 5, ICON_CHAN_MONITOR_LOCKED, txtColIdx);
overrideIcon->show(safetyCh[channel] != OVERRIDE_CHANNEL_UNDEFINED);
#endif
@@ -267,7 +266,7 @@ ComboChannelBar::ComboChannelBar(Window* parent, const rect_t& rect,
LimitData* ld = limitAddress(channel);
if (ld && ld->revert) {
new StaticIcon(this, 0, ICON_SZ, ICON_CHAN_MONITOR_INVERTED,
textColor);
txtColIdx);
}
}
-2
View File
@@ -31,8 +31,6 @@ class ChannelBar : public Window
LcdColorIndex textColorIndex = COLOR_THEME_SECONDARY1_INDEX);
static LAYOUT_VAL(BAR_HEIGHT, 13, 13)
static LAYOUT_VAL(LMARGIN, 2, 2)
static LAYOUT_VAL(TMARGIN, 2, 2)
static LAYOUT_VAL(VAL_W, 45, 45)
static LAYOUT_VAL(VAL_H, 14, 14)
+1 -1
View File
@@ -25,7 +25,7 @@
#include "themes/etx_lv_theme.h"
ColorList::ColorList(Window *parent, const rect_t &rect,
std::vector<ColorEntry> colors, LcdFlags lcdFlags) :
std::vector<ColorEntry> colors) :
ListBox(parent, rect, getColorListNames(colors)), _colorList(colors)
{
setSelected(0);
+1 -2
View File
@@ -30,8 +30,7 @@
class ColorList : public ListBox
{
public:
ColorList(Window* parent, const rect_t& rect, std::vector<ColorEntry> colors,
LcdFlags lcdFlags = 0);
ColorList(Window* parent, const rect_t& rect, std::vector<ColorEntry> colors);
inline ColorEntry getSelectedColor()
{
+1 -1
View File
@@ -89,7 +89,7 @@ class ColorEditorPopup : public BaseDialog
colorPad = new ColorSwatch(hbox, {0, 0, COLOR_PAD_WIDTH, COLOR_PAD_HEIGHT},
COLOR_THEME_PRIMARY1);
hexStr = new StaticText(hbox, {0, 0, CVAL_W, 0}, "", COLOR_THEME_PRIMARY1 | FONT(L));
hexStr = new StaticText(hbox, {0, 0, CVAL_W, 0}, "", COLOR_THEME_PRIMARY1_INDEX, FONT(L));
updateColor(color);
@@ -54,7 +54,7 @@ CrossfireSettings::CrossfireSettings(Window* parent, const FlexGridLayout& g,
// getStringAtIndex(buf, STR_CRSF_BAUDRATE,
// CROSSFIRE_STORE_TO_INDEX(
// g_eeGeneral.internalModuleBaudrate)),
// 0, COLOR_THEME_PRIMARY1);
// COLOR_THEME_PRIMARY1);
}
auto line = newLine(grid);
+1 -1
View File
@@ -165,7 +165,7 @@ Curve::Curve(Window* parent, const rect_t& rect,
posHLine = lv_line_create(lvobj);
etx_obj_add_style(posHLine, styles->graph_position_line, LV_PART_MAIN);
positionValue = new StaticText(this, {10, 10, LV_SIZE_CONTENT, 17}, "", COLOR_THEME_PRIMARY1 | FONT(XS));
positionValue = new StaticText(this, {10, 10, LV_SIZE_CONTENT, 17}, "", COLOR_THEME_PRIMARY1_INDEX, FONT(XS));
positionValue->padLeft(PAD_TINY);
positionValue->padRight(PAD_TINY);
etx_solid_bg(positionValue->getLvObj(), COLOR_THEME_ACTIVE_INDEX);
+6 -6
View File
@@ -90,14 +90,14 @@ class CurveDataEdit : public Window
{PTNUM_X + (i * (NUM_BTN_WIDTH + PAD_TINY)), y,
NUM_BTN_WIDTH, PTNUM_H},
std::to_string(i + start + 1),
COLOR_THEME_PRIMARY1 | FONT(XS) | CENTERED);
COLOR_THEME_PRIMARY1_INDEX, FONT(XS) | CENTERED);
}
y += NUM_HDR_HEIGHT;
new StaticText(
parent, {1, y + PAD_MEDIUM, PTNUM_X, EdgeTxStyles::UI_ELEMENT_HEIGHT},
"X", COLOR_THEME_PRIMARY1 | CENTERED);
"X", COLOR_THEME_PRIMARY1_INDEX, CENTERED);
int8_t* points = curveAddress(index);
@@ -110,7 +110,7 @@ class CurveDataEdit : public Window
parent,
{PTNUM_X + (i * (NUM_BTN_WIDTH + PAD_TINY)), y + PAD_MEDIUM,
NUM_BTN_WIDTH, EdgeTxStyles::UI_ELEMENT_HEIGHT},
"-100", COLOR_THEME_SECONDARY1 | CENTERED);
"-100", COLOR_THEME_SECONDARY1_INDEX, CENTERED);
i += 1;
}
if ((start + count) == curvePointsCount) {
@@ -145,7 +145,7 @@ class CurveDataEdit : public Window
parent,
{PTNUM_X + (i * (NUM_BTN_WIDTH + PAD_TINY)), y + PAD_MEDIUM,
NUM_BTN_WIDTH, EdgeTxStyles::UI_ELEMENT_HEIGHT},
"100", COLOR_THEME_SECONDARY1 | CENTERED);
"100", COLOR_THEME_SECONDARY1_INDEX, CENTERED);
}
} else {
for (uint8_t i = 0; i < count; i++) {
@@ -154,7 +154,7 @@ class CurveDataEdit : public Window
rect_t{PTNUM_X + (i * (NUM_BTN_WIDTH + PAD_TINY)), y + PAD_MEDIUM,
NUM_BTN_WIDTH, EdgeTxStyles::UI_ELEMENT_HEIGHT},
std::to_string(-100 + (200 * (i + start)) / (curvePointsCount - 1)),
COLOR_THEME_SECONDARY1 | CENTERED);
COLOR_THEME_SECONDARY1_INDEX, CENTERED);
}
}
@@ -162,7 +162,7 @@ class CurveDataEdit : public Window
new StaticText(
parent, {1, y + PAD_MEDIUM, PTNUM_X, EdgeTxStyles::UI_ELEMENT_HEIGHT},
"Y", COLOR_THEME_PRIMARY1 | CENTERED);
"Y", COLOR_THEME_PRIMARY1_INDEX, CENTERED);
// y value
for (uint8_t i = 0; i < count; i++) {
+2 -2
View File
@@ -168,12 +168,12 @@ class ChannelFSCombo : public Window
lv_obj_set_style_flex_cross_place(lvobj, LV_FLEX_ALIGN_CENTER, 0);
edit = new ChannelFailsafeEdit(this, ch, vmin, vmax);
auto btn = new TextButton(this, rect_t{}, LV_SYMBOL_SETTINGS, [=]() {
new TextButton(this, rect_t{}, LV_SYMBOL_SETTINGS, [=]() {
edit->toggle();
return 0;
});
btn = new TextButton(this, rect_t{}, LV_SYMBOL_COPY, [=]() {
new TextButton(this, rect_t{}, LV_SYMBOL_COPY, [=]() {
edit->copyChannel();
return 0;
});
+1 -1
View File
@@ -35,7 +35,7 @@ FileCarosell::FileCarosell(Window *parent, const rect_t &rect,
{
setWindowFlag(NO_FOCUS);
message = new StaticText(this, {0, rect.h/2, rect.w, EdgeTxStyles::PAGE_LINE_HEIGHT * 2}, "", CENTERED | FONT(L) | COLOR_THEME_PRIMARY1);
message = new StaticText(this, {0, rect.h/2, rect.w, EdgeTxStyles::PAGE_LINE_HEIGHT * 2}, "", COLOR_THEME_PRIMARY1_INDEX, CENTERED | FONT(L));
setFileNames(fileNames);
}
+3 -3
View File
@@ -78,7 +78,7 @@ void FullScreenDialog::build()
new StaticIcon(
this, ALERT_BITMAP_LEFT, ALERT_BITMAP_TOP,
(type == WARNING_TYPE_INFO) ? ICON_BUSY : ICON_ERROR,
COLOR_THEME_WARNING);
COLOR_THEME_WARNING_INDEX);
std::string t;
if (type == WARNING_TYPE_ALERT) {
@@ -95,14 +95,14 @@ void FullScreenDialog::build()
rect_t{ALERT_TITLE_LEFT, ALERT_TITLE_TOP,
LCD_W - ALERT_TITLE_LEFT - PAD_MEDIUM,
LCD_H - ALERT_TITLE_TOP - PAD_MEDIUM},
t.c_str(), COLOR_THEME_WARNING | FONT(XL));
t.c_str(), COLOR_THEME_WARNING_INDEX, FONT(XL));
messageLabel =
new StaticText(this,
rect_t{ALERT_MESSAGE_LEFT, ALERT_MESSAGE_TOP,
LCD_W - ALERT_MESSAGE_LEFT - PAD_MEDIUM,
LCD_H - ALERT_MESSAGE_TOP - PAD_MEDIUM},
message.c_str(), COLOR_THEME_PRIMARY1 | FONT(BOLD));
message.c_str(), COLOR_THEME_PRIMARY1_INDEX, FONT(BOLD));
if (!action.empty()) {
auto btn = new TextButton(
+10 -13
View File
@@ -56,8 +56,7 @@ class FunctionSwitch : public Window
std::string s(STR_CHAR_SWITCH);
s += switchGetName(switchIndex + switchGetMaxSwitches());
new StaticText(this, {PAD_LARGE, PAD_MEDIUM, SW_W, EdgeTxStyles::PAGE_LINE_HEIGHT}, s,
COLOR_THEME_PRIMARY1);
new StaticText(this, {PAD_LARGE, PAD_MEDIUM, SW_W, EdgeTxStyles::PAGE_LINE_HEIGHT}, s);
new ModelTextEdit(this, {NM_X, 0, NM_W, 0},
g_model.switchNames[switchIndex], LEN_SWITCH_NAME);
@@ -146,7 +145,7 @@ class FunctionSwitch : public Window
void checkEvents() override
{
setState();
if (lastType != FSWITCH_CONFIG(switchIndex)) {
if (lastType != (int)FSWITCH_CONFIG(switchIndex)) {
lastType = FSWITCH_CONFIG(switchIndex);
typeChoice->setValue(lastType);
}
@@ -163,8 +162,7 @@ class SwitchGroup : public Window
padAll(PAD_TINY_GAP);
new StaticText(this, {0, PAD_MEDIUM, NM_W, EdgeTxStyles::PAGE_LINE_HEIGHT},
STR_FUNCTION_SWITCH_GROUPS[groupIndex],
COLOR_THEME_PRIMARY1);
STR_FUNCTION_SWITCH_GROUPS[groupIndex]);
auto btn = new TextButton(
this, {AO_X, 0, AO_W, 0}, STR_GROUP_ALWAYS_ON, [=]() -> int8_t {
@@ -178,8 +176,7 @@ class SwitchGroup : public Window
});
btn->check(IS_FSWITCH_GROUP_ON(groupIndex));
new StaticText(this, {SL_X, PAD_MEDIUM, SL_W, EdgeTxStyles::PAGE_LINE_HEIGHT}, STR_SWITCH_STARTUP,
COLOR_THEME_PRIMARY1);
new StaticText(this, {SL_X, PAD_MEDIUM, SL_W, EdgeTxStyles::PAGE_LINE_HEIGHT}, STR_SWITCH_STARTUP);
startChoice = new Choice(
this, {ST_X, 0, ST_W, 0}, STR_FSSWITCHES, 0,
@@ -234,13 +231,13 @@ ModelFunctionSwitches::ModelFunctionSwitches() : Page(ICON_MODEL_SETUP)
FlexGridLayout grid2(line_col_dsc2, line_row_dsc, PAD_TINY);
auto line = body->newLine(grid2);
new StaticText(line, rect_t{}, STR_SWITCHES, COLOR_THEME_PRIMARY1);
new StaticText(line, rect_t{}, STR_NAME, COLOR_THEME_PRIMARY1 | FONT(XS));
new StaticText(line, rect_t{}, STR_SWITCHES);
new StaticText(line, rect_t{}, STR_NAME, COLOR_THEME_PRIMARY1_INDEX, FONT(XS));
new StaticText(line, rect_t{}, STR_SWITCH_TYPE,
COLOR_THEME_PRIMARY1 | FONT(XS));
new StaticText(line, rect_t{}, STR_GROUP, COLOR_THEME_PRIMARY1 | FONT(XS));
COLOR_THEME_PRIMARY1_INDEX, FONT(XS));
new StaticText(line, rect_t{}, STR_GROUP, COLOR_THEME_PRIMARY1_INDEX, FONT(XS));
startupHeader = new StaticText(line, rect_t{}, STR_SWITCH_STARTUP,
COLOR_THEME_PRIMARY1 | FONT(XS));
COLOR_THEME_PRIMARY1_INDEX, FONT(XS));
for (uint8_t i = 0; i < NUM_FUNCTIONS_SWITCHES; i += 1) {
new FunctionSwitch(body, i);
@@ -254,7 +251,7 @@ ModelFunctionSwitches::ModelFunctionSwitches() : Page(ICON_MODEL_SETUP)
line = body->newLine(grid1);
new StaticText(line, rect_t{}, STR_MORE_INFO, COLOR_THEME_PRIMARY1);
new StaticText(line, rect_t{}, STR_MORE_INFO);
line = body->newLine(grid1);
line->padBottom(PAD_LARGE);
+1 -2
View File
@@ -64,8 +64,7 @@ GVarNumberEdit::GVarNumberEdit(Window* parent, int32_t vmin,
num_field = new NumberEdit(
this, {0, 0, NUM_EDIT_W, 0}, vmin, vmax, [=]() { return getValue() + voffset; },
nullptr);
num_field->setTextFlag(textFlags);
nullptr, textFlags);
num_field->setDefault(vdefault);
#if defined(GVARS)
+2 -4
View File
@@ -51,8 +51,7 @@ class BTDetailsDialog : public BaseDialog
[=]() {
return std::string(bluetooth.localAddr[0] ? bluetooth.localAddr
: "---");
},
COLOR_THEME_PRIMARY1);
});
// Remote MAC
line = form->newLine(grid);
@@ -62,8 +61,7 @@ class BTDetailsDialog : public BaseDialog
[=]() {
return std::string(bluetooth.distantAddr[0] ? bluetooth.distantAddr
: "---");
},
COLOR_THEME_PRIMARY1);
});
}
};
+3 -3
View File
@@ -92,9 +92,9 @@ HWPots::HWPots(Window* parent) :
}
});
new StaticText(this, {P_NM_X, -2, 0, 0}, STR_NAME, FONT(XS));
new StaticText(this, {P_TYP_X, -2, 0, 0}, STR_TYPE, FONT(XS));
new StaticText(this, {P_INV_X, -2, 0, 0}, STR_MENU_INVERT, FONT(XS));
new StaticText(this, {P_NM_X, -2, 0, 0}, STR_NAME, COLOR_THEME_PRIMARY1_INDEX, FONT(XS));
new StaticText(this, {P_TYP_X, -2, 0, 0}, STR_TYPE, COLOR_THEME_PRIMARY1_INDEX, FONT(XS));
new StaticText(this, {P_INV_X, -2, 0, 0}, STR_MENU_INVERT, COLOR_THEME_PRIMARY1_INDEX, FONT(XS));
coord_t yo = EdgeTxStyles::PAGE_LINE_HEIGHT - 2;
+2 -2
View File
@@ -64,8 +64,8 @@ SerialConfigWindow::SerialConfigWindow(Window *parent, FlexGridLayout& grid)
grid.setColSpan(2);
auto line = parent->newLine(grid);
line->padLeft(WARN_PADL);
line->padBottom(WARN_PADB);
new StaticText(line, rect_t{}, STR_TTL_WARNING, COLOR_THEME_WARNING);
line->padBottom(PAD_MEDIUM);
new StaticText(line, rect_t{}, STR_TTL_WARNING, COLOR_THEME_WARNING_INDEX);
grid.setColSpan(1);
}
}
-1
View File
@@ -29,5 +29,4 @@ class SerialConfigWindow
SerialConfigWindow(Window *parent, FlexGridLayout& grid);
static LAYOUT_VAL(WARN_PADL, 20, 20);
static LAYOUT_VAL(WARN_PADB, 6, 6);
};
-2
View File
@@ -29,8 +29,6 @@
#define MAX_LAYOUT_ZONES 10
#define MAX_LAYOUT_OPTIONS 10
constexpr uint32_t LAYOUT_REFRESH = 1000 / 2; // 2 Hz
#if !defined(YAML_GENERATOR)
typedef WidgetsContainerPersistentData<MAX_LAYOUT_ZONES, MAX_LAYOUT_OPTIONS>
LayoutPersistentData;
+23 -24
View File
@@ -67,8 +67,10 @@ SliderIcon::SliderIcon(Window* parent) :
MainViewSlider::MainViewSlider(Window* parent, const rect_t& rect, uint8_t idx,
bool isVertical) :
Window(parent, rect), idx(idx), isVertical(isVertical)
Window(parent, rect), isVertical(isVertical)
{
potIdx = adcGetInputOffset(ADC_INPUT_FLEX) + idx;
if (isVertical) {
int sliderTicksCount = (height() - LayoutFactory::TRIM_SQUARE_SIZE) / SLIDER_TICK_SPACING;
tickPoints = new lv_point_t[(sliderTicksCount + 1) * 2];
@@ -76,10 +78,10 @@ MainViewSlider::MainViewSlider(Window* parent, const rect_t& rect, uint8_t idx,
lv_coord_t y = LayoutFactory::TRIM_SQUARE_SIZE / 2;
for (uint8_t i = 0; i <= sliderTicksCount; i++) {
if (i == 0 || i == sliderTicksCount / 2 || i == sliderTicksCount) {
tickPoints[i * 2] = {SL_TK, y};
tickPoints[i * 2] = {PAD_TINY, y};
tickPoints[i * 2 + 1] = {SL_SZ, y};
} else {
tickPoints[i * 2] = {SL_TK + 2, y};
tickPoints[i * 2] = {PAD_TINY + 2, y};
tickPoints[i * 2 + 1] = {SL_SZ - 2, y};
}
auto line = lv_line_create(lvobj);
@@ -94,10 +96,10 @@ MainViewSlider::MainViewSlider(Window* parent, const rect_t& rect, uint8_t idx,
lv_coord_t x = LayoutFactory::TRIM_SQUARE_SIZE / 2;
for (uint8_t i = 0; i <= sliderTicksCount; i++) {
if (i == 0 || i == sliderTicksCount / 2 || i == SLIDER_TICKS_COUNT) {
tickPoints[i * 2] = {x, SL_TK};
tickPoints[i * 2] = {x, PAD_TINY};
tickPoints[i * 2 + 1] = {x, SL_SZ};
} else {
tickPoints[i * 2] = {x, SL_TK + 2};
tickPoints[i * 2] = {x, PAD_TINY + 2};
tickPoints[i * 2 + 1] = {x, SL_SZ - 2};
}
auto line = lv_line_create(lvobj);
@@ -108,14 +110,8 @@ MainViewSlider::MainViewSlider(Window* parent, const rect_t& rect, uint8_t idx,
}
sliderIcon = new SliderIcon(this);
coord_t x = 0, y = 0;
if (isVertical)
y = (height() - LayoutFactory::TRIM_SQUARE_SIZE) / 2;
else
y = (width() - LayoutFactory::TRIM_SQUARE_SIZE) / 2;
lv_obj_set_pos(sliderIcon->getLvObj(), x, y);
checkEvents();
setPos();
}
void MainViewSlider::deleteLater(bool detach, bool trash)
@@ -126,24 +122,27 @@ void MainViewSlider::deleteLater(bool detach, bool trash)
}
}
void MainViewSlider::setPos()
{
coord_t x = 0, y = 0;
if (isVertical) {
y = divRoundClosest((height() - LayoutFactory::TRIM_SQUARE_SIZE) * (-value + RESX),
2 * RESX);
} else {
x = divRoundClosest((width() - LayoutFactory::TRIM_SQUARE_SIZE) * (value + RESX),
2 * RESX);
}
lv_obj_set_pos(sliderIcon->getLvObj(), x, y);
}
void MainViewSlider::checkEvents()
{
Window::checkEvents();
auto pot_idx = adcGetInputOffset(ADC_INPUT_FLEX) + idx;
int16_t newValue = calibratedAnalogs[pot_idx];
int16_t newValue = calibratedAnalogs[potIdx];
if (value != newValue) {
value = newValue;
coord_t x = 0, y = 0;
if (isVertical) {
y = divRoundClosest((height() - LayoutFactory::TRIM_SQUARE_SIZE) * (-value + RESX),
2 * RESX);
} else {
x = divRoundClosest((width() - LayoutFactory::TRIM_SQUARE_SIZE) * (value + RESX),
2 * RESX);
}
lv_obj_set_pos(sliderIcon->getLvObj(), x, y);
setPos();
}
}
+6 -4
View File
@@ -37,7 +37,6 @@ class MainViewSlider : public Window
public:
MainViewSlider(Window* parent, const rect_t& rect, uint8_t idx,
bool isVertical);
void checkEvents() override;
static LAYOUT_VAL(SLIDER_TICKS_COUNT, 40, 30)
static LAYOUT_VAL(SLIDER_TICK_SPACING, 4, 4)
@@ -47,15 +46,18 @@ class MainViewSlider : public Window
SLIDER_TICKS_COUNT * SLIDER_TICK_SPACING + LayoutFactory::TRIM_SQUARE_SIZE;
static LAYOUT_VAL(SL_SZ, 15, 15)
static LAYOUT_VAL(SL_TK, 2, 2)
protected:
uint8_t idx;
int16_t value = -10000;
uint8_t potIdx;
int16_t value = 0;
bool isVertical;
SliderIcon* sliderIcon = nullptr;
lv_point_t* tickPoints = nullptr;
void setPos();
void checkEvents() override;
void deleteLater(bool detach = true, bool trash = true) override;
};
@@ -62,9 +62,9 @@ rect_t TopBar::getZone(unsigned int index) const
coord_t x = MENU_HEADER_BUTTONS_LEFT + 1;
for (int i = 0; i < index; i += 1)
x += (g_model.topbarWidgetWidth[i] * (TOPBAR_ZONE_WIDTH + TOPBAR_ZONE_HMARGIN));
x += (g_model.topbarWidgetWidth[i] * (TOPBAR_ZONE_WIDTH + PAD_TINY));
coord_t size = ((g_model.topbarWidgetWidth[index] - 1) * (TOPBAR_ZONE_WIDTH + TOPBAR_ZONE_HMARGIN) + TOPBAR_ZONE_WIDTH);
coord_t size = ((g_model.topbarWidgetWidth[index] - 1) * (TOPBAR_ZONE_WIDTH + PAD_TINY) + TOPBAR_ZONE_WIDTH);
if ((x + size) > LCD_W) size = LCD_W - x;
@@ -62,7 +62,6 @@ class TopBar: public TopBarBase
static LAYOUT_VAL(TOPBAR_ZONE_WIDTH, 70, 70)
static LAYOUT_VAL(TOPBAR_ZONE_VMARGIN, 3, 3)
static LAYOUT_VAL(TOPBAR_ZONE_HMARGIN, 2, 2)
static constexpr coord_t TOPBAR_ZONE_HEIGHT = EdgeTxStyles::MENU_HEADER_HEIGHT - 2 * TOPBAR_ZONE_VMARGIN;
static LAYOUT_VAL(HDR_DATE_XO, 48, 48)
+21 -15
View File
@@ -45,9 +45,11 @@ class TrimIcon : public SliderIcon
bar1 = lv_line_create(lvobj);
etx_obj_add_style(bar1, styles->div_line_white, LV_PART_MAIN);
etx_obj_add_style(bar1, styles->div_line_black, LV_STATE_USER_1);
lv_line_set_points(bar1, &barPoints[0], 2);
bar2 = lv_line_create(lvobj);
etx_obj_add_style(bar2, styles->div_line_white, LV_PART_MAIN);
etx_obj_add_style(bar2, styles->div_line_black, LV_STATE_USER_1);
lv_line_set_points(bar2, &barPoints[2], 2);
etx_bg_color(fill, COLOR_THEME_ACTIVE_INDEX, LV_STATE_USER_1);
@@ -55,10 +57,15 @@ class TrimIcon : public SliderIcon
void setState(int value)
{
if (value < TRIM_MIN || value > TRIM_MAX)
if (value < TRIM_MIN || value > TRIM_MAX) {
lv_obj_add_state(fill, LV_STATE_USER_1);
else
lv_obj_add_state(bar1, LV_STATE_USER_1);
lv_obj_add_state(bar2, LV_STATE_USER_1);
} else {
lv_obj_clear_state(fill, LV_STATE_USER_1);
lv_obj_clear_state(bar1, LV_STATE_USER_1);
lv_obj_clear_state(bar2, LV_STATE_USER_1);
}
if (value >= 0)
lv_obj_clear_flag(bar1, LV_OBJ_FLAG_HIDDEN);
@@ -81,8 +88,6 @@ MainViewTrim::MainViewTrim(Window* parent, const rect_t& rect, uint8_t idx,
bool isVertical) :
Window(parent, rect), idx(idx), isVertical(isVertical)
{
setRange();
trimBar = lv_obj_create(lvobj);
etx_solid_bg(trimBar, COLOR_THEME_SECONDARY1_INDEX);
etx_obj_add_style(trimBar, styles->rounded, LV_PART_MAIN);
@@ -99,26 +104,22 @@ MainViewTrim::MainViewTrim(Window* parent, const rect_t& rect, uint8_t idx,
}
trimIcon = new TrimIcon(this, isVertical);
coord_t x = 0, y = 0;
if (isVertical)
y = (height() - LayoutFactory::TRIM_SQUARE_SIZE) / 2;
else
y = (width() - LayoutFactory::TRIM_SQUARE_SIZE) / 2;
lv_obj_set_pos(trimIcon->getLvObj(), x, y);
trimValue = new DynamicNumber<int16_t>(
this, {0, 0, LayoutFactory::TRIM_SQUARE_SIZE, 12},
[=]() { return divRoundClosest(abs(value) * 100, trimMax); },
COLOR_THEME_PRIMARY2 | FONT(XXS) | CENTERED);
COLOR_THEME_PRIMARY2_INDEX, FONT(XXS) | CENTERED);
etx_solid_bg(trimValue->getLvObj(), COLOR_THEME_SECONDARY1_INDEX);
trimValue->hide();
setRange();
setPos();
}
void MainViewTrim::setRange()
{
if (g_model.extendedTrims) {
extendedTrims = g_model.extendedTrims;
if (extendedTrims) {
trimMin = TRIM_EXTENDED_MIN;
trimMax = TRIM_EXTENDED_MAX;
} else {
@@ -193,10 +194,15 @@ void MainViewTrim::checkEvents()
int newValue = getTrimValue(mixerCurrentFlightMode, inputMappingConvertMode(idx));
setRange();
newValue = min(max(newValue, trimMin), trimMax);
bool update = false;
if (extendedTrims != g_model.extendedTrims) {
update = true;
setRange();
newValue = limit(trimMin, newValue, trimMax);
}
if (value != newValue || (g_model.displayTrims == DISPLAY_TRIMS_CHANGE &&
if (update || value != newValue || (g_model.displayTrims == DISPLAY_TRIMS_CHANGE &&
showChange && trimsDisplayTimer == 0)) {
value = newValue;
setPos();
+1
View File
@@ -39,6 +39,7 @@ class MainViewTrim : public Window
bool isVertical;
bool showChange = false;
int trimMin = 0, trimMax = 0;
bool extendedTrims = false;
bool hidden = false;
TrimIcon* trimIcon = nullptr;
DynamicNumber<int16_t>* trimValue = nullptr;
+14 -12
View File
@@ -50,8 +50,6 @@ static lv_disp_drv_t disp_drv;
static lv_disp_t disp;
#endif
static lv_area_t screen_area = {0, 0, LCD_W - 1, LCD_H - 1};
// Call backs
static void (*lcd_wait_cb)(lv_disp_drv_t*) = nullptr;
static void (*lcd_flush_cb)(lv_disp_drv_t*, uint16_t* buffer,
@@ -222,8 +220,22 @@ void lcdInitDisplayDriver()
lcdFront->setDrawCtx(draw_ctx);
}
void lcdClear() { lcd->clear(); }
void lcdFlushed()
{
// its possible to get here before flushLcd is ever called.
// so check for nullptr first. (Race condition if you put breakpoints in
// startup code)
if (refr_disp != nullptr) lv_disp_flush_ready(refr_disp);
}
// Direct drawing - used by boot loader and battery charging state
void lcdInitDirectDrawing()
{
static lv_area_t screen_area = {0, 0, LCD_W - 1, LCD_H - 1};
lv_draw_ctx_t* draw_ctx = disp_drv.draw_ctx;
draw_ctx->buf = disp_drv.draw_buf->buf_act;
draw_ctx->buf_area = &screen_area;
@@ -285,13 +297,3 @@ void lcdRefresh()
lv_disp_t* d = _lv_refr_get_disp_refreshing();
_draw_buf_flush(d);
}
void lcdClear() { lcd->clear(); }
void lcdFlushed()
{
// its possible to get here before flushLcd is ever called.
// so check for nullptr first. (Race condition if you put breakpoints in
// startup code)
if (refr_disp != nullptr) lv_disp_flush_ready(refr_disp);
}
+3 -2
View File
@@ -45,10 +45,11 @@ void lcdSetFlushCb(void (*cb)(lv_disp_drv_t *, uint16_t*, const rect_t&));
// Init LVGL and its display driver
void lcdInitDisplayDriver();
void lcdClear();
// Patch the draw context to allow for direct drawing
void lcdInitDirectDrawing();
void lcdClear();
void lcdRefresh();
void lcdFlushed();
+1 -1
View File
@@ -39,7 +39,7 @@ static const lv_obj_class_t input_mix_line_class = {
.user_data = nullptr,
.event_cb = nullptr,
.width_def = LV_PCT(100),
.height_def = LV_SIZE_CONTENT,
.height_def = ListLineButton::BTN_H,
.editable = LV_OBJ_CLASS_EDITABLE_INHERIT,
.group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE,
.instance_size = sizeof(lv_btn_t),
+2 -2
View File
@@ -38,7 +38,7 @@ class ListLineButton : public ButtonBase
virtual void refresh() = 0;
static LAYOUT_VAL(BTN_H, 29, 29)
static constexpr coord_t GRP_W = LCD_W - PAD_MEDIUM * 2;
static constexpr coord_t GRP_W = LCD_W - PAD_SMALL * 2;
protected:
uint8_t index;
@@ -64,7 +64,7 @@ class InputMixButtonBase : public ListLineButton
static LAYOUT_VAL(FM_CANVAS_HEIGHT, 17, 17)
static LAYOUT_VAL(FM_CANVAS_WIDTH, 90, 90)
static LAYOUT_VAL(BTN_W, 389, 229)
static LAYOUT_VAL(BTN_W, 395, 235)
static constexpr coord_t WGT_X = PAD_TINY;
static constexpr coord_t WGT_Y = PAD_TINY;
static LAYOUT_VAL(WGT_W, 50, 50)
+6 -6
View File
@@ -43,7 +43,7 @@ class CurveButton : public Button
strAppend(s, g_model.curves[index].name, LEN_CURVE_NAME);
}
title = new StaticText(this, {4, -1, width() - 12, TITLE_H + 1}, buf,
COLOR_THEME_SECONDARY1 | CENTERED | FONT(BOLD));
COLOR_THEME_SECONDARY1_INDEX, CENTERED | FONT(BOLD));
etx_txt_color(title->getLvObj(), COLOR_THEME_PRIMARY2_INDEX,
LV_PART_MAIN | LV_STATE_USER_1);
etx_solid_bg(title->getLvObj(), COLOR_THEME_SECONDARY2_INDEX);
@@ -51,10 +51,10 @@ class CurveButton : public Button
LV_PART_MAIN | LV_STATE_USER_1);
hdrLeft = new StaticIcon(this, 0, 0, ICON_ROUND_TITLE_LEFT,
COLOR_THEME_SECONDARY2);
COLOR_THEME_SECONDARY2_INDEX);
hdrRight = new StaticIcon(this, width() - 8, 0,
ICON_ROUND_TITLE_RIGHT,
COLOR_THEME_SECONDARY2);
COLOR_THEME_SECONDARY2_INDEX);
// Preview
preview = new CurveRenderer(
@@ -68,7 +68,7 @@ class CurveButton : public Button
snprintf(buf, 32, "%s %d %s", STR_CURVE_TYPES[curve.type], 5 + curve.points,
STR_PTS);
new StaticText(this, {0, height() - INFO_H + 1, LV_PCT(100), 16}, buf,
COLOR_THEME_SECONDARY1 | CENTERED | FONT(BOLD));
COLOR_THEME_SECONDARY1_INDEX, CENTERED | FONT(BOLD));
}
void update() { preview->update(); }
@@ -211,9 +211,9 @@ void ModelCurvesPage::build(Window *window)
#endif
static const lv_coord_t row_dsc[] = {LV_GRID_CONTENT, LV_GRID_TEMPLATE_LAST};
window->setFlexLayout();
window->setFlexLayout(LV_FLEX_FLOW_COLUMN, PAD_ZERO);
FlexGridLayout grid(col_dsc, row_dsc);
FlexGridLayout grid(col_dsc, row_dsc, PAD_TINY);
FormLine *line = nullptr;
+2 -2
View File
@@ -478,7 +478,7 @@ const lv_obj_class_t FlightModeBtn::fm_trim_value_class = {
};
ModelFlightModesPage::ModelFlightModesPage() :
PageTab(STR_MENUFLIGHTMODES, ICON_MODEL_FLIGHT_MODES, PAD_MEDIUM)
PageTab(STR_MENUFLIGHTMODES, ICON_MODEL_FLIGHT_MODES)
{
}
@@ -494,7 +494,7 @@ void ModelFlightModesPage::build(Window* form)
for (int i = 0; i < MAX_FLIGHT_MODES; i++) {
auto btn = new FlightModeBtn(form, i);
lv_obj_set_pos(btn->getLvObj(), PAD_MEDIUM, i * (FlightModeBtn::BTN_H + 3) + 4);
lv_obj_set_pos(btn->getLvObj(), PAD_SMALL, i * (FlightModeBtn::BTN_H + 3) + 4);
btn->setWidth(ListLineButton::GRP_W);
btn->setPressHandler([=]() {
+1 -1
View File
@@ -554,7 +554,7 @@ void ModelGVarsPage::build(Window* window)
if (modelFMEnabled()) {
hdr = new GVarHeader(window->getParent());
lv_obj_set_pos(hdr->getLvObj(), 0, TabsGroup::MENU_TITLE_TOP + TabsGroup::MENU_TITLE_HEIGHT);
yo = GVarButton::HDR_H - 4;
yo = GVarButton::HDR_H - 2;
}
for (uint8_t index = 0; index < MAX_GVARS; index++) {
+3 -3
View File
@@ -66,7 +66,7 @@ void ModelHeliPage::build(Window* form)
GET_SET_DEFAULT(g_model.swashR.elevatorSource));
// Elevator weight
auto w = new StaticText(line, rect_t{}, STR_WEIGHT, COLOR_THEME_PRIMARY1 | RIGHT);
auto w = new StaticText(line, rect_t{}, STR_WEIGHT, COLOR_THEME_PRIMARY1_INDEX, RIGHT);
w->padRight(PAD_LARGE);
new NumberEdit(line, rect_t{}, -100, 100,
GET_SET_DEFAULT(g_model.swashR.elevatorWeight));
@@ -78,7 +78,7 @@ void ModelHeliPage::build(Window* form)
GET_SET_DEFAULT(g_model.swashR.aileronSource));
// Aileron weight
w = new StaticText(line, rect_t{}, STR_WEIGHT, COLOR_THEME_PRIMARY1 | RIGHT);
w = new StaticText(line, rect_t{}, STR_WEIGHT, COLOR_THEME_PRIMARY1_INDEX, RIGHT);
w->padRight(PAD_LARGE);
new NumberEdit(line, rect_t{}, -100, 100,
GET_SET_DEFAULT(g_model.swashR.aileronWeight));
@@ -90,7 +90,7 @@ void ModelHeliPage::build(Window* form)
GET_SET_DEFAULT(g_model.swashR.collectiveSource));
// Collective weight
w = new StaticText(line, rect_t{}, STR_WEIGHT, COLOR_THEME_PRIMARY1 | RIGHT);
w = new StaticText(line, rect_t{}, STR_WEIGHT, COLOR_THEME_PRIMARY1_INDEX, RIGHT);
w->padRight(PAD_LARGE);
new NumberEdit(line, rect_t{}, -100, 100,
GET_SET_DEFAULT(g_model.swashR.collectiveWeight));
@@ -304,7 +304,7 @@ void getsEdgeDelayParam(char* s, LogicalSwitchData* ls)
class LogicalSwitchButton : public ListLineButton
{
public:
LogicalSwitchButton(Window* parent, const rect_t& rect, int lsIndex) :
LogicalSwitchButton(Window* parent, int lsIndex) :
ListLineButton(parent, lsIndex)
{
setHeight(LS_BUTTON_H);
@@ -510,7 +510,7 @@ class LogicalSwitchButton : public ListLineButton
};
ModelLogicalSwitchesPage::ModelLogicalSwitchesPage() :
PageTab(STR_MENULOGICALSWITCHES, ICON_MODEL_LOGICAL_SWITCHES, PAD_SMALL)
PageTab(STR_MENULOGICALSWITCHES, ICON_MODEL_LOGICAL_SWITCHES)
{
}
@@ -570,13 +570,8 @@ void ModelLogicalSwitchesPage::plusPopup(Window* window)
void ModelLogicalSwitchesPage::build(Window* window)
{
static const lv_coord_t l_col_dsc[] = {LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST};
window->setFlexLayout(LV_FLEX_FLOW_COLUMN, PAD_TINY);
window->setFlexLayout(LV_FLEX_FLOW_COLUMN, PAD_ZERO);
FlexGridLayout grid(l_col_dsc, row_dsc, PAD_TINY);
FormLine* line;
bool hasEmptySwitch = false;
// Reset focusIndex after switching tabs
@@ -588,10 +583,7 @@ void ModelLogicalSwitchesPage::build(Window* window)
bool isActive = (ls->func != LS_FUNC_NONE);
if (isActive) {
line = window->newLine(grid);
auto button = new LogicalSwitchButton(
line, rect_t{0, 0, window->width() - 12, LogicalSwitchButton::LS_BUTTON_H}, i);
auto button = new LogicalSwitchButton(window, i);
button->setPressHandler([=]() {
Menu* menu = new Menu(window);
@@ -652,9 +644,8 @@ void ModelLogicalSwitchesPage::build(Window* window)
}
if (hasEmptySwitch) {
line = window->newLine(grid);
addButton =
new TextButton(line, rect_t{0, 0, window->width() - 12, LogicalSwitchButton::LS_BUTTON_H},
new TextButton(window, rect_t{0, 0, window->width() - 12, LogicalSwitchButton::LS_BUTTON_H},
LV_SYMBOL_PLUS, [=]() {
plusPopup(window);
return 0;
+8 -20
View File
@@ -35,9 +35,6 @@
#define SET_DIRTY() storageDirty(EE_MODEL)
// Overview grid
static const lv_coord_t col_dsc[] = {LV_GRID_CONTENT, LV_GRID_TEMPLATE_LAST};
// Edit grid
#if !PORTRAIT_LCD
static const lv_coord_t e_col_dsc[] = {LV_GRID_FR(2), LV_GRID_FR(3),
@@ -153,11 +150,11 @@ class ScriptEditWindow : public Page
getSourceString(
s, MIXSRC_FIRST_LUA + (idx * MAX_SCRIPT_OUTPUTS) + i);
return std::string(s, sizeof(s) - 1);
},
COLOR_THEME_PRIMARY1);
});
lbl->padLeft(PAD_LARGE);
new DynamicNumber<int16_t>(
line, rect_t{}, [=]() { return calcRESXto1000(so->value); }, PREC1);
line, rect_t{}, [=]() { return calcRESXto1000(so->value); },
COLOR_THEME_PRIMARY1_INDEX, PREC1);
}
}
}
@@ -174,16 +171,15 @@ class ScriptEditWindow : public Page
class ScriptLineButton : public ListLineButton
{
public:
ScriptLineButton(Window* parent, const rect_t& rect,
ScriptLineButton(Window* parent,
const ScriptData& scriptData,
const ScriptInternalData* runtimeData, uint8_t index) :
ListLineButton(parent, index),
scriptData(scriptData),
runtimeData(runtimeData)
{
#if PORTRAIT_LCD
setHeight(EdgeTxStyles::UI_ELEMENT_HEIGHT);
padTop(PAD_SMALL);
#endif
padLeft(PAD_TINY);
padRight(PAD_TINY);
lv_obj_set_layout(lvobj, LV_LAYOUT_GRID);
@@ -274,8 +270,6 @@ class ScriptLineButton : public ListLineButton
const ScriptInternalData* runtimeData;
};
#define CM_BUTTON_H 34
ModelMixerScriptsPage::ModelMixerScriptsPage() :
PageTab(STR_MENUCUSTOMSCRIPTS, ICON_MODEL_LUA_SCRIPTS)
{
@@ -291,15 +285,11 @@ void ModelMixerScriptsPage::rebuild(Window* window, int8_t focusIdx)
void ModelMixerScriptsPage::build(Window* window, int8_t focusIdx)
{
window->padAll(PAD_SMALL);
window->setFlexLayout(LV_FLEX_FLOW_COLUMN, PAD_ZERO);
FlexGridLayout grid(col_dsc, row_dsc, PAD_TINY);
window->padBottom(PAD_LARGE);
window->setFlexLayout(LV_FLEX_FLOW_COLUMN, PAD_TINY);
int8_t scriptIdx = 0;
for (int8_t idx = 0; idx < MAX_SCRIPTS; idx++) {
auto line = window->newLine(grid);
ScriptInternalData* runtimeData = nullptr;
ScriptData* const sd = &(g_model.scriptsData[idx]);
ScriptInputsOutputs* const sio = &(scriptInputsOutputs[idx]);
@@ -308,9 +298,7 @@ void ModelMixerScriptsPage::build(Window* window, int8_t focusIdx)
runtimeData = &(scriptInternalData[scriptIdx++]);
}
auto button = new ScriptLineButton(
line, rect_t{0, 0, window->width() - 12, CM_BUTTON_H}, *sd, runtimeData,
idx);
auto button = new ScriptLineButton(window, *sd, runtimeData, idx);
button->setPressHandler([=]() -> uint8_t {
Menu* const menu = new Menu(window);
+3 -3
View File
@@ -43,7 +43,7 @@ class MPlexIcon : public Window
} else if (mix->mltpx == MLTPX_REPL) {
n = ICON_MPLEX_REPLACE;
}
icon = new StaticIcon(this, 0, 0, n, COLOR_THEME_SECONDARY1);
icon = new StaticIcon(this, 0, 0, n, COLOR_THEME_SECONDARY1_INDEX);
icon->center(width(), height());
}
@@ -429,10 +429,10 @@ void ModelMixesPage::pasteMixAfter(uint8_t dst_idx)
void ModelMixesPage::build(Window * window)
{
window->setFlexLayout(LV_FLEX_FLOW_COLUMN, 3);
window->setFlexLayout(LV_FLEX_FLOW_COLUMN, PAD_TINY);
form = new Window(window, rect_t{});
form->setFlexLayout(LV_FLEX_FLOW_COLUMN, 3);
form->setFlexLayout(LV_FLEX_FLOW_COLUMN, PAD_TINY);
auto box = new Window(window, rect_t{});
box->padAll(PAD_TINY);
+3 -3
View File
@@ -98,7 +98,7 @@ class OutputLineButton : public ListLineButton
lv_obj_set_pos(revert, REV_X, REV_Y);
curve =
new StaticIcon(this, CRV_X, CRV_Y, ICON_TEXTLINE_CURVE, COLOR_THEME_SECONDARY1);
new StaticIcon(this, CRV_X, CRV_Y, ICON_TEXTLINE_CURVE, COLOR_THEME_SECONDARY1_INDEX);
new OutputChannelBar(this, rect_t{BAR_X, PAD_MEDIUM, CH_BAR_WIDTH, CH_BAR_HEIGHT},
index, false, false);
@@ -230,7 +230,7 @@ class OutputLineButton : public ListLineButton
};
ModelOutputsPage::ModelOutputsPage() :
PageTab(STR_MENULIMITS, ICON_MODEL_OUTPUTS, PAD_TINY)
PageTab(STR_MENULIMITS, ICON_MODEL_OUTPUTS)
{
}
@@ -244,7 +244,7 @@ void ModelOutputsPage::build(Window* window)
return 0;
});
new StaticText(window, {EXLIM_X, EXLIM_Y, EXLIM_W, EXLIM_H}, STR_ELIMITS, RIGHT);
new StaticText(window, {EXLIM_X, EXLIM_Y, EXLIM_W, EXLIM_H}, STR_ELIMITS, COLOR_THEME_PRIMARY1_INDEX, RIGHT);
new ToggleSwitch(window, {EXLIMCB_X, EXLIMCB_Y, EXLIMCB_W, EXLIMCB_H}, GET_SET_DEFAULT(g_model.extendedLimits));
for (uint8_t ch = 0; ch < MAX_OUTPUT_CHANNELS; ch++) {
+3 -3
View File
@@ -31,7 +31,7 @@ class ModelOutputsPage : public PageTab
ModelOutputsPage();
void build(Window* window) override;
static constexpr coord_t ADD_TRIMS_X = PAD_MEDIUM;
static constexpr coord_t ADD_TRIMS_X = PAD_SMALL;
static constexpr coord_t ADD_TRIMS_Y = PAD_SMALL;
static LAYOUT_VAL(ADD_TRIMS_W, (LCD_W / 2) - 10, LCD_W - 12)
static constexpr coord_t ADD_TRIMS_H = EdgeTxStyles::UI_ELEMENT_HEIGHT;
@@ -44,9 +44,9 @@ class ModelOutputsPage : public PageTab
static LAYOUT_VAL(EXLIM_Y, 10, ADD_TRIMS_X + ADD_TRIMS_H + 8)
static constexpr coord_t EXLIM_W = EXLIMCB_X - EXLIM_X - PAD_SMALL;
static LAYOUT_VAL(EXLIM_H, 20, 20)
static constexpr coord_t TRIMB_X = PAD_MEDIUM;
static constexpr coord_t TRIMB_X = PAD_SMALL;
static constexpr coord_t TRIMB_Y = EXLIMCB_Y + EXLIMCB_H + PAD_MEDIUM / 2;
static constexpr coord_t TRIMB_W = LCD_W - PAD_MEDIUM * 2;
static constexpr coord_t TRIMB_W = LCD_W - PAD_SMALL * 2;
protected:
void editOutput(uint8_t channel, OutputLineButton* btn);
+6 -6
View File
@@ -88,13 +88,13 @@ class ModelButton : public Button
coord_t fo = (font == FONT(STD)) ? -3 : (font == FONT(XS)) ? -3 : -1;
modelName = new StaticText(this, {PAD_TINY, PAD_TINY, w, fh}, modelCell->modelName,
CENTERED | COLOR_THEME_SECONDARY1 | font);
COLOR_THEME_SECONDARY1_INDEX, CENTERED | font);
etx_bg_color(modelName->getLvObj(), COLOR_THEME_ACTIVE_INDEX, LV_STATE_USER_1);
etx_obj_add_style(modelName->getLvObj(), styles->bg_opacity_75, LV_STATE_USER_1);
modelName->padTop(fo);
} else {
modelName = new StaticText(this, {PAD_TINY, PAD_SMALL, w, EdgeTxStyles::PAGE_LINE_HEIGHT}, modelCell->modelName,
COLOR_THEME_SECONDARY1 | font);
COLOR_THEME_SECONDARY1_INDEX, font);
}
lv_label_set_long_mode(modelName->getLvObj(), LV_LABEL_LONG_DOT);
@@ -173,7 +173,7 @@ class ModelButton : public Button
errorMsg += ")";
LcdFlags font = (modelLayouts[layout].font == FONT(STD)) ? FONT(XS) : FONT(XXS);
new StaticText(this, {PAD_TINY, h / 2, w, getFontHeight(font)}, errorMsg,
CENTERED | COLOR_THEME_SECONDARY1 | font);
COLOR_THEME_SECONDARY1_INDEX, CENTERED | font);
}
void checkEvents() override
@@ -689,7 +689,7 @@ void ModelLabelsWindow::buildHead(Window *hdr)
setTitle();
// new model button
new TextButton(hdr, {LCD_W - NEW_BTN_W - PAD_LARGE, LAYOUT_BTN_YO, NEW_BTN_W, EdgeTxStyles::UI_ELEMENT_HEIGHT}, STR_NEW, [=]() {
new TextButton(hdr, {LCD_W - NEW_BTN_W - PAD_LARGE, PAD_MEDIUM, NEW_BTN_W, EdgeTxStyles::UI_ELEMENT_HEIGHT}, STR_NEW, [=]() {
auto menu = new Menu(this);
menu->setTitle(STR_CREATE_NEW);
menu->addLine(STR_NEW_MODEL, [=]() { newModel(); });
@@ -697,7 +697,7 @@ void ModelLabelsWindow::buildHead(Window *hdr)
return 0;
});
mdlLayout = new ModelLayoutButton(this, LCD_W - LAYOUT_BTN_XO, LAYOUT_BTN_YO, g_eeGeneral.modelSelectLayout, [=]() {
mdlLayout = new ModelLayoutButton(this, LCD_W - LAYOUT_BTN_XO, PAD_MEDIUM, g_eeGeneral.modelSelectLayout, [=]() {
uint8_t l = mdlLayout->getLayout();
l = (l + 1) & 3;
mdlLayout->setLayout(l);
@@ -711,7 +711,7 @@ void ModelLabelsWindow::buildHead(Window *hdr)
void ModelLabelsWindow::buildBody(Window *window)
{
// Models List
mdlselector = new ModelsPageBody(window, {MDLS_X, MDLS_Y, MDLS_W, MDLS_H});
mdlselector = new ModelsPageBody(window, {MDLS_X, PAD_SMALL, MDLS_W, MDLS_H});
mdlselector->setLblRefreshFunc([=]() { labelRefreshRequest(); });
auto mdl_obj = mdlselector->getLvObj();
lv_obj_set_style_max_width(mdl_obj, MDLS_W, LV_PART_MAIN);
+1 -1
View File
@@ -78,7 +78,7 @@ static void viewOption(Window* parent, coord_t x, coord_t y,
std::function<void(uint8_t)> setValue, bool globalState)
{
auto lbl = new StaticText(parent, {x + ModelSetupPage::OPTS_W + PAD_MEDIUM, y + PAD_SMALL + 1, 0, 0},
STR_ADCFILTERVALUES[globalState ? 1 : 2], COLOR_THEME_SECONDARY1);
STR_ADCFILTERVALUES[globalState ? 1 : 2], COLOR_THEME_SECONDARY1_INDEX);
new Choice(parent, {x, y, ModelSetupPage::OPTS_W, 0}, STR_ADCFILTERVALUES, 0, 2, getValue,
[=](int newValue) {
setValue(newValue);
+3 -3
View File
@@ -350,7 +350,7 @@ class USBChannelEditWindow : public Page
line->padBottom(PAD_ZERO);
collisionText =
new StaticText(line, rect_t{}, "",
FONT(BOLD) | COLOR_THEME_PRIMARY2 | CENTERED);
COLOR_THEME_PRIMARY2_INDEX, FONT(BOLD) | CENTERED);
etx_bg_color(collisionText->getLvObj(), COLOR_THEME_WARNING_INDEX);
lv_obj_set_grid_cell(collisionText->getLvObj(), LV_GRID_ALIGN_STRETCH, 0,
USBCH_COLS, LV_GRID_ALIGN_CENTER, 0, 1);
@@ -400,7 +400,7 @@ class USBChannelLineButton : public ListLineButton
m_inverse =
new StaticIcon(this, 0, 0, ICON_CHAN_MONITOR_INVERTED,
COLOR_THEME_SECONDARY1);
COLOR_THEME_SECONDARY1_INDEX);
lv_obj_set_grid_cell(m_inverse->getLvObj(), LV_GRID_ALIGN_START, 1, 1,
LV_GRID_ALIGN_CENTER, 0, 1);
@@ -531,7 +531,7 @@ ModelUSBJoystickPage::ModelUSBJoystickPage() : Page(ICON_MODEL_USB)
line = body->newLine(grid);
_CircCoutoutLabel = new StaticText(
line, rect_t{}, STR_USBJOYSTICK_CIRC_COUTOUT, COLOR_THEME_PRIMARY1);
line, rect_t{}, STR_USBJOYSTICK_CIRC_COUTOUT);
_CircCoutout =
new Choice(line, rect_t{}, STR_VUSBJOYSTICK_CIRC_COUTOUT, 0, USBJOYS_LAST,
GET_DEFAULT(g_model.usbJoystickCircularCut),
+1 -1
View File
@@ -554,7 +554,7 @@ void ModuleWindow::startRSSIDialog(std::function<void()> closeHandler)
return std::to_string((int)TELEMETRY_RSSI()) + getRxStatLabels()->unit;
},
getRxStatLabels()->label, 50,
COLOR_THEME_SECONDARY1 | CENTERED | FONT(XL));
COLOR_THEME_SECONDARY1_INDEX, CENTERED | FONT(XL));
rssiDialog->setCloseHandler([this, closeHandler]() {
rangeButton->check(false);
+2 -3
View File
@@ -52,7 +52,7 @@ class MPMProtoOption : public FormLine {
edit = new NumberEdit(box, rect_t{}, 0, 0, nullptr);
cb = new ToggleSwitch(box, rect_t{}, nullptr, nullptr);
rssi = new DynamicNumber<uint16_t>(
box, rect_t{}, [] { return (uint16_t)TELEMETRY_RSSI(); }, 0,
box, rect_t{}, [] { return (uint16_t)TELEMETRY_RSSI(); }, COLOR_THEME_PRIMARY1_INDEX, 0,
getRxStatLabels()->label, getRxStatLabels()->unit);
rssi->padTop(PAD_SMALL);
}
@@ -345,8 +345,7 @@ MultimoduleSettings::MultimoduleSettings(Window* parent,
char msg[64] = "";
getModuleStatusString(moduleIdx, msg);
return std::string(msg);
},
COLOR_THEME_PRIMARY1);
});
st_line = new MPMSubtype(this, grid, moduleIdx);
+3 -3
View File
@@ -37,7 +37,7 @@ PageHeader::PageHeader(Window* parent, EdgeTxIcon icon) :
title = new StaticText(this,
{PAGE_TITLE_LEFT, PAGE_TITLE_TOP,
LCD_W - PAGE_TITLE_LEFT, EdgeTxStyles::PAGE_LINE_HEIGHT},
"", COLOR_THEME_PRIMARY2);
"", COLOR_THEME_PRIMARY2_INDEX);
}
PageHeader::PageHeader(Window* parent, const char* iconFile) :
@@ -52,7 +52,7 @@ PageHeader::PageHeader(Window* parent, const char* iconFile) :
title = new StaticText(this,
{PAGE_TITLE_LEFT, PAGE_TITLE_TOP,
LCD_W - PAGE_TITLE_LEFT, EdgeTxStyles::PAGE_LINE_HEIGHT},
"", COLOR_THEME_PRIMARY2);
"", COLOR_THEME_PRIMARY2_INDEX);
}
StaticText* PageHeader::setTitle2(std::string txt)
@@ -61,7 +61,7 @@ StaticText* PageHeader::setTitle2(std::string txt)
title2 = new StaticText(this,
{PAGE_TITLE_LEFT, PAGE_TITLE_TOP + EdgeTxStyles::PAGE_LINE_HEIGHT,
LCD_W - PAGE_TITLE_LEFT, EdgeTxStyles::PAGE_LINE_HEIGHT},
"", COLOR_THEME_PRIMARY2);
"", COLOR_THEME_PRIMARY2_INDEX);
}
title2->setText(std::move(txt));
return title2;
+5 -5
View File
@@ -151,11 +151,11 @@ PreviewWindow::PreviewWindow(Window *window, rect_t rect,
etx_solid_bg(topbar->getLvObj(), COLOR_THEME_SECONDARY1_INDEX);
new StaticIcon(topbar, ICON_X1, ICON_Y, ICON_RADIO,
COLOR_THEME_PRIMARY2);
COLOR_THEME_PRIMARY2_INDEX);
new StaticIcon(topbar, ICON_X2, ICON_Y, ICON_RADIO_TOOLS,
COLOR_THEME_PRIMARY2);
COLOR_THEME_PRIMARY2_INDEX);
new StaticIcon(topbar, ICON_X3, ICON_Y, ICON_RADIO_SETUP,
COLOR_THEME_PRIMARY2);
COLOR_THEME_PRIMARY2_INDEX);
new StaticText(this, {ICON_X1, CBT_Y, CBT_W, EdgeTxStyles::PAGE_LINE_HEIGHT}, STR_THEME_CHECKBOX);
new ThemedCheckBox(this, {CB1_X, CB_Y, CB_W, 0}, true);
@@ -166,9 +166,9 @@ PreviewWindow::PreviewWindow(Window *window, rect_t rect,
new MainViewTrim(this, {ICON_X1, TRIM_Y, MainViewSlider::HORIZONTAL_SLIDERS_WIDTH, TRIM_H}, 0, false);
new MainViewSlider(this, {ICON_X1, SLIDER_Y, MainViewSlider::HORIZONTAL_SLIDERS_WIDTH, TRIM_H}, 0, false);
new StaticText(this, {ICON_X1, TXT1_Y, TXT_W, EdgeTxStyles::PAGE_LINE_HEIGHT}, STR_THEME_WARNING,
COLOR_THEME_WARNING);
COLOR_THEME_WARNING_INDEX);
new StaticText(this, {ICON_X1, TXT2_Y, TXT_W, EdgeTxStyles::PAGE_LINE_HEIGHT}, STR_THEME_DISABLED,
COLOR_THEME_DISABLED);
COLOR_THEME_DISABLED_INDEX);
new ThemedTextEdit(this, {ICON_X1, EDT_Y, TXT_W, 0}, STR_THEME_EDIT, true);
new ThemedTextEdit(this, {EDT2_X, EDT_Y, TXT_W, 0}, STR_THEME_FOCUS, false);
+2 -4
View File
@@ -46,6 +46,7 @@ class StickCalibrationWindow : public Window
{
new StaticLZ4Image(this, 0, 0, (LZ4Bitmap *)stick_background);
calibStick = new StaticLZ4Image(this, 0, 0, (LZ4Bitmap *)stick_pointer);
checkEvents();
}
void checkEvents() override
@@ -103,10 +104,7 @@ void RadioCalibrationPage::buildBody(Window *window)
3, 2);
}
std::unique_ptr<ViewMainDecoration> deco(new ViewMainDecoration(window));
deco->setTrimsVisible(false);
deco->setSlidersVisible(true);
deco->setFlightModeVisible(false);
std::unique_ptr<ViewMainDecoration> deco(new ViewMainDecoration(window, false, true, false));
#if defined(PCBNV14) || defined(PCBPL18)
new TextButton(window, {LCD_W - 120, LCD_H - 140, 90, 40}, "Next",
+6 -11
View File
@@ -92,13 +92,11 @@ class AnaViewWindow : public Window
line, rect_t{},
[=]() {
return std::to_string((int16_t)calibratedAnalogs[i] * 25 / 256);
},
COLOR_THEME_PRIMARY1);
});
etx_obj_add_style(lbl->getLvObj(), styles->text_align_right, LV_PART_MAIN);
lbl = new DynamicText(
line, rect_t{}, [=]() { return std::to_string((int16_t)column3(i)); },
COLOR_THEME_PRIMARY1);
line, rect_t{}, [=]() { return std::to_string((int16_t)column3(i)); });
etx_obj_add_style(lbl->getLvObj(), styles->text_align_right, LV_PART_MAIN);
if (column4size() > 0) {
@@ -107,8 +105,7 @@ class AnaViewWindow : public Window
[=]() {
return std::string(column4prefix()) +
std::to_string((int16_t)column4(i));
},
COLOR_THEME_PRIMARY1);
});
etx_obj_add_style(lbl->getLvObj(), (column4size() == 2) ? styles->text_align_left : styles->text_align_right, LV_PART_MAIN);
#if !PORTRAIT_LCD
lv_obj_set_grid_cell(lbl->getLvObj(), LV_GRID_ALIGN_STRETCH,
@@ -125,8 +122,7 @@ class AnaViewWindow : public Window
if (column5size() > 0) {
lbl = new DynamicText(
line, rect_t{},
[=]() { return std::to_string((int16_t)column5(i)); },
COLOR_THEME_PRIMARY1);
[=]() { return std::to_string((int16_t)column5(i)); });
etx_obj_add_style(lbl->getLvObj(), styles->text_align_left, LV_PART_MAIN);
} else {
grid.nextCell();
@@ -182,8 +178,7 @@ class AnaCalibratedViewWindow : public AnaViewWindow
std::to_string(rawTouchState.x) + " : " +
std::to_string(rawTouchState.y);
return std::string("");
},
COLOR_THEME_PRIMARY1);
});
lv_obj_set_grid_cell(lbl->getLvObj(), LV_GRID_ALIGN_STRETCH, 0, 5,
LV_GRID_ALIGN_CENTER, 0, 1);
@@ -192,7 +187,7 @@ class AnaCalibratedViewWindow : public AnaViewWindow
auto lbl2 = new StaticText(
line, rect_t{},
std::string("Touch GT911 FW ver: ") + std::to_string(touchGT911fwver),
COLOR_THEME_PRIMARY1);
COLOR_THEME_PRIMARY1_INDEX);
lv_obj_set_grid_cell(lbl2->getLvObj(), LV_GRID_ALIGN_STRETCH, 0, 5,
LV_GRID_ALIGN_CENTER, 0, 1);
@@ -39,7 +39,7 @@ class GhostModuleConfigWindow : public Window
for (int i = 0; i < GHST_MENU_LINES; i += 1) {
menuLines[i][0] = new StaticText(
this, {xOffset, yOffset + i * lineSpacing, LV_SIZE_CONTENT, h}, "",
FONT(L));
COLOR_THEME_PRIMARY1_INDEX, FONT(L));
etx_txt_color(menuLines[i][0]->getLvObj(), COLOR_THEME_SECONDARY1_INDEX,
LV_PART_MAIN);
etx_solid_bg(menuLines[i][0]->getLvObj(), COLOR_THEME_FOCUS_INDEX,
@@ -49,7 +49,7 @@ class GhostModuleConfigWindow : public Window
menuLines[i][1] = new StaticText(
this, {xOffset2, yOffset + i * lineSpacing, LV_SIZE_CONTENT, h}, "",
FONT(L));
COLOR_THEME_PRIMARY1_INDEX, FONT(L));
etx_txt_color(menuLines[i][1]->getLvObj(), COLOR_THEME_SECONDARY1_INDEX,
LV_PART_MAIN);
etx_solid_bg(menuLines[i][1]->getLvObj(), COLOR_THEME_FOCUS_INDEX,
+2 -3
View File
@@ -138,8 +138,8 @@ static SetupLineDef setupLines[] = {
// RTC Batt display
new DynamicNumber<uint16_t>(
parent,
{x + ToggleSwitch::TOGGLE_W + PAD_LARGE, y + PAD_SMALL + 1, 0, 0},
[] { return getRTCBatteryVoltage(); }, COLOR_THEME_PRIMARY1 | PREC2,
{x + ToggleSwitch::TOGGLE_W + PAD_SMALL, y + PAD_SMALL + 1, 0, 0},
[] { return getRTCBatteryVoltage(); }, COLOR_THEME_PRIMARY1_INDEX, PREC2,
"", "V");
}
},
@@ -165,7 +165,6 @@ void RadioHardwarePage::build(Window* window)
{
window->setFlexLayout(LV_FLEX_FLOW_COLUMN, PAD_TINY);
// TODO: sub-title?
SetupLine::showLines(window, 0, SubPage::EDT_X, padding, setupLines, DIM(setupLines));
FlexGridLayout grid(col_dsc, row_dsc, PAD_TINY);
+1 -1
View File
@@ -574,7 +574,7 @@ static void viewOption(Window* parent, coord_t x, coord_t y,
std::string s(STR_MODEL);
s += " - ";
s += STR_ADCFILTERVALUES[modelOption];
new StaticText(parent, {x + ToggleSwitch::TOGGLE_W + PAD_MEDIUM, y + PAD_SMALL + 1, 0, 0}, s.c_str(), COLOR_THEME_SECONDARY1);
new StaticText(parent, {x + ToggleSwitch::TOGGLE_W + PAD_MEDIUM, y + PAD_SMALL + 1, 0, 0}, s.c_str(), COLOR_THEME_SECONDARY1_INDEX);
}
}
@@ -26,13 +26,9 @@
#define SET_DIRTY() storageDirty(EE_GENERAL)
constexpr coord_t SPECTRUM_HEIGHT = 180;
constexpr coord_t SCALE_HEIGHT = 15;
constexpr coord_t FOOTER_HEIGHT = 32;
static const lv_coord_t col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(1),
LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST};
static const lv_coord_t row_dsc[] = {LV_GRID_CONTENT, LV_GRID_TEMPLATE_LAST};
constexpr coord_t SPECTRUM_HEIGHT = LCD_H - EdgeTxStyles::MENU_HEADER_HEIGHT - SCALE_HEIGHT - FOOTER_HEIGHT;
coord_t getAverage(uint8_t number, const uint8_t* value)
{
@@ -49,15 +45,7 @@ class SpectrumFooterWindow : public Window
SpectrumFooterWindow(Window* parent, const rect_t& rect, int moduleIdx) :
Window(parent, rect)
{
setFlexLayout();
padAll(PAD_ZERO);
padLeft(PAD_SMALL);
padRight(PAD_SMALL);
FlexGridLayout grid(col_dsc, row_dsc);
auto line = newLine(grid);
line->padAll(PAD_ZERO);
if (isModuleMultimodule(moduleIdx)) {
char label[16];
@@ -65,18 +53,18 @@ class SpectrumFooterWindow : public Window
// Frequency
sprintf(label, "T: %dMHz",
int(reusableBuffer.spectrumAnalyser.freq / 1000000));
(new StaticText(line, rect_t{0, 0, lv_pct(30), FOOTER_HEIGHT}, label))
(new StaticText(this, rect_t{PAD_TINY, 0, FLD_W, FOOTER_HEIGHT}, label))
->padTop(PAD_MEDIUM);
// Span
sprintf(label, "S: %dMHz",
int(reusableBuffer.spectrumAnalyser.span / 1000000));
(new StaticText(line, rect_t{0, 0, lv_pct(30), FOOTER_HEIGHT}, label))
(new StaticText(this, rect_t{PAD_TINY + FLD_W, 0, FLD_W, FOOTER_HEIGHT}, label))
->padTop(PAD_MEDIUM);
} else {
// Frequency
auto freq = new NumberEdit(
line, rect_t{0, 0, lv_pct(30), FOOTER_HEIGHT},
this, rect_t{PAD_TINY, 0, FLD_W, 0},
reusableBuffer.spectrumAnalyser.freqMin,
reusableBuffer.spectrumAnalyser.freqMax,
GET_DEFAULT(reusableBuffer.spectrumAnalyser.freq / 1000000),
@@ -86,7 +74,7 @@ class SpectrumFooterWindow : public Window
// Span
auto span = new NumberEdit(
line, rect_t{0, 0, lv_pct(30), FOOTER_HEIGHT}, 1,
this, rect_t{PAD_TINY + FLD_W, 0, FLD_W, 0}, 1,
reusableBuffer.spectrumAnalyser.spanMax,
GET_DEFAULT(reusableBuffer.spectrumAnalyser.span / 1000000),
SET_VALUE(reusableBuffer.spectrumAnalyser.span, newValue * 1000000));
@@ -96,7 +84,7 @@ class SpectrumFooterWindow : public Window
// Tracker
auto tracker = new NumberEdit(
line, rect_t{0, 0, lv_pct(30), LV_SIZE_CONTENT},
this, rect_t{(PAD_TINY + FLD_W) * 2, 0, FLD_W, FOOTER_HEIGHT},
(reusableBuffer.spectrumAnalyser.freq -
reusableBuffer.spectrumAnalyser.span / 2) /
1000000,
@@ -109,6 +97,8 @@ class SpectrumFooterWindow : public Window
tracker->setPrefix("T: ");
tracker->setDefault(reusableBuffer.spectrumAnalyser.freqDefault);
}
static constexpr coord_t FLD_W = (LCD_W - PAD_TINY * 4) / 3;
};
class SpectrumScaleWindow : public Window
@@ -132,8 +122,8 @@ class SpectrumScaleWindow : public Window
int x = (frequency - startFreq) / reusableBuffer.spectrumAnalyser.step;
if (x >= LCD_W - 1) break;
formatNumberAsString(s, 16, frequency / 1000000, 16);
new StaticText(this, {x - 16, 0, 32, 15}, s,
FONT(XS) | CENTERED | COLOR_THEME_PRIMARY1);
new StaticText(this, {x - 16, 0, 32, SCALE_HEIGHT}, s,
COLOR_THEME_PRIMARY1_INDEX, FONT(XS) | CENTERED);
}
}
@@ -193,7 +183,7 @@ class SpectrumWindow : public Window
warning = new StaticText(
this, {0, height() / 2 - 20, lv_pct(100), LV_SIZE_CONTENT},
STR_TURN_OFF_RECEIVER, COLOR_THEME_PRIMARY1 | CENTERED | FONT(XL));
STR_TURN_OFF_RECEIVER, COLOR_THEME_PRIMARY1_INDEX, CENTERED | FONT(XL));
warning->show(TELEMETRY_STREAMING());
}
@@ -331,8 +321,8 @@ void RadioSpectrumAnalyser::checkEvents()
limit<int>(0, offset / reusableBuffer.spectrumAnalyser.step, width() - 1);
if (x != trackX) {
trackX = x;
trackPts[0] = {(lv_coord_t)x, 45};
trackPts[1] = {(lv_coord_t)x, (lv_coord_t)(height() - 32)};
trackPts[0] = {(lv_coord_t)x, EdgeTxStyles::MENU_HEADER_HEIGHT};
trackPts[1] = {(lv_coord_t)x, (lv_coord_t)(height() - FOOTER_HEIGHT)};
lv_line_set_points(trackLine, trackPts, 2);
}
Page::checkEvents();
+7 -4
View File
@@ -272,9 +272,12 @@ class ColorEditPage : public Page
r.h = colForm->height() - COLOR_BOX_HEIGHT - 4;
uint32_t color = _theme->getColorEntryByIndex(_indexOfColor)->colorValue;
_colorEditor = new ColorEditor(
colForm, r, _theme->getColorEntryByIndex(_indexOfColor)->colorValue,
colForm, r, COLOR2FLAGS(color) | RGB_FLAG,
[=](uint32_t rgb) {
rgb = COLOR_VAL(rgb);
_theme->setColor(_indexOfColor, rgb);
if (_colorSquare != nullptr) {
_colorSquare->setColor(rgb);
@@ -290,12 +293,12 @@ class ColorEditPage : public Page
r.w = COLOR_BOX_WIDTH;
r.h = COLOR_BOX_HEIGHT;
_colorSquare = new ColorSwatch(
colBoxForm, r, _theme->getColorEntryByIndex(_indexOfColor)->colorValue);
colBoxForm, r, color);
// hexBox
r.w = HEX_STR_W;
_hexBox = new StaticText(colBoxForm, r, "", COLOR_THEME_PRIMARY1 | FONT(L) | RIGHT);
setHexStr(_theme->getColorEntryByIndex(_indexOfColor)->colorValue);
_hexBox = new StaticText(colBoxForm, r, "", COLOR_THEME_PRIMARY1_INDEX, FONT(L) | RIGHT);
setHexStr(color);
}
void buildHead(PageHeader *window)
+23 -8
View File
@@ -149,10 +149,12 @@ static void run_spektrum_int(Window* parent, const std::string&)
}
#endif
#if defined(HARDWARE_EXTERNAL_MODULE)
static void run_spektrum_ext(Window* parent, const std::string&)
{
new RadioSpectrumAnalyser(EXTERNAL_MODULE);
}
#endif
#endif // defined(PXX2) || defined(MULTIMODULE)
#if defined(INTERNAL_MODULE_PXX2)
@@ -196,6 +198,13 @@ void RadioToolsPage::rebuild(Window* window)
std::list<ToolEntry> tools;
#if defined(HARDWARE_INTERNAL_MODULE)
bool intSpecAnalyser = false;
#endif
#if defined(HARDWARE_EXTERNAL_MODULE)
bool extSpecAnalyser = false;
#endif
#if defined(PXX2)
auto hwSettings = &reusableBuffer.hardwareAndSettings;
@@ -204,8 +213,7 @@ void RadioToolsPage::rebuild(Window* window)
// PXX2 modules tools
if (isPXX2ModuleOptionAvailable(intHwSettings->information.modelID,
MODULE_OPTION_SPECTRUM_ANALYSER)) {
tools.emplace_back(
ToolEntry{STR_SPECTRUM_ANALYSER_INT, {}, run_spektrum_int});
intSpecAnalyser = true;
}
if (isPXX2ModuleOptionAvailable(intHwSettings->information.modelID,
MODULE_OPTION_POWER_METER)) {
@@ -216,25 +224,32 @@ void RadioToolsPage::rebuild(Window* window)
auto extHwSettings = &hwSettings->modules[EXTERNAL_MODULE];
if (isPXX2ModuleOptionAvailable(extHwSettings->information.modelID,
MODULE_OPTION_SPECTRUM_ANALYSER)) {
tools.emplace_back(
ToolEntry{STR_SPECTRUM_ANALYSER_EXT, {}, run_spektrum_ext});
extSpecAnalyser = true;
}
#endif // defined(PXX2)
#if defined(HARDWARE_INTERNAL_MODULE) && defined(MULTIMODULE)
if (g_eeGeneral.internalModule == MODULE_TYPE_MULTIMODULE) {
tools.emplace_back(
ToolEntry{STR_SPECTRUM_ANALYSER_INT, {}, run_spektrum_int});
intSpecAnalyser = true;
}
#endif
#if defined(PXX2) || defined(MULTIMODULE)
if (isModuleMultimodule(EXTERNAL_MODULE)) {
tools.emplace_back(
ToolEntry{STR_SPECTRUM_ANALYSER_EXT, {}, run_spektrum_ext});
extSpecAnalyser = true;
}
#endif
#if defined(HARDWARE_INTERNAL_MODULE)
if (intSpecAnalyser)
tools.emplace_back(ToolEntry{STR_SPECTRUM_ANALYSER_INT, {}, run_spektrum_int});
#endif
#if defined(HARDWARE_EXTERNAL_MODULE)
if (extSpecAnalyser)
tools.emplace_back(ToolEntry{STR_SPECTRUM_ANALYSER_EXT, {}, run_spektrum_ext});
#endif
#if defined(GHOST)
if (isModuleGhost(EXTERNAL_MODULE)) {
tools.emplace_back(ToolEntry{"Ghost module config", {}, run_ghost_config});
+3 -3
View File
@@ -52,7 +52,7 @@ void RadioTrainerPage::build(Window* form)
if (SLAVE_MODE()) {
form->setHeight(TabsGroup::MENU_BODY_HEIGHT);
auto txt = new StaticText(form, rect_t{}, STR_SLAVE, FONT(L));
auto txt = new StaticText(form, rect_t{}, STR_SLAVE, COLOR_THEME_PRIMARY1_INDEX, FONT(L));
lv_obj_align(txt->getLvObj(), LV_ALIGN_CENTER, 0, 0);
} else {
FlexGridLayout grid(col_dsc, row_dsc, PAD_TINY);
@@ -78,7 +78,7 @@ void RadioTrainerPage::build(Window* form)
line->padBottom(PAD_LARGE);
#endif
LcdFlags flags = LEFT | COLOR_THEME_PRIMARY1;
LcdFlags flags = LEFT;
if (g_eeGeneral.ppmunit == PPM_PERCENT_PREC1) flags |= PREC1;
new DynamicNumber<int16_t>(
@@ -86,7 +86,7 @@ void RadioTrainerPage::build(Window* form)
[=]() {
return (trainerInput[i] - g_eeGeneral.trainer.calib[i]) * 2;
},
flags);
COLOR_THEME_PRIMARY1_INDEX, flags);
}
auto line = form->newLine(grid);
@@ -69,62 +69,62 @@ class ThemeView : public Window
auto theme = tp->getCurrentTheme();
if (theme) {
if (!details) {
FlexGridLayout theme_grid(theme_col_dsc, theme_row_dsc);
auto line = newLine(theme_grid);
FlexGridLayout theme_grid(theme_col_dsc, theme_row_dsc, PAD_TINY);
auto line = newLine(theme_grid);
details = new Window(line, rect_t{});
// vertical flow layout
lv_obj_set_flex_flow(details->getLvObj(), LV_FLEX_FLOW_COLUMN);
lv_obj_set_style_pad_row(details->getLvObj(), 2, LV_PART_MAIN);
details = new Window(line, rect_t{0, 0, 0, LV_SIZE_CONTENT});
// vertical flow layout
lv_obj_set_flex_flow(details->getLvObj(), LV_FLEX_FLOW_COLUMN);
lv_obj_set_style_pad_row(details->getLvObj(), PAD_TINY, LV_PART_MAIN);
// make the object fill the grid cell
lv_obj_set_style_grid_cell_x_align(details->getLvObj(),
LV_GRID_ALIGN_STRETCH, 0);
// make the object fill the grid cell
lv_obj_set_style_grid_cell_x_align(details->getLvObj(),
LV_GRID_ALIGN_STRETCH, 0);
lv_obj_set_style_grid_cell_y_align(details->getLvObj(),
LV_GRID_ALIGN_START, 0);
new StaticText(details, rect_t{}, STR_AUTHOR, COLOR_THEME_PRIMARY1 | FONT(BOLD));
author = new StaticText(details, rect_t{}, "");
new StaticText(details, rect_t{}, STR_AUTHOR, COLOR_THEME_PRIMARY1_INDEX, FONT(BOLD));
author = new StaticText(details, rect_t{}, "");
// labels default to LV_SIZE_CONTENT,
// which could overflow the width avail
lv_obj_set_width(author->getLvObj(), lv_pct(100));
// labels default to LV_SIZE_CONTENT,
// which could overflow the width avail
lv_obj_set_width(author->getLvObj(), lv_pct(100));
new StaticText(details, rect_t{}, STR_DESCRIPTION, COLOR_THEME_PRIMARY1 | FONT(BOLD));
description =
new StaticText(details, rect_t{}, "");
new StaticText(details, rect_t{}, STR_DESCRIPTION, COLOR_THEME_PRIMARY1_INDEX, FONT(BOLD));
description =
new StaticText(details, rect_t{}, "");
lv_obj_set_width(description->getLvObj(), lv_pct(100));
lv_obj_set_width(description->getLvObj(), lv_pct(100));
#if !PORTRAIT_LCD
preview = new FilePreview(line, rect_t{0, 0, LCD_W / 2, LCD_H / 2});
#else
preview = new FilePreview(line, rect_t{0, 0, LCD_W - 12, LCD_H / 2});
#endif
preview = new FilePreview(line, {0, 0, PREVIEW_W, LV_SIZE_CONTENT});
// center within cell
lv_obj_set_style_grid_cell_x_align(preview->getLvObj(),
LV_GRID_ALIGN_CENTER, 0);
}
// align within cell
lv_obj_set_style_grid_cell_x_align(preview->getLvObj(),
LV_GRID_ALIGN_START, 0);
author->setText(theme->getAuthor());
description->setText(theme->getInfo());
setImage();
update();
}
}
void setImage()
void update()
{
auto tp = ThemePersistance::instance();
auto theme = tp->getCurrentTheme();
auto themeImage = theme->getThemeImageFileNames();
if (themeImage.size() > 0) {
preview->setFile(themeImage[0].c_str());
} else {
preview->setFile("");
if (theme) {
author->setText(theme->getAuthor());
description->setText(theme->getInfo());
auto themeImage = theme->getThemeImageFileNames();
if (themeImage.size() > 0) {
preview->setFile(themeImage[0].c_str());
} else {
preview->setFile("");
}
}
}
static LAYOUT_VAL(PREVIEW_W, (LCD_W - PAD_MEDIUM * 3) / 2, LCD_W - 12)
protected:
Window* details = nullptr;
FilePreview* preview = nullptr;
@@ -133,16 +133,16 @@ class ThemeView : public Window
};
ScreenUserInterfacePage::ScreenUserInterfacePage(ScreenMenu* menu) :
PageTab(STR_USER_INTERFACE, ICON_THEME_SETUP), menu(menu)
PageTab(STR_USER_INTERFACE, ICON_THEME_SETUP, PAD_TINY), menu(menu)
{
}
void ScreenUserInterfacePage::build(Window* window)
{
window->padAll(PAD_SMALL);
window->padAll(PAD_TINY);
window->setFlexLayout(LV_FLEX_FLOW_COLUMN, PAD_ZERO);
FlexGridLayout grid(line_col_dsc, line_row_dsc);
FlexGridLayout grid(line_col_dsc, line_row_dsc, PAD_TINY);
// Top Bar
auto line = window->newLine(grid);
@@ -222,7 +222,7 @@ void ScreenUserInterfacePage::build(Window* window)
tp->setThemeIndex(value);
tp->applyTheme(value);
tp->setDefaultTheme(value);
themeView->setImage();
themeView->update();
});
grid.setColSpan(2);
@@ -103,11 +103,11 @@ class SelectFabButton : public ButtonBase
etx_quick_icon_create);
iconLayout->setWindowFlag(NO_FOCUS);
(new StaticIcon(iconLayout, 0, 0, icon, COLOR_WHITE))
(new StaticIcon(iconLayout, 0, 0, icon, COLOR_WHITE_INDEX))
->center(SelectFabCarousel::FAB_ICON_SIZE - 4, SelectFabCarousel::FAB_ICON_SIZE - 4);
new StaticText(this, {0, SelectFabCarousel::FAB_BUTTON_HEIGHT - SelectFabCarousel::FAB_TXT_YO, SelectFabCarousel::FAB_BUTTON_INNER_WIDTH, 0},
title, COLOR_WHITE | CENTERED);
title, COLOR_WHITE_INDEX, CENTERED);
}
#if defined(DEBUG_WINDOWS)
@@ -42,6 +42,5 @@ class SelectFabCarousel : public Window
static LAYOUT_VAL(FAB_ICON_SIZE, 52, 52)
static LAYOUT_VAL(FAB_TXT_YO, 48, 48)
static LAYOUT_VAL(FAB_PAD, 4, 4)
static constexpr coord_t FAB_BUTTON_INNER_WIDTH = FAB_BUTTON_WIDTH - PAD_MEDIUM;
};
+3 -12
View File
@@ -741,14 +741,8 @@ void FunctionsPage::plusPopup(Window *window)
void FunctionsPage::build(Window *window)
{
static const lv_coord_t l_col_dsc[] = {LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST};
window->setFlexLayout(LV_FLEX_FLOW_COLUMN, PAD_TINY);
window->padAll(PAD_SMALL);
window->setFlexLayout(LV_FLEX_FLOW_COLUMN, PAD_ZERO);
FlexGridLayout grid(l_col_dsc, row_dsc, PAD_TINY);
FormLine *line;
bool hasEmptyFunction = false;
// Reset focusIndex after switching tabs
@@ -760,10 +754,8 @@ void FunctionsPage::build(Window *window)
bool isActive = (cfn->swtch != 0);
if (isActive) {
line = window->newLine(grid);
auto button = functionButton(
line, rect_t{0, 0, window->width() - 12, SF_BUTTON_H}, i);
window, rect_t{0, 0, window->width() - 12, SF_BUTTON_H}, i);
lv_obj_set_grid_cell(button->getLvObj(), LV_GRID_ALIGN_CENTER, 0, 1,
LV_GRID_ALIGN_CENTER, 0, 1);
@@ -862,9 +854,8 @@ void FunctionsPage::build(Window *window)
}
if (hasEmptyFunction) {
line = window->newLine(grid);
addButton =
new TextButton(line, rect_t{0, 0, window->width() - 12, SF_BUTTON_H},
new TextButton(window, rect_t{0, 0, window->width() - 12, SF_BUTTON_H},
LV_SYMBOL_PLUS, [=]() {
plusPopup(window);
return 0;
+7 -7
View File
@@ -103,12 +103,12 @@ void drawSplash()
new StaticLZ4Image(splashScreen, IMG_X - logo->width / 2,
IMG_Y - logo->height / 2, logo);
new StaticText(splashScreen, {TXT_X - 100, TXT_Y, 200, 24}, ver_str.c_str(), COLOR_GREY | CENTERED);
new StaticText(splashScreen, {TXT_X - 100, TXT_Y, 200, 24}, ver_str.c_str(), COLOR_GREY_INDEX, CENTERED);
new StaticText(splashScreen, {TXT_X - 100, TXT_Y + TXT_H, 200, TXT_H},
nam_str.c_str(), COLOR_GREY | CENTERED);
nam_str.c_str(), COLOR_GREY_INDEX, CENTERED);
#if !defined(VERSION_TAG)
new StaticText(splashScreen, {TXT_X - 100, TXT_Y + TXT_H * 2, 200, TXT_H},
git_str.c_str(), COLOR_GREY | CENTERED);
git_str.c_str(), COLOR_GREY_INDEX, CENTERED);
#endif
}
@@ -197,7 +197,7 @@ void drawSleepBitmap()
etx_solid_bg(shutdownWindow->getLvObj(), COLOR_THEME_PRIMARY1_INDEX);
}
(new StaticIcon(shutdownWindow, 0, 0, ICON_SHUTDOWN, COLOR_THEME_PRIMARY2))
(new StaticIcon(shutdownWindow, 0, 0, ICON_SHUTDOWN, COLOR_THEME_PRIMARY2_INDEX))
->center(LCD_W, LCD_H);
LvglWrapper::instance()->run();
@@ -235,14 +235,14 @@ void drawShutdownAnimation(uint32_t duration, uint32_t totalDuration,
shutdownSplashImg->width(),
shutdownSplashImg->height(), LV_IMG_CF_TRUE_COLOR);
}
(new StaticIcon(shutdownWindow, 0, 0, ICON_SHUTDOWN, COLOR_THEME_PRIMARY2))
(new StaticIcon(shutdownWindow, 0, 0, ICON_SHUTDOWN, COLOR_THEME_PRIMARY2_INDEX))
->center(LCD_W, LCD_H);
for (int i = 0; i < 4; i += 1) {
shutdownAnim[i] = new StaticIcon(
shutdownWindow, LCD_W / 2 + bmp_shutdown_xo[i],
LCD_H / 2 + bmp_shutdown_yo[i],
(EdgeTxIcon)(ICON_SHUTDOWN_CIRCLE0 + i), COLOR_THEME_PRIMARY2);
(EdgeTxIcon)(ICON_SHUTDOWN_CIRCLE0 + i), COLOR_THEME_PRIMARY2_INDEX);
}
}
@@ -264,7 +264,7 @@ void drawFatalErrorScreen(const char* message)
etx_solid_bg(fatalErrorWindow->getLvObj(), COLOR_BLACK_INDEX);
new StaticText(fatalErrorWindow, rect_t{0, LCD_H / 2 - 20, LCD_W, 40},
message, FONT(XL) | CENTERED | COLOR_WHITE);
message, COLOR_WHITE_INDEX, FONT(XL) | CENTERED);
}
backlightEnable(100);
+5 -6
View File
@@ -53,10 +53,10 @@ class SelectedTabIcon : public StaticIcon
{
public:
SelectedTabIcon(Window* parent) :
StaticIcon(parent, 0, 0, ICON_CURRENTMENU_SHADOW, COLOR_THEME_PRIMARY1)
StaticIcon(parent, 0, 0, ICON_CURRENTMENU_SHADOW, COLOR_THEME_PRIMARY1_INDEX)
{
new StaticIcon(this, 0, 0, ICON_CURRENTMENU_BG, COLOR_THEME_FOCUS);
new StaticIcon(this, SEL_DOT_X, SEL_DOT_Y, ICON_CURRENTMENU_DOT, COLOR_THEME_PRIMARY2);
new StaticIcon(this, 0, 0, ICON_CURRENTMENU_BG, COLOR_THEME_FOCUS_INDEX);
new StaticIcon(this, SEL_DOT_X, SEL_DOT_Y, ICON_CURRENTMENU_DOT, COLOR_THEME_PRIMARY2_INDEX);
}
#if defined(DEBUG_WINDOWS)
@@ -74,7 +74,7 @@ class TabsGroupButton : public ButtonBase
ButtonBase(parent, rect, nullptr, window_create), pageTab(page), index(idx)
{
lastIcon = pageTab->getIcon();
icon = new StaticIcon(this, 2, ICON_Y, lastIcon, COLOR_THEME_PRIMARY2);
icon = new StaticIcon(this, 2, ICON_Y, lastIcon, COLOR_THEME_PRIMARY2_INDEX);
show(isVisible());
}
@@ -154,7 +154,7 @@ class TabsGroupHeader : public Window
selectedIcon = new SelectedTabIcon(carousel);
new HeaderDateTime(this, LCD_W - DATE_XO, DATE_Y);
new HeaderDateTime(this, LCD_W - DATE_XO, PAD_MEDIUM);
}
void setTitle(const char* title) { lv_label_set_text(titleLabel, title); }
@@ -221,7 +221,6 @@ class TabsGroupHeader : public Window
uint8_t tabCount() const { return buttons.size(); }
static LAYOUT_VAL(DATE_XO, 48, 48)
static LAYOUT_VAL(DATE_Y, 6, 6)
static LAYOUT_VAL(MENU_HEADER_BUTTON_WIDTH, 33, 33)
static LAYOUT_VAL(HDR_DATE_FULL_WIDTH, 51, 51)
+2 -2
View File
@@ -30,10 +30,10 @@ class TabsGroupHeader;
class PageTab
{
public:
PageTab(PaddingSize padding = PAD_MEDIUM) : padding(padding) {}
PageTab(PaddingSize padding = PAD_SMALL) : padding(padding) {}
PageTab(std::string title, EdgeTxIcon icon,
PaddingSize padding = PAD_MEDIUM) :
PaddingSize padding = PAD_SMALL) :
title(std::move(title)), icon(icon), padding(padding)
{
}
+10 -15
View File
@@ -27,6 +27,7 @@
#include "themes/etx_lv_theme.h"
#include "topbar_impl.h"
#include "view_main.h"
#include "storage/sdcard_yaml.h"
#define SET_DIRTY() storageDirty(EE_GENERAL)
@@ -36,13 +37,6 @@ constexpr const char* RGBSTRING = "RGB(";
ThemePersistance ThemePersistance::themePersistance;
// prototype for SD card function to read a YAML file
// TODO: should this be in sdcard header file?
enum class ChecksumResult;
extern const char* readYamlFile(const char* fullpath,
const YamlParserCalls* calls, void* parser_ctx,
ChecksumResult* checksum_result);
static uint32_t r_color(const YamlNode* node, const char* val, uint8_t val_len)
{
if ((strncmp(val, RGBSTRING, strlen(RGBSTRING)) == 0) &&
@@ -521,7 +515,8 @@ void HeaderDateTime::checkEvents()
struct gtm t;
gettime(&t);
if (t.tm_min != lastMinute) {
if (t.tm_min != lastTime.tm_min || t.tm_hour != lastTime.tm_hour ||
t.tm_mday != lastTime.tm_mday || t.tm_mon != lastTime.tm_mon) {
char str[10];
#if defined(TRANSLATIONS_CN) || defined(TRANSLATIONS_TW)
sprintf(str, "%02d-%02d", t.tm_mon + 1, t.tm_mday);
@@ -533,7 +528,7 @@ void HeaderDateTime::checkEvents()
getTimerString(str, getValue(MIXSRC_TX_TIME), timerOptions);
lv_label_set_text(time, str);
lastMinute = t.tm_min;
lastTime = t;
}
}
@@ -544,15 +539,15 @@ void HeaderDateTime::setColor(LcdFlags color)
}
HeaderIcon::HeaderIcon(Window* parent, EdgeTxIcon icon) :
StaticIcon(parent, 0, 0, ICON_TOPLEFT_BG, COLOR_THEME_FOCUS)
StaticIcon(parent, 0, 0, ICON_TOPLEFT_BG, COLOR_THEME_FOCUS_INDEX)
{
(new StaticIcon(this, 0, 0, icon, COLOR_THEME_PRIMARY2))->center(width(), height());
(new StaticIcon(this, 0, 0, icon, COLOR_THEME_PRIMARY2_INDEX))->center(width(), height());
}
HeaderIcon::HeaderIcon(Window* parent, const char* iconFile) :
StaticIcon(parent, 0, 0, ICON_TOPLEFT_BG, COLOR_THEME_FOCUS)
StaticIcon(parent, 0, 0, ICON_TOPLEFT_BG, COLOR_THEME_FOCUS_INDEX)
{
(new StaticIcon(this, 0, 0, iconFile, COLOR_THEME_PRIMARY2))->center(width(), height());
(new StaticIcon(this, 0, 0, iconFile, COLOR_THEME_PRIMARY2_INDEX))->center(width(), height());
}
UsbSDConnected::UsbSDConnected() :
@@ -561,8 +556,8 @@ UsbSDConnected::UsbSDConnected() :
setWindowFlag(OPAQUE);
etx_solid_bg(lvobj, COLOR_THEME_PRIMARY1_INDEX);
new HeaderDateTime(this, LCD_W - TopBar::HDR_DATE_XO, HDR_DATE_Y);
new HeaderDateTime(this, LCD_W - TopBar::HDR_DATE_XO, PAD_MEDIUM);
auto icon = new StaticIcon(this, 0, 0, ICON_USB_PLUGGED, COLOR_THEME_PRIMARY2);
auto icon = new StaticIcon(this, 0, 0, ICON_USB_PLUGGED, COLOR_THEME_PRIMARY2_INDEX);
lv_obj_center(icon->getLvObj());
}
+1 -3
View File
@@ -172,7 +172,7 @@ class HeaderDateTime : public Window
protected:
lv_obj_t *date = nullptr;
lv_obj_t *time = nullptr;
int8_t lastMinute = -1;
struct gtm lastTime = { 0 };
void checkEvents() override;
};
@@ -188,6 +188,4 @@ class UsbSDConnected : public Window
{
public:
UsbSDConnected();
static LAYOUT_VAL(HDR_DATE_Y, 6, 6)
};
+1 -1
View File
@@ -43,7 +43,7 @@ AboutUs::AboutUs() :
{
new StaticText(form, {0, 0, LV_PCT(100), LV_SIZE_CONTENT},
about_str + "\n" + copyright_str,
COLOR_THEME_SECONDARY1 | CENTERED);
COLOR_THEME_SECONDARY1_INDEX, CENTERED);
auto qrBox = new Window(form, {0, 0, LV_PCT(100), QR_SZ});
auto qr = new QRCode(qrBox, 0, 0, QR_SZ, edgetx_url);
+2 -2
View File
@@ -49,7 +49,7 @@ class ChannelsViewFooter : public Window
w->setWindowFlag(NO_FOCUS);
etx_solid_bg(w->getLvObj(), COLOR_THEME_ACTIVE_INDEX);
new StaticText(this, {LEG_COLORBOX + PAD_MEDIUM + PAD_SMALL, PAD_TINY, LV_SIZE_CONTENT, TXT_H}, STR_MONITOR_OUTPUT_DESC, COLOR_THEME_PRIMARY2 | LEFT);
new StaticText(this, {LEG_COLORBOX + PAD_MEDIUM + PAD_SMALL, PAD_TINY, LV_SIZE_CONTENT, TXT_H}, STR_MONITOR_OUTPUT_DESC, COLOR_THEME_PRIMARY2_INDEX);
int x = getTextWidth(STR_MONITOR_OUTPUT_DESC) + LEG_COLORBOX + PAD_MEDIUM * 2;
@@ -61,7 +61,7 @@ class ChannelsViewFooter : public Window
etx_solid_bg(w->getLvObj(), COLOR_THEME_FOCUS_INDEX);
new StaticText(this, {x + LEG_COLORBOX + PAD_MEDIUM + PAD_SMALL, PAD_TINY, LV_SIZE_CONTENT, TXT_H},
STR_MONITOR_MIXER_DESC, COLOR_THEME_PRIMARY2);
STR_MONITOR_MIXER_DESC, COLOR_THEME_PRIMARY2_INDEX);
}
static LAYOUT_VAL(LEG_COLORBOX, 14, 14)
+34 -45
View File
@@ -20,7 +20,6 @@
*/
#include "view_main_decoration.h"
#include "layout.h"
// because of IS_POT_MULTIPOS() and pal
#include "opentx.h"
@@ -29,12 +28,29 @@
#include "layouts/sliders.h"
#include "layouts/trims.h"
#include "board.h"
#include "hal/adc_driver.h"
#include "themes/etx_lv_theme.h"
static Window* create_layout_box(Window* parent, lv_align_t align,
lv_flex_flow_t flow)
ViewMainDecoration::ViewMainDecoration(Window* parent, bool showTrims, bool showSliders, bool showFM) :
parent(parent)
{
w_ml = layoutBox(parent, LV_ALIGN_LEFT_MID, LV_FLEX_FLOW_ROW_REVERSE);
w_mr = layoutBox(parent, LV_ALIGN_RIGHT_MID, LV_FLEX_FLOW_ROW);
w_bl = layoutBox(parent, LV_ALIGN_BOTTOM_LEFT, LV_FLEX_FLOW_COLUMN);
w_br = layoutBox(parent, LV_ALIGN_BOTTOM_RIGHT, LV_FLEX_FLOW_COLUMN);
w_bc = layoutBox(parent, LV_ALIGN_BOTTOM_MID, LV_FLEX_FLOW_COLUMN);
lv_obj_set_flex_align(w_bc->getLvObj(), LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_SPACE_AROUND);
if (showTrims)
createTrims(w_ml, w_mr, w_bl, w_br);
if (showFM)
createFlightMode(w_bc);
if (showSliders)
createSliders(w_ml, w_mr, w_bl, w_bc, w_br);
}
Window* ViewMainDecoration::layoutBox(Window* parent, lv_align_t align,
lv_flex_flow_t flow)
{
auto w = new Window(parent, rect_t{0, 0, LV_SIZE_CONTENT, LV_SIZE_CONTENT});
@@ -50,26 +66,6 @@ static Window* create_layout_box(Window* parent, lv_align_t align,
return w;
}
ViewMainDecoration::ViewMainDecoration(Window* parent) :
parent(parent)
{
memset(sliders, 0, sizeof(sliders));
memset(trims, 0, sizeof(trims));
flightMode = nullptr;
w_ml = create_layout_box(parent, LV_ALIGN_LEFT_MID, LV_FLEX_FLOW_ROW_REVERSE);
w_mr = create_layout_box(parent, LV_ALIGN_RIGHT_MID, LV_FLEX_FLOW_ROW);
w_bl = create_layout_box(parent, LV_ALIGN_BOTTOM_LEFT, LV_FLEX_FLOW_COLUMN);
w_br = create_layout_box(parent, LV_ALIGN_BOTTOM_RIGHT, LV_FLEX_FLOW_COLUMN);
w_bc = create_layout_box(parent, LV_ALIGN_BOTTOM_MID, LV_FLEX_FLOW_COLUMN);
lv_obj_set_flex_align(w_bc->getLvObj(), LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_SPACE_AROUND);
createTrims(w_ml, w_mr, w_bl, w_br);
createFlightMode(w_bc);
createSliders(w_ml, w_mr, w_bl, w_bc, w_br);
}
void ViewMainDecoration::setSlidersVisible(bool visible)
{
for (int i=0; i < SLIDERS_MAX; i++) {
@@ -106,8 +102,7 @@ rect_t ViewMainDecoration::getMainZone() const
Window* boxes[] = { w_bl, w_bc, w_br };
for ( auto box : boxes ) {
auto obj = box->getLvObj();
auto y = lv_obj_get_y(obj);
auto y = lv_obj_get_y(box->getLvObj());
if (y < bottom) bottom = y;
}
@@ -116,12 +111,11 @@ rect_t ViewMainDecoration::getMainZone() const
void ViewMainDecoration::createSliders(Window* ml, Window* mr, Window* bl, Window* bc, Window* br)
{
int pot = 0, sl = 0;
int pot = 0;
// Bottom left horizontal slider
if (IS_POT_AVAILABLE(pot)) {
sliders[sl] = new MainViewHorizontalSlider(bl, pot);
sl += 1;
sliders[pot] = new MainViewHorizontalSlider(bl, pot);
}
pot += 1;
@@ -129,8 +123,8 @@ void ViewMainDecoration::createSliders(Window* ml, Window* mr, Window* bl, Windo
if (IS_POT_AVAILABLE(pot)) {
if (IS_POT_MULTIPOS(pot)) {
// Has 6POS - place bottom center
sliders[sl] = new MainView6POS(bc, pot);
pot += 1; sl += 1;
sliders[pot] = new MainView6POS(bc, pot);
pot += 1;
}
} else {
pot += 1;
@@ -138,8 +132,7 @@ void ViewMainDecoration::createSliders(Window* ml, Window* mr, Window* bl, Windo
// Bottom right horizontal slider
if (IS_POT_AVAILABLE(pot)) {
sliders[sl] = new MainViewHorizontalSlider(br, pot);
sl += 1;
sliders[pot] = new MainViewHorizontalSlider(br, pot);
}
pot += 1;
@@ -147,35 +140,32 @@ void ViewMainDecoration::createSliders(Window* ml, Window* mr, Window* bl, Windo
if (max_pots > pot) {
// create containers for the sliders, so that they are at the borders of the display
// on top of each other, when there are two sliders to display per side
auto leftPots = create_layout_box(ml, LV_ALIGN_LEFT_MID, LV_FLEX_FLOW_COLUMN);
auto leftPots = layoutBox(ml, LV_ALIGN_LEFT_MID, LV_FLEX_FLOW_COLUMN);
leftPots->setHeight(MainViewSlider::HORIZONTAL_SLIDERS_WIDTH);
auto rightPots = create_layout_box(mr, LV_ALIGN_RIGHT_MID, LV_FLEX_FLOW_COLUMN);
auto rightPots = layoutBox(mr, LV_ALIGN_RIGHT_MID, LV_FLEX_FLOW_COLUMN);
rightPots->setHeight(MainViewSlider::VERTICAL_SLIDERS_HEIGHT);
coord_t lsh = (IS_POT_AVAILABLE(pot + 2)) ? MainViewSlider::HORIZONTAL_SLIDERS_WIDTH / 2 : MainViewSlider::HORIZONTAL_SLIDERS_WIDTH;
coord_t rsh = (IS_POT_AVAILABLE(pot + 3)) ? MainViewSlider::HORIZONTAL_SLIDERS_WIDTH / 2 : MainViewSlider::HORIZONTAL_SLIDERS_WIDTH;
if (IS_POT_AVAILABLE(pot)) {
sliders[sl] = new MainViewVerticalSlider(leftPots, rect_t{0, 0, LayoutFactory::TRIM_SQUARE_SIZE, lsh}, pot);
sl += 1;
sliders[pot] = new MainViewVerticalSlider(leftPots, rect_t{0, 0, LayoutFactory::TRIM_SQUARE_SIZE, lsh}, pot);
}
pot += 1;
if (IS_POT_AVAILABLE(pot)) {
sliders[sl] = new MainViewVerticalSlider(rightPots, rect_t{0, 0, LayoutFactory::TRIM_SQUARE_SIZE, rsh}, pot);
sl += 1;
sliders[pot] = new MainViewVerticalSlider(rightPots, rect_t{0, 0, LayoutFactory::TRIM_SQUARE_SIZE, rsh}, pot);
}
pot += 1;
if (IS_POT_AVAILABLE(pot)) {
sliders[sl] = new MainViewVerticalSlider(leftPots, rect_t{0, 0, LayoutFactory::TRIM_SQUARE_SIZE, lsh}, pot);
sl += 1;
sliders[pot] = new MainViewVerticalSlider(leftPots, rect_t{0, 0, LayoutFactory::TRIM_SQUARE_SIZE, lsh}, pot);
}
pot += 1;
if (IS_POT_AVAILABLE(pot)) {
sliders[sl] = new MainViewVerticalSlider(rightPots, rect_t{0, 0, LayoutFactory::TRIM_SQUARE_SIZE, rsh}, pot);
sliders[pot] = new MainViewVerticalSlider(rightPots, rect_t{0, 0, LayoutFactory::TRIM_SQUARE_SIZE, rsh}, pot);
}
}
}
@@ -195,6 +185,5 @@ void ViewMainDecoration::createFlightMode(Window* bc)
return stringFromNtString(g_model.flightModeData[mixerCurrentFlightMode].name);
};
flightMode = new DynamicText(bc, rect_t{}, getFM, COLOR_THEME_SECONDARY1);
flightMode = new DynamicText(bc, rect_t{}, getFM, COLOR_THEME_SECONDARY1_INDEX);
}
@@ -23,14 +23,12 @@
#include "window.h"
constexpr coord_t FM_LABEL_HEIGHT = 20;
class MainViewTrim;
class ViewMainDecoration
{
public:
ViewMainDecoration(Window* parent);
ViewMainDecoration(Window* parent, bool showTrims = true, bool showSliders = true, bool showFM = true);
// Set decoration visibility
void setTrimsVisible(bool visible);
@@ -69,9 +67,11 @@ class ViewMainDecoration
Window* w_bc;
Window* w_br;
Window* sliders[SLIDERS_MAX];
MainViewTrim* trims[TRIMS_MAX];
Window* flightMode;
Window* sliders[SLIDERS_MAX] = { 0 };
MainViewTrim* trims[TRIMS_MAX] = { 0 };
Window* flightMode = nullptr;
Window* layoutBox(Window* parent, lv_align_t align, lv_flex_flow_t flow);
void createSliders(Window* ml, Window* mr, Window* bl, Window* bc, Window* br);
void createTrims(Window* ml, Window* mr, Window* bl, Window* br);
+12 -20
View File
@@ -96,7 +96,7 @@ class DebugInfoNumber : public Window
coord_t prefixSize = 0;
if (prefix != nullptr) {
prefixSize = getTextWidth(prefix, 0, FONT(XS));
new StaticText(this, {0, 1, prefixSize, rect.h}, prefix,FONT(XS));
new StaticText(this, {0, 1, prefixSize, rect.h}, prefix, COLOR_THEME_PRIMARY1_INDEX, FONT(XS));
}
new DynamicNumber<uint32_t>(this,
{prefixSize, 0, rect.w - prefixSize, rect.h},
@@ -179,15 +179,13 @@ void StatisticsViewPage::build(Window* window)
// Session data
new StaticText(line, rect_t{}, STR_SESSION);
new DynamicText(
line, rect_t{}, [] { return getTimerString(sessionTimer); },
COLOR_THEME_PRIMARY1);
line, rect_t{}, [] { return getTimerString(sessionTimer); });
// Battery data
new StaticText(line, rect_t{}, STR_BATT_LABEL);
new DynamicText(
line, rect_t{},
[] { return getTimerString(g_eeGeneral.globalTimer + sessionTimer); },
COLOR_THEME_PRIMARY1);
[] { return getTimerString(g_eeGeneral.globalTimer + sessionTimer); });
line = window->newLine(grid);
line->padAll(PAD_ZERO);
@@ -195,14 +193,12 @@ void StatisticsViewPage::build(Window* window)
// Throttle
new StaticText(line, rect_t{}, STR_THROTTLE_LABEL);
new DynamicText(
line, rect_t{}, [] { return getTimerString(s_timeCumThr); },
COLOR_THEME_PRIMARY1);
line, rect_t{}, [] { return getTimerString(s_timeCumThr); });
// Throttle % data
new StaticText(line, rect_t{}, STR_THROTTLE_PERCENT_LABEL);
new DynamicText(
line, rect_t{}, [] { return getTimerString(s_timeCum16ThrP / 16); },
COLOR_THEME_PRIMARY1);
line, rect_t{}, [] { return getTimerString(s_timeCum16ThrP / 16); });
line = window->newLine(grid);
line->padAll(PAD_ZERO);
@@ -210,14 +206,11 @@ void StatisticsViewPage::build(Window* window)
// Timers
new StaticText(line, rect_t{}, STR_TIMER_LABEL);
new DynamicText(
line, rect_t{}, [] { return getTimerString(timersStates[0].val); },
COLOR_THEME_PRIMARY1);
line, rect_t{}, [] { return getTimerString(timersStates[0].val); });
new DynamicText(
line, rect_t{}, [] { return getTimerString(timersStates[1].val); },
COLOR_THEME_PRIMARY1);
line, rect_t{}, [] { return getTimerString(timersStates[1].val); });
new DynamicText(
line, rect_t{}, [] { return getTimerString(timersStates[2].val); },
COLOR_THEME_PRIMARY1);
line, rect_t{}, [] { return getTimerString(timersStates[2].val); });
line = window->newLine(grid);
line->padAll(PAD_ZERO);
@@ -269,11 +262,11 @@ void DebugViewPage::build(Window* window)
new StaticText(line, rect_t{}, STR_TMIXMAXMS);
new DynamicNumber<uint16_t>(
line, rect_t{}, [] { return DURATION_MS_PREC2(maxMixerDuration); },
PREC2 | COLOR_THEME_PRIMARY1, nullptr, pad_STR_MS.c_str());
COLOR_THEME_PRIMARY1_INDEX, PREC2, nullptr, pad_STR_MS.c_str());
new DynamicNumber<uint16_t>(
line, rect_t{}, [] { return getMixerSchedulerPeriod() / 1000; },
COLOR_THEME_PRIMARY1, pad_STR_PERIOD.c_str(), pad_STR_MS.c_str());
COLOR_THEME_PRIMARY1_INDEX, 0, pad_STR_PERIOD.c_str(), pad_STR_MS.c_str());
line = window->newLine(grid);
line->padAll(PAD_TINY);
@@ -282,7 +275,7 @@ void DebugViewPage::build(Window* window)
static std::string pad_STR_BYTES = " " + std::string(STR_BYTES);
new StaticText(line, rect_t{}, STR_FREE_MEM_LABEL);
new DynamicNumber<int32_t>(
line, rect_t{}, [] { return availableMemory(); }, COLOR_THEME_PRIMARY1,
line, rect_t{}, [] { return availableMemory(); }, COLOR_THEME_PRIMARY1_INDEX, 0,
nullptr, pad_STR_BYTES.c_str());
#if defined(LUA)
@@ -380,8 +373,7 @@ void DebugViewPage::build(Window* window)
line, rect_t{0, 0, DBG_B_WIDTH, DBG_B_HEIGHT},
[] {
return std::string(gpsData.fix ? STR_GPS_FIX_YES : STR_GPS_FIX_NO);
},
COLOR_THEME_PRIMARY1);
});
new DebugInfoNumber<uint8_t>(
line, rect_t{0, 0, DBG_B_WIDTH, DBG_B_HEIGHT},
[] { return gpsData.numSat; }, STR_GPS_SATS);
+2 -2
View File
@@ -31,11 +31,11 @@ class GaugeWidget : public Widget
{
// Gauge label
sourceText = new StaticText(this, {0, 0, LV_SIZE_CONTENT, 16}, "",
FONT(XS) | COLOR_THEME_PRIMARY2);
COLOR_THEME_PRIMARY2_INDEX, FONT(XS));
valueText = new DynamicNumber<int16_t>(
this, {0, 0, lv_pct(100), 16}, [=]() { return getGuageValue(); },
FONT(XS) | CENTERED | COLOR_THEME_PRIMARY2, "", "%");
COLOR_THEME_PRIMARY2_INDEX, FONT(XS) | CENTERED, "", "%");
etx_obj_add_style(valueText->getLvObj(), styles->text_align_right,
LV_STATE_USER_1);
@@ -118,7 +118,6 @@ class ModelBitmapWidget : public Widget
protected:
bool isLarge = false;
// std::unique_ptr<BitmapBuffer> buffer;
uint32_t deps_hash = 0;
StaticText* label = nullptr;
StaticImage* image = nullptr;
@@ -44,24 +44,24 @@ class RadioInfoWidget : public TopBarWidget
{
// Logs
logsIcon = new StaticIcon(this, W_LOG_X, W_LOG_Y, ICON_DOT,
COLOR_THEME_PRIMARY2);
COLOR_THEME_PRIMARY2_INDEX);
logsIcon->hide();
usbIcon =
new StaticIcon(this, W_USB_X, W_USB_Y, ICON_TOPMENU_USB,
COLOR_THEME_PRIMARY2);
COLOR_THEME_PRIMARY2_INDEX);
usbIcon->hide();
#if defined(AUDIO)
audioScale = new StaticIcon(this, W_AUDIO_SCALE_X, 2,
ICON_TOPMENU_VOLUME_SCALE,
COLOR_THEME_PRIMARY3);
COLOR_THEME_PRIMARY3_INDEX);
for (int i = 0; i < 5; i += 1) {
audioVol[i] = new StaticIcon(
this, W_AUDIO_X, 2,
(EdgeTxIcon)(ICON_TOPMENU_VOLUME_0 + i),
COLOR_THEME_PRIMARY2);
COLOR_THEME_PRIMARY2_INDEX);
audioVol[i]->hide();
}
audioVol[0]->show();
@@ -69,18 +69,18 @@ class RadioInfoWidget : public TopBarWidget
batteryIcon = new StaticIcon(this, W_AUDIO_X, W_BATT_Y,
ICON_TOPMENU_TXBATT,
COLOR_THEME_PRIMARY2);
COLOR_THEME_PRIMARY2_INDEX);
#if defined(USB_CHARGER)
batteryChargeIcon = new StaticIcon(
this, W_BATT_CHG_X, W_BATT_CHG_Y,
ICON_TOPMENU_TXBATT_CHARGE, COLOR_THEME_PRIMARY2);
ICON_TOPMENU_TXBATT_CHARGE, COLOR_THEME_PRIMARY2_INDEX);
batteryChargeIcon->hide();
#endif
#if defined(INTERNAL_MODULE_PXX1) && defined(EXTERNAL_ANTENNA)
extAntenna = new StaticIcon(this, W_RSSI_X - 4, 1,
ICON_TOPMENU_ANTENNA,
COLOR_THEME_PRIMARY2);
COLOR_THEME_PRIMARY2_INDEX);
extAntenna->hide();
#endif
@@ -280,11 +280,11 @@ class InternalGPSWidget : public TopBarWidget
{
icon =
new StaticIcon(this, width() / 2 - 10, 19,
ICON_TOPMENU_GPS, COLOR_THEME_PRIMARY3);
ICON_TOPMENU_GPS, COLOR_THEME_PRIMARY3_INDEX);
numSats = new DynamicNumber<uint16_t>(
this, {0, 1, width(), 12}, [=] { return gpsData.numSat; },
COLOR_THEME_PRIMARY2 | CENTERED | FONT(XS));
COLOR_THEME_PRIMARY2_INDEX, CENTERED | FONT(XS));
}
void checkEvents() override
+2 -2
View File
@@ -43,8 +43,8 @@ class TimerWidget : public Widget
lv_style_set_width(&style, lv_pct(100));
lv_style_set_height(&style, LV_SIZE_CONTENT);
timerBg = new StaticIcon(this, 0, 0, ICON_TIMER_BG, COLOR_THEME_PRIMARY2);
timerIcon = new StaticIcon(this, 3, 4, ICON_TIMER, COLOR_THEME_SECONDARY1);
timerBg = new StaticIcon(this, 0, 0, ICON_TIMER_BG, COLOR_THEME_PRIMARY2_INDEX);
timerIcon = new StaticIcon(this, 3, 4, ICON_TIMER, COLOR_THEME_SECONDARY1_INDEX);
// Timer name
nameLabel = lv_label_create(lvobj);