refactor(color): UI layout logic to better handle different screen sizes and orientations (#6134)

This commit is contained in:
philmoz
2025-05-06 13:49:58 +10:00
committed by GitHub
parent 719324e46d
commit fa54a44f3d
422 changed files with 390029 additions and 394862 deletions
@@ -30,12 +30,12 @@ class ChannelBar : public Window
std::function<int16_t()> getValue, LcdColorIndex barColorIndex,
LcdColorIndex textColorIndex = COLOR_THEME_SECONDARY1_INDEX);
static LAYOUT_VAL(BAR_HEIGHT, 13, 13, 9)
static LAYOUT_VAL_SCALED(BAR_HEIGHT, 13)
static LAYOUT_VAL(VAL_W, 45, 45, LS(45))
static LAYOUT_VAL(VAL_H, 14, 14, LS(14))
static LAYOUT_VAL(VAL_XO, 5, 5, LS(5))
static LAYOUT_VAL(VAL_XT, -54, -54, LS(-54))
static LAYOUT_VAL_SCALED(VAL_W, 45)
static LAYOUT_VAL_SCALED(VAL_H, 14)
static LAYOUT_VAL_SCALED(VAL_XO, 5)
static LAYOUT_VAL_SCALED(VAL_XT, -54)
protected:
uint8_t channel = 0;
@@ -411,7 +411,7 @@ class ThemeColorType : public ColorType
if (c3 != c2) makeButton(hbox, c3);
}
static LAYOUT_VAL(BTN_W, 44, 44, LS(44))
static LAYOUT_VAL_SCALED(BTN_W, 44)
};
// Color editor that shows the system fixed colors as buttons
@@ -449,7 +449,7 @@ class FixedColorType : public ColorType
});
}
static LAYOUT_VAL(BTN_W, 44, 44, LS(44))
static LAYOUT_VAL_SCALED(BTN_W, 44)
};
/////////////////////////////////////////////////////////////////////////
@@ -48,11 +48,11 @@ class ColorEditor : public Window
void setColorEditorType(COLOR_EDITOR_TYPE colorType);
static LAYOUT_VAL(BAR_MARGIN, 5, 5, 4)
static LAYOUT_VAL(BAR_HEIGHT_OFFSET, 25, 25, 16)
static LAYOUT_VAL(LBL_YO, 9, 9, 5)
static LAYOUT_VAL(VAL_XO, 10, 10, 6)
static LAYOUT_VAL(CRSR_SZ, 10, 10, 8)
static LAYOUT_VAL_SCALED(BAR_MARGIN, 5)
static LAYOUT_VAL_SCALED(BAR_HEIGHT_OFFSET, 25)
static LAYOUT_VAL_SCALED(LBL_YO, 9)
static LAYOUT_VAL_SCALED(VAL_XO, 10)
static LAYOUT_VAL_SCALED_EVEN(CRSR_SZ, 10)
protected:
ColorType* _colorType = nullptr;
@@ -24,18 +24,14 @@
#include "color_list.h"
#include "etx_lv_theme.h"
#if !PORTRAIT_LCD
// Landscape
#if LANDSCAPE
static const lv_coord_t col_dsc[] = {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};
#else
// Portrait
static const lv_coord_t col_dsc[] = {LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST};
static const lv_coord_t row_dsc[] = {LV_GRID_CONTENT, LV_GRID_CONTENT,
LV_GRID_TEMPLATE_LAST};
#endif
class ColorEditorPopup : public BaseDialog
@@ -173,11 +169,16 @@ class ColorEditorPopup : public BaseDialog
});
}
static LAYOUT_VAL(CE_SZ, 186, 186, LS(186))
static LAYOUT_VAL2(COLOR_EDIT_WIDTH, LCD_W * 0.9, LCD_W * 0.9)
static LAYOUT_VAL2(COLOR_EDIT_HEIGHT, LCD_H * 0.9, LV_SIZE_CONTENT)
static LAYOUT_VAL(COLOR_PAD_WIDTH, 52, 52, LS(52))
static LAYOUT_VAL(BTN_W, 80, 80, LS(80))
static LAYOUT_VAL_SCALED(CE_SZ, 182)
#if NARROW_LAYOUT
static LAYOUT_ORIENTATION(COLOR_EDIT_WIDTH, LCD_W * 0.95, LCD_W * 0.7)
#else
static LAYOUT_ORIENTATION(COLOR_EDIT_WIDTH, LCD_W * 0.8, LCD_W * 0.7)
#endif
static LAYOUT_ORIENTATION(COLOR_EDIT_HEIGHT, LCD_H * 0.9, LV_SIZE_CONTENT)
static LAYOUT_VAL_SCALED(COLOR_PAD_WIDTH, 52)
static LAYOUT_VAL_SCALED(BTN_W, 80)
static LAYOUT_VAL_SCALED(BTN_PAD_TOP, 60)
};
ColorPicker::ColorPicker(Window* parent, const rect_t& rect,
+4 -4
View File
@@ -86,8 +86,8 @@ class Curve : public Window
void checkEvents() override;
static LAYOUT_VAL(POS_LBL_X, 10, 10, LS(10))
static LAYOUT_VAL(POS_LBL_Y, 10, 10, LS(10))
static LAYOUT_VAL(POS_LBL_H, 17, 17, LS(17))
static LAYOUT_VAL3(POS_PT_SZ, 9, 9, 7, 13)
static LAYOUT_VAL_SCALED(POS_LBL_X, 10)
static LAYOUT_VAL_SCALED(POS_LBL_Y, 10)
static LAYOUT_VAL_SCALED(POS_LBL_H, 17)
static LAYOUT_VAL_SCALED_ODD(POS_PT_SZ, 9)
};
+3 -3
View File
@@ -34,9 +34,9 @@ struct FMMatrix : public ButtonMatrix {
bool isActive(uint8_t btn_id);
void setTextAndState(uint8_t btn_id);
static LAYOUT_VAL(FM_BTN_W, 48, 48, LS(48))
static LAYOUT_VAL2(FM_COLS, 5, 3)
static LAYOUT_VAL2(FM_ROWS, 2, 3)
static LAYOUT_VAL_SCALED(FM_BTN_W, 48)
static LAYOUT_SIZE(FM_COLS, 5, 3)
static LAYOUT_SIZE(FM_ROWS, 2, 3)
};
extern template struct FMMatrix<ExpoData>;
@@ -43,7 +43,7 @@ class GVarNumberEdit : public Window
void setAccelFactor(int value) { num_field->setAccelFactor(value); }
void setDisplayHandler(std::function<std::string(int value)> function);
static LAYOUT_VAL(GV_BTN_W, 40, 40, LS(40))
static LAYOUT_VAL_SCALED(GV_BTN_W, 40)
protected:
Choice* gvar_field = nullptr;
@@ -45,7 +45,7 @@ class SourceNumberEdit : public Window
void update();
static LAYOUT_VAL(SRC_BTN_W, 38, 38, LS(38))
static LAYOUT_VAL_SCALED(SRC_BTN_W, 38)
protected:
Choice* source_field = nullptr;
@@ -134,7 +134,7 @@ class SourceChoiceMenuToolbar : public MenuToolbar
}
}
static LAYOUT_VAL2(FILTER_COLUMNS, 3, 2)
static LAYOUT_SIZE(FILTER_COLUMNS, 3, 2)
protected:
MenuToolbarButton* invertBtn = nullptr;
+3 -2
View File
@@ -29,13 +29,14 @@
#if !defined(BOOT)
extern const etxLz4Font lv_font_en_bold_XXL;
#define FONT_TABLE(name) \
extern const etxLz4Font lv_font_##name##_bold_STD; \
extern const etxLz4Font lv_font_##name##_XXS; \
extern const etxLz4Font lv_font_##name##_XS; \
extern const etxLz4Font lv_font_##name##_L; \
extern const etxLz4Font lv_font_##name##_bold_XL; \
extern const etxLz4Font lv_font_##name##_bold_XXL; \
static const etxLz4Font* lz4FontTable[FONTS_COUNT] = { \
nullptr, /* FONT_STD_INDEX */ \
&lv_font_##name##_bold_STD, /* FONT_BOLD_INDEX */ \
@@ -43,7 +44,7 @@
&lv_font_##name##_XS, /* FONT_XS_INDEX */ \
&lv_font_##name##_L, /* FONT_L_INDEX */ \
&lv_font_##name##_bold_XL, /* FONT_XL_INDEX */ \
&lv_font_##name##_bold_XXL, /* FONT_XXL_INDEX */ \
&lv_font_en_bold_XXL, /* FONT_XXL_INDEX */ \
}; \
static const lv_font_t* lvglFontTable[FONTS_COUNT] = { \
LV_FONT_DEFAULT, /* FONT_STD_INDEX */ \
+1 -1
View File
@@ -52,7 +52,7 @@ class ChoiceBase : public FormField
const char* getTitle() const { return menuTitle; }
static LAYOUT_VAL(ICON_W, 18, 18, LS(18))
static LAYOUT_VAL_SCALED(ICON_W, 18)
protected:
lv_obj_t *label;
+70 -89
View File
@@ -33,107 +33,88 @@
* Layout
*********************/
#if LANDSCAPE_LCD_SML
enum PaddingSize {
PAD_ZERO = 0,
PAD_TINY = 1,
PAD_SMALL = 3,
PAD_MEDIUM = 4,
PAD_LARGE = 6,
PAD_SCROLL = 2,
PAD_THREE = PAD_SCROLL,
PAD_TABLE_V = 3,
PAD_TABLE_H = 2,
PAD_OUTLINE = 1,
PAD_BORDER = 2,
};
#elif LANDSCAPE_LCD_LRG
enum PaddingSize {
PAD_ZERO = 0,
PAD_TINY = 3,
PAD_SMALL = 6,
PAD_MEDIUM = 9,
PAD_LARGE = 12,
PAD_SCROLL = 4,
PAD_THREE = PAD_SCROLL,
PAD_TABLE_V = 10,
PAD_TABLE_H = 6,
PAD_OUTLINE = 2,
PAD_BORDER = 2,
};
#if LCD_W > LCD_H
#define LANDSCAPE true
#define PORTRAIT false
#else
enum PaddingSize {
PAD_ZERO = 0,
PAD_TINY = 2,
PAD_SMALL = 4,
PAD_MEDIUM = 6,
PAD_LARGE = 8,
PAD_SCROLL = 3,
PAD_THREE = PAD_SCROLL,
PAD_TABLE_V = 7,
PAD_TABLE_H = 4,
PAD_OUTLINE = 2,
PAD_BORDER = 2,
};
#define LANDSCAPE false
#define PORTRAIT true
#endif
#if !defined(LANDSCAPE_LCD_STD)
# error "LANDSCAPE_LCD_STD must be defined"
#if PORTRAIT || LCD_W == 320
#define NARROW_LAYOUT true
#else
#define NARROW_LAYOUT false
#endif
#if !defined(LANDSCAPE_LCD_SML)
# error "LANDSCAPE_LCD_SML must be defined"
#if LANDSCAPE
#if LCD_W == 320
#define LAYOUT_SCALE(x) (((x) * 4 + 3) / 5)
#elif LCD_W == 800
#define LAYOUT_SCALE(x) (((x) * 3 + 1) / 2)
#endif
#endif
#if !defined(LANDSCAPE_LCD_LRG)
# error "LANDSCAPE_LCD_LRG must be defined"
#endif
#if !defined(PORTRAIT_LCD)
# error "PORTRAIT_LCD must be defined"
#if !defined(LAYOUT_SCALE)
#define LAYOUT_SCALE(x) (x)
#endif
// Macros for setting up layout values
// LS - scaling factor to convert 480 wide landscape to 320 wide landscape
// LAYOUT_VAL - 3 values - landscape, portrait, landscape small
// - 800x480 size is calculated
#define LS(val) ((val * 4 + 3) / 6)
#if LANDSCAPE_LCD_STD
#define LAYOUT_VAL(name, landscape, portrait, landscape_small) \
constexpr coord_t name = landscape;
#elif LANDSCAPE_LCD_SML
#define LAYOUT_VAL(name, landscape, portrait, landscape_small) \
constexpr coord_t name = landscape_small;
#elif LANDSCAPE_LCD_LRG
#define LAYOUT_VAL(name, landscape, portrait, landscape_small) \
constexpr coord_t name = (((landscape) * 3 + 1) / 2);
#if NARROW_LAYOUT
#define LV(standard, narrow) LAYOUT_SCALE(narrow)
#else
#define LAYOUT_VAL(name, landscape, portrait, landscape_small) \
constexpr coord_t name = portrait;
#define LV(standard, narrow) LAYOUT_SCALE(standard)
#endif
// Macro for value which only differ by orientation
#if PORTRAIT_LCD
#define LAYOUT_VAL2(name, landscape, portrait) \
constexpr int name = portrait;
enum PaddingSize {
PAD_ZERO = 0,
PAD_TINY = LAYOUT_SCALE(2),
PAD_SMALL = LAYOUT_SCALE(4),
PAD_MEDIUM = LAYOUT_SCALE(6),
PAD_LARGE = LAYOUT_SCALE(8),
PAD_SCROLL = LAYOUT_SCALE(3),
PAD_THREE = PAD_SCROLL,
PAD_TABLE_V = LAYOUT_SCALE(7),
PAD_TABLE_H = PAD_SMALL,
PAD_OUTLINE = PAD_TINY,
PAD_BORDER = 2,
};
#define LAYOUT_VAL_SCALED(name, value) \
constexpr coord_t name = LAYOUT_SCALE(value);
#define LAYOUT_VAL_SCALED_EVEN(name, value) \
constexpr coord_t name = (LAYOUT_SCALE(value) + 1) & 0xFFFE;
#define LAYOUT_VAL_SCALED_ODD(name, value) \
constexpr coord_t name = (LAYOUT_SCALE(value) & 0xFFFE) + 1;
// Layout values based on available width (standard or narrow)
#define LAYOUT_SIZE_SCALED(name, standard, narrow) \
constexpr coord_t name = LV(standard, narrow);
#define LAYOUT_SIZE_SCALED_EVEN(name, standard, narrow) \
constexpr coord_t name = (LV(standard, narrow) + 1) & 0xFFFE;
#define LAYOUT_SIZE_SCALED_ODD(name, standard, narrow) \
constexpr coord_t name = (LV(standard, narrow) & 0xFFFE) + 1;
// Macro for value which only differ by whether layout is normal or narrow (no scaling)
#if NARROW_LAYOUT
#define LAYOUT_SIZE(name, standard, narrow) \
constexpr int name = narrow;
#else
#define LAYOUT_VAL2(name, landscape, portrait) \
constexpr int name = landscape;
#define LAYOUT_SIZE(name, standard, narrow) \
constexpr int name = standard;
#endif
// Macro for all values specified directly
#if LANDSCAPE_LCD_STD
#define LAYOUT_VAL3(name, landscape, portrait, landscape_small, landscape_big) \
constexpr coord_t name = landscape;
#elif LANDSCAPE_LCD_SML
#define LAYOUT_VAL3(name, landscape, portrait, landscape_small, landscape_big) \
constexpr coord_t name = landscape_small;
#elif LANDSCAPE_LCD_LRG
#define LAYOUT_VAL3(name, landscape, portrait, landscape_small, landscape_big) \
constexpr coord_t name = landscape_big;
// Layout values based on orientation (landscape or portrait)
#if LANDSCAPE
#define LAYOUT_ORIENTATION_SCALED(name, landscape, portrait) \
constexpr coord_t name = LAYOUT_SCALE(landscape);
#define LAYOUT_ORIENTATION(name, landscape, portrait) \
constexpr int name = landscape;
#else
#define LAYOUT_VAL3(name, landscape, portrait, landscape_small, landscape_big) \
constexpr coord_t name = portrait;
#define LAYOUT_ORIENTATION_SCALED(name, landscape, portrait) \
constexpr coord_t name = LAYOUT_SCALE(portrait);
#define LAYOUT_ORIENTATION(name, landscape, portrait) \
constexpr int name = portrait;
#endif
/**********************
@@ -279,11 +260,11 @@ class EdgeTxStyles
void init();
void applyColors();
static LAYOUT_VAL(STD_FONT_HEIGHT, 21, 21, 14)
static LAYOUT_VAL(UI_ELEMENT_HEIGHT, 32, 32, 24)
static LAYOUT_VAL(MENU_HEADER_HEIGHT, 45, 45, LS(45))
static LAYOUT_VAL(EDIT_FLD_WIDTH_NARROW, 70, 70, LS(70))
static LAYOUT_VAL(EDIT_FLD_WIDTH, 100, 100, LS(100))
static LAYOUT_VAL_SCALED(STD_FONT_HEIGHT, 21)
static LAYOUT_VAL_SCALED(UI_ELEMENT_HEIGHT, 32)
static LAYOUT_VAL_SCALED(MENU_HEADER_HEIGHT, 45)
static LAYOUT_VAL_SCALED(EDIT_FLD_WIDTH_NARROW, 70)
static LAYOUT_VAL_SCALED(EDIT_FLD_WIDTH, 100)
protected:
bool initDone = false;
+1 -1
View File
@@ -87,7 +87,7 @@ class FileChoiceMenuToolbar : public MenuToolbar
}
}
static LAYOUT_VAL2(FC_COLS, 3, 2)
static LAYOUT_SIZE(FC_COLS, 3, 2)
protected:
};
@@ -58,22 +58,22 @@ class FullScreenDialog : public Window
void closeDialog();
static LAYOUT_VAL(ALERT_FRAME_TOP, 50, 70, LS(50))
static LAYOUT_VAL(ALERT_FRAME_HO, 120, 2 * ALERT_FRAME_TOP, LS(120))
static LAYOUT_SIZE_SCALED(ALERT_FRAME_TOP, 50, 70)
static LAYOUT_SIZE(ALERT_FRAME_HO, LAYOUT_SCALE(120), 2 * ALERT_FRAME_TOP)
static constexpr coord_t ALERT_FRAME_HEIGHT = LCD_H - ALERT_FRAME_HO;
static LAYOUT_VAL(ALERT_BMO, 25, 15, LS(25))
static LAYOUT_SIZE_SCALED(ALERT_BMO, 25, 15)
static constexpr coord_t ALERT_BITMAP_TOP = ALERT_FRAME_TOP + ALERT_BMO;
static LAYOUT_VAL(ALERT_BITMAP_LEFT, 20, 15, LS(20))
static LAYOUT_VAL(ALERT_TO, 5, 10, LS(5))
static LAYOUT_SIZE_SCALED(ALERT_BITMAP_LEFT, 20, 15)
static LAYOUT_SIZE_SCALED(ALERT_TO, 5, 10)
static constexpr coord_t ALERT_TITLE_TOP = ALERT_FRAME_TOP + ALERT_TO;
static LAYOUT_VAL(ALERT_TITLE_LEFT, 146, 140, LS(146))
static LAYOUT_VAL(ALERT_MO, 85, 130, LS(85))
static LAYOUT_SIZE_SCALED(ALERT_TITLE_LEFT, 146, 140)
static LAYOUT_SIZE_SCALED(ALERT_MO, 85, 130)
static constexpr coord_t ALERT_MESSAGE_TOP = ALERT_TITLE_TOP + ALERT_MO;
static LAYOUT_VAL2(ALERT_MESSAGE_LEFT, ALERT_TITLE_LEFT, 15)
static LAYOUT_VAL(ONEBTN_W, 280, 280, LS(280))
static LAYOUT_VAL(ONEBTN_H, 40, 40, LS(40))
static LAYOUT_VAL(TWOBTN_W, 100, 100, LS(100))
static LAYOUT_VAL(TWOBTN_H, 40, 40, LS(40))
static LAYOUT_SIZE_SCALED(ALERT_MESSAGE_LEFT, 146, 15)
static LAYOUT_VAL_SCALED(ONEBTN_W, 280)
static LAYOUT_VAL_SCALED(ONEBTN_H, 40)
static LAYOUT_VAL_SCALED(TWOBTN_W, 100)
static LAYOUT_VAL_SCALED(TWOBTN_H, 40)
protected:
uint8_t type;
@@ -134,7 +134,7 @@ void InputMixButtonBase::setFlightModes(uint16_t modes)
free(fm_buffer);
fm_canvas = nullptr;
fm_buffer = nullptr;
#if PORTRAIT_LCD
#if NARROW_LAYOUT
setHeight(ListLineButton::BTN_H);
#endif
return;
@@ -146,7 +146,7 @@ void InputMixButtonBase::setFlightModes(uint16_t modes)
lv_canvas_set_buffer(fm_canvas, fm_buffer, FM_CANVAS_WIDTH,
FM_CANVAS_HEIGHT, LV_IMG_CF_ALPHA_8BIT);
lv_obj_set_pos(fm_canvas, FM_X, FM_Y);
#if PORTRAIT_LCD
#if NARROW_LAYOUT
setHeight(ListLineButton::BTN_H + FM_CANVAS_HEIGHT + 2);
#endif
+10 -10
View File
@@ -61,26 +61,26 @@ class InputMixButtonBase : public ListLineButton
virtual void swapLvglGroup(InputMixButtonBase* line2) = 0;
// total: 90 x 17
static LAYOUT_VAL(FM_CANVAS_HEIGHT, 17, 17, LS(17))
static LAYOUT_VAL(FM_CANVAS_WIDTH, 90, 90, 57)
static LAYOUT_VAL_SCALED(FM_CANVAS_HEIGHT, 17)
static LAYOUT_VAL_SCALED(FM_CANVAS_WIDTH, 90)
static LAYOUT_VAL(LN_X, 73, 73, LS(73))
static LAYOUT_VAL_SCALED(LN_X, 73)
static constexpr coord_t BTN_W = ListLineButton::GRP_W - LN_X - PAD_BORDER * 2 - PAD_OUTLINE;
static constexpr coord_t WGT_X = PAD_TINY;
static constexpr coord_t WGT_Y = PAD_TINY;
static LAYOUT_VAL(WGT_W, 50, 50, LS(50))
static LAYOUT_VAL(WGT_H, 21, 21, LS(21))
static LAYOUT_VAL_SCALED(WGT_W, 50)
static LAYOUT_VAL_SCALED(WGT_H, 21)
static constexpr coord_t SRC_X = WGT_X + WGT_W + PAD_TINY;
static constexpr coord_t SRC_Y = WGT_Y;
static LAYOUT_VAL(SRC_W, 70, 69, LS(70))
static LAYOUT_SIZE_SCALED(SRC_W, 70, 69)
static constexpr coord_t SRC_H = WGT_H;
static constexpr coord_t OPT_X = SRC_X + SRC_W + PAD_TINY;
static constexpr coord_t OPT_Y = WGT_Y;
static LAYOUT_VAL2(OPT_W, BTN_W - PAD_BORDER * 2 - WGT_W - SRC_W - FM_CANVAS_WIDTH - PAD_TINY * 5, 99)
static LAYOUT_SIZE(OPT_W, BTN_W - PAD_BORDER * 2 - WGT_W - SRC_W - FM_CANVAS_WIDTH - PAD_TINY * 5, LAYOUT_SCALE(99))
static constexpr coord_t OPT_H = WGT_H;
static LAYOUT_VAL2(FM_X, BTN_W - PAD_BORDER * 2 - PAD_TINY - FM_CANVAS_WIDTH, 12)
static LAYOUT_VAL2(FM_Y, (WGT_Y + PAD_TINY), (WGT_Y + WGT_H + PAD_TINY))
static LAYOUT_VAL(FM_W, 8, 8, 5)
static LAYOUT_SIZE(FM_X, BTN_W - PAD_BORDER * 2 - PAD_TINY - FM_CANVAS_WIDTH, PAD_LARGE + PAD_SMALL)
static LAYOUT_SIZE(FM_Y, (WGT_Y + PAD_TINY), (WGT_Y + WGT_H + PAD_TINY))
static LAYOUT_VAL_SCALED(FM_W, 8)
protected:
+1 -1
View File
@@ -76,7 +76,7 @@ class ListBox : public TableField
std::string getName() const override { return "ListBox"; }
#endif
static LAYOUT_VAL(MENUS_LINE_HEIGHT, 35, 35, LS(35))
static LAYOUT_VAL_SCALED(MENUS_LINE_HEIGHT, 35)
protected:
static void event_cb(lv_event_t* e);
+7 -8
View File
@@ -145,7 +145,7 @@ class MenuBody : public TableField
#endif
}
void addLine(const uint8_t* icon_mask, const std::string& text,
void addLine(const MaskBitmap* icon_mask, const std::string& text,
std::function<void()> onPress, std::function<bool()> isChecked,
bool update = true)
{
@@ -153,10 +153,9 @@ class MenuBody : public TableField
if (icon_mask) {
canvas = lv_canvas_create(nullptr);
lv_coord_t w = *((uint16_t*)icon_mask);
lv_coord_t h = *(((uint16_t*)icon_mask) + 1);
void* buf = (void*)(icon_mask + 4);
lv_canvas_set_buffer(canvas, buf, w, h, LV_IMG_CF_ALPHA_8BIT);
lv_coord_t w = icon_mask->width;
lv_coord_t h = icon_mask->height;
lv_canvas_set_buffer(canvas, (void*)&icon_mask->data[0], w, h, LV_IMG_CF_ALPHA_8BIT);
}
auto l = new MenuLine(text, onPress, isChecked, canvas);
@@ -342,7 +341,7 @@ class MenuWindowContent : public Window
int selection() { return body->selection(); }
void setIndex(int index) { body->setIndex(index); }
void addLine(const uint8_t* icon_mask, const std::string& text,
void addLine(const MaskBitmap* icon_mask, const std::string& text,
std::function<void()> onPress, std::function<bool()> isChecked,
bool update = true)
{
@@ -393,7 +392,7 @@ void Menu::setTitle(std::string text)
updatePosition();
}
void Menu::addLine(const uint8_t* icon_mask, const std::string& text,
void Menu::addLine(const MaskBitmap* icon_mask, const std::string& text,
std::function<void()> onPress,
std::function<bool()> isChecked)
{
@@ -401,7 +400,7 @@ void Menu::addLine(const uint8_t* icon_mask, const std::string& text,
updatePosition();
}
void Menu::addLineBuffered(const uint8_t* icon_mask, const std::string& text,
void Menu::addLineBuffered(const MaskBitmap* icon_mask, const std::string& text,
std::function<void()> onPress,
std::function<bool()> isChecked)
{
+2 -2
View File
@@ -43,7 +43,7 @@ class Menu : public ModalWindow
void setTitle(std::string text);
void addLine(const uint8_t *icon_mask, const std::string &text,
void addLine(const MaskBitmap *icon_mask, const std::string &text,
std::function<void()> onPress,
std::function<bool()> isChecked = nullptr);
@@ -53,7 +53,7 @@ class Menu : public ModalWindow
addLine(nullptr, text, onPress, isChecked);
}
void addLineBuffered(const uint8_t *icon_mask, const std::string &text,
void addLineBuffered(const MaskBitmap *icon_mask, const std::string &text,
std::function<void()> onPress,
std::function<bool()> isChecked = nullptr);
+1 -1
View File
@@ -62,7 +62,7 @@ MenuToolbarButton::MenuToolbarButton(Window* parent, const rect_t& rect,
}
MenuToolbar::MenuToolbar(Choice* choice, Menu* menu, const int columns) :
Window(menu, {0, 0, 0, MENUS_MAX_HEIGHT}),
Window(menu, {0, 0, 0, 0}),
choice(choice),
menu(menu),
filterColumns(columns),
+1 -2
View File
@@ -45,8 +45,7 @@ class MenuToolbar : public Window
virtual void longPress() {}
static LAYOUT_VAL(MENUS_TOOLBAR_BUTTON_WIDTH, 36, 36, LS(36))
static LAYOUT_VAL3(MENUS_MAX_HEIGHT, ListBox::MENUS_LINE_HEIGHT * 7 + PAD_LARGE, ListBox::MENUS_LINE_HEIGHT * 10, ListBox::MENUS_LINE_HEIGHT * 8 + PAD_LARGE, ListBox::MENUS_LINE_HEIGHT * 8 + PAD_LARGE)
static LAYOUT_VAL_SCALED(MENUS_TOOLBAR_BUTTON_WIDTH, 36)
protected:
Choice* choice;
+3 -3
View File
@@ -36,8 +36,8 @@ class PageHeader : public Window
void setTitle(std::string txt) { title->setText(std::move(txt)); }
StaticText* setTitle2(std::string txt);
static LAYOUT_VAL(PAGE_TITLE_LEFT, 50, 50, LS(50))
static constexpr coord_t PAGE_TITLE_TOP = 2;
static LAYOUT_VAL_SCALED(PAGE_TITLE_LEFT, 50)
static constexpr coord_t PAGE_TITLE_TOP = PAD_TINY;
protected:
StaticText* title;
@@ -80,7 +80,7 @@ class SubPage : public Page
Window* setupLine(const char* title, std::function<void(Window*, coord_t, coord_t)> createEdit, coord_t lblYOffset = 0);
static LAYOUT_VAL(EDT_X, 220, 144, LS(220))
static constexpr coord_t EDT_X = LCD_W * 9 / 20;
protected:
coord_t y = 0;
+8 -8
View File
@@ -63,8 +63,8 @@ class SelectedTabIcon : public StaticIcon
std::string getName() const override { return "SelectedTabIcon"; }
#endif
static LAYOUT_VAL(SEL_DOT_X, 10, 10, 6)
static LAYOUT_VAL(SEL_DOT_Y, 39, 39, LS(39))
static LAYOUT_VAL_SCALED(SEL_DOT_X, 10)
static LAYOUT_VAL_SCALED(SEL_DOT_Y, 39)
};
class TabsGroupButton : public ButtonBase
@@ -101,7 +101,7 @@ class TabsGroupButton : public ButtonBase
pageTab->update(index);
}
static LAYOUT_VAL(ICON_Y, 7, 7, LS(7))
static LAYOUT_VAL_SCALED(ICON_Y, 7)
protected:
PageTab* pageTab;
@@ -147,8 +147,8 @@ class TabsGroupHeader : public Window
setTitle("");
carousel = new Window(this,
{TopBar::MENU_HEADER_BUTTONS_LEFT, 0,
LCD_W - HDR_DATE_FULL_WIDTH - TopBar::MENU_HEADER_BUTTONS_LEFT, EdgeTxStyles::MENU_HEADER_HEIGHT + 10});
{MENU_HEADER_BUTTONS_LEFT, 0,
LCD_W - HDR_DATE_FULL_WIDTH - MENU_HEADER_BUTTONS_LEFT, EdgeTxStyles::MENU_HEADER_HEIGHT + 10});
carousel->padAll(PAD_ZERO);
carousel->setWindowFlag(NO_FOCUS);
@@ -227,9 +227,9 @@ class TabsGroupHeader : public Window
bool isCurrent(uint8_t idx) const { return currentIndex == idx; }
uint8_t tabCount() const { return buttons.size(); }
static LAYOUT_VAL(DATE_XO, 48, 48, LS(48))
static LAYOUT_VAL(MENU_HEADER_BUTTON_WIDTH, 33, 33, LS(33))
static LAYOUT_VAL(HDR_DATE_FULL_WIDTH, 51, 51, LS(51))
static LAYOUT_VAL_SCALED(DATE_XO, 48)
static LAYOUT_VAL_SCALED(MENU_HEADER_BUTTON_WIDTH, 33)
static LAYOUT_VAL_SCALED(HDR_DATE_FULL_WIDTH, 51)
protected:
uint8_t currentIndex = 0;
+2 -2
View File
@@ -87,8 +87,8 @@ class TabsGroup : public NavWindow
void onClicked() override;
void onCancel() override;
static LAYOUT_VAL(MENU_TITLE_TOP, 48, 48, LS(48))
static LAYOUT_VAL(MENU_TITLE_HEIGHT, 21, 21, LS(21))
static LAYOUT_VAL_SCALED(MENU_TITLE_TOP, 48)
static constexpr coord_t MENU_TITLE_HEIGHT = EdgeTxStyles::STD_FONT_HEIGHT;
static constexpr coord_t MENU_BODY_TOP = MENU_TITLE_TOP + MENU_TITLE_HEIGHT;
static constexpr coord_t MENU_BODY_HEIGHT = LCD_H - MENU_BODY_TOP;
+1 -1
View File
@@ -48,7 +48,7 @@ class ToggleSwitch : public FormField
void update() const;
static LAYOUT_VAL(TOGGLE_W, 52, 52, 40)
static LAYOUT_VAL_SCALED(TOGGLE_W, 52)
protected:
std::function<uint8_t()> _getValue;
+5 -5
View File
@@ -347,7 +347,7 @@ class ViewChecklistWindow : public ViewTextWindow
lv_obj_set_layout(obj, LV_LAYOUT_FLEX);
lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_COLUMN);
lv_obj_set_style_pad_all(obj, 3, LV_PART_MAIN);
lv_obj_set_style_pad_all(obj, PAD_THREE, LV_PART_MAIN);
lv_obj_set_style_pad_row(obj, 0, LV_PART_MAIN);
auto g = lv_group_get_default();
@@ -368,18 +368,18 @@ class ViewChecklistWindow : public ViewTextWindow
lv_obj_set_flex_flow(row, LV_FLEX_FLOW_ROW);
lv_obj_set_width(row, lv_pct(100));
lv_obj_set_height(row, LV_SIZE_CONTENT);
lv_obj_set_style_pad_all(row, 3, 0);
lv_obj_set_style_pad_column(row, 6, 0);
lv_obj_set_style_pad_all(row, PAD_THREE, 0);
lv_obj_set_style_pad_column(row, PAD_MEDIUM, 0);
lv_obj_set_flex_align(row, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER,
LV_FLEX_ALIGN_SPACE_EVENLY);
lv_coord_t w = lv_obj_get_content_width(obj) - 6;
lv_coord_t w = lv_obj_get_content_width(obj) - PAD_MEDIUM;
if (buffer[cur] == '=') {
cur++;
w -= 46;
lv_obj_set_style_pad_left(row, 10, 0);
lv_obj_set_style_pad_left(row, PAD_LARGE + PAD_TINY, 0);
auto cb = checkbox_create(row);
+3 -6
View File
@@ -47,7 +47,7 @@ class LayoutFactory
const char* getId() const { return id; }
const char* getName() const { return name; }
virtual const uint8_t* getBitmap() const = 0;
virtual const MaskBitmap* getBitmap() const = 0;
virtual const ZoneOption* getLayoutOptions() const = 0;
@@ -77,11 +77,8 @@ class LayoutFactory
WidgetsContainer* createCustomScreen(unsigned customScreenIndex) const;
static LAYOUT_VAL(TRIM_LINE_WIDTH, 8, 8, LS(8))
static LAYOUT_VAL(TRIM_SQUARE_SIZE, 17, 17, 13)
static LAYOUT_VAL(BM_W, 51, 22, LS(51))
static LAYOUT_VAL(BM_H, 25, 34, LS(25))
static LAYOUT_ORIENTATION_SCALED(BM_W, 51, 22)
static LAYOUT_ORIENTATION_SCALED(BM_H, 25, 34)
protected:
const char* id;
@@ -69,10 +69,10 @@ rect_t Layout::getMainZone() const
rect_t zone = decoration->getMainZone();
if (hasSliders() || hasTrims() || hasFlightMode()) {
// some decoration activated
zone.x += MAIN_ZONE_BORDER;
zone.y += MAIN_ZONE_BORDER;
zone.w -= 2 * MAIN_ZONE_BORDER;
zone.h -= 2 * MAIN_ZONE_BORDER;
zone.x += PAD_LARGE;
zone.y += PAD_LARGE;
zone.w -= 2 * PAD_LARGE;
zone.h -= 2 * PAD_LARGE;
}
return ViewMain::instance()->getMainZone(zone, hasTopbar());
}
@@ -107,8 +107,6 @@ class Layout: public LayoutBase
void show(bool visible = true) override;
bool isLayout() override { return true; }
static LAYOUT_VAL(MAIN_ZONE_BORDER, 10, 10, 6)
protected:
const LayoutFactory * factory = nullptr;
@@ -137,13 +135,11 @@ class BaseLayoutFactory: public LayoutFactory
zoneCount(zoneCount),
zoneMap(zoneMap)
{
this->bitmap = (uint8_t*)malloc(align32(BM_W * BM_H + 2 * sizeof(uint16_t) + 4));
bitmap = (MaskBitmap*)malloc(align32(BM_W * BM_H + sizeof(MaskBitmap)));
bitmap->width = BM_W;
bitmap->height = BM_H;
uint16_t* hdr = (uint16_t*)this->bitmap;
hdr[0] = BM_W;
hdr[1] = BM_H;
uint8_t* bm = (uint8_t*)(this->bitmap + 2 * sizeof(uint16_t));
uint8_t* bm = (uint8_t*)bitmap->data;
memset(bm, 0, BM_W * BM_H);
memset(bm, 0xFF, BM_W);
@@ -178,7 +174,7 @@ class BaseLayoutFactory: public LayoutFactory
}
}
const uint8_t* getBitmap() const override { return bitmap; }
const MaskBitmap* getBitmap() const override { return bitmap; }
const ZoneOption * getLayoutOptions() const override
{
@@ -228,7 +224,7 @@ class BaseLayoutFactory: public LayoutFactory
}
protected:
const uint8_t * bitmap = nullptr;
MaskBitmap * bitmap = nullptr;
const ZoneOption * options;
uint8_t zoneCount;
uint8_t* zoneMap;
@@ -44,7 +44,7 @@ class LayoutChoice : public Button
LayoutChoice(Window* parent, LayoutFactoryGetter getValue,
LayoutFactorySetter setValue) :
Button(parent, {0, 0, LayoutFactory::BM_W + 12, LayoutFactory::BM_H + 12}),
Button(parent, {0, 0, LayoutFactory::BM_W + PAD_LARGE + PAD_SMALL, LayoutFactory::BM_H + PAD_LARGE + PAD_SMALL}),
getValue(std::move(getValue)),
_setValue(std::move(setValue))
{
@@ -86,13 +86,12 @@ class LayoutChoice : public Button
auto layout = getValue();
if (!layout) return;
const uint8_t* bitmap = layout->getBitmap();
const MaskBitmap* bitmap = layout->getBitmap();
if (!bitmap) return;
lv_coord_t w = *((uint16_t*)bitmap);
lv_coord_t h = *(((uint16_t*)bitmap) + 1);
void* buf = (void*)(bitmap + 4);
lv_canvas_set_buffer(canvas, buf, w, h, LV_IMG_CF_ALPHA_8BIT);
lv_coord_t w = bitmap->width;
lv_coord_t h = bitmap->height;
lv_canvas_set_buffer(canvas, (void*)&bitmap->data[0], w, h, LV_IMG_CF_ALPHA_8BIT);
}
void setValue(const LayoutFactory* layout)
@@ -117,7 +116,7 @@ void ScreenAddPage::update(uint8_t index)
void ScreenAddPage::build(Window* window)
{
new TextButton(window,
rect_t{LCD_W / 2 - 100, window->height() / 2 - 32, 200, 32},
rect_t{LCD_W / 2 - ADD_TXT_W / 2, window->height() / 2 - EdgeTxStyles::UI_ELEMENT_HEIGHT, ADD_TXT_W, EdgeTxStyles::UI_ELEMENT_HEIGHT},
STR_ADD_MAIN_VIEW, [this]() -> uint8_t {
// First page is "User interface", subtract it
auto newIdx = pageIndex - 1;
@@ -172,7 +171,7 @@ void ScreenAddPage::build(Window* window)
});
}
#if !PORTRAIT_LCD
#if LANDSCAPE
static const lv_coord_t line_col_dsc[] = {LV_GRID_FR(2), LV_GRID_FR(1),
LV_GRID_FR(2), LV_GRID_TEMPLATE_LAST};
#else
@@ -263,7 +262,7 @@ void ScreenSetupPage::build(Window* window)
Window* btn = new LayoutChoice(line, getFactory, setLayout);
#if PORTRAIT_LCD
#if PORTRAIT
line = window->newLine(grid);
grid.nextCell();
#endif
@@ -37,6 +37,8 @@ class ScreenAddPage : public PageTab
protected:
ScreenMenu* menu;
uint8_t pageIndex;
static LAYOUT_VAL_SCALED(ADD_TXT_W, 200)
};
class ScreenSetupPage : public PageTab
@@ -27,7 +27,7 @@
#include "topbar_impl.h"
#include "view_main.h"
#if !PORTRAIT_LCD // landscape
#if LANDSCAPE
// form grid
static const lv_coord_t line_col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(1),
@@ -39,7 +39,7 @@ static const lv_coord_t line_row_dsc[] = {LV_GRID_CONTENT,
static const lv_coord_t* theme_col_dsc = line_col_dsc;
static const lv_coord_t* theme_row_dsc = line_row_dsc;
#else // portrait
#else
// form grid
static const lv_coord_t line_col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(2),
@@ -123,7 +123,7 @@ class ThemeView : public Window
}
}
static LAYOUT_VAL2(PREVIEW_W, (LCD_W - PAD_MEDIUM * 3) / 2, LCD_W - 12)
static LAYOUT_SIZE(PREVIEW_W, (LCD_W - PAD_MEDIUM * 3) / 2, LCD_W - PAD_LARGE - PAD_SMALL)
protected:
Window* details = nullptr;
@@ -35,7 +35,7 @@ class ScreenUserInterfacePage : public PageTab
void build(Window* window) override;
static LAYOUT_VAL(WWBTN_W, 60, 60, LS(60))
static LAYOUT_VAL_SCALED(WWBTN_W, 60)
protected:
ScreenMenu* menu;
@@ -31,7 +31,7 @@ static void etx_quick_button_constructor(const lv_obj_class_t* class_p,
etx_obj_add_style(obj, styles->border_transparent, LV_PART_MAIN);
etx_obj_add_style(obj, styles->rounded, LV_PART_MAIN);
etx_txt_color(obj, COLOR_WHITE_INDEX, LV_PART_MAIN);
etx_obj_add_style(obj, styles->pad_medium, LV_PART_MAIN);
etx_obj_add_style(obj, styles->pad_zero, LV_PART_MAIN);
etx_obj_add_style(obj, styles->border, LV_PART_MAIN | LV_STATE_FOCUSED);
etx_obj_add_style(obj, styles->border_color[COLOR_WHITE_INDEX],
@@ -74,8 +74,8 @@ static const lv_obj_class_t etx_quick_icon_class = {
.destructor_cb = nullptr,
.user_data = nullptr,
.event_cb = nullptr,
.width_def = SelectFabCarousel::FAB_ICON_SIZE,
.height_def = SelectFabCarousel::FAB_ICON_SIZE,
.width_def = 0,
.height_def = 0,
.editable = LV_OBJ_CLASS_EDITABLE_FALSE,
.group_def = LV_OBJ_CLASS_GROUP_DEF_FALSE,
.instance_size = sizeof(lv_obj_t),
@@ -95,18 +95,22 @@ class SelectFabButton : public ButtonBase
{
padAll(PAD_ZERO);
auto newMask = getBuiltinIcon(icon);
coord_t fabIconSize = newMask->width + PAD_MEDIUM * 2;
auto iconLayout =
new Window(this,
{(SelectFabCarousel::FAB_BUTTON_INNER_WIDTH - SelectFabCarousel::FAB_ICON_SIZE) / 2,
(SelectFabCarousel::FAB_BUTTON_INNER_WIDTH - SelectFabCarousel::FAB_ICON_SIZE) / 2 - 2,
SelectFabCarousel::FAB_ICON_SIZE, SelectFabCarousel::FAB_ICON_SIZE},
{(SelectFabCarousel::FAB_BUTTON_INNER_WIDTH - fabIconSize) / 2,
(SelectFabCarousel::FAB_BUTTON_INNER_WIDTH - fabIconSize) / 2 - PAD_TINY,
fabIconSize, fabIconSize},
etx_quick_icon_create);
iconLayout->setWindowFlag(NO_FOCUS);
(new StaticIcon(iconLayout, 0, 0, icon, COLOR_WHITE_INDEX))
->center(SelectFabCarousel::FAB_ICON_SIZE - 4, SelectFabCarousel::FAB_ICON_SIZE - 4);
->center(fabIconSize - PAD_BORDER * 2, fabIconSize - PAD_BORDER * 2);
new StaticText(this, {0, SelectFabCarousel::FAB_BUTTON_HEIGHT - SelectFabCarousel::FAB_TXT_YO, SelectFabCarousel::FAB_BUTTON_INNER_WIDTH, 0},
new StaticText(this, {-PAD_BORDER, SelectFabCarousel::FAB_BUTTON_HEIGHT - SelectFabCarousel::FAB_TXT_YO,
SelectFabCarousel::FAB_BUTTON_WIDTH, 0},
title, COLOR_WHITE_INDEX, CENTERED);
}
@@ -37,10 +37,9 @@ class SelectFabCarousel : public Window
void addButton(EdgeTxIcon icon, const char* title,
std::function<uint8_t(void)> pressHandler);
static LAYOUT_VAL(FAB_BUTTON_WIDTH, 80, 80, 54)
static LAYOUT_VAL(FAB_BUTTON_HEIGHT, 114, 114, 78)
static LAYOUT_VAL_SCALED_EVEN(FAB_BUTTON_WIDTH, 76)
static LAYOUT_VAL_SCALED(FAB_BUTTON_HEIGHT, 114)
static LAYOUT_VAL(FAB_ICON_SIZE, 52, 52, 36)
static LAYOUT_VAL(FAB_TXT_YO, 48, 48, LS(48))
static constexpr coord_t FAB_BUTTON_INNER_WIDTH = FAB_BUTTON_WIDTH - PAD_MEDIUM;
static LAYOUT_VAL_SCALED(FAB_TXT_YO, 48)
static constexpr coord_t FAB_BUTTON_INNER_WIDTH = FAB_BUTTON_WIDTH - PAD_BORDER * 2;
};
+16 -16
View File
@@ -49,19 +49,19 @@ static const lv_style_const_prop_t shadow2_props[] = {
static LV_STYLE_CONST_MULTI_INIT(shadow2_style, shadow2_props);
SliderIcon::SliderIcon(Window* parent) :
Window(parent, rect_t{0, 0, MainViewSlider::SL_SZ + 2, MainViewSlider::SL_SZ + 2})
Window(parent, rect_t{0, 0, MainViewSlider::SLIDER_ICON_SIZE + 2, MainViewSlider::SLIDER_ICON_SIZE + 2})
{
setWindowFlag(NO_FOCUS);
auto shad = lv_obj_create(lvobj);
etx_obj_add_style(shad, shadow1_style, LV_PART_MAIN);
lv_obj_set_pos(shad, 1, 1);
lv_obj_set_size(shad, MainViewSlider::SL_SZ, MainViewSlider::SL_SZ);
lv_obj_set_size(shad, MainViewSlider::SLIDER_ICON_SIZE, MainViewSlider::SLIDER_ICON_SIZE);
fill = lv_obj_create(lvobj);
etx_obj_add_style(fill, shadow2_style, LV_PART_MAIN);
lv_obj_set_pos(fill, 0, 0);
lv_obj_set_size(fill, MainViewSlider::SL_SZ, MainViewSlider::SL_SZ);
lv_obj_set_size(fill, MainViewSlider::SLIDER_ICON_SIZE, MainViewSlider::SLIDER_ICON_SIZE);
etx_solid_bg(fill, COLOR_THEME_FOCUS_INDEX);
}
@@ -72,17 +72,17 @@ MainViewSlider::MainViewSlider(Window* parent, const rect_t& rect, uint8_t idx,
potIdx = adcGetInputOffset(ADC_INPUT_FLEX) + idx;
if (isVertical) {
int sliderTicksCount = (height() - LayoutFactory::TRIM_SQUARE_SIZE) / SLIDER_TICK_SPACING;
int sliderTicksCount = (height() - SLIDER_BAR_SIZE) / SLIDER_TICK_SPACING;
tickPoints = new lv_point_t[(sliderTicksCount + 1) * 2];
lv_coord_t y = LayoutFactory::TRIM_SQUARE_SIZE / 2;
lv_coord_t y = SLIDER_BAR_SIZE / 2;
for (uint8_t i = 0; i <= sliderTicksCount; i++) {
if (i == 0 || i == sliderTicksCount / 2 || i == sliderTicksCount) {
tickPoints[i * 2] = {PAD_TINY, y};
tickPoints[i * 2 + 1] = {SL_SZ, y};
tickPoints[i * 2 + 1] = {SLIDER_ICON_SIZE, y};
} else {
tickPoints[i * 2] = {PAD_TINY + 2, y};
tickPoints[i * 2 + 1] = {SL_SZ - 2, y};
tickPoints[i * 2 + 1] = {SLIDER_ICON_SIZE - 2, y};
}
auto line = lv_line_create(lvobj);
etx_obj_add_style(line, styles->div_line, LV_PART_MAIN);
@@ -90,17 +90,17 @@ MainViewSlider::MainViewSlider(Window* parent, const rect_t& rect, uint8_t idx,
y += SLIDER_TICK_SPACING;
}
} else {
int sliderTicksCount = (width() - LayoutFactory::TRIM_SQUARE_SIZE) / SLIDER_TICK_SPACING;
int sliderTicksCount = (width() - SLIDER_BAR_SIZE) / SLIDER_TICK_SPACING;
tickPoints = new lv_point_t[(sliderTicksCount + 1) * 2];
lv_coord_t x = LayoutFactory::TRIM_SQUARE_SIZE / 2;
lv_coord_t x = SLIDER_BAR_SIZE / 2;
for (uint8_t i = 0; i <= sliderTicksCount; i++) {
if (i == 0 || i == sliderTicksCount / 2 || i == sliderTicksCount) {
tickPoints[i * 2] = {x, PAD_TINY};
tickPoints[i * 2 + 1] = {x, SL_SZ};
tickPoints[i * 2 + 1] = {x, SLIDER_ICON_SIZE};
} else {
tickPoints[i * 2] = {x, PAD_TINY + 2};
tickPoints[i * 2 + 1] = {x, SL_SZ - 2};
tickPoints[i * 2 + 1] = {x, SLIDER_ICON_SIZE - 2};
}
auto line = lv_line_create(lvobj);
etx_obj_add_style(line, styles->div_line, LV_PART_MAIN);
@@ -126,10 +126,10 @@ void MainViewSlider::setPos()
{
coord_t x = 0, y = 0;
if (isVertical) {
y = divRoundClosest((height() - LayoutFactory::TRIM_SQUARE_SIZE) * (-value + RESX),
y = divRoundClosest((height() - SLIDER_BAR_SIZE) * (-value + RESX),
2 * RESX);
} else {
x = divRoundClosest((width() - LayoutFactory::TRIM_SQUARE_SIZE) * (value + RESX),
x = divRoundClosest((width() - SLIDER_BAR_SIZE) * (value + RESX),
2 * RESX);
}
lv_obj_set_pos(sliderIcon->getLvObj(), x, y);
@@ -149,7 +149,7 @@ void MainViewSlider::checkEvents()
MainViewHorizontalSlider::MainViewHorizontalSlider(Window* parent,
uint8_t idx) :
MainViewSlider(parent,
rect_t{0, 0, HORIZONTAL_SLIDERS_WIDTH, LayoutFactory::TRIM_SQUARE_SIZE},
rect_t{0, 0, HORIZONTAL_SLIDERS_WIDTH, SLIDER_BAR_SIZE},
idx, false)
{
}
@@ -162,10 +162,10 @@ MainViewVerticalSlider::MainViewVerticalSlider(Window* parent,
}
MainView6POS::MainView6POS(Window* parent, uint8_t idx) :
Window(parent, rect_t{0, 0, MULTIPOS_W, LayoutFactory::TRIM_SQUARE_SIZE}), idx(idx)
Window(parent, rect_t{0, 0, MULTIPOS_W, MainViewSlider::SLIDER_BAR_SIZE}), idx(idx)
{
char num[] = " ";
coord_t x = MULTIPOS_W_SPACING / 4 + LayoutFactory::TRIM_SQUARE_SIZE / 4;
coord_t x = MULTIPOS_W_SPACING / 4 + MainViewSlider::SLIDER_BAR_SIZE / 4;
for (uint8_t value = 0; value < XPOTS_MULTIPOS_COUNT; value++) {
num[0] = value + '1';
auto p = lv_label_create(lvobj);
+8 -8
View File
@@ -41,13 +41,13 @@ class MainViewSlider : public Window
#if defined(RADIO_PL18) || defined(RADIO_PL18EV)
static constexpr coord_t SLIDER_SIZE = 136; // to fit 3 across bottom row
#else
static LAYOUT_VAL(SLIDER_SIZE, 160, 120, 108)
static LAYOUT_SIZE_SCALED_EVEN(SLIDER_SIZE, 160, 120)
#endif
static LAYOUT_VAL(SLIDER_TICK_SPACING, 4, 4, LS(4))
static constexpr coord_t HORIZONTAL_SLIDERS_WIDTH = SLIDER_SIZE + LayoutFactory::TRIM_SQUARE_SIZE;
static constexpr coord_t VERTICAL_SLIDERS_HEIGHT = SLIDER_SIZE + LayoutFactory::TRIM_SQUARE_SIZE;
static LAYOUT_VAL(SL_SZ, 15, 15, 11)
static LAYOUT_VAL_SCALED_ODD(SLIDER_ICON_SIZE, 15)
static constexpr coord_t SLIDER_BAR_SIZE = SLIDER_ICON_SIZE + 2;
static LAYOUT_VAL_SCALED(SLIDER_TICK_SPACING, 4)
static constexpr coord_t HORIZONTAL_SLIDERS_WIDTH = SLIDER_SIZE + SLIDER_BAR_SIZE;
static constexpr coord_t VERTICAL_SLIDERS_HEIGHT = SLIDER_SIZE + SLIDER_BAR_SIZE;
protected:
uint8_t potIdx;
@@ -82,8 +82,8 @@ class MainView6POS : public Window
void checkEvents() override;
static LAYOUT_VAL(MULTIPOS_W_SPACING, 12, 12, LS(12))
static LAYOUT_VAL(MULTIPOS_SZ, 12, 12, LS(12))
static LAYOUT_VAL_SCALED(MULTIPOS_W_SPACING, 12)
static LAYOUT_VAL_SCALED(MULTIPOS_SZ, 12)
static constexpr coord_t MULTIPOS_W = (XPOTS_MULTIPOS_COUNT + 1) * MULTIPOS_W_SPACING;
protected:
@@ -59,11 +59,9 @@ class TopBar: public TopBarBase
void removeWidget(unsigned int index) override;
static LAYOUT_VAL3(TOPBAR_ZONE_WIDTH, 70, 70, 47, 118)
static constexpr coord_t TOPBAR_ZONE_HEIGHT = EdgeTxStyles::MENU_HEADER_HEIGHT - 2 * PAD_THREE;
static LAYOUT_VAL_SCALED(HDR_DATE_XO, 48)
static LAYOUT_VAL(HDR_DATE_XO, 48, 48, LS(48))
static LAYOUT_VAL(MENU_HEADER_BUTTONS_LEFT, 47, 47, LS(47))
static constexpr coord_t TOPBAR_ZONE_HEIGHT = EdgeTxStyles::MENU_HEADER_HEIGHT - 2 * PAD_THREE;
protected:
uint32_t lastRefresh = 0;
+31 -33
View File
@@ -31,35 +31,33 @@ class TrimIcon : public SliderIcon
public:
TrimIcon(Window* parent, bool isVertical) : SliderIcon(parent)
{
LAYOUT_VAL(BP_V1, 3, 3, 2)
LAYOUT_VAL3(BP_V2, 4, 4, 2, 7)
LAYOUT_VAL3(BP_V3, 10, 10, 8, 16)
LAYOUT_VAL(BP_V4, 12, 12, 9)
lv_coord_t x1 = MainViewSlider::SLIDER_ICON_SIZE / 5;
lv_coord_t x2 = MainViewSlider::SLIDER_ICON_SIZE - x1;
lv_coord_t y1 = (MainViewSlider::SLIDER_ICON_SIZE + 1) / 4;
lv_coord_t y2 = MainViewSlider::SLIDER_ICON_SIZE - 1 - y1;
lv_coord_t lw = MainViewSlider::SLIDER_ICON_SIZE > 15 ? 2 : 1;
if (lw > 1) y2 += 1;
if (isVertical) {
barPoints[0] = {BP_V1, BP_V2};
barPoints[1] = {BP_V4, BP_V2};
barPoints[2] = {BP_V1, BP_V3};
barPoints[3] = {BP_V4, BP_V3};
barPoints[0] = {x1, y1};
barPoints[1] = {x2, y1};
barPoints[2] = {x1, y2};
barPoints[3] = {x2, y2};
} else {
barPoints[0] = {BP_V3, BP_V1};
barPoints[1] = {BP_V3, BP_V4};
barPoints[2] = {BP_V2, BP_V1};
barPoints[3] = {BP_V2, BP_V4};
barPoints[0] = {y2, x1};
barPoints[1] = {y2, x2};
barPoints[2] = {y1, x1};
barPoints[3] = {y1, x2};
}
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);
#if LANDSCAPE_LCD_LRG
lv_obj_set_style_line_width(bar1, 2, LV_PART_MAIN);
#endif
lv_obj_set_style_line_width(bar1, lw, LV_PART_MAIN);
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);
#if LANDSCAPE_LCD_LRG
lv_obj_set_style_line_width(bar2, 2, LV_PART_MAIN);
#endif
lv_obj_set_style_line_width(bar2, lw, LV_PART_MAIN);
lv_line_set_points(bar2, &barPoints[2], 2);
etx_bg_color(fill, COLOR_THEME_ACTIVE_INDEX, LV_STATE_USER_1);
@@ -102,21 +100,21 @@ MainViewTrim::MainViewTrim(Window* parent, const rect_t& rect, uint8_t idx,
etx_solid_bg(trimBar, COLOR_THEME_SECONDARY1_INDEX);
etx_obj_add_style(trimBar, styles->rounded, LV_PART_MAIN);
if (isVertical) {
lv_obj_set_pos(trimBar, (LayoutFactory::TRIM_SQUARE_SIZE - LayoutFactory::TRIM_LINE_WIDTH) / 2,
LayoutFactory::TRIM_SQUARE_SIZE / 2);
lv_obj_set_size(trimBar, LayoutFactory::TRIM_LINE_WIDTH,
MainViewSlider::VERTICAL_SLIDERS_HEIGHT - LayoutFactory::TRIM_SQUARE_SIZE + 1);
lv_obj_set_pos(trimBar, (MainViewSlider::SLIDER_BAR_SIZE - TRIM_LINE_WIDTH) / 2,
MainViewSlider::SLIDER_BAR_SIZE / 2);
lv_obj_set_size(trimBar, TRIM_LINE_WIDTH,
MainViewSlider::VERTICAL_SLIDERS_HEIGHT - MainViewSlider::SLIDER_BAR_SIZE + 1);
} else {
lv_obj_set_pos(trimBar, LayoutFactory::TRIM_SQUARE_SIZE / 2,
(LayoutFactory::TRIM_SQUARE_SIZE - LayoutFactory::TRIM_LINE_WIDTH - 1) / 2);
lv_obj_set_size(trimBar, MainViewSlider::HORIZONTAL_SLIDERS_WIDTH - LayoutFactory::TRIM_SQUARE_SIZE + 1,
LayoutFactory::TRIM_LINE_WIDTH);
lv_obj_set_pos(trimBar, MainViewSlider::SLIDER_BAR_SIZE / 2,
(MainViewSlider::SLIDER_BAR_SIZE - TRIM_LINE_WIDTH - 1) / 2);
lv_obj_set_size(trimBar, MainViewSlider::HORIZONTAL_SLIDERS_WIDTH - MainViewSlider::SLIDER_BAR_SIZE + 1,
TRIM_LINE_WIDTH);
}
trimIcon = new TrimIcon(this, isVertical);
trimValue = new DynamicNumber<int16_t>(
this, {0, 0, LayoutFactory::TRIM_SQUARE_SIZE, 12},
this, {0, 0, MainViewSlider::SLIDER_BAR_SIZE, 12},
[=]() { return divRoundClosest(abs(value) * 100, trimMax); },
COLOR_THEME_PRIMARY2_INDEX, FONT(XXS) | CENTERED);
etx_solid_bg(trimValue->getLvObj(), COLOR_THEME_SECONDARY1_INDEX);
@@ -157,8 +155,8 @@ void MainViewTrim::setPos()
} else {
x = ((value < 0) ? MainViewSlider::HORIZONTAL_SLIDERS_WIDTH * 4 / 5
: MainViewSlider::HORIZONTAL_SLIDERS_WIDTH / 5) -
LayoutFactory::TRIM_SQUARE_SIZE / 2;
y = (LayoutFactory::TRIM_SQUARE_SIZE - 12) / 2;
MainViewSlider::SLIDER_BAR_SIZE / 2;
y = (MainViewSlider::SLIDER_BAR_SIZE - 12) / 2;
}
lv_obj_set_pos(trimValue->getLvObj(), x, y);
trimValue->show();
@@ -224,7 +222,7 @@ coord_t MainViewTrim::sx()
if (isVertical) return 0;
return divRoundClosest(
(MainViewSlider::HORIZONTAL_SLIDERS_WIDTH - LayoutFactory::TRIM_SQUARE_SIZE) * (value - trimMin),
(MainViewSlider::HORIZONTAL_SLIDERS_WIDTH - MainViewSlider::SLIDER_BAR_SIZE) * (value - trimMin),
trimMax - trimMin);
}
@@ -233,20 +231,20 @@ coord_t MainViewTrim::sy()
if (!isVertical) return 0;
return divRoundClosest(
(MainViewSlider::VERTICAL_SLIDERS_HEIGHT - LayoutFactory::TRIM_SQUARE_SIZE) * (trimMax - value),
(MainViewSlider::VERTICAL_SLIDERS_HEIGHT - MainViewSlider::SLIDER_BAR_SIZE) * (trimMax - value),
trimMax - trimMin);
}
MainViewHorizontalTrim::MainViewHorizontalTrim(Window* parent, uint8_t idx) :
MainViewTrim(parent,
rect_t{0, 0, MainViewSlider::HORIZONTAL_SLIDERS_WIDTH, LayoutFactory::TRIM_SQUARE_SIZE}, idx,
rect_t{0, 0, MainViewSlider::HORIZONTAL_SLIDERS_WIDTH, MainViewSlider::SLIDER_BAR_SIZE}, idx,
false)
{
}
MainViewVerticalTrim::MainViewVerticalTrim(Window* parent, uint8_t idx) :
MainViewTrim(parent,
rect_t{0, 0, LayoutFactory::TRIM_SQUARE_SIZE, MainViewSlider::VERTICAL_SLIDERS_HEIGHT}, idx,
rect_t{0, 0, MainViewSlider::SLIDER_BAR_SIZE, MainViewSlider::VERTICAL_SLIDERS_HEIGHT}, idx,
true)
{
}
+2
View File
@@ -54,6 +54,8 @@ class MainViewTrim : public Window
coord_t sx();
coord_t sy();
static LAYOUT_VAL_SCALED(TRIM_LINE_WIDTH, 8)
};
class MainViewHorizontalTrim : public MainViewTrim
@@ -39,7 +39,7 @@ const std::string copyright_str = "Copyright (C) " BUILD_YEAR " EdgeTX";
const std::string edgetx_url = "https://edgetx.org";
AboutUs::AboutUs() :
BaseDialog(STR_ABOUT_US, true, 220, LV_SIZE_CONTENT)
BaseDialog(STR_ABOUT_US, true, VIEW_W, LV_SIZE_CONTENT)
{
new StaticText(form, {0, 0, LV_PCT(100), LV_SIZE_CONTENT},
about_str + "\n" + copyright_str,
+2 -1
View File
@@ -26,5 +26,6 @@ class AboutUs : public BaseDialog
public:
AboutUs();
static LAYOUT_VAL(QR_SZ, 150, 150, LS(150))
static LAYOUT_VAL_SCALED(QR_SZ, 150)
static LAYOUT_VAL_SCALED(VIEW_W, 220)
};
@@ -64,8 +64,8 @@ class ChannelsViewFooter : public Window
STR_MONITOR_MIXER_DESC, COLOR_THEME_PRIMARY2_INDEX);
}
static LAYOUT_VAL(LEG_COLORBOX, 14, 14, LS(14))
static LAYOUT_VAL(TXT_H, 18, 18, LS(18))
static LAYOUT_VAL_SCALED(LEG_COLORBOX, 14)
static LAYOUT_VAL_SCALED(TXT_H, 18)
};
//-----------------------------------------------------------------------------
@@ -90,18 +90,18 @@ class ChannelsViewPage : public PageTab
// Channels bars
for (uint8_t chan = pageIndex * 8; chan < 8 + pageIndex * 8; chan++) {
#if PORTRAIT_LCD
#if PORTRAIT
coord_t width = window->width() - (hmargin * 2);
coord_t xPos = hmargin;
coord_t yPos = (chan % 8) *
((window->height() - 24) / 8);
((window->height() - PAD_LARGE* 3) / 8);
#else
coord_t width = window->width() / 2 - (hmargin * 2);
coord_t xPos = (chan % 8) >= 4 ? width + (hmargin * 2) : hmargin;
coord_t yPos = (chan % 4) *
((window->height() - 23) / 4);
((window->height() - (PAD_LARGE * 3 - 1)) / 4);
#endif
new ComboChannelBar(window, {xPos, yPos, width, 3 * ChannelBar::BAR_HEIGHT + 3},
new ComboChannelBar(window, {xPos, yPos, width, 3 * ChannelBar::BAR_HEIGHT + PAD_THREE},
chan);
}
@@ -25,19 +25,19 @@
#include "switches.h"
#include "etx_lv_theme.h"
#if PORTRAIT_LCD
#if PORTRAIT
// Footer grid
static const lv_coord_t f_col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(1),
LV_GRID_FR(1), LV_GRID_FR(1),
LV_GRID_TEMPLATE_LAST};
#else // Landscape
#else
// Footer grid
LAYOUT_VAL(LS_C1, 60, 60, LS(60))
LAYOUT_VAL(LS_C3, 112, 112, LS(112))
LAYOUT_VAL(LS_C5, 50, 50, LS(50))
LAYOUT_VAL_SCALED(LS_C1, 60)
LAYOUT_VAL_SCALED(LS_C3, 112)
LAYOUT_VAL_SCALED(LS_C5, 50)
static const lv_coord_t f_col_dsc[] = {
LS_C1, LV_GRID_FR(1), LS_C3, LV_GRID_FR(1), LS_C5, LS_C5, LV_GRID_TEMPLATE_LAST};
@@ -192,9 +192,9 @@ class LogicalSwitchDisplayFooter : public Window
refresh();
}
static LAYOUT_VAL2(V2_COL_CNT, 1, 2)
static LAYOUT_VAL2(ANDSW_ROW, 0, 1)
static LAYOUT_VAL2(ANDSW_COL, 3, 1)
static LAYOUT_ORIENTATION(V2_COL_CNT, 1, 2)
static LAYOUT_ORIENTATION(ANDSW_ROW, 0, 1)
static LAYOUT_ORIENTATION(ANDSW_COL, 3, 1)
protected:
unsigned lsIndex = 0;
@@ -251,11 +251,13 @@ void LogicalSwitchesViewPage::build(Window* window)
window,
{0, window->height() - FOOTER_HEIGHT, window->width(), FOOTER_HEIGHT});
int btnHeight = (window->height() - FOOTER_HEIGHT) / ((MAX_LOGICAL_SWITCHES + BTN_MATRIX_COL - 1) / BTN_MATRIX_COL) - PAD_TINY;
// LSW table
std::string lsString("L64");
for (uint8_t i = 0; i < MAX_LOGICAL_SWITCHES; i++) {
coord_t x = (i % BTN_MATRIX_COL) * (BTN_WIDTH + PAD_TINY) + xo;
coord_t y = (i / BTN_MATRIX_COL) * (BTN_HEIGHT + PAD_TINY) + yo;
coord_t y = (i / BTN_MATRIX_COL) * (btnHeight + PAD_TINY) + yo;
LogicalSwitchData* ls = lswAddress(i);
bool isActive = (ls->func != LS_FUNC_NONE);
@@ -264,7 +266,7 @@ void LogicalSwitchesViewPage::build(Window* window)
if (isActive) {
auto button = new LogicalSwitchDisplayButton(
window, {x, y, BTN_WIDTH, BTN_HEIGHT}, lsString, i);
window, {x, y, BTN_WIDTH, btnHeight}, lsString, i);
button->setFocusHandler([=](bool focus) {
if (focus) {
@@ -273,8 +275,10 @@ void LogicalSwitchesViewPage::build(Window* window)
return 0;
});
} else {
if (btnHeight > EdgeTxStyles::STD_FONT_HEIGHT)
y += (btnHeight - EdgeTxStyles::STD_FONT_HEIGHT) / 2;
auto lbl = lv_label_create(window->getLvObj());
lv_obj_set_size(lbl, BTN_WIDTH, BTN_HEIGHT);
lv_obj_set_size(lbl, BTN_WIDTH, btnHeight);
lv_obj_set_pos(lbl, x, y);
etx_obj_add_style(lbl, styles->text_align_center, LV_PART_MAIN);
etx_txt_color(lbl, COLOR_THEME_DISABLED_INDEX);
@@ -30,10 +30,9 @@ class LogicalSwitchesViewPage : public PageTab
public:
LogicalSwitchesViewPage();
static LAYOUT_VAL(FOOTER_HEIGHT, 20, 40, LS(20))
static LAYOUT_VAL(BTN_WIDTH, 57, 76, LS(57))
static LAYOUT_VAL(BTN_HEIGHT, 20, 21, 18)
static LAYOUT_VAL2(BTN_MATRIX_COL, 8, 4)
static LAYOUT_ORIENTATION_SCALED(FOOTER_HEIGHT, 20, 40)
static LAYOUT_ORIENTATION(BTN_MATRIX_COL, 8, 6)
static constexpr coord_t BTN_WIDTH = (LCD_W - PAD_OUTLINE * 2) / BTN_MATRIX_COL - PAD_OUTLINE;
protected:
void build(Window* window) override;
@@ -155,22 +155,22 @@ void ViewMainDecoration::createSliders(Window* ml, Window* mr, Window* bl, Windo
coord_t rsh = (IS_POT_AVAILABLE(pot + 3)) ? MainViewSlider::VERTICAL_SLIDERS_HEIGHT / 2 : MainViewSlider::VERTICAL_SLIDERS_HEIGHT;
if (IS_POT_AVAILABLE(pot)) {
sliders[pot] = new MainViewVerticalSlider(leftPots, rect_t{0, 0, LayoutFactory::TRIM_SQUARE_SIZE, lsh}, pot);
sliders[pot] = new MainViewVerticalSlider(leftPots, rect_t{0, 0, MainViewSlider::SLIDER_BAR_SIZE, lsh}, pot);
}
pot += 1;
if (IS_POT_AVAILABLE(pot)) {
sliders[pot] = new MainViewVerticalSlider(rightPots, rect_t{0, 0, LayoutFactory::TRIM_SQUARE_SIZE, rsh}, pot);
sliders[pot] = new MainViewVerticalSlider(rightPots, rect_t{0, 0, MainViewSlider::SLIDER_BAR_SIZE, rsh}, pot);
}
pot += 1;
if (IS_POT_AVAILABLE(pot)) {
sliders[pot] = new MainViewVerticalSlider(leftPots, rect_t{0, 0, LayoutFactory::TRIM_SQUARE_SIZE, lsh}, pot);
sliders[pot] = new MainViewVerticalSlider(leftPots, rect_t{0, 0, MainViewSlider::SLIDER_BAR_SIZE, lsh}, pot);
}
pot += 1;
if (IS_POT_AVAILABLE(pot)) {
sliders[pot] = new MainViewVerticalSlider(rightPots, rect_t{0, 0, LayoutFactory::TRIM_SQUARE_SIZE, rsh}, pot);
sliders[pot] = new MainViewVerticalSlider(rightPots, rect_t{0, 0, MainViewSlider::SLIDER_BAR_SIZE, rsh}, pot);
}
}
}
@@ -65,12 +65,12 @@ ViewMainMenu::ViewMainMenu(Window* parent, std::function<void()> closeHandler) :
// Save focus
Layer::push(this);
coord_t w = SelectFabCarousel::FAB_BUTTON_WIDTH * QM_COLS + PAD_LARGE * 2;
coord_t h = SelectFabCarousel::FAB_BUTTON_HEIGHT * QM_ROWS + PAD_LARGE * 2;
coord_t w = SelectFabCarousel::FAB_BUTTON_WIDTH * QM_COLS + PAD_SMALL * 2;
coord_t h = SelectFabCarousel::FAB_BUTTON_HEIGHT * QM_ROWS + PAD_SMALL * 2;
bool hasNotes = modelHasNotes();
#if !PORTRAIT_LCD
#if LANDSCAPE
if (hasNotes)
w += SelectFabCarousel::FAB_BUTTON_WIDTH;
#endif
@@ -78,7 +78,7 @@ ViewMainMenu::ViewMainMenu(Window* parent, std::function<void()> closeHandler) :
auto box =
new Window(this, {(LCD_W - w) / 2, (LCD_H - h) / 2, w, h},
etx_modal_dialog_create);
box->padAll(PAD_LARGE);
box->padAll(PAD_SMALL);
auto carousel = new SelectFabCarousel(box);
carousel->addButton(ICON_MODEL_SELECT, STR_MAIN_MENU_MANAGE_MODELS,
@@ -32,8 +32,8 @@ class ViewMainMenu : public Window
void onClicked() override;
void deleteLater(bool detach = true, bool trash = true) override;
static LAYOUT_VAL2(QM_COLS, 4, 3)
static LAYOUT_VAL2(QM_ROWS, 2, 3)
static LAYOUT_ORIENTATION(QM_COLS, 4, 3)
static LAYOUT_ORIENTATION(QM_ROWS, 2, 3)
protected:
std::function<void()> closeHandler = nullptr;
@@ -59,32 +59,26 @@ static const lv_coord_t col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(1),
LV_GRID_FR(1), LV_GRID_FR(1),
LV_GRID_TEMPLATE_LAST};
#if !PORTRAIT_LCD
#if LANDSCAPE
static const lv_coord_t dbg_4col_dsc[] = {LV_GRID_FR(2), LV_GRID_FR(3),
LV_GRID_FR(3), LV_GRID_FR(3),
LV_GRID_TEMPLATE_LAST};
#define DBG_COL_CNT 4
#else
static const lv_coord_t dbg_2col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(1),
LV_GRID_TEMPLATE_LAST};
static const lv_coord_t dbg_3col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(1),
LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST};
#define DBG_COL_CNT 3
#endif
static const lv_coord_t row_dsc[] = {LV_GRID_CONTENT, LV_GRID_TEMPLATE_LAST};
#if !PORTRAIT_LCD
#define CV_SCALE 3
#define DBG_B_WIDTH (LCD_W - 20) / 4
#else
#define CV_SCALE 4
#define DBG_B_WIDTH (LCD_W - 20) / 2
#endif
static LAYOUT_ORIENTATION(DBG_COL_CNT, 4, 3)
static LAYOUT_ORIENTATION(DBG_B_WIDTH, (LCD_W - 20) / 4, (LCD_W - 20) / 2)
static LAYOUT_VAL_SCALED(DBG_B_HEIGHT, 20)
static LAYOUT_ORIENTATION(CV_SCALE, 3, 4)
#define CV_WIDTH MAXTRACE
#define CV_HEIGHT (CV_SCALE * 32 + 5)
#define DBG_B_HEIGHT 20
#define CV_HEIGHT (CV_SCALE * EdgeTxStyles::UI_ELEMENT_HEIGHT + PAD_SMALL + 1)
static LAYOUT_VAL_SCALED(RST_BTN_H, 24)
template <class T>
class DebugInfoNumber : public Window
@@ -121,14 +115,14 @@ class ThrottleCurveWindow : public Window
int i;
axis[0] = {0, 0};
axis[1] = {0, (lv_coord_t)(h - 3)};
axis[2] = {(lv_coord_t)width(), (lv_coord_t)(h - 3)};
axis[1] = {0, (lv_coord_t)(h - PAD_THREE)};
axis[2] = {(lv_coord_t)width(), (lv_coord_t)(h - PAD_THREE)};
auto axisLine = lv_line_create(lvobj);
etx_obj_add_style(axisLine, styles->div_line_black, LV_PART_MAIN);
lv_line_set_points(axisLine, axis, 3);
for (x = 0, i = 0; x < width(); x += 6, i += 2) {
ticks[i] = {x, (lv_coord_t)(h - 5)};
ticks[i] = {x, (lv_coord_t)(h - PAD_SMALL - 1)};
ticks[i + 1] = {x, h};
auto tick = lv_line_create(lvobj);
lv_line_set_points(tick, &ticks[i], 2);
@@ -150,7 +144,7 @@ class ThrottleCurveWindow : public Window
for (lv_coord_t x = 0; x < width() && traceRd < s_traceWr;
x += 1, traceRd += 1) {
uint8_t h = s_traceBuf[traceRd % width()];
lv_coord_t y = height() - 3 - CV_SCALE * h;
lv_coord_t y = height() - PAD_THREE - CV_SCALE * h;
graph[x] = {x, y};
graphSize += 1;
}
@@ -225,7 +219,7 @@ void StatisticsViewPage::build(Window* window)
line->padAll(PAD_SMALL);
// Reset
auto btn = new TextButton(line, rect_t{0, 0, 0, 24}, STR_MENUTORESET,
auto btn = new TextButton(line, rect_t{0, 0, 0, RST_BTN_H}, STR_MENUTORESET,
[=]() -> uint8_t {
g_eeGeneral.globalTimer = 0;
storageDirty(EE_GENERAL);
@@ -244,7 +238,7 @@ void DebugViewPage::build(Window* window)
{
window->setFlexLayout(LV_FLEX_FLOW_COLUMN, PAD_ZERO);
#if !PORTRAIT_LCD
#if LANDSCAPE
FlexGridLayout grid(dbg_4col_dsc, row_dsc, PAD_ZERO);
FlexGridLayout grid2(dbg_4col_dsc, row_dsc, PAD_ZERO);
#else
@@ -283,10 +277,10 @@ void DebugViewPage::build(Window* window)
// LUA timing data
new StaticText(line, rect_t{}, STR_LUA_SCRIPTS_LABEL);
#if PORTRAIT_LCD
#if PORTRAIT
line = window->newLine(grid);
line->padAll(PAD_ZERO);
line->padLeft(10);
line->padLeft(PAD_LARGE);
#endif
new DebugInfoNumber<uint16_t>(
line, rect_t{0, 0, DBG_B_WIDTH, DBG_B_HEIGHT},
@@ -297,8 +291,8 @@ void DebugViewPage::build(Window* window)
line = window->newLine(grid);
line->padAll(PAD_ZERO);
#if PORTRAIT_LCD
line->padLeft(10);
#if PORTRAIT
line->padLeft(PAD_LARGE);
#else
grid.nextCell();
#endif
@@ -311,10 +305,10 @@ void DebugViewPage::build(Window* window)
line, rect_t{0, 0, DBG_B_WIDTH, DBG_B_HEIGHT},
[] { return luaGetMemUsed(lsWidgets); }, STR_MEM_USED_WIDGET);
#if PORTRAIT_LCD
#if PORTRAIT
line = window->newLine(grid);
line->padAll(PAD_ZERO);
line->padLeft(10);
line->padLeft(PAD_LARGE);
#endif
new DebugInfoNumber<uint32_t>(
@@ -327,10 +321,10 @@ void DebugViewPage::build(Window* window)
// Stacks data
new StaticText(line, rect_t{}, STR_FREE_STACK);
#if PORTRAIT_LCD
#if PORTRAIT
line = window->newLine(grid2);
line->padAll(PAD_ZERO);
line->padLeft(10);
line->padLeft(PAD_LARGE);
#endif
new DebugInfoNumber<uint32_t>(
line, rect_t{0, 0, DBG_B_WIDTH, DBG_B_HEIGHT},
@@ -363,10 +357,10 @@ void DebugViewPage::build(Window* window)
line->padAll(PAD_TINY);
new StaticText(line, rect_t{}, STR_INT_GPS_LABEL);
#if PORTRAIT_LCD
#if PORTRAIT
line = window->newLine(grid2);
line->padAll(PAD_ZERO);
line->padLeft(10);
line->padLeft(PAD_LARGE);
#endif
new DynamicText(
line, rect_t{0, 0, DBG_B_WIDTH, DBG_B_HEIGHT},
@@ -386,7 +380,7 @@ void DebugViewPage::build(Window* window)
line->padAll(PAD_SMALL);
// Reset
auto btn = new TextButton(line, rect_t{0, 0, 0, 24}, STR_MENUTORESET,
auto btn = new TextButton(line, rect_t{0, 0, 0, RST_BTN_H}, STR_MENUTORESET,
[=]() -> uint8_t {
maxMixerDuration = 0;
#if defined(LUA)
+1 -1
View File
@@ -156,7 +156,7 @@ void Widget::enableFocus(bool enable)
if (enable) {
if (!focusBorder) {
lv_style_init(&borderStyle);
lv_style_set_line_width(&borderStyle, 2);
lv_style_set_line_width(&borderStyle, PAD_BORDER);
lv_style_set_line_opa(&borderStyle, LV_OPA_COVER);
lv_style_set_line_color(&borderStyle, makeLvColor(COLOR_THEME_FOCUS));
@@ -29,7 +29,7 @@ class WidgetSettings : public BaseDialog
public:
WidgetSettings(Widget* widget);
static LAYOUT_VAL(SLIDER_W, 150, 120, LS(150))
static LAYOUT_SIZE_SCALED(SLIDER_W, 150, 120)
protected:
Widget* widget;
@@ -27,7 +27,9 @@
#define WIDGET_NAME_LEN 20
#define MAX_WIDGET_OPTIONS 10
static LAYOUT_VAL2(MAX_TOPBAR_ZONES, 6, 4)
static LAYOUT_VAL_SCALED(MENU_HEADER_BUTTONS_LEFT, 47)
static LAYOUT_VAL_SCALED(TOPBAR_ZONE_WIDTH, 70);
static constexpr int MAX_TOPBAR_ZONES = (LCD_W - MENU_HEADER_BUTTONS_LEFT - 1 + TOPBAR_ZONE_WIDTH / 2) / TOPBAR_ZONE_WIDTH;
#define MAX_TOPBAR_OPTIONS 1 // just because of VC++ which doesn't like 0-size arrays :(
@@ -57,10 +57,10 @@ SetupWidgetsPageSlot::SetupWidgetsPageSlot(Window* parent, const rect_t& rect,
etx_obj_add_style(lvobj, styles->border_color[COLOR_THEME_FOCUS_INDEX], LV_STATE_FOCUSED);
lv_style_init(&borderStyle);
lv_style_set_line_width(&borderStyle, 2);
lv_style_set_line_width(&borderStyle, PAD_BORDER);
lv_style_set_line_opa(&borderStyle, LV_OPA_COVER);
lv_style_set_line_dash_width(&borderStyle, 2);
lv_style_set_line_dash_gap(&borderStyle, 2);
lv_style_set_line_dash_width(&borderStyle, PAD_BORDER);
lv_style_set_line_dash_gap(&borderStyle, PAD_BORDER);
lv_style_set_line_color(&borderStyle, makeLvColor(COLOR_THEME_SECONDARY2));
borderPts[0] = {1, 1};
+11 -9
View File
@@ -130,11 +130,13 @@ class CurveDataEdit : public Window
}
}
static LAYOUT_VAL(ROW_HEIGHT, 82, 82, LS(82))
static LAYOUT_VAL(NUM_BTN_WIDTH, 48, 48, LS(48))
static LAYOUT_VAL(NUM_HDR_HEIGHT, 15, 15, LS(15))
static LAYOUT_VAL(PTNUM_X, 15, 15, LS(15))
static LAYOUT_VAL(PTNUM_H, 13, 13, LS(13))
static LAYOUT_VAL_SCALED(ROW_HEIGHT, 82)
static LAYOUT_VAL_SCALED(NUM_BTN_WIDTH, 47)
static LAYOUT_VAL_SCALED(NUM_HDR_HEIGHT, 15)
static LAYOUT_VAL_SCALED(PTNUM_X, 15)
static LAYOUT_VAL_SCALED(PTNUM_H, 13)
static constexpr coord_t PT_EDIT_WIDTH = PTNUM_X + (NUM_BTN_WIDTH + PAD_TINY) * 5;
static LAYOUT_ORIENTATION(CURVE_WIDTH, LCD_W - PAD_SMALL - PT_EDIT_WIDTH, LAYOUT_SCALE(200))
protected:
uint8_t index;
@@ -270,13 +272,13 @@ void CurveEditWindow::buildBody(Window* window)
lv_obj_set_grid_align(line->getLvObj(), LV_GRID_ALIGN_SPACE_BETWEEN,
LV_GRID_ALIGN_SPACE_BETWEEN);
#if PORTRAIT_LCD
#if PORTRAIT
lv_obj_set_flex_flow(line->getLvObj(), LV_FLEX_FLOW_COLUMN);
coord_t boxWidth = window->width();
coord_t boxHeight = window->height() - CURVE_WIDTH;
coord_t boxHeight = window->height() - CurveDataEdit::CURVE_WIDTH;
#else
lv_obj_set_flex_flow(line->getLvObj(), LV_FLEX_FLOW_ROW);
coord_t boxWidth = window->width() - CURVE_WIDTH;
coord_t boxWidth = window->width() - CurveDataEdit::CURVE_WIDTH;
coord_t boxHeight = window->height();
#endif
@@ -390,7 +392,7 @@ void CurveEditWindow::buildBody(Window* window)
// Curve editor
lv_obj_set_flex_align(line->getLvObj(), LV_FLEX_ALIGN_CENTER,
LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_SPACE_AROUND);
curveEdit = new CurveEdit(line, {0, 0, CURVE_WIDTH, CURVE_WIDTH}, index);
curveEdit = new CurveEdit(line, {0, 0, CurveDataEdit::CURVE_WIDTH, CurveDataEdit::CURVE_WIDTH}, index);
curveDataEdit->setCurveEdit(curveEdit);
}
-2
View File
@@ -37,8 +37,6 @@ class CurveEditWindow : public Page
void setCurrentSource(mixsrc_t source);
static LAYOUT_VAL(CURVE_WIDTH, 215, 232, LS(215))
protected:
uint8_t index;
CurveEdit* curveEdit = nullptr;
@@ -30,23 +30,6 @@
#define SET_DIRTY() storageDirty(EE_MODEL)
static const lv_coord_t line_col_dsc1[] = {LV_GRID_CONTENT,
LV_GRID_TEMPLATE_LAST};
#if defined(FUNCTION_SWITCHES_RGB_LEDS)
static const lv_coord_t line_col_dsc2[] = {
LV_GRID_FR(13), LV_GRID_FR(11), LV_GRID_FR(11),
LV_GRID_FR(12), LV_GRID_FR(10), LV_GRID_FR(7), LV_GRID_FR(7),
LV_GRID_TEMPLATE_LAST};
#else
static const lv_coord_t line_col_dsc2[] = {
LV_GRID_FR(10), LV_GRID_FR(10), LV_GRID_FR(10),
LV_GRID_FR(12), LV_GRID_FR(8), LV_GRID_TEMPLATE_LAST};
#endif
static const lv_coord_t line_row_dsc[] = {LV_GRID_CONTENT,
LV_GRID_TEMPLATE_LAST};
static const char* _fct_sw_start[] = {STR_CHAR_DOWN, STR_CHAR_UP, STR_LAST};
const std::string edgetx_fs_manual_url =
@@ -57,7 +40,7 @@ class FunctionSwitch : public Window
{
public:
FunctionSwitch(Window* parent, uint8_t sw) :
Window(parent, {0, 0, LCD_W - PAD_SMALL * 2, EdgeTxStyles::UI_ELEMENT_HEIGHT + PAD_TINY * 2}), switchIndex(sw)
Window(parent, {0, 0, LCD_W - PAD_SMALL * 2, ROW_H}), switchIndex(sw)
{
padAll(PAD_TINY);
@@ -125,11 +108,16 @@ class FunctionSwitch : public Window
});
#if defined(FUNCTION_SWITCHES_RGB_LEDS)
#if NARROW_LAYOUT
new StaticText(this, rect_t{C1_X - C1_W - PAD_TINY, C1_Y + PAD_SMALL, C1_W, 0}, STR_OFF, COLOR_THEME_PRIMARY1_INDEX, FONT(XS) | RIGHT);
new StaticText(this, rect_t{C2_X - C2_W - PAD_TINY, C2_Y + PAD_SMALL, C2_W, 0}, STR_ON_ONE_SWITCHES[0], COLOR_THEME_PRIMARY1_INDEX, FONT(XS) | RIGHT);
#endif
offValue = g_model.functionSwitchLedOFFColor[switchIndex];
onValue = g_model.functionSwitchLedONColor[switchIndex];
offColor = new ColorPicker(
this, {C1_X, 0, C1_W, 0},
this, {C1_X, C1_Y, C1_W, 0},
[=]() -> int { // getValue
return g_model.functionSwitchLedOFFColor[switchIndex].getColor() | RGB888_FLAG;
},
@@ -147,7 +135,7 @@ class FunctionSwitch : public Window
[=](int newValue) { previewColor(newValue); }, ETX_RGB888);
onColor = new ColorPicker(
this, {C2_X, 0, C2_W, 0},
this, {C2_X, C2_Y, C2_W, 0},
[=]() -> int { // getValue
return g_model.functionSwitchLedONColor[switchIndex].getColor() | RGB888_FLAG;
},
@@ -169,29 +157,43 @@ class FunctionSwitch : public Window
}
#if defined(FUNCTION_SWITCHES_RGB_LEDS)
static LAYOUT_VAL(SW_W, 70, 70, LS(70))
static LAYOUT_VAL_SCALED(SW_W, 70)
static constexpr coord_t NM_X = SW_W + PAD_SMALL;
static LAYOUT_VAL(NM_W, 60, 60, LS(60))
static LAYOUT_VAL_SCALED(NM_W, 60)
static constexpr coord_t TP_X = NM_X + NM_W + PAD_SMALL;
static LAYOUT_VAL(TP_W, 78, 78, LS(78))
static LAYOUT_VAL_SCALED(TP_W, 78)
static constexpr coord_t GR_X = TP_X + TP_W + PAD_SMALL;
static LAYOUT_VAL(GR_W, 84, 84, LS(84))
static LAYOUT_VAL_SCALED(GR_W, 84)
static constexpr coord_t ST_X = GR_X + GR_W + PAD_SMALL;
static LAYOUT_VAL(ST_W, 60, 60, LS(60))
static constexpr coord_t C1_X = ST_X + ST_W + PAD_SMALL;
static LAYOUT_VAL(C1_W, 40, 40, LS(40))
static constexpr coord_t C2_X = C1_X + C1_W + PAD_SMALL;
static LAYOUT_VAL(C2_W, 40, 40, LS(40))
static LAYOUT_VAL_SCALED(ST_W, 60)
#if NARROW_LAYOUT
static constexpr coord_t ROW_H = EdgeTxStyles::UI_ELEMENT_HEIGHT * 2 + PAD_OUTLINE * 3;
static constexpr coord_t C1_X = TP_X;
static constexpr coord_t C1_Y = EdgeTxStyles::UI_ELEMENT_HEIGHT + PAD_OUTLINE;
static LAYOUT_VAL_SCALED(C1_W, 40)
static constexpr coord_t C2_X = GR_X;
static constexpr coord_t C2_Y = EdgeTxStyles::UI_ELEMENT_HEIGHT + PAD_OUTLINE;
static LAYOUT_VAL_SCALED(C2_W, 40)
#else
static constexpr coord_t ROW_H = EdgeTxStyles::UI_ELEMENT_HEIGHT + PAD_OUTLINE * 2;
static constexpr coord_t C1_X = ST_X + ST_W + PAD_SMALL;
static constexpr coord_t C1_Y = 0;
static LAYOUT_VAL_SCALED(C1_W, 40)
static constexpr coord_t C2_X = C1_X + C1_W + PAD_SMALL;
static constexpr coord_t C2_Y = 0;
static LAYOUT_VAL_SCALED(C2_W, 40)
#endif
#else
static constexpr coord_t ROW_H = EdgeTxStyles::UI_ELEMENT_HEIGHT + PAD_OUTLINE * 2;
static constexpr coord_t SW_W = (LCD_W - PAD_SMALL * 2 - PAD_TINY * 4) / 5;
static constexpr coord_t NM_X = SW_W + PAD_TINY;
static LAYOUT_VAL(NM_W, 80, 80, LS(80))
static LAYOUT_VAL_SCALED(NM_W, 80)
static constexpr coord_t TP_X = NM_X + SW_W + PAD_TINY;
static LAYOUT_VAL(TP_W, 86, 86, LS(86))
static LAYOUT_VAL_SCALED(TP_W, 86)
static constexpr coord_t GR_X = TP_X + SW_W + PAD_TINY;
static LAYOUT_VAL(GR_W, 94, 94, LS(94))
static LAYOUT_VAL_SCALED(GR_W, 94)
static constexpr coord_t ST_X = GR_X + SW_W + PAD_LARGE * 2 + PAD_SMALL;
static LAYOUT_VAL(ST_W, 70, 70, LS(70))
static LAYOUT_VAL_SCALED(ST_W, 70)
#endif
protected:
@@ -245,7 +247,7 @@ class SwitchGroup : public Window
{
public:
SwitchGroup(Window* parent, uint8_t group) :
Window(parent, {0, 0, LCD_W - PAD_SMALL * 2, EdgeTxStyles::UI_ELEMENT_HEIGHT + PAD_TINY * 2}), groupIndex(group)
Window(parent, {0, 0, LCD_W - PAD_SMALL * 2, ROW_H}), groupIndex(group)
{
padAll(PAD_TINY);
@@ -294,13 +296,14 @@ class SwitchGroup : public Window
startChoice->setValue(groupDefaultSwitch(groupIndex) + 1);
}
static LAYOUT_VAL(NM_W, 100, 100, LS(100))
static LAYOUT_VAL_SCALED(NM_W, 80)
static constexpr coord_t AO_X = NM_W + PAD_TINY;
static LAYOUT_VAL(AO_W, 100, 100, LS(100))
static LAYOUT_VAL_SCALED(AO_W, 90)
static constexpr coord_t SL_X = AO_X + AO_W + PAD_LARGE * 3 + PAD_MEDIUM;
static LAYOUT_VAL(SL_W, 100, 100, LS(100))
static LAYOUT_VAL_SCALED(SL_W, 80)
static constexpr coord_t ST_X = SL_X + SL_W + PAD_TINY;
static LAYOUT_VAL(ST_W, 80, 80, LS(80))
static LAYOUT_VAL_SCALED(ST_W, 60)
static constexpr coord_t ROW_H = EdgeTxStyles::UI_ELEMENT_HEIGHT + PAD_OUTLINE * 2;
protected:
uint8_t groupIndex;
@@ -315,20 +318,17 @@ ModelFunctionSwitches::ModelFunctionSwitches() : Page(ICON_MODEL_SETUP)
body->padAll(PAD_TINY);
body->setFlexLayout(LV_FLEX_FLOW_COLUMN, PAD_ZERO);
FlexGridLayout grid1(line_col_dsc1, line_row_dsc, PAD_TINY);
FlexGridLayout grid2(line_col_dsc2, line_row_dsc, PAD_TINY);
auto line = body->newLine(grid2);
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,
auto box = new Window(body, {0, 0, LV_PCT(100), LV_SIZE_CONTENT});
new StaticText(box, rect_t{0, 0, FunctionSwitch::SW_W, 0}, STR_SWITCHES);
new StaticText(box, rect_t{FunctionSwitch::NM_X + PAD_OUTLINE, 0, FunctionSwitch::NM_W, 0}, STR_NAME, COLOR_THEME_PRIMARY1_INDEX, FONT(XS));
new StaticText(box, rect_t{FunctionSwitch::TP_X + PAD_OUTLINE, 0, FunctionSwitch::TP_W, 0}, STR_SWITCH_TYPE,
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,
new StaticText(box, rect_t{FunctionSwitch::GR_X + PAD_OUTLINE, 0, FunctionSwitch::GR_W, 0}, STR_GROUP, COLOR_THEME_PRIMARY1_INDEX, FONT(XS));
startupHeader = new StaticText(box, rect_t{FunctionSwitch::ST_X + PAD_OUTLINE, 0, FunctionSwitch::ST_W, 0}, STR_SWITCH_STARTUP,
COLOR_THEME_PRIMARY1_INDEX, FONT(XS));
#if defined(FUNCTION_SWITCHES_RGB_LEDS)
new StaticText(line, rect_t{}, STR_OFF, COLOR_THEME_PRIMARY1_INDEX, FONT(XS));
new StaticText(line, rect_t{}, STR_ON_ONE_SWITCHES[0], COLOR_THEME_PRIMARY1_INDEX, FONT(XS));
#if defined(FUNCTION_SWITCHES_RGB_LEDS) && !NARROW_LAYOUT
new StaticText(box, rect_t{FunctionSwitch::C1_X + PAD_OUTLINE, 0, FunctionSwitch::C1_W, 0}, STR_OFF, COLOR_THEME_PRIMARY1_INDEX, FONT(XS));
new StaticText(box, rect_t{FunctionSwitch::C2_X + PAD_OUTLINE, 0, FunctionSwitch::C2_W, 0}, STR_ON_ONE_SWITCHES[0], COLOR_THEME_PRIMARY1_INDEX, FONT(XS));
#endif
for (uint8_t i = 0; i < NUM_FUNCTIONS_SWITCHES; i += 1) {
@@ -339,21 +339,22 @@ ModelFunctionSwitches::ModelFunctionSwitches() : Page(ICON_MODEL_SETUP)
groupLines[i - 1] = new SwitchGroup(body, i);
}
setState();
#if defined(HARDWARE_TOUCH)
body->padBottom(PAD_LARGE);
line = body->newLine(grid1);
box = new Window(body, {0, 0, LV_PCT(100), LV_SIZE_CONTENT});
new StaticText(line, rect_t{}, STR_MORE_INFO);
new StaticText(box, rect_t{}, STR_MORE_INFO);
line = body->newLine(grid1);
line->padBottom(PAD_LARGE);
line->padLeft((width() - 150) / 2);
auto qr = lv_qrcode_create(line->getLvObj(), 150,
auto qr = lv_qrcode_create(box->getLvObj(), 150,
makeLvColor(COLOR_THEME_SECONDARY1),
makeLvColor(COLOR_THEME_SECONDARY3));
lv_qrcode_update(qr, edgetx_fs_manual_url.c_str(),
edgetx_fs_manual_url.length());
lv_obj_set_pos(qr, (LCD_W - 150) / 2, EdgeTxStyles::STD_FONT_HEIGHT);
#endif
setState();
}
void ModelFunctionSwitches::setState()
+19 -16
View File
@@ -45,30 +45,19 @@ InputEditWindow::InputEditWindow(int8_t input, uint8_t index) :
setTitle();
auto body_obj = body->getLvObj();
#if PORTRAIT_LCD // portrait
lv_obj_set_flex_flow(body_obj, LV_FLEX_FLOW_COLUMN);
#else // landscape
lv_obj_set_flex_flow(body_obj, LV_FLEX_FLOW_ROW);
#endif
lv_obj_set_style_flex_cross_place(body_obj, LV_FLEX_ALIGN_CENTER, 0);
#if PORTRAIT
body->padAll(PAD_ZERO);
auto box = new Window(body, rect_t{});
auto box = new Window(body, rect_t{0, 0, body->width(), body->height() - INPUT_EDIT_CURVE_HEIGHT - PAD_TINY * 2});
auto box_obj = box->getLvObj();
lv_obj_set_flex_grow(box_obj, 2);
etx_scrollbar(box_obj);
#if PORTRAIT_LCD // portrait
box->setWidth(body->width() - 2 * PAD_MEDIUM);
#else // landscape
box->setHeight(body->height() - 2 * PAD_MEDIUM);
#endif
box->padAll(PAD_SMALL);
auto form = new Window(box, rect_t{});
buildBody(form);
preview = new Curve(
body, rect_t{0, 0, INPUT_EDIT_CURVE_WIDTH, INPUT_EDIT_CURVE_HEIGHT},
body, rect_t{(LCD_W - INPUT_EDIT_CURVE_WIDTH) / 2, body->height() - INPUT_EDIT_CURVE_HEIGHT - PAD_TINY, INPUT_EDIT_CURVE_WIDTH, INPUT_EDIT_CURVE_HEIGHT},
[=](int x) -> int {
ExpoData* line = expoAddress(index);
int16_t anas[MAX_INPUTS] = {0};
@@ -76,6 +65,20 @@ InputEditWindow::InputEditWindow(int8_t input, uint8_t index) :
return anas[line->chn];
},
[=]() -> int { return getValue(expoAddress(index)->srcRaw); });
#else
body->padAll(PAD_SMALL);
buildBody(body);
preview = new Curve(
this, rect_t{LCD_W - INPUT_EDIT_CURVE_WIDTH - PAD_LARGE, EdgeTxStyles::MENU_HEADER_HEIGHT + PAD_TINY, INPUT_EDIT_CURVE_WIDTH, INPUT_EDIT_CURVE_HEIGHT},
[=](int x) -> int {
ExpoData* line = expoAddress(index);
int16_t anas[MAX_INPUTS] = {0};
applyExpos(anas, e_perout_mode_inactive_flight_mode, line->srcRaw, x);
return anas[line->chn];
},
[=]() -> int { return getValue(expoAddress(index)->srcRaw); });
#endif
}
void InputEditWindow::setTitle()
+2 -2
View File
@@ -32,8 +32,8 @@ class InputEditWindow : public Page
public:
InputEditWindow(int8_t input, uint8_t index);
static LAYOUT_VAL(INPUT_EDIT_CURVE_WIDTH, 140, 176, 110)
static LAYOUT_VAL2(INPUT_EDIT_CURVE_HEIGHT, INPUT_EDIT_CURVE_WIDTH, 132)
static LAYOUT_ORIENTATION_SCALED(INPUT_EDIT_CURVE_WIDTH, 138, 176)
static LAYOUT_ORIENTATION(INPUT_EDIT_CURVE_HEIGHT, INPUT_EDIT_CURVE_WIDTH, LAYOUT_SCALE(132))
protected:
uint8_t input;
+2 -2
View File
@@ -48,7 +48,7 @@ class MixerEditStatusBar : public Window
channel, true);
}
static LAYOUT_VAL(MIX_STATUS_BAR_MARGIN, 3, 0, LS(3))
static LAYOUT_SIZE_SCALED(MIX_STATUS_BAR_MARGIN, 3, 0)
protected:
ComboChannelBar *channelBar;
@@ -75,7 +75,7 @@ void MixEditWindow::buildHeader(Window *window)
channel);
}
#if !PORTRAIT_LCD
#if !NARROW_LAYOUT
static const lv_coord_t col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(2),
LV_GRID_FR(1), LV_GRID_FR(3),
LV_GRID_TEMPLATE_LAST};
+2 -2
View File
@@ -30,8 +30,8 @@ class MixEditWindow : public Page
public:
MixEditWindow(int8_t channel, uint8_t index);
static LAYOUT_VAL(MIX_STATUS_BAR_WIDTH, 250, 180, LS(250))
static LAYOUT_VAL2(MIX_RIGHT_MARGIN, 0, 3)
static LAYOUT_SIZE_SCALED(MIX_STATUS_BAR_WIDTH, 250, 180)
static LAYOUT_SIZE(MIX_RIGHT_MARGIN, 0, 3)
protected:
uint8_t channel;
@@ -40,7 +40,7 @@ MixEditAdvanced::MixEditAdvanced(int8_t channel, uint8_t index) :
buildBody(body);
}
#if !PORTRAIT_LCD
#if !NARROW_LAYOUT
static const lv_coord_t col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(1),
LV_GRID_FR(1), LV_GRID_FR(1),
LV_GRID_TEMPLATE_LAST};
@@ -88,7 +88,7 @@ void MixEditAdvanced::buildBody(Window* form)
edit->setZeroText(STR_OFF);
// Delay up/down precision
#if !PORTRAIT_LCD
#if !NARROW_LAYOUT
grid.setColSpan(2);
#endif
line = form->newLine(grid);
@@ -105,7 +105,7 @@ void MixEditAdvanced::buildBody(Window* form)
delayDn->update();
SET_DIRTY();
});
#if !PORTRAIT_LCD
#if !NARROW_LAYOUT
grid.setColSpan(1);
#endif
@@ -125,7 +125,7 @@ void MixEditAdvanced::buildBody(Window* form)
delayDn->setSuffix("s");
// Slow up/down precision
#if !PORTRAIT_LCD
#if !NARROW_LAYOUT
grid.setColSpan(2);
#endif
line = form->newLine(grid);
@@ -142,7 +142,7 @@ void MixEditAdvanced::buildBody(Window* form)
slowDn->update();
SET_DIRTY();
});
#if !PORTRAIT_LCD
#if !NARROW_LAYOUT
grid.setColSpan(1);
#endif
@@ -42,7 +42,7 @@ class CurveButton : public Button
s = strAppend(s, ":");
strAppend(s, g_model.curves[index].name, LEN_CURVE_NAME);
}
title = new StaticText(this, {4, -1, width() - PAD_MEDIUM * 2, EdgeTxStyles::STD_FONT_HEIGHT}, buf,
title = new StaticText(this, {PAD_SMALL, -1, width() - PAD_MEDIUM * 2, EdgeTxStyles::STD_FONT_HEIGHT}, buf,
COLOR_THEME_SECONDARY1_INDEX, CENTERED | FONT(BOLD));
etx_txt_color(title->getLvObj(), COLOR_THEME_PRIMARY2_INDEX,
LV_PART_MAIN | LV_STATE_USER_1);
@@ -52,15 +52,15 @@ class CurveButton : public Button
hdrLeft = new StaticIcon(this, 0, 0, ICON_ROUND_TITLE_LEFT,
COLOR_THEME_SECONDARY2_INDEX);
hdrRight = new StaticIcon(this, width() - 8, 0,
hdrRight = new StaticIcon(this, width() - PAD_LARGE, 0,
ICON_ROUND_TITLE_RIGHT,
COLOR_THEME_SECONDARY2_INDEX);
// Preview
preview = new CurveRenderer(
this,
{PAD_MEDIUM, PAD_MEDIUM + EdgeTxStyles::STD_FONT_HEIGHT, width() - PAD_MEDIUM * 2 - 4,
width() - PAD_MEDIUM * 2 - 4},
{PAD_MEDIUM, PAD_MEDIUM + EdgeTxStyles::STD_FONT_HEIGHT, width() - PAD_MEDIUM * 2 - PAD_SMALL,
width() - PAD_MEDIUM * 2 - PAD_SMALL},
[=](int x) -> int { return applyCustomCurve(x, index); });
// Curve characteristics
@@ -73,8 +73,8 @@ class CurveButton : public Button
void update() { preview->update(); }
static LAYOUT_VAL(INFO_H, 27, 27, 19)
static LAYOUT_VAL(CURVE_BTN_W, 142, 142, LS(142))
static LAYOUT_VAL_SCALED(INFO_H, 27)
static constexpr coord_t CURVE_BTN_W = (LCD_W - PAD_LARGE * (ModelCurvesPage::PER_ROW + 1)) / ModelCurvesPage::PER_ROW;
static constexpr coord_t CURVE_BTH_H = CURVE_BTN_W + EdgeTxStyles::STD_FONT_HEIGHT * 2;
protected:
@@ -202,7 +202,7 @@ void ModelCurvesPage::plusPopup(Window *window)
void ModelCurvesPage::build(Window *window)
{
#if !PORTRAIT_LCD
#if LANDSCAPE
static const lv_coord_t col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(1),
LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST};
#else
+1 -1
View File
@@ -34,7 +34,7 @@ class ModelCurvesPage : public PageTab
virtual void build(Window* window) override;
static LAYOUT_VAL2(PER_ROW, 3, 2)
static LAYOUT_ORIENTATION(PER_ROW, 3, 2)
protected:
uint8_t focusIndex = -1;
@@ -49,7 +49,7 @@ static const lv_coord_t line_col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(1),
static const lv_coord_t line_row_dsc[] = {LV_GRID_CONTENT,
LV_GRID_TEMPLATE_LAST};
#if !PORTRAIT_LCD
#if LANDSCAPE
static const lv_coord_t trims_col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(1),
LV_GRID_TEMPLATE_LAST};
#else
@@ -106,7 +106,7 @@ class TrimEdit : public Window
showControls();
}
static LAYOUT_VAL(TR_BTN_W, 65, 65, 44)
static LAYOUT_VAL_SCALED(TR_BTN_W, 65)
protected:
int trimId;
@@ -193,7 +193,7 @@ class FlightModeEdit : public Page
}
}
static LAYOUT_VAL2(TRIMS_PER_LINE, 2, 1)
static LAYOUT_SIZE(TRIMS_PER_LINE, 2, 1)
protected:
uint8_t index;
@@ -282,7 +282,7 @@ class FlightModeBtn : public ListLineButton
ListLineButton::checkEvents();
if (!refreshing && init) {
refreshing = true;
for (int t = 0; t < keysGetMaxTrims(); t += 1) {
for (int t = 0; t < keysGetMaxTrims() && t < MAX_FMTRIMS; t += 1) {
if (lastTrim[t] != g_model.flightModeData[index].trim[t].value) {
setTrimValue(t);
}
@@ -311,7 +311,7 @@ class FlightModeBtn : public ListLineButton
lv_label_set_text(fmSwitch, "");
}
for (int i = 0; i < keysGetMaxTrims(); i += 1) {
for (int i = 0; i < keysGetMaxTrims() && i < MAX_FMTRIMS; i += 1) {
setTrimValue(i);
lv_label_set_text(fmTrimMode[i], getFMTrimStr(fm.trim[i].mode, false).c_str());
}
@@ -324,24 +324,24 @@ class FlightModeBtn : public ListLineButton
formatNumberAsString(fm.fadeOut, PREC1, 0, nullptr, "s").c_str());
}
static LAYOUT_VAL(BTN_H, 36, 56, LS(36))
static LAYOUT_VAL2(MAX_FMTRIMS, 6, 4)
static LAYOUT_SIZE_SCALED(BTN_H, 36, 56)
static LAYOUT_SIZE(MAX_FMTRIMS, 6, 4)
static constexpr coord_t FMID_X = PAD_TINY;
static LAYOUT_VAL(FMID_Y, 6, 16, 3)
static LAYOUT_VAL(FMID_W, 36, 46, LS(36))
static LAYOUT_SIZE_SCALED(FMID_Y, 6, 16)
static LAYOUT_SIZE_SCALED(FMID_W, 36, 46)
static constexpr coord_t NAME_X = FMID_X + FMID_W + PAD_TINY;
static LAYOUT_VAL(NAME_Y, 6, 0, 3)
static LAYOUT_VAL(NAME_W, 95, 160, LS(95))
static LAYOUT_SIZE_SCALED(NAME_Y, 6, 0)
static LAYOUT_SIZE_SCALED(NAME_W, 95, 160)
static constexpr coord_t SWTCH_X = NAME_X + NAME_W + PAD_TINY;
static LAYOUT_VAL(SWTCH_Y, 6, 0, 3)
static LAYOUT_VAL(SWTCH_W, 50, 50, LS(50))
static LAYOUT_VAL2(TRIM_X, SWTCH_X + SWTCH_W + PAD_TINY, FMID_X + FMID_W + PAD_TINY)
static LAYOUT_VAL(TRIM_Y, 0, 20, -1)
static LAYOUT_VAL(TRIM_W, 30, 40, LS(30))
static LAYOUT_VAL(TRIM_H, 16, 16, 11)
static LAYOUT_SIZE_SCALED(SWTCH_Y, 6, 0)
static LAYOUT_VAL_SCALED(SWTCH_W, 50)
static LAYOUT_SIZE(TRIM_X, SWTCH_X + SWTCH_W + PAD_TINY, FMID_X + FMID_W + PAD_TINY)
static LAYOUT_SIZE_SCALED(TRIM_Y, 0, 20)
static LAYOUT_SIZE_SCALED(TRIM_W, 30, 40)
static LAYOUT_VAL_SCALED(TRIM_H, 16)
static constexpr coord_t TRIMC_W = MAX_FMTRIMS * TRIM_W;
static LAYOUT_VAL(FADE_W, 45, 45, LS(45))
static LAYOUT_VAL(FADE_Y, 6, 24, 3)
static LAYOUT_VAL_SCALED(FADE_W, 45)
static LAYOUT_SIZE_SCALED(FADE_Y, 6, 24)
static constexpr coord_t FADE_X = ListLineButton::GRP_W - PAD_BORDER * 2 - FADE_W * 2 - PAD_TINY * 2;
protected:
@@ -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_SMALL, i * (FlightModeBtn::BTN_H + 3) + 4);
lv_obj_set_pos(btn->getLvObj(), PAD_SMALL, i * (FlightModeBtn::BTN_H + PAD_THREE) + PAD_SMALL);
btn->setWidth(ListLineButton::GRP_W);
btn->setPressHandler([=]() {
@@ -504,7 +504,7 @@ void ModelFlightModesPage::build(Window* form)
}
trimCheck = new TextButton(
form, rect_t{6, MAX_FLIGHT_MODES * (FlightModeBtn::BTN_H + 3) + PAD_LARGE, ListLineButton::GRP_W, TRIM_CHK_H}, STR_CHECKTRIMS, [&]() -> uint8_t {
form, rect_t{6, MAX_FLIGHT_MODES * (FlightModeBtn::BTN_H + PAD_THREE) + PAD_LARGE, ListLineButton::GRP_W, EdgeTxStyles::UI_ELEMENT_HEIGHT}, STR_CHECKTRIMS, [&]() -> uint8_t {
if (trimsCheckTimer)
trimsCheckTimer = 0;
else
@@ -33,8 +33,6 @@ class ModelFlightModesPage : public PageTab
void build(Window* window) override;
static LAYOUT_VAL(TRIM_CHK_H, 40, 40, LS(40))
protected:
TextButton* trimCheck = nullptr;
+20 -14
View File
@@ -66,14 +66,19 @@ class GVarButton : public ListLineButton
if (line) line->build();
}
static LAYOUT_VAL3(GVAR_NAME_SIZE, 44, 44, LS(44), 74)
static LAYOUT_VAL_SCALED(GVAR_NAME_SIZE, 44)
static constexpr coord_t GVAR_VAL_H = EdgeTxStyles::STD_FONT_HEIGHT + 2;
static LAYOUT_VAL3(GVAR_VAL_W, 45, 50, LS(45), 75)
static LAYOUT_VAL2(GVAR_COLS, MAX_FLIGHT_MODES, 5)
static LAYOUT_VAL2(BTN_H, EdgeTxStyles::UI_ELEMENT_HEIGHT, 50)
static LAYOUT_VAL(GVAR_NM_Y, 4, 13, LS(4))
static LAYOUT_VAL(GVAR_YO, 4, 2, LS(4))
static LAYOUT_VAL2(HDR_H, EdgeTxStyles::STD_FONT_HEIGHT + PAD_TINY, EdgeTxStyles::STD_FONT_HEIGHT * 2 + PAD_TINY)
static constexpr coord_t GVAR_VAL_SPACE = LCD_W - GVAR_NAME_SIZE - PAD_SMALL * 2 - PAD_BORDER * 2 - PAD_TINY * 2;
#define GVAR_VAL_MIN_W LAYOUT_SCALE(46)
#if GVAR_VAL_SPACE / GVAR_VAL_MIN_W <= MAX_FLIGHT_MODES
static constexpr coord_t GVAR_COLS = GVAR_VAL_SPACE / GVAR_VAL_MIN_W;
#else
static constexpr coord_t GVAR_COLS = MAX_FLIGHT_MODES;
#endif
static constexpr coord_t GVAR_VAL_W = GVAR_VAL_SPACE / GVAR_COLS;
static LAYOUT_SIZE_SCALED(BTN_H, 32, 50)
static LAYOUT_SIZE_SCALED(GVAR_NM_Y, 3, 13)
static LAYOUT_SIZE_SCALED(GVAR_YO, 3, 2)
static const lv_obj_class_t gv_label_class;
static const lv_obj_class_t gv_value_class;
@@ -127,7 +132,7 @@ class GVarButton : public ListLineButton
if (modelFMEnabled()) {
for (int flightMode = 0; flightMode < MAX_FLIGHT_MODES; flightMode++) {
valueTexts[flightMode] = etx_create(&gv_value_class, lvobj);
lv_obj_set_pos(valueTexts[flightMode], (flightMode % GVAR_COLS) * GVAR_VAL_W + GVAR_NAME_SIZE + PAD_BORDER * 2,
lv_obj_set_pos(valueTexts[flightMode], (flightMode % GVAR_COLS) * GVAR_VAL_W + GVAR_NAME_SIZE + PAD_TINY * 2,
(flightMode / GVAR_COLS) * GVAR_VAL_H + GVAR_YO);
if (flightMode == currentFlightMode) {
@@ -229,7 +234,7 @@ class GVarHeader : public Window
{
public:
GVarHeader(Window* parent) :
Window(parent, {0, 0, LCD_W, GVarButton::HDR_H})
Window(parent, {0, 0, LCD_W, HDR_H})
{
padAll(PAD_ZERO);
etx_solid_bg(lvobj, COLOR_THEME_SECONDARY3_INDEX);
@@ -245,6 +250,8 @@ class GVarHeader : public Window
if (line) line->build();
}
static LAYOUT_SIZE(HDR_H, EdgeTxStyles::STD_FONT_HEIGHT + PAD_TINY, EdgeTxStyles::STD_FONT_HEIGHT * 2)
protected:
bool init = false;
uint8_t currentFlightMode = 0; // used for checking updates
@@ -281,7 +288,7 @@ class GVarHeader : public Window
labelTexts[flightMode] = etx_create(&GVarButton::gv_value_class, lvobj);
lv_label_set_text(labelTexts[flightMode], label);
lv_obj_set_pos(labelTexts[flightMode], (flightMode % GVarButton::GVAR_COLS) * GVarButton::GVAR_VAL_W + GVarButton::GVAR_NAME_SIZE + HDR_XO,
lv_obj_set_pos(labelTexts[flightMode], (flightMode % GVarButton::GVAR_COLS) * GVarButton::GVAR_VAL_W + GVarButton::GVAR_NAME_SIZE + PAD_SMALL + PAD_BORDER + PAD_TINY * 2,
(flightMode / GVarButton::GVAR_COLS) * EdgeTxStyles::STD_FONT_HEIGHT + 1);
if (flightMode == currentFlightMode) {
@@ -291,8 +298,6 @@ class GVarHeader : public Window
lv_obj_update_layout(lvobj);
}
static LAYOUT_VAL3(HDR_XO, 10, 10, 9, 12)
};
class GVarEditWindow : public Page
@@ -554,14 +559,15 @@ void ModelGVarsPage::build(Window* window)
{
coord_t yo = 0;
if (modelFMEnabled()) {
window->padTop(PAD_OUTLINE);
hdr = new GVarHeader(window->getParent());
lv_obj_set_pos(hdr->getLvObj(), 0, TabsGroup::MENU_TITLE_TOP + TabsGroup::MENU_TITLE_HEIGHT);
yo = GVarButton::HDR_H - PAD_TINY;
yo = GVarHeader::HDR_H;
}
for (uint8_t index = 0; index < MAX_GVARS; index++) {
auto button = new GVarButton(window, index);
lv_obj_set_pos(button->getLvObj(), 0, yo + index * (GVarButton::BTN_H + PAD_TINY));
lv_obj_set_pos(button->getLvObj(), 0, yo + index * (GVarButton::BTN_H + PAD_OUTLINE));
button->setPressHandler([=]() {
Menu* menu = new Menu();
menu->addLine(STR_EDIT, [=]() {
+2 -2
View File
@@ -26,12 +26,12 @@
#define SET_DIRTY() storageDirty(EE_MODEL)
#if !PORTRAIT_LCD // landscape
#if LANDSCAPE
static const lv_coord_t col_dsc[] = {LV_GRID_FR(2), LV_GRID_FR(1),
LV_GRID_FR(1), LV_GRID_FR(2),
LV_GRID_TEMPLATE_LAST};
static const lv_coord_t row_dsc[] = {LV_GRID_CONTENT, LV_GRID_TEMPLATE_LAST};
#else // portrait
#else
static const lv_coord_t col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(1),
LV_GRID_TEMPLATE_LAST};
static const lv_coord_t row_dsc[] = {LV_GRID_CONTENT, LV_GRID_CONTENT,
@@ -189,7 +189,7 @@ class InputGroup : public InputMixGroupBase
{
adjustHeight();
lv_obj_set_pos(label, 2, 4);
lv_obj_set_pos(label, PAD_TINY, PAD_SMALL);
refresh();
}
@@ -502,24 +502,24 @@ class LogicalSwitchButton : public ListLineButton
}
}
static LAYOUT_VAL(LS_BUTTON_H, 32, 44, LS(32))
static LAYOUT_SIZE_SCALED(LS_BUTTON_H, 32, 44)
static constexpr coord_t NM_X = PAD_TINY;
static LAYOUT_VAL(NM_Y, 4, 10, 1)
static LAYOUT_VAL(NM_W, 30, 36, LS(30))
static LAYOUT_SIZE_SCALED(NM_Y, 4, 10)
static LAYOUT_SIZE_SCALED(NM_W, 30, 36)
static constexpr coord_t FN_X = NM_X + NM_W + PAD_TINY;
static constexpr coord_t FN_Y = NM_Y;
static LAYOUT_VAL(FN_W, 50, 58, LS(50))
static LAYOUT_SIZE_SCALED(FN_W, 50, 58)
static constexpr coord_t V1_X = FN_X + FN_W + PAD_TINY;
static LAYOUT_VAL2(V1_Y, NM_Y, 0)
static LAYOUT_VAL(V1_W, 88, 88, LS(88))
static LAYOUT_SIZE(V1_Y, NM_Y, 0)
static LAYOUT_VAL_SCALED(V1_W, 88)
static constexpr coord_t V2_X = V1_X + V1_W + PAD_TINY;
static constexpr coord_t V2_Y = V1_Y;
static constexpr coord_t AND_W = V1_W;
static LAYOUT_VAL(DUR_W, 40, 54, LS(40))
static LAYOUT_SIZE_SCALED(DUR_W, 40, 54)
static constexpr coord_t DEL_W = DUR_W;
static constexpr coord_t AND_X = ListLineButton::GRP_W - PAD_BORDER * 2 - AND_W - DUR_W - DEL_W - PAD_TINY * 3;
static LAYOUT_VAL2(AND_Y, NM_Y, 20)
static LAYOUT_SIZE_SCALED(AND_Y, 4, 20)
static constexpr coord_t V2_W = AND_X - V2_X - PAD_TINY;
static constexpr coord_t DUR_X = ListLineButton::GRP_W - PAD_BORDER * 2 - DUR_W - DEL_W - PAD_TINY * 2;
static constexpr coord_t DUR_Y = AND_Y;
@@ -36,7 +36,7 @@
#define SET_DIRTY() storageDirty(EE_MODEL)
// Edit grid
#if !PORTRAIT_LCD
#if LANDSCAPE
static const lv_coord_t e_col_dsc[] = {LV_GRID_FR(2), LV_GRID_FR(3),
LV_GRID_TEMPLATE_LAST};
#else
@@ -185,7 +185,7 @@ class ScriptLineButton : public ListLineButton
lv_obj_set_layout(lvobj, LV_LAYOUT_GRID);
lv_obj_set_grid_dsc_array(lvobj, b_col_dsc, row_dsc);
lv_obj_set_style_pad_row(lvobj, 0, 0);
lv_obj_set_style_pad_column(lvobj, 4, 0);
lv_obj_set_style_pad_column(lvobj, PAD_SMALL, 0);
lv_obj_update_layout(parent->getLvObj());
if (lv_obj_is_visible(lvobj)) delayed_init();
+7 -8
View File
@@ -67,8 +67,8 @@ class MPlexIcon : public Window
index = i;
}
static LAYOUT_VAL(MPLEX_ICON_W, 25, 25, LS(25))
static LAYOUT_VAL(MPLEX_ICON_H, 29, 29, 22)
static LAYOUT_VAL_SCALED(MPLEX_ICON_W, 25)
static LAYOUT_VAL_SCALED(MPLEX_ICON_H, 29)
protected:
uint8_t index;
@@ -156,7 +156,7 @@ class MixLineButton : public InputMixButtonBase
}
}
static LAYOUT_VAL(MPLEX_XO, 28, 28, LS(28))
static LAYOUT_VAL_SCALED(MPLEX_XO, 28)
protected:
MPlexIcon* mplex = nullptr;
@@ -190,7 +190,7 @@ class MixGroup : public InputMixGroupBase
void enableMixerMonitor()
{
if (!monitor)
monitor = new MixerChannelBar(this, {LCD_W - CHBAR_XO, 1, CHBAR_W, CHBAR_H}, idx - MIXSRC_FIRST_CH);
monitor = new MixerChannelBar(this, {ListLineButton::GRP_W - CHBAR_W - PAD_LARGE, 1, CHBAR_W, CHBAR_H}, idx - MIXSRC_FIRST_CH);
monitorVisible = true;
monitor->show();
adjustHeight();
@@ -214,10 +214,9 @@ class MixGroup : public InputMixGroupBase
setHeight(y + PAD_BORDER * 2);
}
static LAYOUT_VAL(CHNUM_Y, 17, 17, LS(17))
static LAYOUT_VAL(CHBAR_XO, 118, 118, 81)
static LAYOUT_VAL(CHBAR_W, 100, 100, LS(100))
static LAYOUT_VAL(CHBAR_H, 14, 14, LS(14))
static LAYOUT_VAL_SCALED(CHNUM_Y, 17)
static LAYOUT_VAL_SCALED(CHBAR_W, 100)
static LAYOUT_VAL_SCALED(CHBAR_H, 14)
protected:
MixerChannelBar* monitor = nullptr;
+19 -19
View File
@@ -64,10 +64,10 @@ class OutputLineButton : public ListLineButton
lv_obj_set_pos(source, SRC_X, SRC_Y);
lv_obj_set_size(source, SRC_W, SRC_H);
#if !PORTRAIT_LCD
#if !NARROW_LAYOUT
etx_font(source, FONT_XS_INDEX, ETX_STATE_NAME_FONT_SMALL);
lv_obj_set_style_pad_top(source, -2, ETX_STATE_NAME_FONT_SMALL);
lv_obj_set_style_text_line_space(source, -3, ETX_STATE_NAME_FONT_SMALL);
lv_obj_set_style_pad_top(source, -PAD_TINY, ETX_STATE_NAME_FONT_SMALL);
lv_obj_set_style_text_line_space(source, -PAD_THREE, ETX_STATE_NAME_FONT_SMALL);
#endif
min = lv_label_create(lvobj);
@@ -129,14 +129,14 @@ class OutputLineButton : public ListLineButton
const LimitData* output = limitAddress(index);
if (g_model.limitData[index].name[0] != '\0') {
#if !PORTRAIT_LCD
#if !NARROW_LAYOUT
lv_obj_add_state(source, ETX_STATE_NAME_FONT_SMALL);
#endif
lv_label_set_text_fmt(source, "%s\n" TR_CH "%u",
getSourceString(MIXSRC_FIRST_CH + index),
index + 1);
} else {
#if !PORTRAIT_LCD
#if !NARROW_LAYOUT
lv_obj_clear_state(source, ETX_STATE_NAME_FONT_SMALL);
#endif
lv_label_set_text(source, getSourceString(MIXSRC_FIRST_CH + index));
@@ -166,31 +166,31 @@ class OutputLineButton : public ListLineButton
curve->show(output->curve);
}
static LAYOUT_VAL(CH_LINE_H, 32, 50, LS(32))
static LAYOUT_VAL(CH_BAR_WIDTH, 100, 100, LS(100))
static LAYOUT_VAL(CH_BAR_HEIGHT, 16, 16, LS(16))
static LAYOUT_VAL(BAR_XO, 17, 17, LS(17))
static LAYOUT_SIZE_SCALED(CH_LINE_H, 32, 50)
static LAYOUT_VAL_SCALED(CH_BAR_WIDTH, 100)
static LAYOUT_VAL_SCALED(CH_BAR_HEIGHT, 16)
static LAYOUT_VAL_SCALED(BAR_XO, 17)
static constexpr coord_t BAR_X = LCD_W - CH_BAR_WIDTH - BAR_XO;
static constexpr coord_t SRC_X = PAD_TINY;
static constexpr coord_t SRC_Y = 1;
static LAYOUT_VAL(SRC_W, 80, 80, LS(80))
static LAYOUT_VAL_SCALED(SRC_W, 80)
static constexpr coord_t SRC_H = CH_LINE_H - PAD_MEDIUM;
static constexpr coord_t MIN_X = SRC_X + SRC_W + PAD_TINY;
static LAYOUT_VAL(MIN_Y, 4, 2, 2)
static LAYOUT_VAL(MIN_W, 52, 52, LS(52))
static LAYOUT_SIZE_SCALED(MIN_Y, 4, 2)
static LAYOUT_VAL_SCALED(MIN_W, 52)
static constexpr coord_t MAX_X = MIN_X + MIN_W + PAD_TINY;
static constexpr coord_t MAX_Y = MIN_Y;
static LAYOUT_VAL(MAX_W, 52, 60, LS(52))
static LAYOUT_VAL(OFF_X, MAX_X + MAX_W + PAD_TINY, SRC_X + SRC_W + PAD_TINY, MAX_X + MAX_W + PAD_TINY)
static LAYOUT_VAL(OFF_Y, MIN_Y, 24, MIN_Y)
static LAYOUT_VAL(OFF_W, 44, 52, LS(44))
static LAYOUT_SIZE_SCALED(MAX_W, 52, 60)
static LAYOUT_SIZE(OFF_X, MAX_X + MAX_W + PAD_TINY, SRC_X + SRC_W + PAD_TINY)
static LAYOUT_SIZE_SCALED(OFF_Y, 4, 24)
static LAYOUT_SIZE_SCALED(OFF_W, 44, 52)
static constexpr coord_t CTR_X = OFF_X + OFF_W + PAD_TINY;
static constexpr coord_t CTR_Y = OFF_Y;
static LAYOUT_VAL(CTR_W, 60, 60, LS(60))
static LAYOUT_VAL_SCALED(CTR_W, 60)
static constexpr coord_t REV_X = CTR_X + CTR_W + PAD_TINY;
static constexpr coord_t REV_Y = CTR_Y;
static LAYOUT_VAL(REV_W, 16, 16, LS(16))
static LAYOUT_VAL_SCALED(REV_W, 16)
static constexpr coord_t CRV_X = REV_X + REV_W + PAD_TINY;
static constexpr coord_t CRV_Y = REV_Y + 1;
@@ -251,7 +251,7 @@ void ModelOutputsPage::build(Window* window)
for (uint8_t ch = 0; ch < MAX_OUTPUT_CHANNELS; ch++) {
// Channel settings
auto btn = new OutputLineButton(window, ch);
lv_obj_set_pos(btn->getLvObj(), TRIMB_X, TRIMB_Y + (ch * (OutputLineButton::CH_LINE_H + 2)));
lv_obj_set_pos(btn->getLvObj(), TRIMB_X, TRIMB_Y + (ch * (OutputLineButton::CH_LINE_H + PAD_TINY)));
btn->setWidth(TRIMB_W);
LimitData* output = limitAddress(ch);
+6 -6
View File
@@ -33,15 +33,15 @@ class ModelOutputsPage : public PageTab
static constexpr coord_t ADD_TRIMS_X = PAD_SMALL;
static constexpr coord_t ADD_TRIMS_Y = PAD_SMALL;
static LAYOUT_VAL2(ADD_TRIMS_W, (LCD_W / 2) - PAD_LARGE, LCD_W - 12)
static LAYOUT_SIZE(ADD_TRIMS_W, (LCD_W / 2) - PAD_LARGE, LCD_W - PAD_LARGE - PAD_SMALL)
static constexpr coord_t ADD_TRIMS_H = EdgeTxStyles::UI_ELEMENT_HEIGHT;
static LAYOUT_VAL(EXLIM_XO, 58, 58, LS(58))
static LAYOUT_VAL_SCALED(EXLIM_XO, 58)
static constexpr coord_t EXLIMCB_X = LCD_W - EXLIM_XO;
static LAYOUT_VAL(EXLIMCB_Y, 4, ADD_TRIMS_X + ADD_TRIMS_H + 2, LS(4))
static LAYOUT_VAL(EXLIMCB_W, 52, 52, LS(52))
static LAYOUT_SIZE(EXLIMCB_Y, PAD_SMALL, ADD_TRIMS_Y + ADD_TRIMS_H + PAD_TINY)
static LAYOUT_VAL_SCALED(EXLIMCB_W, 52)
static constexpr coord_t EXLIMCB_H = EdgeTxStyles::UI_ELEMENT_HEIGHT;
static LAYOUT_VAL2(EXLIM_X, ADD_TRIMS_X + ADD_TRIMS_W + PAD_SMALL, 6)
static LAYOUT_VAL(EXLIM_Y, 10, ADD_TRIMS_X + ADD_TRIMS_H + 8, LS(10))
static LAYOUT_SIZE(EXLIM_X, ADD_TRIMS_X + ADD_TRIMS_W + PAD_SMALL, PAD_MEDIUM)
static LAYOUT_SIZE(EXLIM_Y, PAD_LARGE + PAD_TINY, ADD_TRIMS_Y + ADD_TRIMS_H + PAD_LARGE)
static constexpr coord_t EXLIM_W = EXLIMCB_X - EXLIM_X - PAD_SMALL;
static constexpr coord_t TRIMB_X = PAD_SMALL;
static constexpr coord_t TRIMB_Y = EXLIMCB_Y + EXLIMCB_H + PAD_MEDIUM / 2;
+10 -10
View File
@@ -41,11 +41,11 @@ struct ModelButtonLayout {
uint16_t columns;
};
static LAYOUT_VAL(L0_W, 165, 147, LS(165))
static LAYOUT_VAL(L0_H, 92, 92, LS(92))
static LAYOUT_VAL(L1_W, 108, 96, LS(108))
static LAYOUT_VAL(L1_H, 61, 61, LS(61))
static LAYOUT_VAL(L3_W, 336, 300, LS(336))
static constexpr coord_t L0_W = (ModelLabelsWindow::MDLS_W - PAD_BORDER * 3) / 2;
static constexpr coord_t L0_H = L0_W * 11 / 20;
static constexpr coord_t L1_W = (ModelLabelsWindow::MDLS_W - PAD_BORDER * 4) / 3;
static constexpr coord_t L1_H = L1_W * 11 / 20;
static constexpr coord_t L3_W = ModelLabelsWindow::MDLS_W - PAD_BORDER * 2;
ModelButtonLayout modelLayouts[] = {
{L0_W, L0_H, true, FONT(STD), 2},
@@ -84,8 +84,8 @@ class ModelButton : public Button
if (modelCell->modelBitmap[0] == 0)
showNoImgMsg();
coord_t fh = getFontHeight(font) - ((font == FONT(STD)) ? 4 : (font == FONT(XS)) ? 3 : 1);
coord_t fo = (font == FONT(STD)) ? -3 : (font == FONT(XS)) ? -3 : -1;
coord_t fh = getFontHeight(font) - ((font == FONT(STD)) ? PAD_SMALL : (font == FONT(XS)) ? PAD_THREE : 1);
coord_t fo = (font == FONT(STD)) ? -PAD_THREE : (font == FONT(XS)) ? -PAD_THREE : -1;
modelName = new StaticText(this, {PAD_TINY, PAD_TINY, w, fh}, modelCell->modelName,
COLOR_THEME_SECONDARY1_INDEX, CENTERED | font);
@@ -714,7 +714,7 @@ void ModelLabelsWindow::buildHead(Window *hdr)
void ModelLabelsWindow::buildBody(Window *window)
{
// Models List
mdlselector = new ModelsPageBody(window, {MDLS_X, PAD_SMALL, MDLS_W, MDLS_H});
mdlselector = new ModelsPageBody(window, {MDLS_X, MDLS_Y, 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);
@@ -726,7 +726,7 @@ void ModelLabelsWindow::buildBody(Window *window)
// Labels
lblselector =
new ListBox(window, rect_t{PAD_SMALL, LABELS_Y, LABELS_WIDTH, LABELS_HEIGHT}, getLabels());
new ListBox(window, rect_t{LABELS_X, LABELS_Y, LABELS_WIDTH, LABELS_HEIGHT}, getLabels());
lblselector->setSmallSelectMarker();
auto lbl_obj = lblselector->getLvObj();
etx_scrollbar(lbl_obj);
@@ -735,7 +735,7 @@ void ModelLabelsWindow::buildBody(Window *window)
// Sort Button
new Choice(
window, {PAD_SMALL, LABELS_Y + LABELS_HEIGHT + PAD_SMALL, SORT_BUTTON_W, 0}, STR_SORT_ORDERS, NAME_ASC, DATE_DES,
window, {LABELS_X, LABELS_Y + LABELS_HEIGHT + PAD_SMALL, SORT_BUTTON_W, 0}, STR_SORT_ORDERS, NAME_ASC, DATE_DES,
[=]() { return mdlselector->getSortOrder(); },
[=](int newValue) { mdlselector->setSortOrder((ModelsSortBy)newValue); },
STR_SORT_MODELS_BY);
+11 -10
View File
@@ -34,17 +34,18 @@ class ModelLabelsWindow : public Page
public:
ModelLabelsWindow();
static LAYOUT_VAL(NEW_BTN_W, 60, 60, LS(60))
static LAYOUT_VAL_SCALED(NEW_BTN_W, 60)
static constexpr coord_t LAYOUT_BTN_XO = NEW_BTN_W + PAD_LARGE * 2 + EdgeTxStyles::UI_ELEMENT_HEIGHT;
static LAYOUT_VAL(LAYOUT_BTN_YO, 6, 6, LS(6))
static LAYOUT_VAL(MDLS_X, 137, 4, LS(137))
static LAYOUT_VAL(MDLS_Y, 4, 4, LS(4))
static LAYOUT_VAL(MDLS_W, 343, LCD_W - PAD_MEDIUM, LS(343))
static LAYOUT_VAL2(MDLS_H, LCD_H - EdgeTxStyles::MENU_HEADER_HEIGHT - PAD_SMALL * 2, 219)
static LAYOUT_VAL2(LABELS_Y, PAD_SMALL, MDLS_Y + MDLS_H + PAD_SMALL)
static LAYOUT_VAL(LABELS_WIDTH, 131, LCD_W - PAD_SMALL * 2, LS(131))
static LAYOUT_VAL2(LABELS_HEIGHT, LCD_H - EdgeTxStyles::MENU_HEADER_HEIGHT - EdgeTxStyles::UI_ELEMENT_HEIGHT - PAD_SMALL * 2 - PAD_MEDIUM, 166)
static LAYOUT_VAL2(SORT_BUTTON_W, LABELS_WIDTH, 120)
static LAYOUT_VAL_SCALED(LAYOUT_BTN_YO, 6)
static constexpr coord_t MDLS_Y = PAD_BORDER;
static constexpr coord_t LABELS_X = PAD_BORDER;
static LAYOUT_ORIENTATION(MDLS_H, LCD_H - EdgeTxStyles::MENU_HEADER_HEIGHT - PAD_SMALL * 2, LAYOUT_SCALE(219))
static LAYOUT_ORIENTATION(LABELS_Y, PAD_SMALL, MDLS_Y + MDLS_H + PAD_SMALL)
static LAYOUT_ORIENTATION(LABELS_WIDTH, LCD_W * 131 / 480, LCD_W - PAD_SMALL * 2)
static LAYOUT_ORIENTATION(LABELS_HEIGHT, LCD_H - EdgeTxStyles::MENU_HEADER_HEIGHT - EdgeTxStyles::UI_ELEMENT_HEIGHT - PAD_SMALL * 2 - PAD_MEDIUM, LAYOUT_SCALE(166))
static LAYOUT_ORIENTATION(SORT_BUTTON_W, LABELS_WIDTH, LAYOUT_SCALE(120))
static LAYOUT_ORIENTATION(MDLS_X, LABELS_WIDTH + PAD_BORDER, PAD_SMALL)
static LAYOUT_ORIENTATION(MDLS_W, LCD_W - LABELS_WIDTH - PAD_BORDER, LCD_W - PAD_MEDIUM)
protected:
ModelsSortBy sort = DEFAULT_MODEL_SORT;
+8 -8
View File
@@ -210,15 +210,15 @@ struct CenterBeepsMatrix : public ButtonMatrix {
update();
setWidth(min((int)btn_cnt, SW_BTNS) * SW_BTN_W + 4);
setWidth(min((int)btn_cnt, SW_BTNS) * SW_BTN_W + PAD_SMALL);
uint8_t rows = ((btn_cnt - 1) / SW_BTNS) + 1;
setHeight((rows * 36) + 4);
setHeight((rows * (EdgeTxStyles::UI_ELEMENT_HEIGHT + PAD_SMALL)) + PAD_SMALL);
lv_obj_set_style_pad_all(lvobj, 4, LV_PART_MAIN);
lv_obj_set_style_pad_all(lvobj, PAD_SMALL, LV_PART_MAIN);
lv_obj_set_style_pad_row(lvobj, 4, LV_PART_MAIN);
lv_obj_set_style_pad_column(lvobj, 4, LV_PART_MAIN);
lv_obj_set_style_pad_row(lvobj, PAD_SMALL, LV_PART_MAIN);
lv_obj_set_style_pad_column(lvobj, PAD_SMALL, LV_PART_MAIN);
}
void onPress(uint8_t btn_id)
@@ -248,9 +248,9 @@ struct CenterBeepsMatrix : public ButtonMatrix {
setChecked(btn_id);
}
static LAYOUT_VAL(SW_BTNS, 8, 4, 8)
static LAYOUT_VAL(SW_BTN_W, 56, 72, 38)
static LAYOUT_VAL(SW_BTN_H, 36, 36, LS(36))
static LAYOUT_SIZE(SW_BTNS, 8, 4)
static LAYOUT_SIZE_SCALED(SW_BTN_W, 56, 72)
static LAYOUT_VAL_SCALED(SW_BTN_H, 36)
private:
uint8_t max_analogs;
+4 -4
View File
@@ -29,10 +29,10 @@ class ModelSetupPage: public PageTab {
void build(Window * window) override;
static LAYOUT_VAL2(BTN_COLS, 3, 3)
static LAYOUT_VAL(BTN_H, 62, 62, LS(62))
static LAYOUT_VAL(OPTS_W, 100, 100, LS(100))
static LAYOUT_VAL(NAM_W, 200, 140, LS(200))
static LAYOUT_SIZE(BTN_COLS, 3, 3)
static LAYOUT_VAL_SCALED(BTN_H, 62)
static LAYOUT_VAL_SCALED(OPTS_W, 100)
static LAYOUT_SIZE_SCALED(NAM_W, 200, 140)
private:
TextButton *labelTextButton = nullptr;
@@ -36,7 +36,7 @@
std::string getSensorCustomValue(uint8_t sensor, int32_t value, LcdFlags flags);
#if (PORTRAIT_LCD) || defined(TRANSLATIONS_CZ)
#if PORTRAIT || defined(TRANSLATIONS_CZ)
#define TWOCOLBUTTONS 1
#else
#define TWOCOLBUTTONS 0
@@ -84,11 +84,11 @@ class TSStyle
lv_style_t tsFreshStyle;
static LAYOUT_VAL(NUM_W, 36, 36, LS(36))
static LAYOUT_VAL(NAME_W, 56, 56, LS(56))
static LAYOUT_VAL(ID_Y, 17, 17, LS(17))
static LAYOUT_VAL(ID_H, 11, 11, LS(11))
static LAYOUT_VAL(FRSH_Y, 10, 10, LS(10))
static LAYOUT_VAL_SCALED(NUM_W, 36)
static LAYOUT_VAL_SCALED(NAME_W, 56)
static LAYOUT_VAL_SCALED(ID_Y, 16)
static LAYOUT_VAL_SCALED(ID_H, 12)
static LAYOUT_VAL_SCALED(FRSH_Y, 10)
private:
bool styleInitDone;
@@ -203,64 +203,6 @@ lv_obj_t* TSStyle::newValue(lv_obj_t* parent)
return obj;
}
static void ts_fresh_icon_constructor(const lv_obj_class_t* class_p,
lv_obj_t* obj)
{
#if LANDSCAPE_LCD_SML
static uint8_t const freshBitmap[] = {
0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
};
#elif LANDSCAPE_LCD_LRG
static uint8_t const freshBitmap[] = {
0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
};
#else
static uint8_t const freshBitmap[] = {
0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00,
0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00,
};
#endif
etx_obj_add_style(obj, tsStyle.tsFreshStyle, LV_PART_MAIN);
lv_canvas_set_buffer(obj, (void*)freshBitmap, PAD_LARGE, PAD_LARGE, LV_IMG_CF_ALPHA_8BIT);
lv_obj_add_flag(obj, LV_OBJ_FLAG_HIDDEN);
}
static const lv_obj_class_t ts_fresh_icon_class = {
.base_class = &lv_canvas_class,
.constructor_cb = ts_fresh_icon_constructor,
.destructor_cb = nullptr,
.user_data = nullptr,
.event_cb = nullptr,
.width_def = PAD_LARGE,
.height_def = PAD_LARGE,
.editable = LV_OBJ_CLASS_EDITABLE_FALSE,
.group_def = LV_OBJ_CLASS_GROUP_DEF_INHERIT,
.instance_size = sizeof(lv_canvas_t),
};
class SensorButton : public ListLineButton
{
public:
@@ -268,7 +210,7 @@ class SensorButton : public ListLineButton
ListLineButton(parent, index)
{
padAll(PAD_ZERO);
setHeight(EdgeTxStyles::UI_ELEMENT_HEIGHT);
setHeight(EdgeTxStyles::UI_ELEMENT_HEIGHT + PAD_SMALL);
check(isActive());
@@ -327,7 +269,7 @@ class SensorButton : public ListLineButton
lv_obj_enable_style_refresh(false);
numLabel = tsStyle.newNum(lvobj, index);
lv_obj_set_pos(numLabel, PAD_TINY, PAD_MEDIUM/2);
lv_obj_set_pos(numLabel, PAD_TINY, PAD_TINY);
TelemetrySensor* sensor = &g_model.telemetrySensors[index];
if (sensor->type == TELEM_TYPE_CUSTOM) {
@@ -343,11 +285,14 @@ class SensorButton : public ListLineButton
lv_obj_t* nm = tsStyle.newName(lvobj, s);
lv_obj_set_pos(nm, TSStyle::NUM_W + PAD_SMALL, PAD_MEDIUM/2);
fresh = etx_create(&ts_fresh_icon_class, lvobj);
lv_obj_set_pos(fresh, TSStyle::NUM_W + TSStyle::NAME_W + PAD_MEDIUM, TSStyle::FRSH_Y);
auto mask = getBuiltinIcon(ICON_DOT);
fresh = lv_canvas_create(lvobj);
lv_obj_set_pos(fresh, TSStyle::NUM_W + TSStyle::NAME_W + PAD_MEDIUM, PAD_LARGE);
lv_canvas_set_buffer(fresh, (void*)mask->data, mask->width, mask->height, LV_IMG_CF_ALPHA_8BIT);
lv_obj_add_flag(fresh, LV_OBJ_FLAG_HIDDEN);
valLabel = tsStyle.newValue(lvobj);
lv_obj_set_pos(valLabel, TSStyle::NUM_W + TSStyle::NAME_W + PAD_LARGE * 2, PAD_MEDIUM/2);
lv_obj_set_pos(valLabel, TSStyle::NUM_W + TSStyle::NAME_W + PAD_LARGE * 3, PAD_MEDIUM/2);
lv_obj_update_layout(lvobj);
@@ -815,7 +760,7 @@ class SensorEditWindow : public SubPage
updateSensorParameters();
}
static LAYOUT_VAL2(NUM_EDIT_W, EdgeTxStyles::EDIT_FLD_WIDTH_NARROW, 80)
static LAYOUT_SIZE(NUM_EDIT_W, EdgeTxStyles::EDIT_FLD_WIDTH_NARROW, LAYOUT_SCALE(80))
};
ModelTelemetryPage::ModelTelemetryPage() :
@@ -33,7 +33,7 @@ class ModelTelemetryPage : public PageTab
void build(Window* window) override;
static LAYOUT_VAL(NUM_EDIT_W, 100, 65, LS(100))
static LAYOUT_SIZE_SCALED(NUM_EDIT_W, 100, 65)
protected:
int lastKnownIndex = 0;
@@ -32,7 +32,7 @@
#define ETX_STATE_COLLISION_WARN LV_STATE_USER_1
#if !PORTRAIT_LCD // Landscape
#if !NARROW_LAYOUT
static const lv_coord_t line_col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(1),
LV_GRID_FR(1), LV_GRID_FR(1),
@@ -49,7 +49,7 @@ static const lv_coord_t b_col_dsc[] = {LV_GRID_FR(10), 20,
static const lv_coord_t b_row_dsc[] = {LV_GRID_CONTENT, LV_GRID_TEMPLATE_LAST};
#else // Portrait
#else
static const lv_coord_t line_col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(1),
LV_GRID_TEMPLATE_LAST};
@@ -82,7 +82,7 @@ class USBChannelEditStatusBar : public Window
channel, true);
}
static LAYOUT_VAL(USBCH_EDIT_STATUS_BAR_MARGIN, 3, 0, LS(3))
static LAYOUT_SIZE_SCALED(USBCH_EDIT_STATUS_BAR_MARGIN, 3, 0)
protected:
ComboChannelBar* channelBar;
@@ -215,9 +215,9 @@ class USBChannelEditWindow : public Page
buildBody(body);
}
static LAYOUT_VAL(USBCH_EDIT_STATUS_BAR_WIDTH, 250, 160, LS(250))
static LAYOUT_VAL(USBCH_EDIT_RIGHT_MARGIN, 0, 3, 0)
static LAYOUT_VAL2(USBCH_COLS, 4, 2)
static LAYOUT_SIZE_SCALED(USBCH_EDIT_STATUS_BAR_WIDTH, 250, 160)
static LAYOUT_SIZE(USBCH_EDIT_RIGHT_MARGIN, 0, 3)
static LAYOUT_SIZE(USBCH_COLS, 4, 2)
protected:
uint8_t channel;
@@ -291,7 +291,7 @@ class USBChannelEditWindow : public Page
new Choice(line, rect_t{}, STR_VUSBJOYSTICK_CH_MODE, 0, USBJOYS_CH_LAST,
GET_DEFAULT(cch->mode), SET_VALUE_WUPDATE(cch->mode));
#if PORTRAIT_LCD
#if NARROW_LAYOUT
line = form->newLine(grid);
#endif
@@ -316,7 +316,7 @@ class USBChannelEditWindow : public Page
this->update();
});
#if PORTRAIT_LCD
#if NARROW_LAYOUT
line = m_btnModeFrame->newLine(grid);
#endif
@@ -327,7 +327,7 @@ class USBChannelEditWindow : public Page
line = m_btnModeFrame->newLine(grid);
new StaticText(line, rect_t{}, STR_USBJOYSTICK_CH_BTNNUM);
#if PORTRAIT_LCD
#if NARROW_LAYOUT
line = m_btnModeFrame->newLine(grid);
#endif
_BtnNumSel = new USBChannelButtonSel(line, rect_t{}, channel,
@@ -366,14 +366,14 @@ class USBChannelLineButton : public ListLineButton
ListLineButton(parent, index)
{
setHeight(USBCH_LINE_HEIGHT);
#if !PORTRAIT_LCD
#if !NARROW_LAYOUT
padTop(PAD_SMALL);
#endif
lv_obj_set_layout(lvobj, LV_LAYOUT_GRID);
lv_obj_set_grid_dsc_array(lvobj, b_col_dsc, b_row_dsc);
lv_obj_set_style_pad_row(lvobj, 0, 0);
lv_obj_set_style_pad_column(lvobj, 4, 0);
lv_obj_set_style_pad_column(lvobj, PAD_SMALL, 0);
lv_obj_add_event_cb(lvobj, USBChannelLineButton::on_draw,
LV_EVENT_DRAW_MAIN_BEGIN, nullptr);
@@ -487,10 +487,10 @@ class USBChannelLineButton : public ListLineButton
bool isActive() const override { return false; }
static LAYOUT_VAL(USBCH_LINE_HEIGHT, 32, 48, LS(32))
static LAYOUT_VAL2(USBCH_CHN_ROWS, 1, 2)
static LAYOUT_VAL2(USBCH_BTN_MODE_COL, 4, 2)
static LAYOUT_VAL2(USBCH_BTN_MODE_ROW, 0, 1)
static LAYOUT_SIZE_SCALED(USBCH_LINE_HEIGHT, 32, 48)
static LAYOUT_SIZE(USBCH_CHN_ROWS, 1, 2)
static LAYOUT_SIZE(USBCH_BTN_MODE_COL, 4, 2)
static LAYOUT_SIZE(USBCH_BTN_MODE_ROW, 0, 1)
protected:
bool init = false;
@@ -518,7 +518,7 @@ ModelUSBJoystickPage::ModelUSBJoystickPage() : Page(ICON_MODEL_USB, PAD_BORDER)
GET_DEFAULT(g_model.usbJoystickExtMode),
SET_VALUE_WUPDATE(g_model.usbJoystickExtMode));
#if PORTRAIT_LCD
#if NARROW_LAYOUT
line = body->newLine(grid);
#endif
@@ -536,7 +536,7 @@ ModelUSBJoystickPage::ModelUSBJoystickPage() : Page(ICON_MODEL_USB, PAD_BORDER)
GET_DEFAULT(g_model.usbJoystickCircularCut),
SET_VALUE_WUPDATE(g_model.usbJoystickCircularCut));
#if PORTRAIT_LCD
#if NARROW_LAYOUT
line = body->newLine(grid);
#endif
+2 -2
View File
@@ -45,7 +45,7 @@ class OutputEditStatusBar : public Window
channel, true);
}
static LAYOUT_VAL(OUTPUT_EDIT_STATUS_BAR_MARGIN, 3, 0, LS(3))
static LAYOUT_SIZE_SCALED(OUTPUT_EDIT_STATUS_BAR_MARGIN, 3, 0)
protected:
ComboChannelBar *channelBar;
@@ -101,7 +101,7 @@ void OutputEditWindow::buildHeader(Window *window)
channel);
}
#if !PORTRAIT_LCD
#if !NARROW_LAYOUT
static const lv_coord_t col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(2),
LV_GRID_FR(1), LV_GRID_FR(2),
LV_GRID_TEMPLATE_LAST};
+2 -2
View File
@@ -36,8 +36,8 @@ class OutputEditWindow : public Page
public:
explicit OutputEditWindow(uint8_t channel);
static LAYOUT_VAL(OUTPUT_EDIT_STATUS_BAR_WIDTH, 250, 180, LS(250))
static LAYOUT_VAL(OUTPUT_EDIT_RIGHT_MARGIN, 0, 3, 0)
static LAYOUT_SIZE_SCALED(OUTPUT_EDIT_STATUS_BAR_WIDTH, 250, 180)
static LAYOUT_SIZE(OUTPUT_EDIT_RIGHT_MARGIN, 0, 3)
protected:
uint8_t channel;
@@ -99,9 +99,9 @@ class SwitchWarnMatrix : public ButtonMatrix
setChecked(btn_id);
}
static LAYOUT_VAL2(SW_BTNS, 8, 4)
static LAYOUT_VAL(SW_BTN_W, 56, 72, 38)
static LAYOUT_VAL(SW_BTN_H, 36, 36, LS(36))
static LAYOUT_SIZE(SW_BTNS, 8, 4)
static LAYOUT_SIZE_SCALED(SW_BTN_W, 56, 72)
static LAYOUT_VAL_SCALED(SW_BTN_H, 36)
private:
uint8_t sw_idx[MAX_SWITCHES];
@@ -798,7 +798,7 @@ void FunctionsPage::build(Window *window)
if (isActive) {
auto button = functionButton(
window, rect_t{0, 0, window->width() - 12, SF_BUTTON_H}, i);
window, rect_t{0, 0, window->width() - PAD_LARGE - PAD_SMALL, SF_BUTTON_H}, i);
lv_obj_set_grid_cell(button->getLvObj(), LV_GRID_ALIGN_CENTER, 0, 1,
LV_GRID_ALIGN_CENTER, 0, 1);
@@ -51,15 +51,15 @@ class FunctionLineButton : public ListLineButton
void refresh() override;
static constexpr coord_t NM_X = PAD_TINY;
static LAYOUT_VAL(NM_Y, 4, 10, 1)
static LAYOUT_VAL(NM_W, 43, 40, LS(43))
static LAYOUT_SIZE_SCALED(NM_Y, 4, 10)
static LAYOUT_SIZE_SCALED(NM_W, 43, 40)
static constexpr coord_t SW_X = NM_X + NM_W + PAD_TINY;
static LAYOUT_VAL2(SW_Y, NM_Y, 0)
static LAYOUT_VAL(SW_W, 70, 198, LS(70))
static LAYOUT_VAL2(FN_X, SW_X + SW_W + PAD_TINY, NM_X + NM_W + PAD_TINY)
static LAYOUT_VAL2(FN_Y, NM_Y, 20)
static LAYOUT_VAL(RP_W, 40, 34, LS(40))
static LAYOUT_VAL(EN_SZ, 16, 16, 12)
static LAYOUT_SIZE(SW_Y, NM_Y, 0)
static LAYOUT_SIZE_SCALED(SW_W, 70, 198)
static LAYOUT_SIZE(FN_X, SW_X + SW_W + PAD_TINY, NM_X + NM_W + PAD_TINY)
static LAYOUT_SIZE_SCALED(FN_Y, 4, 20)
static LAYOUT_SIZE_SCALED(RP_W, 40, 34)
static LAYOUT_VAL_SCALED(EN_SZ, 16)
static constexpr coord_t RP_X = ListLineButton::GRP_W - PAD_BORDER * 2 - RP_W - EN_SZ - PAD_TINY * 2;
static constexpr coord_t RP_Y = NM_Y;
static constexpr coord_t FN_W = RP_X - FN_X - PAD_TINY;
@@ -130,7 +130,7 @@ class FunctionsPage : public PageTab
void build(Window* window) override;
static LAYOUT_VAL(SF_BUTTON_H, 32, 44, LS(32))
static LAYOUT_SIZE_SCALED(SF_BUTTON_H, 32, 44)
protected:
int8_t focusIndex = -1;
+4 -4
View File
@@ -28,10 +28,10 @@ class TimerWindow : public SubPage
public:
TimerWindow(uint8_t timer);
static LAYOUT_VAL(COUNTDOWN_W, 144, 144, LS(144))
static LAYOUT_VAL2(COUNTDOWN_LBL_YO, 0, (EdgeTxStyles::UI_ELEMENT_HEIGHT + PAD_TINY) / 2)
static LAYOUT_VAL2(COUNTDOWN_VAL_XO, COUNTDOWN_W + PAD_SMALL, 0)
static LAYOUT_VAL2(COUNTDOWN_VAL_YO, 0, EdgeTxStyles::UI_ELEMENT_HEIGHT + PAD_TINY)
static LAYOUT_VAL_SCALED(COUNTDOWN_W, 144)
static LAYOUT_SIZE(COUNTDOWN_LBL_YO, 0, (EdgeTxStyles::UI_ELEMENT_HEIGHT + PAD_TINY) / 2)
static LAYOUT_SIZE(COUNTDOWN_VAL_XO, COUNTDOWN_W + PAD_SMALL, 0)
static LAYOUT_SIZE(COUNTDOWN_VAL_YO, 0, EdgeTxStyles::UI_ELEMENT_HEIGHT + PAD_TINY)
protected:
Window* timerDirLine = nullptr;
@@ -162,14 +162,13 @@ TrainerPage::TrainerPage() : Page(ICON_MODEL_SETUP)
TrainerModuleData* tr = &g_model.trainerData;
trainerChoice->setSetValueHandler([=](int32_t newValue) {
//TODO: move the BT stuff somewhere else?
//TODO: move the BT stuff somewhere else?
#if defined(BLUETOOTH)
memclear(bluetooth.distantAddr, sizeof(bluetooth.distantAddr));
bluetooth.state = BLUETOOTH_STATE_OFF;
memclear(bluetooth.distantAddr, sizeof(bluetooth.distantAddr));
bluetooth.state = BLUETOOTH_STATE_OFF;
#endif
tr->mode = newValue;
trainerModule->update();
SET_DIRTY();
});
tr->mode = newValue;
trainerModule->update();
SET_DIRTY();
});
}
+1 -1
View File
@@ -28,5 +28,5 @@ class TrimsSetup : public SubPage
public:
TrimsSetup();
static LAYOUT_VAL(HATSMODE_W, 120, 120, LS(120))
static LAYOUT_VAL_SCALED(HATSMODE_W, 120)
};
@@ -36,12 +36,12 @@ class ChannelFailsafeBargraph : public Window
etx_obj_add_style(lvobj, styles->border_thin, LV_PART_MAIN);
etx_obj_add_style(lvobj, styles->border_color[COLOR_BLACK_INDEX], LV_PART_MAIN);
outputsBar = new OutputChannelBar(this, {0, 1, width() - 2, ChannelBar::BAR_HEIGHT},
outputsBar = new OutputChannelBar(this, {0, 1, width() - PAD_TABLE_H, ChannelBar::BAR_HEIGHT},
channel, false, false);
outputsBar->hide();
failsafeBar = new ChannelBar(
this, {0, ChannelBar::BAR_HEIGHT + 3, width() - 2, ChannelBar::BAR_HEIGHT}, channel,
this, {0, ChannelBar::BAR_HEIGHT + PAD_THREE, width() - PAD_TABLE_H, ChannelBar::BAR_HEIGHT}, channel,
[=] { return g_model.failsafeChannels[channel]; },
COLOR_THEME_WARNING_INDEX);
failsafeBar->hide();
@@ -28,5 +28,5 @@ class FailSafePage : public Page
public:
explicit FailSafePage(uint8_t moduleIdx);
static LAYOUT_VAL(FS_BARGRAPH_WIDTH, 130, 90, LS(130))
static LAYOUT_SIZE_SCALED(FS_BARGRAPH_WIDTH, 130, 90)
};
+16 -17
View File
@@ -37,7 +37,7 @@ struct HWInputEdit : public RadioTextEdit {
{
}
static LAYOUT_VAL(HW_INP_W, 64, 64, LS(64))
static LAYOUT_VAL_SCALED(HW_INP_W, 64)
};
static const lv_coord_t col_two_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(2),
@@ -45,7 +45,7 @@ static const lv_coord_t col_two_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(2),
static const lv_coord_t col_three_dsc[] = {
LV_GRID_FR(8), LV_GRID_FR(12), LV_GRID_FR(20), LV_GRID_TEMPLATE_LAST};
#if !PORTRAIT_LCD
#if LANDSCAPE
static const lv_coord_t pots_col_dsc[] = {LV_GRID_FR(2), LV_GRID_FR(2),
LV_GRID_FR(5), LV_GRID_FR(2),
LV_GRID_TEMPLATE_LAST};
@@ -83,7 +83,7 @@ HWSticks::HWSticks(Window* parent) : Window(parent, rect_t{})
}
HWPots::HWPots(Window* parent) :
Window(parent, rect_t{0, 0, DIALOG_DEFAULT_WIDTH - 12, LV_SIZE_CONTENT})
Window(parent, rect_t{0, 0, LV_PCT(100), LV_SIZE_CONTENT})
{
padAll(PAD_TINY);
@@ -100,7 +100,7 @@ HWPots::HWPots(Window* parent) :
new StaticText(this, {P_TYP_X, -PAD_TINY, 0, 0}, STR_TYPE, COLOR_THEME_PRIMARY1_INDEX, FONT(XS));
new StaticText(this, {P_INV_X, -PAD_TINY, 0, 0}, STR_MENU_INVERT, COLOR_THEME_PRIMARY1_INDEX, FONT(XS));
coord_t yo = EdgeTxStyles::STD_FONT_HEIGHT - 2;
coord_t yo = EdgeTxStyles::STD_FONT_HEIGHT - PAD_TINY;
auto max_pots = adcGetMaxInputs(ADC_INPUT_FLEX);
for (int i = 0; i < max_pots; i++) {
@@ -112,7 +112,7 @@ HWPots::HWPots(Window* parent) :
// if (!globalData.flyskygimbals && (i >= (NUM_POTS - 2))) continue;
// #endif
new StaticText(this,
rect_t{P_LBL_X, P_Y(i) + yo + PAD_MEDIUM, P_LBL_W, 0},
rect_t{0, P_Y(i) + yo + PAD_MEDIUM, P_LBL_W, 0},
adcGetInputLabel(ADC_INPUT_FLEX, i));
new HWInputEdit(this, (char*)analogGetCustomLabel(ADC_INPUT_FLEX, i),
@@ -197,15 +197,15 @@ class HWSwitch
public:
HWSwitch(Window* parent, int swnum, coord_t y)
{
new SwitchDynamicLabel(parent, swnum, PAD_TINY, y + PAD_MEDIUM, SW_CTRL_W);
new SwitchDynamicLabel(parent, swnum, PAD_TINY, y + PAD_SMALL, HWSwitches::SW_CTRL_W);
new HWInputEdit(parent, (char*)switchGetCustomName(swnum), LEN_SWITCH_NAME,
SW_CTRL_W + 8, y);
HWSwitches::SW_CTRL_W + PAD_SMALL, y);
coord_t x = SW_CTRL_W * 2 + PAD_LARGE + PAD_MEDIUM;
coord_t x = HWSwitches::SW_CTRL_W * 2 + PAD_SMALL * 2;
if (switchIsFlex(swnum)) {
channel = new Choice(
parent, {x, y, SW_CTRL_W, 0}, -1,
parent, {x, y, HWSwitches::SW_CTRL_W, 0}, -1,
adcGetMaxInputs(ADC_INPUT_FLEX) - 1,
[=]() -> int { return switchGetFlexConfig(swnum); },
[=](int newValue) {
@@ -219,11 +219,11 @@ class HWSwitch
if (val < 0) return STR_NONE;
return adcGetInputLabel(ADC_INPUT_FLEX, val);
});
x += SW_CTRL_W + PAD_MEDIUM;
x += HWSwitches::SW_CTRL_W + PAD_SMALL;
}
sw_cfg = new Choice(
parent, {x, y, SW_CTRL_W, 0},
parent, {x, y, HWSwitches::SW_CTRL_W, 0},
STR_SWTYPES, SWITCH_NONE, switchGetMaxType(swnum),
[=]() -> int { return SWITCH_CONFIG(swnum); },
[=](int newValue) {
@@ -246,8 +246,7 @@ class HWSwitch
}
}
static LAYOUT_VAL(SW_CTRL_W, 86, 75, LS(86))
static LAYOUT_VAL(SW_CTRL_H, 36, 36, 26)
static constexpr coord_t SW_CTRL_H = EdgeTxStyles::UI_ELEMENT_HEIGHT + PAD_OUTLINE;
protected:
Choice* channel = nullptr;
@@ -255,19 +254,19 @@ class HWSwitch
};
HWSwitches::HWSwitches(Window* parent) :
Window(parent, rect_t{0, 0, DIALOG_DEFAULT_WIDTH - 12, LV_SIZE_CONTENT})
Window(parent, rect_t{0, 0, LV_PCT(100), LV_SIZE_CONTENT})
{
padAll(PAD_TINY);
auto max_switches = switchGetMaxSwitches();
for (int i = 0; i < max_switches; i++) {
new HWSwitch(this, i, i * HWSwitch::SW_CTRL_H + PAD_TINY);
new HWSwitch(this, i, i * HWSwitch::SW_CTRL_H + PAD_OUTLINE);
}
}
template <class T>
HWInputDialog<T>::HWInputDialog(const char* title) :
BaseDialog(title, true)
HWInputDialog<T>::HWInputDialog(const char* title, coord_t w) :
BaseDialog(title, true, w)
{
new T(form);
}
+19 -13
View File
@@ -24,6 +24,7 @@
#include "button.h"
#include "dialog.h"
#include "form.h"
#include "toggleswitch.h"
#include <vector>
class ToggleSwitch;
@@ -34,24 +35,26 @@ class HWSticks : public Window
HWSticks(Window* parent);
};
struct HWPots : public Window
class HWPots : public Window
{
public:
HWPots(Window* parent);
// Absolute layout for Pots popup - due to performance issues with lv_textarea
// in a flex layout
static LAYOUT_VAL(P_LBL_X, 0, 0, 0)
static LAYOUT_VAL3(P_LBL_W, (DIALOG_DEFAULT_WIDTH - 45) * 2 / 11, (DIALOG_DEFAULT_WIDTH - 18) * 13 / 21, (DIALOG_DEFAULT_WIDTH - 30) * 2 / 11, (DIALOG_DEFAULT_WIDTH - 67) * 2 / 11)
static LAYOUT_VAL2(P_NM_X, P_LBL_X + P_LBL_W + PAD_MEDIUM, 100);
static LAYOUT_VAL(P_NM_W, 70, 70, LS(70))
static LAYOUT_VAL2(P_TYP_X, P_NM_X + P_NM_W, 32)
static LAYOUT_VAL(P_TYP_W, 160, P_LBL_W, LS(160))
static LAYOUT_VAL2(P_INV_X, P_TYP_X + P_TYP_W + PAD_MEDIUM, P_NM_X + P_NM_W + PAD_MEDIUM)
static LAYOUT_VAL(P_INV_W, 52, 52, LS(52))
static LAYOUT_VAL(P_ROW_H, 36, 72, 26)
static LAYOUT_VAL(P_OFST_Y, 0, 36, 0)
#define P_Y(i) (i * P_ROW_H + 2)
static LAYOUT_ORIENTATION_SCALED(P_LBL_W, 60, 120)
static constexpr coord_t P_NM_X = P_LBL_W + PAD_SMALL;
static LAYOUT_VAL_SCALED(P_NM_W, 64)
static LAYOUT_ORIENTATION(P_TYP_X, P_NM_X + P_NM_W + PAD_SMALL, LAYOUT_SCALE(32))
static LAYOUT_ORIENTATION(P_TYP_W, LAYOUT_SCALE(160), P_LBL_W)
static LAYOUT_ORIENTATION(P_INV_X, P_TYP_X + P_TYP_W + PAD_SMALL, P_NM_X + P_NM_W + PAD_SMALL)
static constexpr coord_t P_INV_W = ToggleSwitch::TOGGLE_W;
static LAYOUT_ORIENTATION(P_ROW_H, EdgeTxStyles::UI_ELEMENT_HEIGHT + PAD_OUTLINE, LAYOUT_SCALE(72))
static LAYOUT_ORIENTATION_SCALED(P_OFST_Y, 0, 36)
static LAYOUT_ORIENTATION(POTS_WINDOW_WIDTH,
P_LBL_W + P_NM_W + P_TYP_W + P_INV_W + PAD_TINY * 2 + PAD_SMALL * 5 + PAD_SCROLL,
P_LBL_W + P_NM_W + P_INV_W + PAD_TINY * 2 + PAD_SMALL * 4 + PAD_SCROLL)
#define P_Y(i) (i * P_ROW_H + PAD_TINY)
protected:
bool potsChanged;
@@ -62,9 +65,12 @@ class HWSwitches : public Window
{
public:
HWSwitches(Window* parent);
static LAYOUT_SIZE_SCALED(SW_CTRL_W, 86, 72)
static constexpr coord_t SW_WINDOW_WIDTH = SW_CTRL_W * 4 + PAD_SMALL * 5 + PAD_TINY * 2 + PAD_SCROLL;
};
template <class T>
struct HWInputDialog : public BaseDialog {
HWInputDialog(const char* title = nullptr);
HWInputDialog(const char* title, coord_t w = DIALOG_DEFAULT_WIDTH);
};
+22 -22
View File
@@ -34,28 +34,28 @@ class PreviewWindow : public Window
void setColorList(std::vector<ColorEntry> colorList);
static LAYOUT_VAL(ICON_X1, 5, 5, LS(5))
static LAYOUT_VAL(ICON_X2, 38, 38, LS(38))
static LAYOUT_VAL(ICON_X3, 71, 71, LS(71))
static LAYOUT_VAL(ICON_Y, 5, 5, LS(5))
static LAYOUT_VAL(DATE_XO, 44, 44, LS(44))
static LAYOUT_VAL(CBT_Y, 44, 44, LS(44))
static LAYOUT_VAL(CBT_W, 100, 100, LS(100))
static LAYOUT_VAL(CB1_X, 100, 100, LS(100))
static LAYOUT_VAL(CB2_X, 154, 154, LS(154))
static LAYOUT_VAL(CB_Y, 40, 40, LS(40))
static LAYOUT_VAL(CB_W, 50, 50, LS(50))
static LAYOUT_VAL(BTN_X, 210, 210, LS(210))
static LAYOUT_VAL(BTN1_Y, 40, 40, LS(40))
static LAYOUT_VAL(BTN2_Y, 79, 79, LS(79))
static LAYOUT_VAL(BTN_W, 100, 100, LS(100))
static LAYOUT_VAL(TRIM_Y, 79, 79, LS(79))
static LAYOUT_VAL(SLIDER_Y, 101, 101, LS(101))
static LAYOUT_VAL(TXT1_Y, 122, 122, LS(122))
static LAYOUT_VAL(TXT2_Y, 144, 144, LS(144))
static LAYOUT_VAL(TXT_W, 100, 100, LS(100))
static LAYOUT_VAL(EDT2_X, 114, 114, LS(114))
static LAYOUT_VAL(EDT_Y, 170, 170, LS(170))
static LAYOUT_VAL_SCALED(ICON_X1, 5)
static LAYOUT_VAL_SCALED(ICON_X2, 38)
static LAYOUT_VAL_SCALED(ICON_X3, 71)
static LAYOUT_VAL_SCALED(ICON_Y, 5)
static LAYOUT_VAL_SCALED(DATE_XO, 44)
static LAYOUT_VAL_SCALED(CBT_Y, 44)
static LAYOUT_VAL_SCALED(CBT_W, 100)
static LAYOUT_VAL_SCALED(CB1_X, 100)
static LAYOUT_VAL_SCALED(CB2_X, 154)
static LAYOUT_VAL_SCALED(CB_Y, 40)
static LAYOUT_VAL_SCALED(CB_W, 50)
static LAYOUT_VAL_SCALED(BTN_X, 210)
static LAYOUT_VAL_SCALED(BTN1_Y, 40)
static LAYOUT_VAL_SCALED(BTN2_Y, 79)
static LAYOUT_VAL_SCALED(BTN_W, 100)
static LAYOUT_VAL_SCALED(TRIM_Y, 79)
static LAYOUT_VAL_SCALED(SLIDER_Y, 101)
static LAYOUT_VAL_SCALED(TXT1_Y, 122)
static LAYOUT_VAL_SCALED(TXT2_Y, 144)
static LAYOUT_VAL_SCALED(TXT_W, 100)
static LAYOUT_VAL_SCALED(EDT2_X, 114)
static LAYOUT_VAL_SCALED(EDT_Y, 170)
protected:
tmr10ms_t ticks;
@@ -58,8 +58,8 @@ class StickCalibrationWindow : public Window
lv_obj_set_pos(calibStick->getLvObj(), dx, dy);
}
static LAYOUT_VAL(CAL_CTR, 9, 9, LS(9))
static LAYOUT_VAL(CAL_SIZ, 68, 68, LS(68))
static LAYOUT_VAL_SCALED(CAL_CTR, 9)
static LAYOUT_VAL_SCALED(CAL_SIZ, 68)
protected:
uint8_t stickX, stickY;
+12 -12
View File
@@ -32,7 +32,7 @@
#define STATSDEPTH 8 // ideally a value of power of 2
#if !PORTRAIT_LCD
#if LANDSCAPE
static const lv_coord_t col_dsc[] = {
LV_GRID_FR(32), LV_GRID_FR(40), LV_GRID_FR(40), LV_GRID_FR(40), LV_GRID_FR(40),
@@ -58,9 +58,9 @@ class AnaViewWindow : public Window
grid(col_dsc, row_dsc, PAD_ZERO)
{
parent->padAll(PAD_ZERO);
padAll(PAD_SMALL);
padLeft(PAD_LARGE);
padRight(PAD_LARGE);
padAll(PAD_TINY);
padLeft(PAD_SMALL);
padRight(PAD_SMALL);
setFlexLayout();
line = newLine(grid);
@@ -78,13 +78,13 @@ class AnaViewWindow : public Window
if (i >= pot_offset && (POT_CONFIG(i - pot_offset) == FLEX_NONE))
continue;
#if !PORTRAIT_LCD
#if LANDSCAPE
if ((i & 1) == 0) line = newLine(grid);
#else
line = newLine(grid);
#endif
lv_obj_set_style_pad_column(line->getLvObj(), 8, 0);
lv_obj_set_style_pad_column(line->getLvObj(), PAD_SMALL, LV_PART_MAIN);
if (((adcGetInputMask() & (1 << i)) != 0) && i < adcGetMaxInputs(ADC_INPUT_MAIN))
sprintf(s, "D%d :", i + 1);
else
@@ -111,7 +111,7 @@ class AnaViewWindow : public Window
std::to_string((int16_t)column4(i));
});
etx_obj_add_style(lbl->getLvObj(), (column4size() == 2) ? styles->text_align_left : styles->text_align_right, LV_PART_MAIN);
#if !PORTRAIT_LCD
#if LANDSCAPE
lv_obj_set_grid_cell(lbl->getLvObj(), LV_GRID_ALIGN_STRETCH,
3 + (i & 1) * 5, column4size(),
LV_GRID_ALIGN_CENTER, 0, 1);
@@ -166,8 +166,8 @@ class AnaCalibratedViewWindow : public AnaViewWindow
lv_obj_add_flag(touchLines[1], LV_OBJ_FLAG_HIDDEN);
line = newLine(grid);
#if PORTRAIT_LCD
line->padTop(20);
#if PORTRAIT
line->padTop(PAD_LARGE * 2 + PAD_SMALL);
#else
line->padTop(PAD_TINY);
#endif
@@ -195,7 +195,7 @@ class AnaCalibratedViewWindow : public AnaViewWindow
lv_obj_set_grid_cell(lbl2->getLvObj(), LV_GRID_ALIGN_STRETCH, 0, 5,
LV_GRID_ALIGN_CENTER, 0, 1);
#if PORTRAIT_LCD
#if PORTRAIT
line = newLine(grid);
#endif
lbl2 = new StaticText(line, rect_t{},
@@ -241,7 +241,7 @@ class AnaCalibratedViewWindow : public AnaViewWindow
}
#endif
static LAYOUT_VAL2(TSI2CEventsCol, 5, 0)
static LAYOUT_SIZE(TSI2CEventsCol, 5, 0)
protected:
#if defined(HARDWARE_TOUCH)
@@ -447,7 +447,7 @@ class AnaMinMaxViewWindow : public AnaViewWindow
AnaViewWindow::checkEvents();
}
static LAYOUT_VAL2(GRIDCOLS, 10, 5)
static LAYOUT_SIZE(GRIDCOLS, 10, 5)
};
class AnaCalibratedViewPage : public PageTab
@@ -31,9 +31,7 @@
#if defined(FUNCTION_SWITCHES_RGB_LEDS)
#include "color_list.h"
#include "hal/rgbleds.h"
#endif
#if defined(FUNCTION_SWITCHES_RGB_LEDS)
uint16_t getLedColor(int i)
{
// Convert RBG888 to RGB565
@@ -47,13 +45,13 @@ uint16_t getLedColor(int i)
class RadioCustSwitchesDiagsWindow : public Window
{
static LAYOUT_VAL(FS_1ST_COLUMN, 95, 62, LS(95))
static LAYOUT_VAL(FS_2ND_COLUMN, 160, 107, LS(160))
static LAYOUT_VAL(FS_3RD_COLUMN, 260, 173, LS(260))
static LAYOUT_VAL(FS_LBL_WIDTH, 60, 40, LS(60))
static LAYOUT_VAL_SCALED(FS_1ST_COLUMN, 95)
static LAYOUT_VAL_SCALED(FS_2ND_COLUMN, 160)
static LAYOUT_VAL_SCALED(FS_3RD_COLUMN, 260)
static LAYOUT_VAL_SCALED(FS_LBL_WIDTH, 60)
#if defined(FUNCTION_SWITCHES_RGB_LEDS)
static LAYOUT_VAL(FS_COLOR_WIDTH, 30, 30, LS(30))
static LAYOUT_VAL(FS_COLOR_HEIGHT, 15, 15, LS(15))
static LAYOUT_VAL_SCALED(FS_COLOR_WIDTH, 30)
static LAYOUT_VAL_SCALED(FS_COLOR_HEIGHT, 15)
ColorSwatch* colorBox[NUM_FUNCTIONS_SWITCHES];
#endif
@@ -93,15 +91,13 @@ class RadioCustSwitchesDiagsWindow : public Window
}
#if defined(FUNCTION_SWITCHES_RGB_LEDS)
void checkEvents() {
void checkEvents() override {
Window::checkEvents();
for (uint8_t i = 0; i < NUM_FUNCTIONS_SWITCHES; i += 1) {
colorBox[i]->setColor(getLedColor(i));
}
}
#endif
protected:
};
void RadioCustSwitchesDiagsPage::buildHeader(Window *window)
+20 -16
View File
@@ -57,27 +57,27 @@ class RadioKeyDiagsWindow : public Window
{
padAll(PAD_ZERO);
coord_t colWidth = (width() - 24) / 3;
coord_t colHeight = height() - 12;
coord_t colWidth = (width() - PAD_LARGE * 3) / 3;
coord_t colHeight = height() - PAD_LARGE - PAD_SMALL;
Window* form;
coord_t x = 6;
coord_t x = PAD_MEDIUM;
if (keysGetMaxKeys() > 0) {
form = new Window(parent, rect_t{x, 6, colWidth, colHeight});
form = new Window(parent, rect_t{x, PAD_MEDIUM, colWidth, colHeight});
etx_txt_color(form->getLvObj(), COLOR_THEME_PRIMARY1_INDEX);
addKeys(form);
x += colWidth + 6;
x += colWidth + PAD_MEDIUM;
} else {
colWidth = (width() - 18) / 2;
colWidth = (width() - PAD_MEDIUM * 3) / 2;
}
form = new Window(parent, rect_t{x, 6, colWidth, colHeight});
form = new Window(parent, rect_t{x, PAD_MEDIUM, colWidth, colHeight});
etx_txt_color(form->getLvObj(), COLOR_THEME_PRIMARY1_INDEX);
addSwitches(form);
x += colWidth + 6;
x += colWidth + PAD_MEDIUM;
form = new Window(parent, rect_t{x, 6, colWidth, colHeight});
form = new Window(parent, rect_t{x, PAD_MEDIUM, colWidth, colHeight});
etx_txt_color(form->getLvObj(), COLOR_THEME_PRIMARY1_INDEX);
addTrims(form);
}
@@ -105,7 +105,7 @@ class RadioKeyDiagsWindow : public Window
lbl = lv_label_create(obj);
lv_label_set_text(lbl, "");
lv_obj_set_pos(lbl, 70, i * EdgeTxStyles::STD_FONT_HEIGHT);
lv_obj_set_pos(lbl, KVAL_X, i * EdgeTxStyles::STD_FONT_HEIGHT);
keyValues[i] = lbl;
}
@@ -116,7 +116,7 @@ class RadioKeyDiagsWindow : public Window
reValue = lv_label_create(obj);
lv_label_set_text(reValue, "");
lv_obj_set_pos(reValue, 70, (i + 1) * EdgeTxStyles::STD_FONT_HEIGHT);
lv_obj_set_pos(reValue, KVAL_X, (i + 1) * EdgeTxStyles::STD_FONT_HEIGHT);
#endif
}
@@ -150,26 +150,26 @@ class RadioKeyDiagsWindow : public Window
lv_obj_set_pos(lbl, 0, 0);
lbl = lv_label_create(obj);
lv_label_set_text(lbl, "-");
lv_obj_set_pos(lbl, 62, 0);
lv_obj_set_pos(lbl, TRIM_MINUS_X, 0);
lbl = lv_label_create(obj);
lv_label_set_text(lbl, "+");
lv_obj_set_pos(lbl, 75, 0);
lv_obj_set_pos(lbl, TRIM_PLUS_X, 0);
// TRIMS
for (uint8_t i = 0; i < keysGetMaxTrims(); i++) {
lbl = lv_label_create(obj);
formatNumberAsString(s, 10, i + 1, 0, 10, "T");
lv_label_set_text(lbl, s);
lv_obj_set_pos(lbl, 4, i * EdgeTxStyles::STD_FONT_HEIGHT + EdgeTxStyles::STD_FONT_HEIGHT);
lv_obj_set_pos(lbl, PAD_SMALL, i * EdgeTxStyles::STD_FONT_HEIGHT + EdgeTxStyles::STD_FONT_HEIGHT);
lbl = lv_label_create(obj);
lv_label_set_text(lbl, "");
lv_obj_set_pos(lbl, 60, i * EdgeTxStyles::STD_FONT_HEIGHT + EdgeTxStyles::STD_FONT_HEIGHT);
lv_obj_set_pos(lbl, TRIM_MINUS_X - PAD_TINY, i * EdgeTxStyles::STD_FONT_HEIGHT + EdgeTxStyles::STD_FONT_HEIGHT);
trimValues[i * 2] = lbl;
lbl = lv_label_create(obj);
lv_label_set_text(lbl, "");
lv_obj_set_pos(lbl, 75, i * EdgeTxStyles::STD_FONT_HEIGHT + EdgeTxStyles::STD_FONT_HEIGHT);
lv_obj_set_pos(lbl, TRIM_PLUS_X, i * EdgeTxStyles::STD_FONT_HEIGHT + EdgeTxStyles::STD_FONT_HEIGHT);
trimValues[i * 2 + 1] = lbl;
}
}
@@ -228,6 +228,10 @@ class RadioKeyDiagsWindow : public Window
#endif
lv_obj_t **switchValues = nullptr;
lv_obj_t **trimValues = nullptr;
static LAYOUT_VAL_SCALED(KVAL_X, 70)
static LAYOUT_VAL_SCALED(TRIM_MINUS_X, 62)
static LAYOUT_VAL_SCALED(TRIM_PLUS_X, 75)
};
void RadioKeyDiagsPage::buildHeader(Window *window)
@@ -33,8 +33,6 @@ class GhostModuleConfigWindow : public Window
GhostModuleConfigWindow(Window* parent, const rect_t& rect) :
Window(parent, rect)
{
constexpr coord_t yOffset = 20;
constexpr coord_t lineSpacing = 25;
coord_t h = getFontHeight(FONT(L));
for (int i = 0; i < GHST_MENU_LINES; i += 1) {
@@ -60,8 +58,10 @@ class GhostModuleConfigWindow : public Window
}
}
static LAYOUT_VAL(xOffset, 140, 20, LS(140))
static LAYOUT_VAL(xOffset2, 260, 140, LS(260))
static LAYOUT_SIZE_SCALED(xOffset, 140, 20)
static LAYOUT_VAL_SCALED(yOffset, 20)
static LAYOUT_SIZE_SCALED(xOffset2, 260, 140)
static LAYOUT_VAL_SCALED(lineSpacing, 25)
protected:
StaticText* menuLines[GHST_MENU_LINES][2];
@@ -189,8 +189,8 @@ void RadioHardwarePage::build(Window* window)
new SetupButtonGroup(window, {0, 0, LCD_W - padding * 2, 0}, STR_INPUTS, BTN_COLS, PAD_ZERO, {
{STR_CALIBRATION, []() { new RadioCalibrationPage(); }},
{STR_STICKS, []() { new HWInputDialog<HWSticks>(STR_STICKS); }},
{STR_POTS, []() { new HWInputDialog<HWPots>(STR_POTS); }},
{STR_SWITCHES, []() { new HWInputDialog<HWSwitches>(STR_SWITCHES); }},
{STR_POTS, []() { new HWInputDialog<HWPots>(STR_POTS, HWPots::POTS_WINDOW_WIDTH); }},
{STR_SWITCHES, []() { new HWInputDialog<HWSwitches>(STR_SWITCHES, HWSwitches::SW_WINDOW_WIDTH); }},
});
// Debugs
@@ -32,8 +32,8 @@ class RadioHardwarePage : public PageTab
void build(Window* window) override;
static LAYOUT_VAL2(BTN_COLS, 4, 3)
static LAYOUT_VAL2(FS_BTN_COLS, 2, 2)
static LAYOUT_SIZE(BTN_COLS, 4, 3)
static LAYOUT_SIZE(FS_BTN_COLS, 2, 2)
protected:
void cleanup() override;

Some files were not shown because too many files have changed in this diff Show More