diff --git a/radio/src/gui/colorlcd/channel_bar.cpp b/radio/src/gui/colorlcd/channel_bar.cpp index fb64765d9dd..f7baa91733f 100644 --- a/radio/src/gui/colorlcd/channel_bar.cpp +++ b/radio/src/gui/colorlcd/channel_bar.cpp @@ -29,6 +29,12 @@ #define CHANNELS_LIMIT (g_model.extendedLimits ? LIMIT_EXT_MAX : LIMIT_STD_MAX) +LAYOUT_VAL1(VAL_W, 45) +LAYOUT_VAL1(VAL_H, 12) +LAYOUT_VAL1(VAL_XO, 5) +LAYOUT_VAL1(VAL_YO, -2) +LAYOUT_VAL1(VAL_XT, -54) + ChannelBar::ChannelBar(Window* parent, const rect_t& rect, std::function getValueFunc, LcdFlags barColor, LcdFlags txtColor) : @@ -41,13 +47,13 @@ ChannelBar::ChannelBar(Window* parent, const rect_t& rect, lv_obj_set_pos(bar, width() / 2, 0); lv_obj_set_size(bar, 0, height()); - coord_t yo = (height() < 10) ? -1 : -2; + coord_t yo = (height() < 10) ? -1 : VAL_YO; valText = lv_label_create(lvobj); - lv_obj_set_pos(valText, width() / 2 + 5, yo); - lv_obj_set_size(valText, 45, 12); + lv_obj_set_pos(valText, width() / 2 + VAL_XO, yo); + lv_obj_set_size(valText, VAL_W, VAL_H); etx_obj_add_style(valText, styles->text_align_left, LV_PART_MAIN); - lv_obj_set_style_translate_x(valText, -54, LV_STATE_USER_1); + lv_obj_set_style_translate_x(valText, VAL_XT, LV_STATE_USER_1); etx_obj_add_style(valText, styles->text_align_right, LV_STATE_USER_1); etx_font(valText, FONT_XS_INDEX); etx_txt_color(valText, indexFromColor(txtColor)); @@ -210,8 +216,6 @@ void OutputChannelBar::checkEvents() //----------------------------------------------------------------------------- -LAYOUT_VAL1(VAL_W, 45) -LAYOUT_VAL1(VAL_H, 12) LAYOUT_VAL3(ICON_SZ, 25, 16, 25) ComboChannelBar::ComboChannelBar(Window* parent, const rect_t& rect, diff --git a/radio/src/gui/colorlcd/input_edit.cpp b/radio/src/gui/colorlcd/input_edit.cpp index 8b79aa004bd..9d1fb88b149 100644 --- a/radio/src/gui/colorlcd/input_edit.cpp +++ b/radio/src/gui/colorlcd/input_edit.cpp @@ -56,9 +56,9 @@ InputEditWindow::InputEditWindow(int8_t input, uint8_t index) : etx_scrollbar(box_obj); #if PORTRAIT_LCD // portrait - box->setWidth(body->width() - 2 * lv_dpx(8)); + box->setWidth(body->width() - 2 * PAD_MEDIUM); #else // landscape - box->setHeight(body->height() - 2 * lv_dpx(8)); + box->setHeight(body->height() - 2 * PAD_MEDIUM); #endif auto form = new Window(box, rect_t{}); @@ -84,7 +84,7 @@ static const lv_coord_t row_dsc[] = {LV_GRID_CONTENT, LV_GRID_TEMPLATE_LAST}; void InputEditWindow::buildBody(Window* form) { FlexGridLayout grid(col_dsc, row_dsc, PAD_TINY); - form->setFlexLayout(); + form->setFlexLayout(LV_FLEX_FLOW_COLUMN, PAD_ZERO); ExpoData* input = expoAddress(index); diff --git a/radio/src/gui/colorlcd/list_line_button.cpp b/radio/src/gui/colorlcd/list_line_button.cpp index bbd2bf2d171..b9c2060a4fe 100644 --- a/radio/src/gui/colorlcd/list_line_button.cpp +++ b/radio/src/gui/colorlcd/list_line_button.cpp @@ -62,37 +62,31 @@ void ListLineButton::checkEvents() } // total: 92 x 17 -#define FM_CANVAS_HEIGHT 17 -#define FM_CANVAS_WIDTH 92 - -#if LCD_W > LCD_H // Landscape - -#define BTN_W 389 - -#define SRC_W 70 -#define OPT_W 171 -#define FM_X (OPT_X + OPT_W + 2) -#define FM_Y (WGT_Y + 2) - -#else // Portrait - -#define BTN_W 229 - -#define SRC_W 69 -#define OPT_W 106 +LAYOUT_VAL1(FM_CANVAS_HEIGHT, 17) +LAYOUT_VAL3(FM_CANVAS_WIDTH, 90, 57, 90) + +LAYOUT_VAL3(BTN_W, 389, 258, 229) +LAYOUT_VAL2(SRC_W, 70, 69) +LAYOUT_VAL3(OPT_W, 171, 116, 106) +LAYOUT_VAL3(LN_X, 73, 48, 73) + +#if !PORTRAIT_LCD +#define FM_X (OPT_X + OPT_W + PAD_TINY) +#define FM_Y (WGT_Y + PAD_TINY) +#else #define FM_X 12 -#define FM_Y (WGT_Y + WGT_H + 2) - +#define FM_Y (WGT_Y + WGT_H + PAD_TINY) #endif +LAYOUT_VAL3(FM_W, 8, 5, 8) -#define WGT_X 2 -#define WGT_Y 2 -#define WGT_W 42 -#define WGT_H 21 -#define SRC_X (WGT_X + WGT_W + 2) +#define WGT_X PAD_TINY +#define WGT_Y PAD_TINY +LAYOUT_VAL1(WGT_W, 42) +LAYOUT_VAL1(WGT_H, 21) +#define SRC_X (WGT_X + WGT_W + PAD_TINY) #define SRC_Y WGT_Y #define SRC_H WGT_H -#define OPT_X (SRC_X + SRC_W + 2) +#define OPT_X (SRC_X + SRC_W + PAD_TINY) #define OPT_Y WGT_Y #define OPT_H WGT_H @@ -100,7 +94,7 @@ InputMixButtonBase::InputMixButtonBase(Window* parent, uint8_t index) : ListLineButton(parent, index) { setWidth(BTN_W); - setHeight(BTN_H); + setHeight(IM_BTN_H); padAll(PAD_ZERO); weight = lv_label_create(lvobj); @@ -146,8 +140,8 @@ void InputMixButtonBase::setFlightModes(uint16_t modes) free(fm_buffer); fm_canvas = nullptr; fm_buffer = nullptr; -#if LCD_H > LCD_W - setHeight(BTN_H); +#if PORTRAIT_LCD + setHeight(IM_BTN_H); #endif return; } @@ -158,8 +152,8 @@ 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 LCD_H > LCD_W - setHeight(BTN_H + FM_CANVAS_HEIGHT + 2); +#if PORTRAIT_LCD + setHeight(IM_BTN_H + FM_CANVAS_HEIGHT + 2); #endif lv_obj_set_style_img_recolor(fm_canvas, makeLvColor(COLOR_THEME_SECONDARY1), @@ -175,7 +169,7 @@ void InputMixButtonBase::setFlightModes(uint16_t modes) coord_t x = 0; lv_canvas_copy_buf(fm_canvas, mask->data, x, 0, w, h); - x += 20; + x += (w + PAD_TINY); lv_draw_label_dsc_t label_dsc; lv_draw_label_dsc_init(&label_dsc); @@ -193,11 +187,11 @@ void InputMixButtonBase::setFlightModes(uint16_t modes) if (fm_modes & (1 << i)) { label_dsc.color = lv_color_make(0x7f, 0x7f, 0x7f); } else { - lv_canvas_draw_rect(fm_canvas, x, 0, 8, 3, &rect_dsc); + lv_canvas_draw_rect(fm_canvas, x, 0, FM_W, 3, &rect_dsc); label_dsc.color = lv_color_white(); } - lv_canvas_draw_text(fm_canvas, x, 0, 8, &label_dsc, s); - x += 8; + lv_canvas_draw_text(fm_canvas, x, 0, FM_W, &label_dsc, s); + x += FM_W; } } @@ -212,7 +206,7 @@ static const lv_obj_class_t group_class = { .destructor_cb = nullptr, .user_data = nullptr, .event_cb = nullptr, - .width_def = LCD_W - 12, + .width_def = IM_GRP_W, .height_def = LV_SIZE_CONTENT, .editable = LV_OBJ_CLASS_EDITABLE_FALSE, .group_def = LV_OBJ_CLASS_GROUP_DEF_FALSE, @@ -238,7 +232,7 @@ InputMixGroupBase::InputMixGroupBase(Window* parent, mixsrc_t idx) : void InputMixGroupBase::adjustHeight() { - if (getLineCount() == 0) setHeight(InputMixButtonBase::BTN_H + 8); + if (getLineCount() == 0) setHeight(IM_BTN_H + 8); coord_t y = 2; for (auto it = lines.cbegin(); it != lines.cend(); ++it) { diff --git a/radio/src/gui/colorlcd/list_line_button.h b/radio/src/gui/colorlcd/list_line_button.h index 6261c4ec9fd..7858734dba6 100644 --- a/radio/src/gui/colorlcd/list_line_button.h +++ b/radio/src/gui/colorlcd/list_line_button.h @@ -25,6 +25,9 @@ #include "opentx_types.h" #include "tabsgroup.h" +LAYOUT_VAL1(IM_BTN_H, 29) +#define IM_GRP_W (LCD_W - PAD_MEDIUM * 2) + class ListLineButton : public ButtonBase { public: @@ -53,8 +56,6 @@ class InputMixButtonBase : public ListLineButton void setSource(mixsrc_t idx); void setFlightModes(uint16_t modes); - static constexpr coord_t BTN_H = 29; - virtual void updatePos(coord_t x, coord_t y) = 0; virtual void swapLvglGroup(InputMixButtonBase* line2) = 0; @@ -84,8 +85,6 @@ class InputMixGroupBase : public Window void refresh(); protected: - static constexpr coord_t LN_X = 73; - mixsrc_t idx; lv_obj_t* label; std::list lines; diff --git a/radio/src/gui/colorlcd/model_flightmodes.cpp b/radio/src/gui/colorlcd/model_flightmodes.cpp index 9de758d5538..a653b37e5da 100644 --- a/radio/src/gui/colorlcd/model_flightmodes.cpp +++ b/radio/src/gui/colorlcd/model_flightmodes.cpp @@ -200,42 +200,30 @@ class FlightModeEdit : public Page uint8_t index; }; -#if LCD_W > LCD_H // Landscape - -#define BTN_H 36 -#define FMID_W 36 -#define NAME_W 95 -#define NAME_Y 8 -#define SWTCH_Y 6 -#define MAX_FMTRIMS 6 -#define TRIM_W 30 -#define TRIM_X (SWTCH_X + SWTCH_W + 2) -#define TRIM_Y 0 -#define FADE_Y 6 - -#else // Portrait - -#define BTN_H 56 -#define FMID_W 46 -#define NAME_W 160 -#define NAME_Y 0 -#define SWTCH_Y 0 -#define MAX_FMTRIMS 4 -#define TRIM_W 40 -#define TRIM_X (FMID_X + FMID_W + 2) -#define TRIM_Y 20 -#define FADE_Y 24 - +LAYOUT_VAL2(BTN_H, 36, 56) +#define FMID_X PAD_TINY +LAYOUT_VAL3(FMID_Y, 6, 3, 16) +LAYOUT_VAL2(FMID_W, 36, 46) +#define NAME_X (FMID_X + FMID_W + PAD_TINY) +LAYOUT_VAL3(NAME_Y, 8, 3, 0) +LAYOUT_VAL2(NAME_W, 95, 160) +#define SWTCH_X (NAME_X + NAME_W + PAD_TINY) +LAYOUT_VAL3(SWTCH_Y, 6, 3, 0) +LAYOUT_VAL1(SWTCH_W, 50) +LAYOUT_VAL3(MAX_FMTRIMS, 6, 6, 4) +#if PORTRAIT_LCD +#define TRIM_X (FMID_X + FMID_W + PAD_TINY) +#else +#define TRIM_X (SWTCH_X + SWTCH_W + PAD_TINY) #endif - -#define FMID_X 2 -#define FMID_Y (BTN_H / 2 - 12) -#define NAME_X (FMID_X + FMID_W + 2) -#define SWTCH_W 50 -#define SWTCH_X (NAME_X + NAME_W + 2) +LAYOUT_VAL3(TRIM_Y, 0, -1, 20) +LAYOUT_VAL2(TRIM_W, 30, 40) #define TRIMC_W (MAX_FMTRIMS * TRIM_W) -#define FADE_W 45 -#define FADE_X (TRIM_X + TRIMC_W + 2) +LAYOUT_VAL3(TRIM_H, 16, 11, 16) +#define FADE_X (TRIM_X + TRIMC_W + PAD_TINY) +LAYOUT_VAL3(FADE_Y, 6, 3, 24) +LAYOUT_VAL1(FADE_W, 45) +LAYOUT_VAL1(TRIM_CHK_H, 40) static void fm_id_constructor(const lv_obj_class_t* class_p, lv_obj_t* obj) { @@ -394,7 +382,7 @@ class FlightModeBtn : public ListLineButton fmTrimMode[i] = etx_create(&fm_trim_mode_class, lvobj); lv_obj_set_pos(fmTrimMode[i], TRIM_X + i * TRIM_W, TRIM_Y); fmTrimValue[i] = etx_create(&fm_trim_value_class, lvobj); - lv_obj_set_pos(fmTrimValue[i], TRIM_X + i * TRIM_W, TRIM_Y + 16); + lv_obj_set_pos(fmTrimValue[i], TRIM_X + i * TRIM_W, TRIM_Y + TRIM_H); } fmFadeIn = etx_create(&fm_fade_class, lvobj); @@ -502,8 +490,8 @@ 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(), 6, i * (BTN_H + 3) + 4); - btn->setWidth(LCD_W - 12); + lv_obj_set_pos(btn->getLvObj(), PAD_MEDIUM, i * (BTN_H + 3) + 4); + btn->setWidth(IM_GRP_W); btn->setPressHandler([=]() { new FlightModeEdit(i); @@ -512,7 +500,7 @@ void ModelFlightModesPage::build(Window* form) } trimCheck = new TextButton( - form, rect_t{6, MAX_FLIGHT_MODES * (BTN_H + 3) + 8, LCD_W - 12, 40}, STR_CHECKTRIMS, [&]() -> uint8_t { + form, rect_t{6, MAX_FLIGHT_MODES * (BTN_H + 3) + PAD_LARGE, IM_GRP_W, TRIM_CHK_H}, STR_CHECKTRIMS, [&]() -> uint8_t { if (trimsCheckTimer) trimsCheckTimer = 0; else diff --git a/radio/src/gui/colorlcd/model_gvars.cpp b/radio/src/gui/colorlcd/model_gvars.cpp index d50ccf5c07f..6efa0734409 100644 --- a/radio/src/gui/colorlcd/model_gvars.cpp +++ b/radio/src/gui/colorlcd/model_gvars.cpp @@ -30,7 +30,8 @@ #define SET_DIRTY() storageDirty(EE_MODEL) -LAYOUT_VAL3(BTN_H, 38, 26, 72) +LAYOUT_VAL3(BTN_H, 38, 26, (modelFMEnabled() ? 72 : 38)) +LAYOUT_VAL3(GVAR_NM_Y, 7, 4, (modelFMEnabled() ? 24 : 7)) LAYOUT_VAL2(GVAR_VAL_W, 45, 50) LAYOUT_VAL1(GVAR_NAME_SIZE, 44) @@ -39,8 +40,6 @@ LAYOUT_VAL1(GVAR_NAME_SIZE, 44) #if !PORTRAIT_LCD #define GVAR_COLS MAX_FLIGHT_MODES #else -#define BTN_H (modelFMEnabled() ? 72 : 38) -#define GVAR_VAL_W 50 #define GVAR_COLS 5 #endif @@ -73,7 +72,7 @@ static const lv_obj_class_t gv_label_class = { .user_data = nullptr, .event_cb = nullptr, .width_def = GVAR_VAL_W, - .height_def = PAGE_LINE_HEIGHT - 6, + .height_def = PAGE_LINE_HEIGHT - PAD_MEDIUM, .editable = LV_OBJ_CLASS_EDITABLE_INHERIT, .group_def = LV_OBJ_CLASS_GROUP_DEF_INHERIT, .instance_size = sizeof(lv_label_t), @@ -164,7 +163,7 @@ class GVarButton : public ListLineButton auto nm = lv_label_create(lvobj); lv_label_set_text(nm, getGVarString(index)); - lv_obj_set_pos(nm, 2, (BTN_H - PAGE_LINE_HEIGHT - 4) / 2); + lv_obj_set_pos(nm, PAD_TINY, GVAR_NM_Y); lv_obj_set_size(nm, GVAR_NAME_SIZE, PAGE_LINE_HEIGHT); if (modelFMEnabled()) { @@ -175,12 +174,12 @@ class GVarButton : public ListLineButton labelTexts[flightMode] = etx_create(&gv_label_class, lvobj); lv_label_set_text(labelTexts[flightMode], label); - lv_obj_set_pos(labelTexts[flightMode], (flightMode % GVAR_COLS) * GVAR_VAL_W + GVAR_NAME_SIZE + 4, + lv_obj_set_pos(labelTexts[flightMode], (flightMode % GVAR_COLS) * GVAR_VAL_W + GVAR_NAME_SIZE + PAD_SMALL, (flightMode / GVAR_COLS) * GVAR_VAL_H); valueTexts[flightMode] = etx_create(&gv_value_class, lvobj); - lv_obj_set_pos(valueTexts[flightMode], (flightMode % GVAR_COLS) * GVAR_VAL_W + GVAR_NAME_SIZE + 4, - (flightMode / GVAR_COLS) * GVAR_VAL_H + PAGE_LINE_HEIGHT - 6); + lv_obj_set_pos(valueTexts[flightMode], (flightMode % GVAR_COLS) * GVAR_VAL_W + GVAR_NAME_SIZE + PAD_SMALL, + (flightMode / GVAR_COLS) * GVAR_VAL_H + PAGE_LINE_HEIGHT - PAD_MEDIUM); if (flightMode == currentFlightMode) { lv_obj_add_state(valueTexts[flightMode], LV_STATE_CHECKED); @@ -191,7 +190,7 @@ class GVarButton : public ListLineButton } } else { valueTexts[0] = lv_label_create(lvobj); - lv_obj_set_pos(valueTexts[0], GVAR_NAME_SIZE + 6, (BTN_H - PAGE_LINE_HEIGHT - 4) / 2); + lv_obj_set_pos(valueTexts[0], GVAR_NAME_SIZE + PAD_MEDIUM, (BTN_H - PAGE_LINE_HEIGHT - PAD_SMALL) / 2); updateValueText(0); } @@ -484,7 +483,7 @@ void ModelGVarsPage::rebuild(Window* window) void ModelGVarsPage::build(Window* window) { - window->setFlexLayout(LV_FLEX_FLOW_COLUMN, PAD_TINY); + window->setFlexLayout(LV_FLEX_FLOW_COLUMN, PAD_TINY_GAP); for (uint8_t index = 0; index < MAX_GVARS; index++) { auto button = new GVarButton(window, rect_t{}, index); diff --git a/radio/src/gui/colorlcd/model_inputs.cpp b/radio/src/gui/colorlcd/model_inputs.cpp index 688262b4cf1..4c1db5628de 100644 --- a/radio/src/gui/colorlcd/model_inputs.cpp +++ b/radio/src/gui/colorlcd/model_inputs.cpp @@ -400,10 +400,10 @@ void ModelInputsPage::build(Window* window) // reset clipboard _copyMode = 0; - window->setFlexLayout(LV_FLEX_FLOW_COLUMN, 3); + window->setFlexLayout(LV_FLEX_FLOW_COLUMN, PAD_TINY); form = new Window(window, rect_t{}); - form->setFlexLayout(LV_FLEX_FLOW_COLUMN, 3); + form->setFlexLayout(LV_FLEX_FLOW_COLUMN, PAD_TINY); auto btn = new TextButton(window, rect_t{}, LV_SYMBOL_PLUS, [=]() { newInput(); diff --git a/radio/src/gui/colorlcd/model_logical_switches.cpp b/radio/src/gui/colorlcd/model_logical_switches.cpp index fefba82bec6..8cd409ecc35 100644 --- a/radio/src/gui/colorlcd/model_logical_switches.cpp +++ b/radio/src/gui/colorlcd/model_logical_switches.cpp @@ -294,50 +294,38 @@ void getsEdgeDelayParam(char* s, LogicalSwitchData* ls) .c_str()); } -#if LCD_W > LCD_H // Landscape - -#define LS_BUTTON_H 32 - -#define NM_Y 4 -#define NM_W 30 -#define FN_W 50 -#define V1_Y NM_Y -#define AND_X (V2_X + V2_W + 2) -#define AND_Y NM_Y -#define DUR_W 40 - -#else // Portrait - -#define LS_BUTTON_H 44 - -#define NM_Y 10 -#define NM_W 36 -#define FN_W 58 -#define V1_Y 0 -#define AND_X (FN_X + FN_W + 2) -#define AND_Y 20 -#define DUR_W 54 - +LAYOUT_VAL2(LS_BUTTON_H, 32, 44) +LAYOUT_VAL3(NM_Y, 4, 1, 10) +LAYOUT_VAL2(NM_W, 30, 36) +LAYOUT_VAL2(FN_W, 50, 58) +LAYOUT_VAL3(V1_Y, NM_Y, NM_Y, 0) +LAYOUT_VAL3(AND_Y, NM_Y, NM_Y, 20) +LAYOUT_VAL2(DUR_W, 40, 54) + +#if !PORTRAIT_LCD +#define AND_X (V2_X + V2_W + PAD_TINY) +#else +#define AND_X (FN_X + FN_W + PAD_TINY) #endif -#define NM_X 2 -#define NM_H 20 -#define FN_X (NM_X + NM_W + 2) +#define NM_X PAD_TINY +LAYOUT_VAL1(NM_H, 20) +#define FN_X (NM_X + NM_W + PAD_TINY) #define FN_Y NM_Y #define FN_H NM_H -#define V1_X (FN_X + FN_W + 2) -#define V1_W 88 +#define V1_X (FN_X + FN_W + PAD_TINY) +LAYOUT_VAL1(V1_W, 88) #define V1_H NM_H -#define V2_X (V1_X + V1_W + 2) +#define V2_X (V1_X + V1_W + PAD_TINY) #define V2_Y V1_Y -#define V2_W 110 +LAYOUT_VAL1(V2_W, 110) #define V2_H NM_H -#define AND_W 88 +#define AND_W V1_W #define AND_H NM_H -#define DUR_X (AND_X + AND_W + 2) +#define DUR_X (AND_X + AND_W + PAD_TINY) #define DUR_Y AND_Y #define DUR_H NM_H -#define DEL_X (DUR_X + DUR_W + 2) +#define DEL_X (DUR_X + DUR_W + PAD_TINY) #define DEL_Y AND_Y #define DEL_H NM_H #define DEL_W DUR_W diff --git a/radio/src/gui/colorlcd/model_mixes.cpp b/radio/src/gui/colorlcd/model_mixes.cpp index a30ce199fa3..98fc835a866 100644 --- a/radio/src/gui/colorlcd/model_mixes.cpp +++ b/radio/src/gui/colorlcd/model_mixes.cpp @@ -29,6 +29,9 @@ #define SET_DIRTY() storageDirty(EE_MODEL) +LAYOUT_VAL1(MPLEX_ICON_W, 25) +LAYOUT_VAL3(MPLEX_ICON_H, 29, 22, 29) + class MPlexIcon : public Window { public: @@ -137,7 +140,7 @@ class MixLineButton : public InputMixButtonBase { setPos(x, y); mplex->setPos(x - 28, y); - mplex->show(y > BTN_H); + mplex->show(y > IM_BTN_H); } lv_obj_t* mplexLvObj() const { return mplex->getLvObj(); } diff --git a/radio/src/gui/colorlcd/model_outputs.cpp b/radio/src/gui/colorlcd/model_outputs.cpp index 89a24785894..70ea2d62215 100644 --- a/radio/src/gui/colorlcd/model_outputs.cpp +++ b/radio/src/gui/colorlcd/model_outputs.cpp @@ -32,54 +32,43 @@ #define ETX_STATE_MINMAX_BOLD LV_STATE_USER_1 #define ETX_STATE_NAME_FONT_SMALL LV_STATE_USER_1 -#define CH_BAR_WIDTH 100 -#define CH_BAR_HEIGHT 16 - -#if LCD_W > LCD_H // Landscape - -#define CH_LINE_H 32 - -#define MIN_Y 4 -#define MAX_W 52 -#define OFF_X (MAX_X + MAX_W + 2) -#define OFF_Y 4 -#define OFF_W 44 -#define BAR_Y 6 - -#else // Portrait - -#define CH_LINE_H 50 - -#define MIN_Y 2 -#define MAX_W 60 -#define OFF_X (SRC_X + SRC_W + 2) -#define OFF_Y 24 -#define OFF_W 52 -#define BAR_Y 4 - +LAYOUT_VAL1(CH_BAR_WIDTH, 100) +LAYOUT_VAL1(CH_BAR_HEIGHT, 16) +LAYOUT_VAL2(CH_LINE_H, 32, 50) +LAYOUT_VAL3(MIN_Y, 4, 2, 2) +LAYOUT_VAL2(MAX_W, 52, 60) +#define OFF_Y MIN_Y +LAYOUT_VAL2(OFF_W, 44, 52) +#define BAR_Y PAD_MEDIUM + +#if !PORTRAIT_LCD +#define OFF_X (MAX_X + MAX_W + PAD_TINY) +#else +#define OFF_X (SRC_X + SRC_W + PAD_TINY) #endif -#define SRC_X 2 +#define SRC_X PAD_TINY #define SRC_Y 1 -#define SRC_W 80 -#define SRC_H (CH_LINE_H - 6) -#define MIN_X (SRC_X + SRC_W + 2) -#define MIN_W 52 -#define MIN_H 20 -#define MAX_X (MIN_X + MIN_W + 2) +LAYOUT_VAL1(SRC_W, 80) +#define SRC_H (CH_LINE_H - PAD_MEDIUM) +#define MIN_X (SRC_X + SRC_W + PAD_TINY) +LAYOUT_VAL1(MIN_W, 52) +LAYOUT_VAL1(MIN_H, 20) +#define MAX_X (MIN_X + MIN_W + PAD_TINY) #define MAX_Y MIN_Y -#define MAX_H 20 -#define OFF_H 20 -#define CTR_X (OFF_X + OFF_W + 2) +#define MAX_H MIN_H +#define OFF_H MIN_H +#define CTR_X (OFF_X + OFF_W + PAD_TINY) #define CTR_Y OFF_Y -#define CTR_W 60 -#define CTR_H 20 -#define REV_X (CTR_X + CTR_W + 2) +LAYOUT_VAL1(CTR_W, 60) +#define CTR_H MIN_H +#define REV_X (CTR_X + CTR_W + PAD_TINY) #define REV_Y CTR_Y -#define REV_W 16 -#define CRV_X (REV_X + REV_W + 2) +LAYOUT_VAL1(REV_W, 16) +#define CRV_X (REV_X + REV_W + PAD_TINY) #define CRV_Y (REV_Y + 1) -#define BAR_X (LCD_W - CH_BAR_WIDTH - 17) +LAYOUT_VAL1(BAR_XO, 17) +#define BAR_X (LCD_W - CH_BAR_WIDTH - BAR_XO) class OutputLineButton : public ListLineButton { @@ -242,33 +231,28 @@ ModelOutputsPage::ModelOutputsPage() : { } -#if LCD_W > LCD_H - -#define ADD_TRIMS_W ((LCD_W / 2) - 10) -#define EXLIM_X (ADD_TRIMS_X + ADD_TRIMS_W + 4) -#define EXLIM_Y 10 -#define EXLIMCB_Y 4 +LAYOUT_VAL3(ADD_TRIMS_W, (LCD_W / 2) - 10, (LCD_W / 2) - 7, LCD_W - 12) +LAYOUT_VAL2(EXLIM_Y, 10, ADD_TRIMS_X + ADD_TRIMS_H + 8) +LAYOUT_VAL2(EXLIMCB_Y, 4, ADD_TRIMS_X + ADD_TRIMS_H + 2) +#if !PORTRAIT_LCD +#define EXLIM_X (ADD_TRIMS_X + ADD_TRIMS_W + PAD_SMALL) #else - -#define ADD_TRIMS_W (LCD_W - 12) #define EXLIM_X 6 -#define EXLIM_Y (ADD_TRIMS_X + ADD_TRIMS_H + 8) -#define EXLIMCB_Y (ADD_TRIMS_X + ADD_TRIMS_H + 2) - #endif -#define ADD_TRIMS_X 6 -#define ADD_TRIMS_Y 4 -#define ADD_TRIMS_H 32 -#define EXLIM_W (EXLIMCB_X - EXLIM_X - 4) -#define EXLIM_H 20 -#define EXLIMCB_X (LCD_W - 58) -#define EXLIMCB_W 52 -#define EXLIMCB_H 32 -#define TRIMB_X 6 -#define TRIMB_Y (EXLIMCB_Y + EXLIMCB_H + 3) -#define TRIMB_W (LCD_W - 12) +#define ADD_TRIMS_X PAD_MEDIUM +#define ADD_TRIMS_Y PAD_SMALL +#define ADD_TRIMS_H UI_ELEMENT_HEIGHT +#define EXLIM_W (EXLIMCB_X - EXLIM_X - PAD_SMALL) +LAYOUT_VAL1(EXLIM_H, 20) +LAYOUT_VAL1(EXLIM_XO, 58) +#define EXLIMCB_X (LCD_W - EXLIM_XO) +LAYOUT_VAL1(EXLIMCB_W, 52) +#define EXLIMCB_H UI_ELEMENT_HEIGHT +#define TRIMB_X PAD_MEDIUM +#define TRIMB_Y (EXLIMCB_Y + EXLIMCB_H + PAD_MEDIUM / 2) +#define TRIMB_W (LCD_W - PAD_MEDIUM * 2) void ModelOutputsPage::build(Window* window) { diff --git a/radio/src/gui/colorlcd/model_telemetry.cpp b/radio/src/gui/colorlcd/model_telemetry.cpp index 132e2409c73..926fe136531 100644 --- a/radio/src/gui/colorlcd/model_telemetry.cpp +++ b/radio/src/gui/colorlcd/model_telemetry.cpp @@ -64,9 +64,13 @@ static const lv_coord_t e_col_dsc2[] = {LV_GRID_FR(4), LV_GRID_FR(3), static const lv_coord_t row_dsc[] = {LV_GRID_CONTENT, LV_GRID_TEMPLATE_LAST}; -#define BTN_H 32 -#define NUM_W 36 -#define NAME_W 56 +#define BTN_H UI_ELEMENT_HEIGHT +LAYOUT_VAL1(NUM_W, 36) +LAYOUT_VAL1(NUM_H, 20) +LAYOUT_VAL1(NAME_W, 56) +LAYOUT_VAL1(ID_Y, 17) +LAYOUT_VAL1(ID_H, 11) +LAYOUT_VAL1(FRSH_Y, 10) class TSStyle { @@ -113,7 +117,7 @@ static const lv_obj_class_t ts_num_class = { .user_data = nullptr, .event_cb = nullptr, .width_def = NUM_W, - .height_def = 20, + .height_def = NUM_H, .editable = LV_OBJ_CLASS_EDITABLE_INHERIT, .group_def = LV_OBJ_CLASS_GROUP_DEF_INHERIT, .instance_size = sizeof(lv_label_t), @@ -166,7 +170,7 @@ static const lv_obj_class_t ts_name_class = { .user_data = nullptr, .event_cb = nullptr, .width_def = NAME_W, - .height_def = 20, + .height_def = NUM_H, .editable = LV_OBJ_CLASS_EDITABLE_INHERIT, .group_def = LV_OBJ_CLASS_GROUP_DEF_INHERIT, .instance_size = sizeof(lv_label_t), @@ -193,7 +197,7 @@ static const lv_obj_class_t ts_value_class = { .user_data = nullptr, .event_cb = nullptr, .width_def = LV_SIZE_CONTENT, - .height_def = 20, + .height_def = NUM_H, .editable = LV_OBJ_CLASS_EDITABLE_INHERIT, .group_def = LV_OBJ_CLASS_GROUP_DEF_INHERIT, .instance_size = sizeof(lv_label_t), @@ -210,17 +214,30 @@ lv_obj_t* TSStyle::newValue(lv_obj_t* parent) static void ts_fresh_icon_constructor(const lv_obj_class_t* class_p, lv_obj_t* obj) { +#if LANDSCAPE_LCD_SMALL 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, + 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, }; +#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, 8, 8, LV_IMG_CF_ALPHA_8BIT); + 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); } @@ -230,8 +247,8 @@ static const lv_obj_class_t ts_fresh_icon_class = { .destructor_cb = nullptr, .user_data = nullptr, .event_cb = nullptr, - .width_def = 8, - .height_def = 8, + .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), @@ -301,27 +318,27 @@ class SensorButton : public ListLineButton init = true; numLabel = tsStyle.newNum(lvobj, index); - lv_obj_set_pos(numLabel, 2, 3); + lv_obj_set_pos(numLabel, PAD_TINY, PAD_MEDIUM/2); TelemetrySensor* sensor = &g_model.telemetrySensors[index]; if (sensor->type == TELEM_TYPE_CUSTOM) { sprintf(s, "ID: %d", sensor->instance); idLabel = tsStyle.newId(lvobj, s); - lv_obj_set_pos(idLabel, 2, 17); + lv_obj_set_pos(idLabel, PAD_TINY, ID_Y); } setNumIdState(); strAppend(s, g_model.telemetrySensors[index].label, TELEM_LABEL_LEN); lv_obj_t* nm = tsStyle.newName(lvobj, s); - lv_obj_set_pos(nm, NUM_W + 4, 3); + lv_obj_set_pos(nm, NUM_W + PAD_SMALL, PAD_MEDIUM/2); fresh = etx_create(&ts_fresh_icon_class, lvobj); - lv_obj_set_pos(fresh, NUM_W + NAME_W + 6, 10); + lv_obj_set_pos(fresh, NUM_W + NAME_W + PAD_MEDIUM, FRSH_Y); valLabel = tsStyle.newValue(lvobj); - lv_obj_set_pos(valLabel, NUM_W + NAME_W + 16, 3); + lv_obj_set_pos(valLabel, NUM_W + NAME_W + PAD_LARGE * 2, PAD_MEDIUM/2); lv_obj_update_layout(lvobj); } diff --git a/radio/src/gui/colorlcd/special_functions.cpp b/radio/src/gui/colorlcd/special_functions.cpp index 5bdff34e27b..b05dcaaf256 100644 --- a/radio/src/gui/colorlcd/special_functions.cpp +++ b/radio/src/gui/colorlcd/special_functions.cpp @@ -32,45 +32,32 @@ #define SET_DIRTY() setDirty() -#if LCD_W > LCD_H - -#define SF_BUTTON_H 32 - -#define NM_X 2 -#define NM_Y 4 -#define NM_W 43 -#define SW_Y NM_Y -#define SW_W 70 -#define FN_X (SW_X + SW_W + 2) -#define FN_Y NM_Y -#define FN_W 277 -#define RP_W 40 +LAYOUT_VAL2(SF_BUTTON_H, 32, 44) +#define NM_X PAD_TINY +LAYOUT_VAL3(NM_Y, 4, 1, 10) +LAYOUT_VAL2(NM_W, 43, 40) +LAYOUT_VAL3(SW_Y, NM_Y, NM_Y, 0) +LAYOUT_VAL2(SW_W, 70, 198) +LAYOUT_VAL3(FN_Y, NM_Y, NM_Y, 20) +LAYOUT_VAL3(FN_W, 278, 183, SW_W) +LAYOUT_VAL2(RP_W, 40, 34) +#if !PORTRAIT_LCD +#define FN_X (SW_X + SW_W + PAD_TINY) #else - -#define SF_BUTTON_H 44 - -#define NM_X 2 -#define NM_Y 10 -#define NM_W 40 -#define SW_Y 0 -#define SW_W 198 -#define FN_X (NM_X + NM_W + 2) -#define FN_Y 20 -#define FN_W SW_W -#define RP_W 34 - +#define FN_X (NM_X + NM_W + PAD_TINY) #endif -#define NM_H 20 -#define SW_X (NM_X + NM_W + 2) +LAYOUT_VAL1(NM_H, 20) +#define SW_X (NM_X + NM_W + PAD_TINY) #define SW_H NM_H #define FN_H NM_H -#define RP_X (FN_X + FN_W + 2) +#define RP_X (FN_X + FN_W + PAD_TINY) #define RP_Y NM_Y #define RP_H NM_H -#define EN_X (RP_X + RP_W + 5) -#define EN_Y NM_Y + 2 +#define EN_X (RP_X + RP_W + PAD_TINY) +#define EN_Y (NM_Y + PAD_TINY_GAP) +LAYOUT_VAL1(EN_SZ, 16) //----------------------------------------------------------------------------- @@ -104,8 +91,8 @@ static const lv_obj_class_t sf_enable_state = { .destructor_cb = nullptr, .user_data = nullptr, .event_cb = nullptr, - .width_def = 16, - .height_def = 16, + .width_def = EN_SZ, + .height_def = EN_SZ, .editable = LV_OBJ_CLASS_EDITABLE_FALSE, .group_def = LV_OBJ_CLASS_GROUP_DEF_FALSE, .instance_size = sizeof(lv_obj_t), diff --git a/radio/src/gui/colorlcd/themes/etx_lv_theme.h b/radio/src/gui/colorlcd/themes/etx_lv_theme.h index bed52a212ce..646ae4eaaf0 100644 --- a/radio/src/gui/colorlcd/themes/etx_lv_theme.h +++ b/radio/src/gui/colorlcd/themes/etx_lv_theme.h @@ -37,6 +37,7 @@ enum PaddingSize { PAD_ZERO = 0, PAD_TINY = 1, + PAD_TINY_GAP = 2, PAD_SMALL = 3, PAD_MEDIUM = 4, PAD_LARGE = 6 @@ -45,6 +46,7 @@ enum PaddingSize { enum PaddingSize { PAD_ZERO = 0, PAD_TINY = 2, + PAD_TINY_GAP = 2, PAD_SMALL = 4, PAD_MEDIUM = 6, PAD_LARGE = 8