From 181e8ad77a44a1f8e442178e91f3eb3adfda734c Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sun, 5 Jun 2022 13:06:11 +0200 Subject: [PATCH] fix(themes): load & apply properly --- radio/src/gui/colorlcd/LvglWrapper.cpp | 129 +----------------- radio/src/gui/colorlcd/LvglWrapper.h | 2 + radio/src/gui/colorlcd/input_mix_button.cpp | 2 +- radio/src/gui/colorlcd/theme.cpp | 3 - radio/src/gui/colorlcd/themes/480_default.cpp | 1 + .../src/gui/colorlcd/themes/etx_lv_theme.cpp | 67 +++++++-- radio/src/thirdparty/libopenui | 2 +- 7 files changed, 65 insertions(+), 141 deletions(-) diff --git a/radio/src/gui/colorlcd/LvglWrapper.cpp b/radio/src/gui/colorlcd/LvglWrapper.cpp index 5c6f008a4..0aeb4ca3a 100644 --- a/radio/src/gui/colorlcd/LvglWrapper.cpp +++ b/radio/src/gui/colorlcd/LvglWrapper.cpp @@ -23,6 +23,8 @@ #include "LvglWrapper.h" #include "themes/etx_lv_theme.h" +#include "widgets/field_edit.h" + #include "view_main.h" LvglWrapper* LvglWrapper::_instance = nullptr; @@ -220,137 +222,20 @@ static void init_lvgl_drivers() keyboardDevice = lv_indev_drv_register(&keyboard_drv); } -// The theme code needs to go somewhere else (gui/colorlcd/themes/default.cpp?) -static lv_style_t menu_line_style; -static lv_style_t menu_checked_style; -static lv_style_t textedit_style_main; -static lv_style_t textedit_style_focused; -static lv_style_t textedit_style_cursor; -static lv_style_t textedit_style_cursor_edit; -static lv_style_t numberedit_style_main; -static lv_style_t numberedit_style_focused; -static lv_style_t numberedit_style_cursor; -static lv_style_t numberedit_style_cursor_edit; - - -static void theme_apply_cb(lv_theme_t * th, lv_obj_t * obj) +void initLvglTheme() { - LV_UNUSED(th); - - if (lv_obj_check_type(obj, &lv_obj_class)) { - // lv_obj_add_style(obj, &generic_style, LV_PART_MAIN); - return; - } - - lv_obj_t* parent = lv_obj_get_parent(obj); - if (parent == NULL) { - // main screen - return; - } - - if (lv_obj_check_type(obj, &lv_numberedit_class)) { - lv_obj_add_style(obj, &numberedit_style_main, LV_PART_MAIN); - lv_obj_add_style(obj, &numberedit_style_focused, LV_PART_MAIN | LV_STATE_FOCUSED); - lv_obj_add_style(obj, &numberedit_style_cursor, LV_PART_CURSOR); - lv_obj_add_style(obj, &numberedit_style_cursor_edit, LV_PART_CURSOR | LV_STATE_EDITED); - return; - } - - if (lv_obj_check_type(obj, &lv_textarea_class)) { - lv_obj_add_style(obj, &textedit_style_main, LV_PART_MAIN); - lv_obj_add_style(obj, &textedit_style_focused, LV_PART_MAIN | LV_STATE_FOCUSED); - lv_obj_add_style(obj, &textedit_style_cursor, LV_PART_CURSOR); - lv_obj_add_style(obj, &textedit_style_cursor_edit, LV_PART_CURSOR | LV_STATE_EDITED); - return; - } -} - -static void init_theme() -{ - /*Initialize the styles*/ - - // numberedit - // LV_PART_MAIN - lv_style_init(&numberedit_style_main); - lv_style_init(&numberedit_style_focused); - lv_style_init(&numberedit_style_cursor); - lv_style_init(&numberedit_style_cursor_edit); - - lv_style_set_border_width(&numberedit_style_main, 1); - lv_style_set_border_color(&numberedit_style_main, makeLvColor(COLOR_THEME_SECONDARY2)); - lv_style_set_bg_color(&numberedit_style_main, makeLvColor(COLOR_THEME_PRIMARY2)); - lv_style_set_bg_opa(&numberedit_style_main, LV_OPA_COVER); - lv_style_set_text_color(&numberedit_style_main, makeLvColor(COLOR_THEME_SECONDARY1)); - lv_style_set_pad_left(&numberedit_style_main, FIELD_PADDING_LEFT); - lv_style_set_pad_top(&numberedit_style_main, FIELD_PADDING_TOP); - - // LV_STATE_FOCUSED - lv_style_set_bg_color(&numberedit_style_focused, makeLvColor(COLOR_THEME_FOCUS)); - lv_style_set_text_color(&numberedit_style_focused, makeLvColor(COLOR_THEME_PRIMARY2)); - - // Hide cursor when not editing - lv_style_set_opa(&numberedit_style_cursor, LV_OPA_0); - - // Show Cursor in "Edit" mode - lv_style_set_opa(&numberedit_style_cursor_edit, LV_OPA_COVER); - lv_style_set_bg_opa(&numberedit_style_cursor_edit, LV_OPA_50); - - // textedit - lv_style_init(&textedit_style_main); - lv_style_init(&textedit_style_focused); - lv_style_init(&textedit_style_cursor); - lv_style_init(&textedit_style_cursor_edit); - - // textedit style main - lv_style_set_border_width(&textedit_style_main, 1); - lv_style_set_border_color(&textedit_style_main, makeLvColor(COLOR_THEME_SECONDARY2)); - lv_style_set_bg_color(&textedit_style_main, makeLvColor(COLOR_THEME_PRIMARY2)); - lv_style_set_bg_opa(&textedit_style_main, LV_OPA_COVER); - lv_style_set_text_color(&textedit_style_main, makeLvColor(COLOR_THEME_SECONDARY1)); - lv_style_set_pad_left(&textedit_style_main, FIELD_PADDING_LEFT); - lv_style_set_pad_top(&textedit_style_main, FIELD_PADDING_TOP); - - //textedit style focused - lv_style_set_bg_color(&textedit_style_focused, makeLvColor(COLOR_THEME_FOCUS)); - lv_style_set_text_color(&textedit_style_focused, makeLvColor(COLOR_THEME_PRIMARY2)); - - // hide cursor when not editing - lv_style_set_opa(&textedit_style_cursor, LV_OPA_0); - - // Show Cursor in "Edit" mode - lv_style_set_opa(&textedit_style_cursor_edit, LV_OPA_COVER); - lv_style_set_bg_opa(&textedit_style_cursor_edit, LV_OPA_50); - - // Menus - lv_style_init(&menu_line_style); - lv_style_set_bg_opa(&menu_line_style, LV_OPA_100); - lv_style_set_bg_color(&menu_line_style, makeLvColor(COLOR_THEME_PRIMARY2)); - - lv_style_init(&menu_checked_style); - lv_style_set_border_width(&menu_checked_style, 1); - lv_style_set_border_color(&menu_checked_style, makeLvColor(COLOR_THEME_FOCUS)); - lv_style_set_text_color(&menu_checked_style, makeLvColor(COLOR_THEME_PRIMARY2)); - lv_style_set_bg_color(&menu_checked_style, makeLvColor(COLOR_THEME_FOCUS)); - - /*Initialize the new theme from the current theme*/ - lv_theme_t *th_act = etx_lv_theme_init( + /* Initialize the ETX theme */ + lv_theme_t* th = etx_lv_theme_init( NULL, lv_palette_main(LV_PALETTE_BLUE), lv_palette_main(LV_PALETTE_RED), false, LV_FONT_DEFAULT); - static lv_theme_t th_new; - th_new = *th_act; - /*Set the parent theme and the style apply callback for the new theme*/ - lv_theme_set_parent(&th_new, th_act); - lv_theme_set_apply_cb(&th_new, theme_apply_cb); - - /*Assign the new theme to the current display*/ - lv_disp_set_theme(NULL, &th_new); + /* Assign the theme to the current display*/ + lv_disp_set_theme(NULL, th); } LvglWrapper::LvglWrapper() { init_lvgl_drivers(); - init_theme(); // Create main window and load that screen auto window = MainWindow::instance(); diff --git a/radio/src/gui/colorlcd/LvglWrapper.h b/radio/src/gui/colorlcd/LvglWrapper.h index 8c845f03e..1b79adc2f 100644 --- a/radio/src/gui/colorlcd/LvglWrapper.h +++ b/radio/src/gui/colorlcd/LvglWrapper.h @@ -80,4 +80,6 @@ class LvglWrapper static void runNested(); }; +void initLvglTheme(); + #endif // _LVGLWRAPPER_H_ diff --git a/radio/src/gui/colorlcd/input_mix_button.cpp b/radio/src/gui/colorlcd/input_mix_button.cpp index ba3fd56fd..2f8476c1e 100644 --- a/radio/src/gui/colorlcd/input_mix_button.cpp +++ b/radio/src/gui/colorlcd/input_mix_button.cpp @@ -42,7 +42,7 @@ void InputMixButton::value_changed(lv_event_t* e) } InputMixButton::InputMixButton(Window* parent, uint8_t index) : - Button(parent, rect_t{}, nullptr, 0, COLOR_THEME_PRIMARY1, + Button(parent, rect_t{}, nullptr, 0, 0/*COLOR_THEME_PRIMARY1*/, input_mix_line_create), index(index) { diff --git a/radio/src/gui/colorlcd/theme.cpp b/radio/src/gui/colorlcd/theme.cpp index e91c7f89f..ee1137b8a 100644 --- a/radio/src/gui/colorlcd/theme.cpp +++ b/radio/src/gui/colorlcd/theme.cpp @@ -212,9 +212,6 @@ void loadTheme() loadTheme(newTheme); else loadTheme(defaultTheme); -// else { -// loadTheme(theme); -// } } MenuWindowContent * createMenuWindow(Menu * menu) diff --git a/radio/src/gui/colorlcd/themes/480_default.cpp b/radio/src/gui/colorlcd/themes/480_default.cpp index a6be363d0..5d7d79e7d 100644 --- a/radio/src/gui/colorlcd/themes/480_default.cpp +++ b/radio/src/gui/colorlcd/themes/480_default.cpp @@ -177,6 +177,7 @@ class Theme480: public OpenTxTheme { loadIcons(reload); if (reload) loadBuiltinBitmaps(); + initLvglTheme(); } void drawBackground(BitmapBuffer * dc) const override diff --git a/radio/src/gui/colorlcd/themes/etx_lv_theme.cpp b/radio/src/gui/colorlcd/themes/etx_lv_theme.cpp index fe48f5848..64063a45b 100644 --- a/radio/src/gui/colorlcd/themes/etx_lv_theme.cpp +++ b/radio/src/gui/colorlcd/themes/etx_lv_theme.cpp @@ -11,6 +11,8 @@ #include "font.h" #include "libopenui_config.h" +#include "widgets/field_edit.h" + #include "lvgl_widgets/input_mix_line.h" #include "lvgl_widgets/input_mix_group.h" @@ -23,10 +25,10 @@ extern lv_color_t makeLvColor(uint32_t colorFlags); #define RADIUS_DEFAULT (disp_size == DISP_LARGE ? lv_disp_dpx(theme.disp, 12) : lv_disp_dpx(theme.disp, 8)) /*SCREEN*/ -#define LIGHT_COLOR_SCR lv_palette_lighten(LV_PALETTE_GREY, 4) -#define LIGHT_COLOR_CARD lv_color_white() -#define LIGHT_COLOR_TEXT lv_palette_darken(LV_PALETTE_GREY, 4) -#define LIGHT_COLOR_GREY lv_palette_lighten(LV_PALETTE_GREY, 2) +#define LIGHT_COLOR_SCR makeLvColor(COLOR_THEME_SECONDARY3) +#define LIGHT_COLOR_CARD makeLvColor(COLOR_THEME_PRIMARY2) +#define LIGHT_COLOR_TEXT makeLvColor(COLOR_THEME_PRIMARY1) +#define LIGHT_COLOR_GREY makeLvColor(COLOR_THEME_SECONDARY2) #define DARK_COLOR_SCR lv_color_hex(0x15171A) #define DARK_COLOR_CARD lv_color_hex(0x282b30) #define DARK_COLOR_TEXT lv_palette_lighten(LV_PALETTE_GREY, 5) @@ -50,6 +52,7 @@ typedef struct { lv_style_t card; lv_style_t btn; lv_style_t line_btn; + lv_style_t field; /*Utility*/ lv_style_t bg_color_primary; @@ -60,6 +63,7 @@ typedef struct { lv_style_t bg_color_white; lv_style_t bg_color_active; lv_style_t bg_color_focus; + lv_style_t bg_color_edit; lv_style_t pressed; lv_style_t disabled; lv_style_t focus_border; @@ -123,6 +127,7 @@ typedef struct { #if LV_USE_TEXTAREA lv_style_t ta_cursor, ta_placeholder; + lv_style_t field_cursor, edit_cursor; #endif #if LV_USE_CALENDAR @@ -314,6 +319,18 @@ static void style_init(void) lv_style_set_border_width(&styles.line_btn, BORDER_WIDTH); lv_style_set_border_color(&styles.line_btn, makeLvColor(COLOR_THEME_SECONDARY2)); + style_init_reset(&styles.field); + + lv_style_set_border_width(&styles.field, lv_dpx(1)); + lv_style_set_border_color(&styles.field, makeLvColor(COLOR_THEME_SECONDARY2)); + + lv_style_set_bg_color(&styles.field, makeLvColor(COLOR_THEME_PRIMARY2)); + lv_style_set_bg_opa(&styles.field, LV_OPA_COVER); + + lv_style_set_text_color(&styles.field, makeLvColor(COLOR_THEME_SECONDARY1)); + lv_style_set_pad_left(&styles.field, lv_dpx(3)); + lv_style_set_pad_top(&styles.field, lv_dpx(3)); + static lv_color_filter_dsc_t dark_filter; lv_color_filter_dsc_init(&dark_filter, dark_color_filter_cb); @@ -392,9 +409,9 @@ static void style_init(void) lv_style_set_text_color(&styles.bg_color_grey, color_text); style_init_reset(&styles.bg_color_white); - lv_style_set_bg_color(&styles.bg_color_white, color_card); + lv_style_set_bg_color(&styles.bg_color_white, makeLvColor(COLOR_THEME_PRIMARY2)); lv_style_set_bg_opa(&styles.bg_color_white, LV_OPA_COVER); - lv_style_set_text_color(&styles.bg_color_white, color_text); + lv_style_set_text_color(&styles.bg_color_white, makeLvColor(COLOR_THEME_PRIMARY1)); style_init_reset(&styles.bg_color_active); lv_style_set_bg_color(&styles.bg_color_active, makeLvColor(COLOR_THEME_ACTIVE)); @@ -406,6 +423,11 @@ static void style_init(void) lv_style_set_bg_opa(&styles.bg_color_focus, LV_OPA_COVER); lv_style_set_text_color(&styles.bg_color_focus, makeLvColor(COLOR_THEME_PRIMARY2)); + style_init_reset(&styles.bg_color_edit); + lv_style_set_bg_color(&styles.bg_color_edit, makeLvColor(COLOR_THEME_EDIT)); + lv_style_set_bg_opa(&styles.bg_color_edit, LV_OPA_COVER); + lv_style_set_text_color(&styles.bg_color_edit, makeLvColor(COLOR_THEME_PRIMARY2)); + style_init_reset(&styles.circle); lv_style_set_radius(&styles.circle, LV_RADIUS_CIRCLE); @@ -596,6 +618,15 @@ static void style_init(void) style_init_reset(&styles.ta_placeholder); lv_style_set_text_color(&styles.ta_placeholder, (theme.flags & MODE_DARK) ? lv_palette_darken(LV_PALETTE_GREY, 2) : lv_palette_lighten(LV_PALETTE_GREY, 1)); + + // field_cursor, edit_cursor + style_init_reset(&styles.field_cursor); + lv_style_set_opa(&styles.field_cursor, LV_OPA_0); + + style_init_reset(&styles.edit_cursor); + lv_style_set_opa(&styles.edit_cursor, LV_OPA_COVER); + lv_style_set_bg_opa(&styles.edit_cursor, LV_OPA_50); + #endif #if LV_USE_CALENDAR @@ -802,7 +833,7 @@ static void theme_apply(lv_theme_t * th, lv_obj_t * obj) else if(lv_obj_check_type(obj, &input_mix_line_class)) { lv_obj_add_style(obj, &styles.line_btn, 0); lv_obj_add_style(obj, &styles.pad_small, 0); - lv_obj_add_style(obj, &styles.bg_color_active, LV_STATE_CHECKED); + lv_obj_set_style_bg_color(obj, makeLvColor(COLOR_THEME_SECONDARY3), LV_STATE_CHECKED); lv_obj_add_style(obj, &styles.focus_border, LV_STATE_FOCUSED); } #endif @@ -980,15 +1011,23 @@ static void theme_apply(lv_theme_t * th, lv_obj_t * obj) #if LV_USE_TEXTAREA else if(lv_obj_check_type(obj, &lv_textarea_class)) { - // lv_obj_add_style(obj, &styles.card, 0); - // lv_obj_add_style(obj, &styles.pad_small, 0); - // lv_obj_add_style(obj, &styles.outline_primary, LV_STATE_FOCUS_KEY); - // lv_obj_add_style(obj, &styles.outline_secondary, LV_STATE_EDITED); + lv_obj_add_style(obj, &styles.card, 0); + lv_obj_add_style(obj, &styles.pad_small, 0); + lv_obj_add_style(obj, &styles.outline_primary, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &styles.outline_secondary, LV_STATE_EDITED); lv_obj_add_style(obj, &styles.scrollbar, LV_PART_SCROLLBAR); lv_obj_add_style(obj, &styles.scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); lv_obj_add_style(obj, &styles.ta_cursor, LV_PART_CURSOR | LV_STATE_FOCUSED); lv_obj_add_style(obj, &styles.ta_placeholder, LV_PART_TEXTAREA_PLACEHOLDER); } + else if(lv_obj_check_type(obj, &field_edit_class)) { + lv_obj_add_style(obj, &styles.field, 0); + lv_obj_add_style(obj, &styles.bg_color_focus, LV_STATE_FOCUSED); + lv_obj_add_style(obj, &styles.bg_color_edit, LV_STATE_EDITED); + + lv_obj_add_style(obj, &styles.field_cursor, LV_PART_CURSOR); + lv_obj_add_style(obj, &styles.edit_cursor, LV_PART_CURSOR | LV_STATE_EDITED); + } #endif #if LV_USE_CALENDAR @@ -1021,9 +1060,9 @@ static void theme_apply(lv_theme_t * th, lv_obj_t * obj) lv_obj_add_style(obj, &styles.bg_color_white, LV_PART_ITEMS); lv_obj_add_style(obj, &styles.keyboard_btn_bg, LV_PART_ITEMS); lv_obj_add_style(obj, &styles.pressed, LV_PART_ITEMS | LV_STATE_PRESSED); - lv_obj_add_style(obj, &styles.bg_color_grey, LV_PART_ITEMS | LV_STATE_CHECKED); - lv_obj_add_style(obj, &styles.bg_color_primary_muted, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); - lv_obj_add_style(obj, &styles.bg_color_secondary_muted, LV_PART_ITEMS | LV_STATE_EDITED); + lv_obj_add_style(obj, &styles.bg_color_active, LV_PART_ITEMS | LV_STATE_CHECKED); + lv_obj_add_style(obj, &styles.bg_color_focus, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &styles.bg_color_focus, LV_PART_ITEMS | LV_STATE_EDITED); } #endif #if LV_USE_LIST diff --git a/radio/src/thirdparty/libopenui b/radio/src/thirdparty/libopenui index b1fc0e138..67df92ec6 160000 --- a/radio/src/thirdparty/libopenui +++ b/radio/src/thirdparty/libopenui @@ -1 +1 @@ -Subproject commit b1fc0e1385272ef85d11af99c07da69a8f50250d +Subproject commit 67df92ec6da99315ad8f6b824f427381fb14cd8c