From 0ab6433c66481b810dec0ff893cc433c7f0ef2ff Mon Sep 17 00:00:00 2001 From: Gabor Kiss-Vamosi Date: Fri, 26 Feb 2021 09:51:27 +0100 Subject: [PATCH] assign theme to the display + minor fixes --- examples/widgets/bar/lv_example_bar_6.c | 2 +- examples/widgets/label/lv_example_label_1.c | 2 +- lv_conf_template.h | 19 ---- src/extra/layouts/flex/lv_flex.c | 13 ++- src/extra/layouts/grid/lv_grid.c | 67 ++++++++++++-- src/extra/layouts/grid/lv_grid.h | 10 ++- src/extra/themes/default/lv_theme_default.c | 89 +++++++++++-------- src/extra/themes/default/lv_theme_default.h | 7 +- src/extra/widgets/calendar/lv_calendar.c | 4 +- .../calendar/lv_calendar_header_arrow.c | 2 +- src/extra/widgets/led/lv_led.c | 2 +- src/extra/widgets/list/lv_list.c | 4 +- src/extra/widgets/msgbox/lv_msgbox.c | 2 +- src/lv_api_map.h | 2 + src/lv_conf_internal.h | 67 -------------- src/lv_core/lv_disp.c | 23 ++++- src/lv_core/lv_disp.h | 16 +++- src/lv_core/lv_indev.c | 34 +++---- src/lv_core/lv_obj.c | 16 +--- src/lv_core/lv_obj.h | 4 +- src/lv_core/lv_obj_pos.c | 2 +- src/lv_core/lv_refr.c | 10 +-- src/lv_core/lv_theme.c | 62 +++++-------- src/lv_core/lv_theme.h | 19 ++-- src/lv_draw/lv_draw_label.c | 2 +- src/lv_draw/lv_draw_rect.c | 2 +- src/lv_hal/lv_hal_disp.c | 18 +++- src/lv_hal/lv_hal_disp.h | 51 ++++++----- src/lv_hal/lv_hal_indev.h | 9 +- src/lv_misc/lv_style.c | 2 +- src/lv_misc/lv_style.h | 6 +- src/lv_widgets/lv_label.c | 12 +-- src/lv_widgets/lv_label.h | 12 +-- src/lv_widgets/lv_slider.c | 1 + src/lv_widgets/lv_switch.c | 1 + 35 files changed, 301 insertions(+), 293 deletions(-) diff --git a/examples/widgets/bar/lv_example_bar_6.c b/examples/widgets/bar/lv_example_bar_6.c index 17715e2a7..ba442b905 100644 --- a/examples/widgets/bar/lv_example_bar_6.c +++ b/examples/widgets/bar/lv_example_bar_6.c @@ -13,7 +13,7 @@ static void event_cb(lv_obj_t * obj, lv_event_t e) lv_draw_label_dsc_t dsc; lv_draw_label_dsc_init(&dsc); - dsc.font = LV_THEME_FONT_NORMAL; + dsc.font = LV_FONT_DEFAULT; char buf[8]; lv_snprintf(buf, sizeof(buf), "%d", lv_bar_get_value(obj)); diff --git a/examples/widgets/label/lv_example_label_1.c b/examples/widgets/label/lv_example_label_1.c index 519cc1b05..d7fcebef8 100644 --- a/examples/widgets/label/lv_example_label_1.c +++ b/examples/widgets/label/lv_example_label_1.c @@ -17,7 +17,7 @@ void lv_example_label_1(void) lv_obj_t * label2 = lv_label_create(lv_scr_act(), NULL); - lv_label_set_long_mode(label2, LV_LABEL_LONG_SROLL_CIRC); /*Circular scroll*/ + lv_label_set_long_mode(label2, LV_LABEL_LONG_SCROLL_CIRCULAR); /*Circular scroll*/ lv_obj_set_width(label2, 150); lv_label_set_text(label2, "It is a circularly scrolling text. "); lv_obj_align(label2, NULL, LV_ALIGN_CENTER, 0, 40); diff --git a/lv_conf_template.h b/lv_conf_template.h index 3d1a7e905..87d553b3e 100644 --- a/lv_conf_template.h +++ b/lv_conf_template.h @@ -345,25 +345,6 @@ typedef void * lv_user_data_t; * In these languages characters should be replaced with an other form based on their position in the text */ #define LV_USE_ARABIC_PERSIAN_CHARS 0 - -/*================== - * THEME USAGE - *================*/ -/*Set the very basic the attributes*/ -#define LV_THEME_COLOR_PRIMARY lv_color_hex(0x01a2b1) -#define LV_THEME_COLOR_SECONDARY lv_color_hex(0x44d1b6) -#define LV_THEME_FONT_SMALL &lv_font_montserrat_14 -#define LV_THEME_FONT_NORMAL &lv_font_montserrat_14 -#define LV_THEME_FONT_LARGE &lv_font_montserrat_14 -#define LV_THEME_FONT_EXTRA_LARGE &lv_font_montserrat_14 - -/* An external include file required to see the theme init function. - * Relative to "lv_core/lv_obj" */ -#define LV_THEME_INIT_INCLUDE "../extra/themes/lv_themes.h" - -/* Set a theme initialization function */ -#define LV_THEME_INIT lv_theme_default_init - /*================== * WIDGET USAGE *================*/ diff --git a/src/extra/layouts/flex/lv_flex.c b/src/extra/layouts/flex/lv_flex.c index c379a1b3e..f4820d2a5 100644 --- a/src/extra/layouts/flex/lv_flex.c +++ b/src/extra/layouts/flex/lv_flex.c @@ -239,6 +239,10 @@ static void flex_update(lv_obj_t * cont, lv_obj_t * item) } } LV_ASSERT_MEM_INTEGRITY(); + + if(cont->w_set == LV_SIZE_CONTENT || cont->h_set == LV_SIZE_CONTENT) { + lv_obj_set_size(cont, cont->w_set, cont->h_set); + } } /** @@ -268,7 +272,9 @@ static int32_t find_track_end(lv_obj_t * cont, int32_t item_start_id, lv_coord_t lv_obj_t * item = lv_obj_get_child(cont, item_id); while(item) { - if(lv_obj_has_flag(item, LV_OBJ_FLAG_LAYOUTABLE) && !lv_obj_has_flag(item, LV_OBJ_FLAG_HIDDEN)) { + if(!lv_obj_has_flag(item, LV_OBJ_FLAG_IGNORE_LAYOUT) && !lv_obj_has_flag(item, LV_OBJ_FLAG_HIDDEN)) { + if(item_id != item_start_id && lv_obj_has_flag(item, LV_OBJ_FLAG_LAYOUT_1)) break; + lv_coord_t main_size = (row ? item->w_set : item->h_set); if(_LV_FLEX_GET_GROW(main_size)) { grow_sum += _LV_FLEX_GET_GROW(main_size); @@ -279,8 +285,11 @@ static int32_t find_track_end(lv_obj_t * cont, int32_t item_start_id, lv_coord_t if(wrap && t->track_main_size + item_size > max_main_size) break; t->track_main_size += item_size + item_gap; } + + t->track_cross_size = LV_MAX(get_cross_size(item), t->track_cross_size); t->item_cnt++; + } item_id += f->rev ? -1 : +1; if(item_id < 0) break; @@ -336,7 +345,7 @@ static void children_repos(lv_obj_t * cont, int32_t item_first_id, int32_t item_ lv_obj_t * item = lv_obj_get_child(cont, item_first_id); /*Reposition the children*/ while(item && item_first_id != item_last_id) { - if(!lv_obj_has_flag(item, LV_OBJ_FLAG_LAYOUTABLE) || lv_obj_has_flag(item, LV_OBJ_FLAG_HIDDEN)) { + if(lv_obj_has_flag(item, LV_OBJ_FLAG_IGNORE_LAYOUT) || lv_obj_has_flag(item, LV_OBJ_FLAG_HIDDEN)) { item = get_next_item(cont, f->rev, &item_first_id); continue; } diff --git a/src/extra/layouts/grid/lv_grid.c b/src/extra/layouts/grid/lv_grid.c index d464b71f9..98289b8d8 100644 --- a/src/extra/layouts/grid/lv_grid.c +++ b/src/extra/layouts/grid/lv_grid.c @@ -20,7 +20,8 @@ #define CELL_SPAN_MASK (CELL_POS_MASK << CELL_SHIFT) #define CELL_FLAG_MASK (CELL_POS_MASK << (2 * CELL_SHIFT)) -#define IS_FR(x) (LV_COORD_IS_LAYOUT(x)) +#define IS_FR(x) (LV_COORD_IS_LAYOUT(x) && _LV_COORD_PLAIN(x) < 100) +#define IS_CONTENT(x) (LV_COORD_IS_LAYOUT(x) && _LV_COORD_PLAIN(x) == 100) #define GET_FR(x) (_LV_COORD_PLAIN(x)) @@ -96,8 +97,8 @@ void lv_grid_set_place(lv_grid_t * grid, uint8_t col_place, uint8_t row_place) grid->row_place = row_place; } -void lv_obj_set_grid_cell(lv_obj_t * obj, lv_grid_place_t ver_place, uint8_t col_pos, uint8_t col_span, - lv_grid_place_t hor_place, uint8_t row_pos, uint8_t row_span) +void lv_obj_set_grid_cell(lv_obj_t * obj, lv_grid_place_t hor_place, uint8_t col_pos, uint8_t col_span, + lv_grid_place_t ver_place, uint8_t row_pos, uint8_t row_span) { if(!lv_obj_is_layout_positioned(obj)) return; @@ -177,6 +178,10 @@ static void item_refr(lv_obj_t * item) item_repos(item, &c, NULL); calc_free(&c); + + if(cont->w_set == LV_SIZE_CONTENT || cont->h_set == LV_SIZE_CONTENT) { + lv_obj_set_size(cont, cont->w_set, cont->h_set); + } } /** @@ -237,6 +242,28 @@ static void calc_cols(lv_obj_t * cont, _lv_grid_calc_t * c) c->x = lv_mem_buf_get(sizeof(lv_coord_t) * c->col_num); c->w = lv_mem_buf_get(sizeof(lv_coord_t) * c->col_num); + /*Set sizes for CONTENT cells*/ + for(i = 0; i < c->col_num; i++) { + lv_coord_t size = LV_COORD_MIN; + if(IS_CONTENT(grid->col_dsc[i])) { + /*Check the size of children of this cell*/ + uint32_t ci; + for(ci = 0; ci < lv_obj_get_child_cnt(cont); ci++) { + lv_obj_t * item = lv_obj_get_child(cont, ci); + if(LV_COORD_IS_LAYOUT(item->x_set) == false || LV_COORD_IS_LAYOUT(item->y_set) == false) continue; + if(lv_obj_has_flag(item, LV_OBJ_FLAG_IGNORE_LAYOUT)) continue; + uint32_t col_pos = GET_CELL_POS(item->x_set); + if(col_pos != i) continue; + uint32_t col_span = GET_CELL_SPAN(item->x_set); + if(col_span != 1) continue; + + size = LV_MAX(size, lv_obj_get_width(item)); + } + if(size >= 0) c->w[i] = size; + else c->w[i] = 0; + } + } + uint32_t col_fr_cnt = 0; lv_coord_t grid_w = 0; bool auto_w = cont->w_set == LV_SIZE_CONTENT ? true : false; @@ -244,7 +271,9 @@ static void calc_cols(lv_obj_t * cont, _lv_grid_calc_t * c) for(i = 0; i < c->col_num; i++) { lv_coord_t x = grid->col_dsc[i]; if(IS_FR(x)) col_fr_cnt += GET_FR(x); - else { + else if (IS_CONTENT(x)) { + grid_w += c->w[i]; + } else { c->w[i] = x; grid_w += x; } @@ -274,17 +303,39 @@ static void calc_rows(lv_obj_t * cont, _lv_grid_calc_t * c) c->row_num = grid->row_dsc_len; c->y = lv_mem_buf_get(sizeof(lv_coord_t) * c->row_num); c->h = lv_mem_buf_get(sizeof(lv_coord_t) * c->row_num); + /*Set sizes for CONTENT cells*/ + for(i = 0; i < c->row_num; i++) { + lv_coord_t size = LV_COORD_MIN; + if(IS_CONTENT(grid->row_dsc[i])) { + /*Check the size of children of this cell*/ + uint32_t ci; + for(ci = 0; ci < lv_obj_get_child_cnt(cont); ci++) { + lv_obj_t * item = lv_obj_get_child(cont, ci); + if(LV_COORD_IS_LAYOUT(item->x_set) == false || LV_COORD_IS_LAYOUT(item->y_set) == false) continue; + if(lv_obj_has_flag(item, LV_OBJ_FLAG_IGNORE_LAYOUT)) continue; + uint32_t row_pos = GET_CELL_POS(item->y_set); + if(row_pos != i) continue; + uint32_t row_span = GET_CELL_SPAN(item->y_set); + if(row_span != 1) continue; + + size = LV_MAX(size, lv_obj_get_height(item)); + } + if(size >= 0) c->h[i] = size; + else c->h[i] = 0; + } + } uint32_t row_fr_cnt = 0; lv_coord_t grid_h = 0; bool auto_h = cont->h_set == LV_SIZE_CONTENT ? true : false; - - for(i = 0; i < grid->row_dsc_len; i++) { + for(i = 0; i < c->row_num; i++) { lv_coord_t x = grid->row_dsc[i]; if(IS_FR(x)) row_fr_cnt += GET_FR(x); - else { + else if (IS_CONTENT(x)) { + grid_h += c->h[i]; + } else { c->h[i] = x; grid_h += x; } @@ -316,7 +367,7 @@ static void calc_rows(lv_obj_t * cont, _lv_grid_calc_t * c) static void item_repos(lv_obj_t * item, _lv_grid_calc_t * c, item_repos_hint_t * hint) { if(LV_COORD_IS_LAYOUT(item->x_set) == 0 || LV_COORD_IS_LAYOUT(item->y_set) == 0) return; - if(lv_obj_has_flag(item, LV_OBJ_FLAG_LAYOUTABLE) == false) return; + if(lv_obj_has_flag(item, LV_OBJ_FLAG_IGNORE_LAYOUT)) return; uint32_t col_span = GET_CELL_SPAN(item->x_set); uint32_t row_span = GET_CELL_SPAN(item->y_set); if(row_span == 0 || col_span == 0) return; diff --git a/src/extra/layouts/grid/lv_grid.h b/src/extra/layouts/grid/lv_grid.h index 436a86d94..ae2940ad5 100644 --- a/src/extra/layouts/grid/lv_grid.h +++ b/src/extra/layouts/grid/lv_grid.h @@ -91,15 +91,15 @@ void lv_grid_set_place(lv_grid_t * grid, uint8_t col_place, uint8_t row_place); /** * Set the cell of an object. The object's parent needs to have grid layout, else nothing will happen * @param obj: pointer to an object - * @param ver_place: the vertical alignment in the cell. `LV_GRID_START/END/CENTER/STRETCH` + * @param hor_place: the vertical alignment in the cell. `LV_GRID_START/END/CENTER/STRETCH` * @param col_pos: column ID * @param col_span: number of columns to take (>= 1) - * @param hor_place the horizontal alignment in the cell. `LV_GRID_START/END/CENTER/STRETCH` + * @param ver_place the horizontal alignment in the cell. `LV_GRID_START/END/CENTER/STRETCH` * @param row_pos: row ID * @param row_span: number of rows to take (>= 1) */ -void lv_obj_set_grid_cell(struct _lv_obj_t * obj, lv_grid_place_t ver_place, uint8_t col_pos, uint8_t col_span, - lv_grid_place_t hor_place, uint8_t row_pos, uint8_t row_span); +void lv_obj_set_grid_cell(struct _lv_obj_t * obj, lv_grid_place_t hor_place, uint8_t col_pos, uint8_t col_span, + lv_grid_place_t ver_place, uint8_t row_pos, uint8_t row_span); /** * Can be used track size to make the track fill the free space. @@ -108,6 +108,8 @@ void lv_obj_set_grid_cell(struct _lv_obj_t * obj, lv_grid_place_t ver_place, uin */ #define LV_GRID_FR(x) (LV_COORD_SET_LAYOUT(x)) +#define LV_GRID_CONTENT (LV_COORD_SET_LAYOUT(100)) + /** * Just a wrapper to `LV_GRID_FR` for bindings. */ diff --git a/src/extra/themes/default/lv_theme_default.c b/src/extra/themes/default/lv_theme_default.c index ca7d336b7..c258bf0fc 100644 --- a/src/extra/themes/default/lv_theme_default.c +++ b/src/extra/themes/default/lv_theme_default.c @@ -21,11 +21,10 @@ * DEFINES *********************/ -#define RADIUS_DEFAULT LV_DPX(8) +#define RADIUS_DEFAULT LV_DPX(10) /*SCREEN*/ -//#define COLOR_SCR (IS_LIGHT ? lv_color_hex(0xf5f8fa) : lv_color_hex(0x444b5a)) -#define COLOR_SCR (IS_LIGHT ? lv_color_blue_grey_lighten_5() : lv_color_hex(0x444b5a)) +#define COLOR_SCR (IS_LIGHT ? lv_color_grey_lighten_5() : lv_color_hex(0x444b5a)) #define COLOR_SCR_TEXT (IS_LIGHT ? lv_color_hex(0x3b3e42) : lv_color_hex(0xe7e9ec)) /*BUTTON*/ @@ -38,9 +37,6 @@ #define BTN_DIS_COLOR (lv_color_lighten(theme.color_secondary, LV_OPA_40)) #define BTN_BORDER_COLOR theme.color_primary -#define COLOR_BTN_BORDER_PR theme.color_primary -#define COLOR_BTN_BORDER_CHK theme.color_primary -#define COLOR_BTN_BORDER_CHK_PR theme.color_primary #define COLOR_BTN_BORDER_INA (IS_LIGHT ? lv_color_hex3(0x888) : lv_color_hex(0x404040)) /*BACKGROUND*/ @@ -88,9 +84,10 @@ typedef struct { /*Utility*/ lv_style_t bg_color_primary; + lv_style_t bg_color_primary_light; lv_style_t bg_color_secondary; lv_style_t bg_color_gray; - lv_style_t bg_color_panel; + lv_style_t bg_color_white; lv_style_t pressed; lv_style_t disabled; lv_style_t pad_zero; @@ -129,10 +126,6 @@ typedef struct { lv_style_t cb_marker, cb_marker_checked, cb_bg_outline_pad; #endif -#if LV_USE_DROPDOWN - lv_style_t ddlist_flip; -#endif - #if LV_USE_TABLE lv_style_t table_cell; #endif @@ -161,6 +154,9 @@ typedef struct { lv_style_t list_bg, list_btn, list_item_grow, list_label; #endif +#if LV_USE_TABVIEW + lv_style_t tab_btn; +#endif #if LV_USE_LED lv_style_t led; #endif @@ -268,9 +264,15 @@ static void style_init(void) lv_style_set_outline_opa(&styles->edit_outline, LV_OPA_50); style_init_reset(&styles->btn); - lv_style_set_radius(&styles->btn, RADIUS_DEFAULT); + lv_style_set_radius(&styles->btn, LV_DPX(14)); lv_style_set_bg_opa(&styles->btn, LV_OPA_COVER); lv_style_set_bg_color(&styles->btn, COLOR_GRAY); + lv_style_set_shadow_color(&styles->btn, COLOR_GRAY); + lv_style_set_shadow_width(&styles->btn, 1); + lv_style_set_shadow_ofs_y(&styles->btn, LV_DPX(4)); +// lv_style_set_border_color(&styles->btn, COLOR_GRAY); +// lv_style_set_border_width(&styles->btn, 4); +// lv_style_set_border_side(&styles->btn, LV_BORDER_SIDE_BOTTOM); lv_style_set_text_color(&styles->btn, CARD_TEXT_COLOR); lv_style_set_pad_hor(&styles->btn, LV_DPX(40)); lv_style_set_pad_ver(&styles->btn, LV_DPX(15)); @@ -326,6 +328,12 @@ static void style_init(void) lv_style_set_content_color(&styles->bg_color_primary, lv_color_white()); lv_style_set_bg_opa(&styles->bg_color_primary, LV_OPA_COVER); + style_init_reset(&styles->bg_color_primary_light); + lv_style_set_bg_color(&styles->bg_color_primary_light, lv_color_lighten(theme.color_primary, LV_OPA_90)); + lv_style_set_text_color(&styles->bg_color_primary_light, theme.color_primary); + lv_style_set_content_color(&styles->bg_color_primary_light, theme.color_primary); + lv_style_set_bg_opa(&styles->bg_color_primary_light, LV_OPA_COVER); + style_init_reset(&styles->bg_color_secondary); lv_style_set_bg_color(&styles->bg_color_secondary, theme.color_secondary); lv_style_set_text_color(&styles->bg_color_secondary, lv_color_white()); @@ -338,11 +346,11 @@ static void style_init(void) lv_style_set_text_color(&styles->bg_color_gray, CARD_TEXT_COLOR); lv_style_set_content_color(&styles->bg_color_gray, CARD_TEXT_COLOR); - style_init_reset(&styles->bg_color_panel); - lv_style_set_bg_color(&styles->bg_color_panel, lv_color_white()); - lv_style_set_bg_opa(&styles->bg_color_panel, LV_OPA_COVER); - lv_style_set_text_color(&styles->bg_color_panel, CARD_TEXT_COLOR); - lv_style_set_content_color(&styles->bg_color_panel, CARD_TEXT_COLOR); + style_init_reset(&styles->bg_color_white); + lv_style_set_bg_color(&styles->bg_color_white, lv_color_white()); + lv_style_set_bg_opa(&styles->bg_color_white, LV_OPA_COVER); + lv_style_set_text_color(&styles->bg_color_white, CARD_TEXT_COLOR); + lv_style_set_content_color(&styles->bg_color_white, CARD_TEXT_COLOR); style_init_reset(&styles->circle); lv_style_set_radius(&styles->circle, LV_RADIUS_CIRCLE); @@ -375,11 +383,6 @@ static void style_init(void) lv_style_set_arc_color(&styles->arc_indic_primary, theme.color_primary); #endif -#if LV_USE_DROPDOWN - style_init_reset(&styles->ddlist_flip); - lv_style_set_transform_angle(&styles->ddlist_flip, 1800); -#endif - #if LV_USE_CHECKBOX style_init_reset(&styles->cb_marker); lv_style_set_pad_all(&styles->cb_marker, LV_DPX(3)); @@ -466,6 +469,12 @@ static void style_init(void) lv_style_set_pad_all(&styles->msgbox_btns_bg, OUTLINE_WIDTH); #endif +#if LV_USE_TABVIEW + style_init_reset(&styles->tab_btn); + lv_style_set_border_color(&styles->tab_btn, theme.color_primary); + lv_style_set_border_width(&styles->tab_btn, lv_dpx(3)); + lv_style_set_border_side(&styles->tab_btn, LV_BORDER_SIDE_BOTTOM); +#endif #if LV_USE_LIST style_init_reset(&styles->list_bg); lv_style_set_pad_hor(&styles->list_bg, PAD_DEF); @@ -502,9 +511,9 @@ static void style_init(void) * GLOBAL FUNCTIONS **********************/ -lv_theme_t * lv_theme_default_init(lv_color_t color_primary, lv_color_t color_secondary, +lv_theme_t * lv_theme_default_init(lv_disp_t * disp, lv_color_t color_primary, lv_color_t color_secondary, const lv_font_t * font_small, const lv_font_t * font_normal, - const lv_font_t * font_large, const lv_font_t * font_extra_large) + const lv_font_t * font_large) { /* This trick is required only to avoid the garbage collection of @@ -515,12 +524,12 @@ lv_theme_t * lv_theme_default_init(lv_color_t color_primary, lv_color_t color_se styles = (my_theme_styles_t *)LV_GC_ROOT(_lv_theme_default_styles); } + theme.disp = disp; theme.color_primary = color_primary; theme.color_secondary = color_secondary; theme.font_small = font_small; theme.font_normal = font_normal; theme.font_large = font_large; - theme.font_extra_large = font_extra_large; theme.apply_cb = theme_apply; style_init(); @@ -530,6 +539,11 @@ lv_theme_t * lv_theme_default_init(lv_color_t color_primary, lv_color_t color_se return (lv_theme_t *)&theme; } +bool lv_theme_default_is_inited(void) +{ + return inited; +} + static void theme_apply(lv_theme_t * th, lv_obj_t * obj) { @@ -587,7 +601,7 @@ static void theme_apply(lv_theme_t * th, lv_obj_t * obj) #if LV_USE_LIST /*Add different buttons to the lists*/ if(lv_obj_check_type(lv_obj_get_parent(obj), &lv_list_class)) { - lv_obj_add_style(obj, LV_PART_MAIN, LV_STATE_DEFAULT, &styles->bg_color_panel); + lv_obj_add_style(obj, LV_PART_MAIN, LV_STATE_DEFAULT, &styles->bg_color_white); lv_obj_add_style(obj, LV_PART_MAIN, LV_STATE_DEFAULT, &styles->list_btn); lv_obj_add_style(obj, LV_PART_MAIN, LV_STATE_FOCUS_KEY, &styles->bg_color_primary); lv_obj_add_style(obj, LV_PART_MAIN, LV_STATE_FOCUS_KEY, &styles->list_item_grow); @@ -625,10 +639,11 @@ static void theme_apply(lv_theme_t * th, lv_obj_t * obj) #endif #if LV_USE_TABVIEW if(lv_obj_check_type(lv_obj_get_parent(obj), &lv_tabview_class)) { - lv_obj_add_style(obj, LV_PART_MAIN, LV_STATE_DEFAULT, &styles->bg_color_panel); - lv_obj_add_style(obj, LV_PART_ITEMS, LV_STATE_DEFAULT, &styles->bg_color_gray); + lv_obj_add_style(obj, LV_PART_MAIN, LV_STATE_DEFAULT, &styles->bg_color_white); + lv_obj_add_style(obj, LV_PART_ITEMS, LV_STATE_DEFAULT, &styles->bg_color_white); lv_obj_add_style(obj, LV_PART_ITEMS, LV_STATE_PRESSED, &styles->pressed); - lv_obj_add_style(obj, LV_PART_ITEMS, LV_STATE_CHECKED, &styles->bg_color_panel); + lv_obj_add_style(obj, LV_PART_ITEMS, LV_STATE_CHECKED, &styles->bg_color_primary_light); + lv_obj_add_style(obj, LV_PART_ITEMS, LV_STATE_CHECKED, &styles->tab_btn); return; } #endif @@ -678,7 +693,7 @@ static void theme_apply(lv_theme_t * th, lv_obj_t * obj) lv_obj_add_style(obj, LV_PART_MAIN, LV_STATE_DEFAULT, &styles->no_radius); lv_obj_add_style(obj, LV_PART_SCROLLBAR, LV_STATE_DEFAULT, &styles->scrollbar); lv_obj_add_style(obj, LV_PART_SCROLLBAR, LV_STATE_SCROLLED, &styles->scrollbar_scrolled); - lv_obj_add_style(obj, LV_PART_ITEMS, LV_STATE_DEFAULT, &styles->bg_color_panel); + lv_obj_add_style(obj, LV_PART_ITEMS, LV_STATE_DEFAULT, &styles->bg_color_white); lv_obj_add_style(obj, LV_PART_ITEMS, LV_STATE_DEFAULT, &styles->table_cell); lv_obj_add_style(obj, LV_PART_ITEMS, LV_STATE_DEFAULT, &styles->pad_normal); lv_obj_add_style(obj, LV_PART_ITEMS, LV_STATE_PRESSED, &styles->pressed); @@ -715,7 +730,7 @@ static void theme_apply(lv_theme_t * th, lv_obj_t * obj) lv_obj_add_style(obj, LV_PART_INDICATOR, LV_STATE_DEFAULT, &styles->circle); lv_obj_add_style(obj, LV_PART_INDICATOR, LV_STATE_DISABLED, &styles->disabled); lv_obj_add_style(obj, LV_PART_KNOB, LV_STATE_DEFAULT, &styles->knob); - lv_obj_add_style(obj, LV_PART_KNOB, LV_STATE_DEFAULT, &styles->bg_color_panel); + lv_obj_add_style(obj, LV_PART_KNOB, LV_STATE_DEFAULT, &styles->bg_color_white); lv_obj_add_style(obj, LV_PART_KNOB, LV_STATE_DEFAULT, &styles->pad_small_negative); lv_obj_add_style(obj, LV_PART_KNOB, LV_STATE_DISABLED, &styles->disabled); } @@ -748,15 +763,11 @@ static void theme_apply(lv_theme_t * th, lv_obj_t * obj) #if LV_USE_DROPDOWN else if(lv_obj_check_type(obj, &lv_dropdown_class)) { - lv_obj_add_style(obj, LV_PART_MAIN, LV_STATE_DEFAULT, &styles->btn); + lv_obj_add_style(obj, LV_PART_MAIN, LV_STATE_DEFAULT, &styles->card); lv_obj_add_style(obj, LV_PART_MAIN, LV_STATE_DEFAULT, &styles->pad_normal); lv_obj_add_style(obj, LV_PART_MAIN, LV_STATE_DEFAULT, &styles->transition_delayed); lv_obj_add_style(obj, LV_PART_MAIN, LV_STATE_PRESSED, &styles->pressed); lv_obj_add_style(obj, LV_PART_MAIN, LV_STATE_PRESSED, &styles->transition_normal); -#if LV_THEME_DEFAULT_GROW - lv_obj_add_style(obj, LV_PART_MAIN, LV_STATE_PRESSED, &styles->grow); -#endif - lv_obj_add_style(obj, LV_PART_MAIN, LV_STATE_CHECKED, &styles->ddlist_flip); lv_obj_add_style(obj, LV_PART_MAIN, LV_STATE_DEFAULT, &styles->transition_normal); lv_obj_add_style(obj, LV_PART_MAIN, LV_STATE_FOCUS_KEY, &styles->focus_outline); lv_obj_add_style(obj, LV_PART_MAIN, LV_STATE_EDITED, &styles->edit_outline); @@ -831,7 +842,7 @@ static void theme_apply(lv_theme_t * th, lv_obj_t * obj) lv_obj_add_style(obj, LV_PART_MAIN, LV_STATE_FOCUS_KEY, &styles->focus_outline); lv_obj_add_style(obj, LV_PART_MAIN, LV_STATE_EDITED, &styles->edit_outline); lv_obj_add_style(obj, LV_PART_ITEMS, LV_STATE_DEFAULT, &styles->btn); - lv_obj_add_style(obj, LV_PART_ITEMS, LV_STATE_DEFAULT, &styles->bg_color_panel); + lv_obj_add_style(obj, LV_PART_ITEMS, LV_STATE_DEFAULT, &styles->bg_color_white); lv_obj_add_style(obj, LV_PART_ITEMS, LV_STATE_PRESSED, &styles->pressed); lv_obj_add_style(obj, LV_PART_ITEMS, LV_STATE_CHECKED, &styles->bg_color_gray); lv_obj_add_style(obj, LV_PART_ITEMS, LV_STATE_FOCUSED, &styles->focus_outline); @@ -876,9 +887,9 @@ static void theme_apply(lv_theme_t * th, lv_obj_t * obj) else if(lv_obj_check_type(obj, &lv_colorwheel_class)) { lv_obj_add_style(obj, LV_PART_MAIN, LV_STATE_DEFAULT, &styles->colorwheel_main); lv_obj_add_style(obj, LV_PART_KNOB, LV_STATE_DEFAULT, &styles->pad_normal); - lv_obj_add_style(obj, LV_PART_KNOB, LV_STATE_DEFAULT, &styles->bg_color_panel); + lv_obj_add_style(obj, LV_PART_KNOB, LV_STATE_DEFAULT, &styles->bg_color_white); lv_obj_add_style(obj, LV_PART_KNOB, LV_STATE_DEFAULT, &styles->pad_normal); - lv_obj_add_style(obj, LV_PART_KNOB, LV_STATE_DEFAULT, &styles->bg_color_panel); + lv_obj_add_style(obj, LV_PART_KNOB, LV_STATE_DEFAULT, &styles->bg_color_white); } #endif diff --git a/src/extra/themes/default/lv_theme_default.h b/src/extra/themes/default/lv_theme_default.h index 2a82f1993..8b9a97cbe 100644 --- a/src/extra/themes/default/lv_theme_default.h +++ b/src/extra/themes/default/lv_theme_default.h @@ -36,9 +36,12 @@ extern "C" { * @param font pointer to a font to use. * @return a pointer to reference this theme later */ -lv_theme_t * lv_theme_default_init(lv_color_t color_primary, lv_color_t color_secondary, +lv_theme_t * lv_theme_default_init(lv_disp_t * disp,lv_color_t color_primary, lv_color_t color_secondary, const lv_font_t * font_small, const lv_font_t * font_normal, - const lv_font_t * font_large, const lv_font_t * font_extra_large); + const lv_font_t * font_large); + + +bool lv_theme_default_is_inited(void); /********************** * MACROS diff --git a/src/extra/widgets/calendar/lv_calendar.c b/src/extra/widgets/calendar/lv_calendar.c index 554f132ff..2147e925a 100644 --- a/src/extra/widgets/calendar/lv_calendar.c +++ b/src/extra/widgets/calendar/lv_calendar.c @@ -272,7 +272,7 @@ static void draw_event_cb(lv_obj_t * obj, lv_event_t e) if(lv_btnmatrix_has_btn_ctrl(obj, hook_dsc->id, LV_CALENDAR_CTRL_HIGHLIGHT)) { hook_dsc->rect_dsc->bg_opa = LV_OPA_40; - hook_dsc->rect_dsc->bg_color = lv_theme_get_color_primary(); + hook_dsc->rect_dsc->bg_color = lv_theme_get_color_primary(obj); if(lv_btnmatrix_get_selected_btn(obj) == hook_dsc->id) { hook_dsc->rect_dsc->bg_opa = LV_OPA_70; } @@ -280,7 +280,7 @@ static void draw_event_cb(lv_obj_t * obj, lv_event_t e) if(lv_btnmatrix_has_btn_ctrl(obj, hook_dsc->id, LV_CALENDAR_CTRL_TODAY)) { hook_dsc->rect_dsc->border_opa = LV_OPA_COVER; - hook_dsc->rect_dsc->border_color = lv_theme_get_color_primary(); + hook_dsc->rect_dsc->border_color = lv_theme_get_color_primary(obj); hook_dsc->rect_dsc->border_width += 1; } diff --git a/src/extra/widgets/calendar/lv_calendar_header_arrow.c b/src/extra/widgets/calendar/lv_calendar_header_arrow.c index c044e8e3e..410496106 100644 --- a/src/extra/widgets/calendar/lv_calendar_header_arrow.c +++ b/src/extra/widgets/calendar/lv_calendar_header_arrow.c @@ -54,7 +54,7 @@ lv_obj_t * lv_calendar_header_arrow_create(lv_obj_t * parent, lv_obj_t * calenda lv_obj_add_event_cb(mo_prev, month_event_cb, calendar); lv_obj_t * label = lv_label_create(header, NULL); - lv_label_set_long_mode(label, LV_LABEL_LONG_SROLL_CIRC); + lv_label_set_long_mode(label, LV_LABEL_LONG_SCROLL_CIRCULAR); lv_obj_set_style_text_align(label, LV_PART_MAIN, LV_STATE_DEFAULT, LV_TEXT_ALIGN_CENTER); lv_obj_set_flex_grow(label, 1); lv_label_set_text_fmt(label, "%d %s", cur_date->year, month_names_def[cur_date->month - 1]); diff --git a/src/extra/widgets/led/lv_led.c b/src/extra/widgets/led/lv_led.c index ef58f10c4..e90fbffad 100644 --- a/src/extra/widgets/led/lv_led.c +++ b/src/extra/widgets/led/lv_led.c @@ -152,7 +152,7 @@ static void lv_led_constructor(lv_obj_t * obj, const lv_obj_t * copy) { LV_UNUSED(copy); lv_led_t * led = (lv_led_t *) obj; - led->color = lv_theme_get_color_primary(); + led->color = lv_theme_get_color_primary(obj); led->bright = LV_LED_BRIGHT_MAX; led->bright = LV_LED_BRIGHT_MAX; diff --git a/src/extra/widgets/list/lv_list.c b/src/extra/widgets/list/lv_list.c index 5c0c62c71..11d1959ca 100644 --- a/src/extra/widgets/list/lv_list.c +++ b/src/extra/widgets/list/lv_list.c @@ -56,7 +56,7 @@ lv_obj_t * lv_list_add_text(lv_obj_t * list, const char * txt) { lv_obj_t * label = lv_label_create(list, NULL); lv_label_set_text(label, txt); - lv_label_set_long_mode(label, LV_LABEL_LONG_SROLL_CIRC); + lv_label_set_long_mode(label, LV_LABEL_LONG_SCROLL_CIRCULAR); lv_obj_set_width(label, LV_SIZE_PCT(100)); return label; } @@ -76,7 +76,7 @@ lv_obj_t * lv_list_add_btn(lv_obj_t * list, const char * icon, const char * txt, if(txt) { lv_obj_t * label = lv_label_create(btn, NULL); lv_label_set_text(label, txt); - lv_label_set_long_mode(label, LV_LABEL_LONG_SROLL_CIRC); + lv_label_set_long_mode(label, LV_LABEL_LONG_SCROLL_CIRCULAR); lv_obj_set_flex_grow(label, 1); } diff --git a/src/extra/widgets/msgbox/lv_msgbox.c b/src/extra/widgets/msgbox/lv_msgbox.c index 890de9599..50e1e6c9e 100644 --- a/src/extra/widgets/msgbox/lv_msgbox.c +++ b/src/extra/widgets/msgbox/lv_msgbox.c @@ -65,7 +65,7 @@ lv_obj_t * lv_msgbox_create(const char * title, const char * txt, const char * b lv_obj_t * label; label = lv_label_create(mbox, NULL); lv_label_set_text(label, title); - lv_label_set_long_mode(label, LV_LABEL_LONG_SROLL_CIRC); + lv_label_set_long_mode(label, LV_LABEL_LONG_SCROLL_CIRCULAR); if(add_close_btn) lv_obj_set_flex_grow(label, 1); else lv_obj_set_width(label, LV_SIZE_PCT(100)); diff --git a/src/lv_api_map.h b/src/lv_api_map.h index 70832cd3a..918d475e3 100644 --- a/src/lv_api_map.h +++ b/src/lv_api_map.h @@ -20,6 +20,8 @@ extern "C" { *********************/ #define LV_NO_TASK_READY LV_NO_TIMER_READY +#define LV_INDEV_STATE_REL LV_INDEV_STATE_RELEASED +#define LV_INDEV_STATE_PR LV_INDEV_STATE_PRESSED /********************** * TYPEDEFS diff --git a/src/lv_conf_internal.h b/src/lv_conf_internal.h index e0e7e7ead..0078add0c 100644 --- a/src/lv_conf_internal.h +++ b/src/lv_conf_internal.h @@ -974,73 +974,6 @@ e.g. "stm32f769xx.h" or "stm32f429xx.h" */ # endif #endif - -/*================== - * THEME USAGE - *================*/ -/*Set the very basic the attributes*/ -#ifndef LV_THEME_COLOR_PRIMARY -# ifdef CONFIG_LV_THEME_COLOR_PRIMARY -# define LV_THEME_COLOR_PRIMARY CONFIG_LV_THEME_COLOR_PRIMARY -# else -# define LV_THEME_COLOR_PRIMARY lv_color_hex(0x01a2b1) -# endif -#endif -#ifndef LV_THEME_COLOR_SECONDARY -# ifdef CONFIG_LV_THEME_COLOR_SECONDARY -# define LV_THEME_COLOR_SECONDARY CONFIG_LV_THEME_COLOR_SECONDARY -# else -# define LV_THEME_COLOR_SECONDARY lv_color_hex(0x44d1b6) -# endif -#endif -#ifndef LV_THEME_FONT_SMALL -# ifdef CONFIG_LV_THEME_FONT_SMALL -# define LV_THEME_FONT_SMALL CONFIG_LV_THEME_FONT_SMALL -# else -# define LV_THEME_FONT_SMALL &lv_font_montserrat_14 -# endif -#endif -#ifndef LV_THEME_FONT_NORMAL -# ifdef CONFIG_LV_THEME_FONT_NORMAL -# define LV_THEME_FONT_NORMAL CONFIG_LV_THEME_FONT_NORMAL -# else -# define LV_THEME_FONT_NORMAL &lv_font_montserrat_14 -# endif -#endif -#ifndef LV_THEME_FONT_LARGE -# ifdef CONFIG_LV_THEME_FONT_LARGE -# define LV_THEME_FONT_LARGE CONFIG_LV_THEME_FONT_LARGE -# else -# define LV_THEME_FONT_LARGE &lv_font_montserrat_14 -# endif -#endif -#ifndef LV_THEME_FONT_EXTRA_LARGE -# ifdef CONFIG_LV_THEME_FONT_EXTRA_LARGE -# define LV_THEME_FONT_EXTRA_LARGE CONFIG_LV_THEME_FONT_EXTRA_LARGE -# else -# define LV_THEME_FONT_EXTRA_LARGE &lv_font_montserrat_14 -# endif -#endif - -/* An external include file required to see the theme init function. - * Relative to "lv_core/lv_obj" */ -#ifndef LV_THEME_INIT_INCLUDE -# ifdef CONFIG_LV_THEME_INIT_INCLUDE -# define LV_THEME_INIT_INCLUDE CONFIG_LV_THEME_INIT_INCLUDE -# else -# define LV_THEME_INIT_INCLUDE "../extra/themes/lv_themes.h" -# endif -#endif - -/* Set a theme initialization function */ -#ifndef LV_THEME_INIT -# ifdef CONFIG_LV_THEME_INIT -# define LV_THEME_INIT CONFIG_LV_THEME_INIT -# else -# define LV_THEME_INIT lv_theme_default_init -# endif -#endif - /*================== * WIDGET USAGE *================*/ diff --git a/src/lv_core/lv_disp.c b/src/lv_core/lv_disp.c index 3ee72845c..dbe970613 100644 --- a/src/lv_core/lv_disp.c +++ b/src/lv_core/lv_disp.c @@ -120,6 +120,25 @@ lv_obj_t * lv_disp_get_layer_sys(lv_disp_t * disp) return disp->sys_layer; } +/** + * Get the theme of a display + * @param disp pointer to a display + * @return the display's theme (can be NULL) + */ +void lv_disp_set_theme(lv_disp_t * disp, lv_theme_t * th) +{ + disp->theme = th; +} +/** + * Get the theme of a display + * @param disp pointer to a display + * @return the display's theme (can be NULL) + */ +lv_theme_t * lv_disp_get_theme(lv_disp_t * disp) +{ + return disp->theme; +} + /** * Set the background color of a display * @param disp pointer to a display @@ -199,7 +218,7 @@ void lv_scr_load_anim(lv_obj_t * new_scr, lv_scr_load_anim_t anim_type, uint32_t lv_disp_load_scr(d->scr_to_load); lv_anim_del(d->scr_to_load, NULL); lv_obj_set_pos(d->scr_to_load, 0, 0); -// lv_style_remove_prop(lv_obj_get_local_style(d->scr_to_load, LV_PART_MAIN, LV_STATE_DEFAULT), LV_STYLE_OPA); + lv_obj_remove_local_style_prop(d->scr_to_load, LV_PART_MAIN, LV_STATE_DEFAULT, LV_STYLE_OPA); act_scr = d->scr_to_load; } @@ -364,7 +383,7 @@ lv_timer_t * _lv_disp_get_refr_task(lv_disp_t * disp) return NULL; } - return disp->read_task; + return disp->refr_timer; } /********************** diff --git a/src/lv_core/lv_disp.h b/src/lv_core/lv_disp.h index b15afd917..1f3031c36 100644 --- a/src/lv_core/lv_disp.h +++ b/src/lv_core/lv_disp.h @@ -15,6 +15,7 @@ extern "C" { *********************/ #include "../lv_hal/lv_hal.h" #include "lv_obj.h" +#include "lv_theme.h" /********************* * DEFINES @@ -78,6 +79,20 @@ lv_obj_t * lv_disp_get_layer_top(lv_disp_t * disp); */ lv_obj_t * lv_disp_get_layer_sys(lv_disp_t * disp); +/** + * Get the theme of a display + * @param disp pointer to a display + * @return the display's theme (can be NULL) + */ +void lv_disp_set_theme(lv_disp_t * disp, lv_theme_t * th); + +/** + * Get the theme of a display + * @param disp pointer to a display + * @return the display's theme (can be NULL) + */ +lv_theme_t * lv_disp_get_theme(lv_disp_t * disp); + /** * Set the background color of a display * @param disp pointer to a display @@ -99,7 +114,6 @@ void lv_disp_set_bg_image(lv_disp_t * disp, const void * img_src); */ void lv_disp_set_bg_opa(lv_disp_t * disp, lv_opa_t opa); - /** * Switch screen with animation * @param scr pointer to the new screen to load diff --git a/src/lv_core/lv_indev.c b/src/lv_core/lv_indev.c index 8f1390713..a38d79498 100644 --- a/src/lv_core/lv_indev.c +++ b/src/lv_core/lv_indev.c @@ -84,7 +84,7 @@ void lv_indev_read_task_cb(lv_timer_t * task) indev_act->proc.state = data.state; /*Save the last activity time*/ - if(indev_act->proc.state == LV_INDEV_STATE_PR) { + if(indev_act->proc.state == LV_INDEV_STATE_PRESSED) { indev_act->driver.disp->last_activity_time = lv_tick_get(); } else if(indev_act->driver.type == LV_INDEV_TYPE_ENCODER && data.enc_diff) { @@ -183,7 +183,7 @@ void lv_indev_set_cursor(lv_indev_t * indev, lv_obj_t * cur_obj) lv_obj_set_parent(indev->cursor, lv_disp_get_layer_sys(indev->driver.disp)); lv_obj_set_pos(indev->cursor, indev->proc.types.pointer.act_point.x, indev->proc.types.pointer.act_point.y); lv_obj_clear_flag(indev->cursor, LV_OBJ_FLAG_CLICKABLE); - lv_obj_clear_flag(indev->cursor, LV_OBJ_FLAG_LAYOUTABLE); + lv_obj_add_flag(indev->cursor, LV_OBJ_FLAG_IGNORE_LAYOUT); } void lv_indev_set_group(lv_indev_t * indev, lv_group_t * group) @@ -275,7 +275,7 @@ lv_timer_t * lv_indev_get_read_task(lv_disp_t * indev) return NULL; } - return indev->read_task; + return indev->refr_timer; } lv_obj_t * lv_indev_search_obj(lv_obj_t * obj, lv_point_t * point) @@ -339,7 +339,7 @@ static void indev_pointer_proc(lv_indev_t * i, lv_indev_data_t * data) i->proc.types.pointer.act_point.x = data->point.x; i->proc.types.pointer.act_point.y = data->point.y; - if(i->proc.state == LV_INDEV_STATE_PR) { + if(i->proc.state == LV_INDEV_STATE_PRESSED) { indev_proc_press(&i->proc); } else { @@ -357,13 +357,13 @@ static void indev_pointer_proc(lv_indev_t * i, lv_indev_data_t * data) */ static void indev_keypad_proc(lv_indev_t * i, lv_indev_data_t * data) { - if(data->state == LV_INDEV_STATE_PR && i->proc.wait_until_release) return; + if(data->state == LV_INDEV_STATE_PRESSED && i->proc.wait_until_release) return; if(i->proc.wait_until_release) { i->proc.wait_until_release = 0; i->proc.pr_timestamp = 0; i->proc.long_pr_sent = 0; - i->proc.types.keypad.last_state = LV_INDEV_STATE_REL; /*To skip the processing of release*/ + i->proc.types.keypad.last_state = LV_INDEV_STATE_RELEASED; /*To skip the processing of release*/ } lv_group_t * g = i->group; @@ -386,7 +386,7 @@ static void indev_keypad_proc(lv_indev_t * i, lv_indev_data_t * data) i->proc.types.keypad.last_state = data->state; /*Key press happened*/ - if(data->state == LV_INDEV_STATE_PR && prev_state == LV_INDEV_STATE_REL) { + if(data->state == LV_INDEV_STATE_PRESSED && prev_state == LV_INDEV_STATE_RELEASED) { i->proc.pr_timestamp = lv_tick_get(); /*Simulate a press on the object if ENTER was pressed*/ @@ -424,7 +424,7 @@ static void indev_keypad_proc(lv_indev_t * i, lv_indev_data_t * data) } } /*Pressing*/ - else if(data->state == LV_INDEV_STATE_PR && prev_state == LV_INDEV_STATE_PR) { + else if(data->state == LV_INDEV_STATE_PRESSED && prev_state == LV_INDEV_STATE_PRESSED) { if(data->key == LV_KEY_ENTER) { lv_signal_send(indev_obj_act, LV_SIGNAL_PRESSING, NULL); @@ -477,7 +477,7 @@ static void indev_keypad_proc(lv_indev_t * i, lv_indev_data_t * data) } } /*Release happened*/ - else if(data->state == LV_INDEV_STATE_REL && prev_state == LV_INDEV_STATE_PR) { + else if(data->state == LV_INDEV_STATE_RELEASED && prev_state == LV_INDEV_STATE_PRESSED) { /*The user might clear the key when it was released. Always release the pressed key*/ data->key = prev_key; if(data->key == LV_KEY_ENTER) { @@ -509,13 +509,13 @@ static void indev_keypad_proc(lv_indev_t * i, lv_indev_data_t * data) */ static void indev_encoder_proc(lv_indev_t * i, lv_indev_data_t * data) { - if(data->state == LV_INDEV_STATE_PR && i->proc.wait_until_release) return; + if(data->state == LV_INDEV_STATE_PRESSED && i->proc.wait_until_release) return; if(i->proc.wait_until_release) { i->proc.wait_until_release = 0; i->proc.pr_timestamp = 0; i->proc.long_pr_sent = 0; - i->proc.types.keypad.last_state = LV_INDEV_STATE_REL; /*To skip the processing of release*/ + i->proc.types.keypad.last_state = LV_INDEV_STATE_RELEASED; /*To skip the processing of release*/ } /* Save the last keys before anything else. @@ -531,7 +531,7 @@ static void indev_encoder_proc(lv_indev_t * i, lv_indev_data_t * data) if(indev_obj_act == NULL) return; /*Process the steps they are valid only with released button*/ - if(data->state != LV_INDEV_STATE_REL) { + if(data->state != LV_INDEV_STATE_RELEASED) { data->enc_diff = 0; } @@ -540,7 +540,7 @@ static void indev_encoder_proc(lv_indev_t * i, lv_indev_data_t * data) if(indev_obj_act == NULL) return; /*Button press happened*/ - if(data->state == LV_INDEV_STATE_PR && last_state == LV_INDEV_STATE_REL) { + if(data->state == LV_INDEV_STATE_PRESSED && last_state == LV_INDEV_STATE_RELEASED) { i->proc.pr_timestamp = lv_tick_get(); @@ -576,7 +576,7 @@ static void indev_encoder_proc(lv_indev_t * i, lv_indev_data_t * data) } } /*Pressing*/ - else if(data->state == LV_INDEV_STATE_PR && last_state == LV_INDEV_STATE_PR) { + else if(data->state == LV_INDEV_STATE_PRESSED && last_state == LV_INDEV_STATE_PRESSED) { /* Long press*/ if(i->proc.long_pr_sent == 0 && lv_tick_elaps(i->proc.pr_timestamp) > i->driver.long_press_time) { @@ -632,7 +632,7 @@ static void indev_encoder_proc(lv_indev_t * i, lv_indev_data_t * data) } /*Release happened*/ - else if(data->state == LV_INDEV_STATE_REL && last_state == LV_INDEV_STATE_PR) { + else if(data->state == LV_INDEV_STATE_RELEASED && last_state == LV_INDEV_STATE_PRESSED) { if(data->key == LV_KEY_ENTER) { bool editable = lv_obj_is_editable(indev_obj_act); @@ -725,7 +725,7 @@ static void indev_button_proc(lv_indev_t * i, lv_indev_data_t * data) lv_coord_t y = i->btn_points[data->btn_id].y; /*If a new point comes always make a release*/ - if(data->state == LV_INDEV_STATE_PR) { + if(data->state == LV_INDEV_STATE_PRESSED) { if(i->proc.types.pointer.last_point.x != x || i->proc.types.pointer.last_point.y != y) { indev_proc_release(&i->proc); @@ -738,7 +738,7 @@ static void indev_button_proc(lv_indev_t * i, lv_indev_data_t * data) i->proc.types.pointer.act_point.x = x; i->proc.types.pointer.act_point.y = y; - if(data->state == LV_INDEV_STATE_PR) indev_proc_press(&i->proc); + if(data->state == LV_INDEV_STATE_PRESSED) indev_proc_press(&i->proc); else indev_proc_release(&i->proc); if(indev_reset_check(&i->proc)) return; diff --git a/src/lv_core/lv_obj.c b/src/lv_core/lv_obj.c index 2f8da5426..905c3db10 100644 --- a/src/lv_core/lv_obj.c +++ b/src/lv_core/lv_obj.c @@ -25,8 +25,6 @@ #include #include -#include LV_THEME_INIT_INCLUDE - #if LV_USE_GPU_STM32_DMA2D #include "../lv_gpu/lv_gpu_stm32_dma2d.h" #endif @@ -124,13 +122,6 @@ void lv_init(void) _lv_ll_init(&LV_GC_ROOT(_lv_disp_ll), sizeof(lv_disp_t)); _lv_ll_init(&LV_GC_ROOT(_lv_indev_ll), sizeof(lv_indev_t)); -#ifdef LV_THEME_INIT - lv_theme_t * th = LV_THEME_INIT(LV_THEME_COLOR_PRIMARY, LV_THEME_COLOR_SECONDARY, - LV_THEME_FONT_SMALL, LV_THEME_FONT_NORMAL, - LV_THEME_FONT_LARGE, LV_THEME_FONT_EXTRA_LARGE); - - lv_theme_set_act(th); -#endif /*Initialize the screen refresh system*/ _lv_refr_init(); @@ -318,9 +309,9 @@ void lv_obj_add_flag(lv_obj_t * obj, lv_obj_flag_t f) obj->flags |= f; - if(f & LV_OBJ_FLAG_LAYOUTABLE) lv_signal_send(lv_obj_get_parent(obj), LV_SIGNAL_CHILD_CHG, obj); + if(f & LV_OBJ_FLAG_IGNORE_LAYOUT) lv_signal_send(lv_obj_get_parent(obj), LV_SIGNAL_CHILD_CHG, obj); - if(f & LV_OBJ_FLAG_HIDDEN) { + if(f & (LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_LAYOUT_1 | LV_OBJ_FLAG_LAYOUT_2)) { lv_obj_invalidate(obj); if(lv_obj_is_layout_positioned(obj)) { lv_obj_update_layout(lv_obj_get_parent(obj), obj); @@ -340,7 +331,7 @@ void lv_obj_clear_flag(lv_obj_t * obj, lv_obj_flag_t f) lv_obj_update_layout(lv_obj_get_parent(obj), obj); } } - if(f & LV_OBJ_FLAG_LAYOUTABLE) lv_signal_send(lv_obj_get_parent(obj), LV_SIGNAL_CHILD_CHG, obj); + if(f & LV_OBJ_FLAG_IGNORE_LAYOUT) lv_signal_send(lv_obj_get_parent(obj), LV_SIGNAL_CHILD_CHG, obj); } void lv_obj_set_state(lv_obj_t * obj, lv_state_t new_state) @@ -666,7 +657,6 @@ static void lv_obj_constructor(lv_obj_t * obj, const lv_obj_t * copy) obj->flags |= LV_OBJ_FLAG_SNAPABLE; if(parent) obj->flags |= LV_OBJ_FLAG_PRESS_LOCK; if(parent) obj->flags |= LV_OBJ_FLAG_SCROLL_CHAIN; - if(parent) obj->flags |= LV_OBJ_FLAG_LAYOUTABLE; obj->flags |= LV_OBJ_FLAG_CLICK_FOCUSABLE; obj->flags |= LV_OBJ_FLAG_SCROLLABLE; obj->flags |= LV_OBJ_FLAG_SCROLL_ELASTIC; diff --git a/src/lv_core/lv_obj.h b/src/lv_core/lv_obj.h index acc834452..8d3f9d874 100644 --- a/src/lv_core/lv_obj.h +++ b/src/lv_core/lv_obj.h @@ -193,7 +193,7 @@ enum { LV_OBJ_FLAG_SCROLLABLE = (1 << 4), /**< Make the object scrollable*/ LV_OBJ_FLAG_SCROLL_ELASTIC = (1 << 5), /**< Allow scrolling inside but with slower speed*/ LV_OBJ_FLAG_SCROLL_MOMENTUM = (1 << 6), /**< Make the object scroll further when "thrown"*/ - LV_OBJ_FLAG_SCROLL_ONE = (1 << 7), /**< Allow scrolling only one snapable children*/ + LV_OBJ_FLAG_SCROLL_ONE = (1 << 7), /**< Allow scrolling only one snapable children*/ LV_OBJ_FLAG_SCROLL_CHAIN = (1 << 8), /**< Allow propagating the scroll to a parent */ LV_OBJ_FLAG_SCROLL_ON_FOCUS = (1 << 9), /**< Automatically scroll object to make it visible when focused*/ LV_OBJ_FLAG_SNAPABLE = (1 << 10), /**< If scroll snap is enabled on the parent it can snap to this object*/ @@ -202,7 +202,7 @@ enum { LV_OBJ_FLAG_GESTURE_BUBBLE = (1 << 13), /**< Propagate the gestures to the parent */ LV_OBJ_FLAG_FOCUS_BUBBLE = (1 << 14), /**< Propagate the focus to the parent */ LV_OBJ_FLAG_ADV_HITTEST = (1 << 15), /**< Allow performing more accurate hit (click) test. E.g. consider rounded corners. */ - LV_OBJ_FLAG_LAYOUTABLE = (1 << 16), /**< Make the object position-able by the layouts */ + LV_OBJ_FLAG_IGNORE_LAYOUT = (1 << 16), /**< Make the object position-able by the layouts */ LV_OBJ_FLAG_LAYOUT_1 = (1 << 23), /** Custom flag, free to use by layouts*/ LV_OBJ_FLAG_LAYOUT_2 = (1 << 24), /** Custom flag, free to use by layouts*/ diff --git a/src/lv_core/lv_obj_pos.c b/src/lv_core/lv_obj_pos.c index 5fad20d92..8f4c643d9 100644 --- a/src/lv_core/lv_obj_pos.c +++ b/src/lv_core/lv_obj_pos.c @@ -154,7 +154,7 @@ void lv_obj_set_layout(lv_obj_t * obj, const void * layout) bool lv_obj_is_layout_positioned(const lv_obj_t * obj) { - if(lv_obj_has_flag(obj, LV_OBJ_FLAG_LAYOUTABLE) == false) return false; + if(lv_obj_has_flag(obj, LV_OBJ_FLAG_IGNORE_LAYOUT)) return false; lv_obj_t * parent = lv_obj_get_parent(obj); if(parent == NULL) return false; diff --git a/src/lv_core/lv_refr.c b/src/lv_core/lv_refr.c index 0be005627..21cf04e3d 100644 --- a/src/lv_core/lv_refr.c +++ b/src/lv_core/lv_refr.c @@ -84,13 +84,13 @@ void lv_refr_now(lv_disp_t * disp) lv_anim_refr_now(); if(disp) { - _lv_disp_refr_task(disp->read_task); + _lv_disp_refr_task(disp->refr_timer); } else { lv_disp_t * d; d = lv_disp_get_next(NULL); while(d) { - _lv_disp_refr_task(d->read_task); + _lv_disp_refr_task(d->refr_timer); d = lv_disp_get_next(d); } } @@ -129,7 +129,7 @@ void _lv_inv_area(lv_disp_t * disp, const lv_area_t * area_p) if(lv_disp_is_true_double_buf(disp)) { disp->inv_areas[0] = scr_area; disp->inv_p = 1; - lv_timer_pause(disp->read_task, false); + lv_timer_pause(disp->refr_timer, false); return; } @@ -150,7 +150,7 @@ void _lv_inv_area(lv_disp_t * disp, const lv_area_t * area_p) lv_area_copy(&disp->inv_areas[disp->inv_p], &scr_area); } disp->inv_p++; - lv_timer_pause(disp->read_task, false); + lv_timer_pause(disp->refr_timer, false); } /** @@ -251,7 +251,7 @@ void _lv_disp_refr_task(lv_timer_t * tmr) } else { perf_last_time = lv_tick_get(); - uint32_t fps_limit = 1000 / disp_refr->read_task->period; + uint32_t fps_limit = 1000 / disp_refr->refr_timer->period; uint32_t fps; if(elaps_sum == 0) elaps_sum = 1; diff --git a/src/lv_core/lv_theme.c b/src/lv_core/lv_theme.c index dddf908d9..b071cd6b9 100644 --- a/src/lv_core/lv_theme.c +++ b/src/lv_core/lv_theme.c @@ -24,7 +24,6 @@ static void apply_theme(lv_theme_t * th, lv_obj_t * obj); /********************** * STATIC VARIABLES **********************/ -static lv_theme_t * act_theme; /********************** * MACROS @@ -34,23 +33,10 @@ static lv_theme_t * act_theme; * GLOBAL FUNCTIONS **********************/ -/** - * Set a theme for the system. - * From now, all the created objects will use styles from this theme by default - * @param th pointer to theme (return value of: 'lv_theme_init_xxx()') - */ -void lv_theme_set_act(lv_theme_t * th) +lv_theme_t * lv_theme_get_from_obj(lv_obj_t * obj) { - act_theme = th; -} - -/** - * Get the current system theme. - * @return pointer to the current system theme. NULL if not set. - */ -lv_theme_t * lv_theme_get_act(void) -{ - return act_theme; + lv_disp_t * disp = obj ? lv_obj_get_disp(obj) : lv_disp_get_default(); + return lv_disp_get_theme(disp); } /** @@ -60,12 +46,14 @@ lv_theme_t * lv_theme_get_act(void) */ void lv_theme_apply(lv_obj_t * obj) { + lv_theme_t * th = lv_theme_get_from_obj(obj); + if(th == NULL) return; + lv_obj_enable_style_refresh(false); lv_obj_remove_style(obj, LV_PART_ANY, LV_STATE_ANY, NULL); - if(act_theme == NULL) return; - apply_theme(act_theme, obj); /*Apply the theme including the base theme(s)*/ + apply_theme(th, obj); /*Apply the theme including the base theme(s)*/ lv_obj_enable_style_refresh(true); lv_obj_refresh_style(obj, LV_PART_ANY, LV_STYLE_PROP_ALL); @@ -94,38 +82,34 @@ void lv_theme_set_apply_cb(lv_theme_t * theme, lv_theme_apply_cb_t apply_cb) theme->apply_cb = apply_cb; } -const lv_font_t * lv_theme_get_font_small(void) +const lv_font_t * lv_theme_get_font_small(lv_obj_t * obj) { - return act_theme->font_small; + lv_theme_t * th = lv_theme_get_from_obj(obj); + return th ? th->font_small : LV_FONT_DEFAULT; } -const lv_font_t * lv_theme_get_font_normal(void) +const lv_font_t * lv_theme_get_font_normal(lv_obj_t * obj) { - return act_theme->font_normal; + lv_theme_t * th = lv_theme_get_from_obj(obj); + return th ? th->font_normal : LV_FONT_DEFAULT; } -const lv_font_t * lv_theme_get_font_large(void) +const lv_font_t * lv_theme_get_font_large(lv_obj_t * obj) { - return act_theme->font_large; + lv_theme_t * th = lv_theme_get_from_obj(obj); + return th ? th->font_large : LV_FONT_DEFAULT; } -const lv_font_t * lv_theme_get_font_extra_large(void) +lv_color_t lv_theme_get_color_primary(lv_obj_t * obj) { - return act_theme->font_extra_large; + lv_theme_t * th = lv_theme_get_from_obj(obj); + return th ? th->color_primary : lv_color_blue_grey(); } -lv_color_t lv_theme_get_color_primary(void) +lv_color_t lv_theme_get_color_secondary(lv_obj_t * obj) { - return act_theme->color_primary; -} - -/** - * Get the secondary color of the theme - * @return the color - */ -lv_color_t lv_theme_get_color_secondary(void) -{ - return act_theme->color_secondary; + lv_theme_t * th = lv_theme_get_from_obj(obj); + return th ? th->color_secondary : lv_color_blue(); } /********************** @@ -135,5 +119,5 @@ lv_color_t lv_theme_get_color_secondary(void) static void apply_theme(lv_theme_t * th, lv_obj_t * obj) { if(th->parent) apply_theme(th->parent, obj); - if(th->apply_cb) th->apply_cb(act_theme, obj); + if(th->apply_cb) th->apply_cb(th, obj); } diff --git a/src/lv_core/lv_theme.h b/src/lv_core/lv_theme.h index c1d59df3e..8070e8f9d 100644 --- a/src/lv_core/lv_theme.h +++ b/src/lv_core/lv_theme.h @@ -24,6 +24,7 @@ extern "C" { **********************/ struct _lv_theme_t; +struct _lv_disp_t; typedef void (*lv_theme_apply_cb_t)(struct _lv_theme_t *, lv_obj_t *); @@ -31,12 +32,12 @@ typedef struct _lv_theme_t { lv_theme_apply_cb_t apply_cb; struct _lv_theme_t * parent; /**< Apply the current theme's style on top of this theme.*/ void * user_data; + struct _lv_disp_t * disp; lv_color_t color_primary; lv_color_t color_secondary; const lv_font_t * font_small; const lv_font_t * font_normal; const lv_font_t * font_large; - const lv_font_t * font_extra_large; } lv_theme_t; /********************** @@ -83,36 +84,30 @@ void lv_theme_set_apply_cb(lv_theme_t * theme, lv_theme_apply_cb_t apply_cb); * Get the small font of the theme * @return pointer to the font */ -const lv_font_t * lv_theme_get_font_small(void); +const lv_font_t * lv_theme_get_font_small(lv_obj_t * obj); /** * Get the normal font of the theme * @return pointer to the font */ -const lv_font_t * lv_theme_get_font_normal(void); +const lv_font_t * lv_theme_get_font_normal(lv_obj_t * obj); /** * Get the subtitle font of the theme * @return pointer to the font */ -const lv_font_t * lv_theme_get_font_large(void); - -/** - * Get the title font of the theme - * @return pointer to the font - */ -const lv_font_t * lv_theme_get_font_extra_large(void); +const lv_font_t * lv_theme_get_font_large(lv_obj_t * obj); /** * Get the primary color of the theme * @return the color */ -lv_color_t lv_theme_get_color_primary(void); +lv_color_t lv_theme_get_color_primary(lv_obj_t * obj); /** * Get the secondary color of the theme * @return the color */ -lv_color_t lv_theme_get_color_secondary(void); +lv_color_t lv_theme_get_color_secondary(lv_obj_t * obj); /********************** * MACROS diff --git a/src/lv_draw/lv_draw_label.c b/src/lv_draw/lv_draw_label.c index ed1db18d5..7ace25fb1 100644 --- a/src/lv_draw/lv_draw_label.c +++ b/src/lv_draw/lv_draw_label.c @@ -96,7 +96,7 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_label_dsc_init(lv_draw_label_dsc_t * dsc) lv_memset_00(dsc, sizeof(lv_draw_label_dsc_t)); dsc->opa = LV_OPA_COVER; dsc->color = lv_color_black(); - dsc->font = LV_THEME_FONT_NORMAL; + dsc->font = LV_FONT_DEFAULT; dsc->sel_start = LV_DRAW_LABEL_NO_TXT_SEL; dsc->sel_end = LV_DRAW_LABEL_NO_TXT_SEL; dsc->sel_color = lv_color_black(); diff --git a/src/lv_draw/lv_draw_rect.c b/src/lv_draw/lv_draw_rect.c index 7088dfa81..ac4228e55 100644 --- a/src/lv_draw/lv_draw_rect.c +++ b/src/lv_draw/lv_draw_rect.c @@ -83,7 +83,7 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_rect_dsc_init(lv_draw_rect_dsc_t * dsc) dsc->bg_img_opa = LV_OPA_COVER; dsc->outline_opa = LV_OPA_COVER; dsc->border_opa = LV_OPA_COVER; - dsc->content_font = LV_THEME_FONT_NORMAL; + dsc->content_font = LV_FONT_DEFAULT; dsc->content_opa = LV_OPA_COVER; dsc->content_align = LV_ALIGN_CENTER; dsc->shadow_opa = LV_OPA_COVER; diff --git a/src/lv_hal/lv_hal_disp.c b/src/lv_hal/lv_hal_disp.c index 6cd8335ba..73f3a2fe0 100644 --- a/src/lv_hal/lv_hal_disp.c +++ b/src/lv_hal/lv_hal_disp.c @@ -17,6 +17,10 @@ #include "../lv_misc/lv_assert.h" #include "../lv_core/lv_obj.h" #include "../lv_core/lv_refr.h" +#include "../lv_core/lv_theme.h" +#if LV_USE_THEME_DEFAULT +#include "../extra/themes/default/lv_theme_default.h" +#endif /********************* * DEFINES @@ -119,9 +123,9 @@ lv_disp_t * lv_disp_drv_register(lv_disp_drv_t * driver) disp_def = disp; /*Temporarily change the default screen to create the default screens on the new display*/ /*Create a refresh task*/ - disp->read_task = lv_timer_create(_lv_disp_refr_task, LV_DISP_DEF_REFR_PERIOD, disp); - LV_ASSERT_MALLOC(disp->read_task); - if(disp->read_task == NULL) return NULL; + disp->refr_timer = lv_timer_create(_lv_disp_refr_task, LV_DISP_DEF_REFR_PERIOD, disp); + LV_ASSERT_MALLOC(disp->refr_timer); + if(disp->refr_timer == NULL) return NULL; disp->inv_p = 0; disp->last_activity_time = 0; @@ -134,6 +138,12 @@ lv_disp_t * lv_disp_drv_register(lv_disp_drv_t * driver) disp->bg_opa = LV_OPA_COVER; #endif +#if LV_USE_THEME_DEFAULT + if(lv_theme_default_is_inited() == false) { + disp->theme = lv_theme_default_init(disp, lv_color_blue(), lv_color_purple(), LV_FONT_DEFAULT, LV_FONT_DEFAULT, LV_FONT_DEFAULT); + } +#endif + disp->prev_scr = NULL; disp->act_scr = lv_obj_create(NULL, NULL); /*Create a default screen on the display*/ disp->top_layer = lv_obj_create(NULL, NULL); /*Create top layer on the display*/ @@ -150,7 +160,7 @@ lv_disp_t * lv_disp_drv_register(lv_disp_drv_t * driver) disp_def = disp_def_tmp; /*Revert the default display*/ - lv_timer_ready(disp->read_task); /*Be sure the screen will be refreshed immediately on start up*/ + lv_timer_ready(disp->refr_timer); /*Be sure the screen will be refreshed immediately on start up*/ return disp; } diff --git a/src/lv_hal/lv_hal_disp.h b/src/lv_hal/lv_hal_disp.h index 38a8869ae..485e3701d 100644 --- a/src/lv_hal/lv_hal_disp.h +++ b/src/lv_hal/lv_hal_disp.h @@ -38,8 +38,9 @@ extern "C" { * TYPEDEFS **********************/ -struct _disp_t; -struct _disp_drv_t; +struct _lv_disp_t; +struct _lv_disp_drv_t; +struct _lv_theme_t; /** * Structure for holding display buffer information. @@ -71,7 +72,7 @@ typedef enum { /** * Display Driver structure to be registered by HAL */ -typedef struct _disp_drv_t { +typedef struct _lv_disp_drv_t { lv_coord_t hor_res; /**< Horizontal resolution. */ lv_coord_t ver_res; /**< Vertical resolution. */ @@ -97,35 +98,35 @@ typedef struct _disp_drv_t { /** MANDATORY: Write the internal buffer (VDB) to the display. 'lv_disp_flush_ready()' has to be * called when finished */ - void (*flush_cb)(struct _disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p); + void (*flush_cb)(struct _lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p); /** OPTIONAL: Extend the invalidated areas to match with the display drivers requirements * E.g. round `y` to, 8, 16 ..) on a monochrome display*/ - void (*rounder_cb)(struct _disp_drv_t * disp_drv, lv_area_t * area); + void (*rounder_cb)(struct _lv_disp_drv_t * disp_drv, lv_area_t * area); /** OPTIONAL: Set a pixel in a buffer according to the special requirements of the display * Can be used for color format not supported in LittelvGL. E.g. 2 bit -> 4 gray scales * @note Much slower then drawing with supported color formats. */ - void (*set_px_cb)(struct _disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, + void (*set_px_cb)(struct _lv_disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, lv_color_t color, lv_opa_t opa); /** OPTIONAL: Called after every refresh cycle to tell the rendering and flushing time + the * number of flushed pixels */ - void (*monitor_cb)(struct _disp_drv_t * disp_drv, uint32_t time, uint32_t px); + void (*monitor_cb)(struct _lv_disp_drv_t * disp_drv, uint32_t time, uint32_t px); /** OPTIONAL: Called periodically while lvgl waits for operation to be completed. * For example flushing or GPU * User can execute very simple tasks here or yield the task */ - void (*wait_cb)(struct _disp_drv_t * disp_drv); + void (*wait_cb)(struct _lv_disp_drv_t * disp_drv); /** OPTIONAL: Called when lvgl needs any CPU cache that affects rendering to be cleaned */ - void (*clean_dcache_cb)(struct _disp_drv_t * disp_drv); + void (*clean_dcache_cb)(struct _lv_disp_drv_t * disp_drv); /** OPTIONAL: called to wait while the gpu is working */ - void (*gpu_wait_cb)(struct _disp_drv_t * disp_drv); + void (*gpu_wait_cb)(struct _lv_disp_drv_t * disp_drv); /** OPTIONAL: Fill a memory with a color (GPU only)*/ - void (*gpu_fill_cb)(struct _disp_drv_t * disp_drv, lv_color_t * dest_buf, lv_coord_t dest_width, + void (*gpu_fill_cb)(struct _lv_disp_drv_t * disp_drv, lv_color_t * dest_buf, lv_coord_t dest_width, const lv_area_t * fill_area, lv_color_t color); /** On CHROMA_KEYED images this color will be transparent. @@ -144,27 +145,29 @@ struct _lv_obj_t; * Display structure. * @note `lv_disp_drv_t` should be the first member of the structure. */ -typedef struct _disp_t { +typedef struct _lv_disp_t { /**< Driver to the display*/ lv_disp_drv_t driver; /**< A task which periodically checks the dirty areas and refreshes them*/ - lv_timer_t * read_task; + lv_timer_t * refr_timer; + + /**< The theme assigned to the screen*/ + struct _lv_theme_t * theme; /** Screens of the display*/ - struct _lv_obj_t ** screens; /**< Array of screen objects. `NULL` terminated*/ - struct _lv_obj_t * act_scr; /**< Currently active screen on this display */ - struct _lv_obj_t * prev_scr; /**< Previous screen. Used during screen animations */ - struct _lv_obj_t * scr_to_load; /**< The screen prepared to load in lv_scr_load_anim*/ - struct _lv_obj_t * top_layer; /**< @see lv_disp_get_layer_top */ - struct _lv_obj_t * sys_layer; /**< @see lv_disp_get_layer_sys */ + struct _lv_obj_t ** screens; /**< Array of screen objects. */ + struct _lv_obj_t * act_scr; /**< Currently active screen on this display */ + struct _lv_obj_t * prev_scr; /**< Previous screen. Used during screen animations */ + struct _lv_obj_t * scr_to_load; /**< The screen prepared to load in lv_scr_load_anim*/ + struct _lv_obj_t * top_layer; /**< @see lv_disp_get_layer_top */ + struct _lv_obj_t * sys_layer; /**< @see lv_disp_get_layer_sys */ uint32_t screen_cnt; -uint8_t del_prev : - 1; /**< 1: Automatically delete the previous screen when the screen load animation is ready */ + uint8_t del_prev : 1; /**< 1: Automatically delete the previous screen when the screen load animation is ready */ - lv_color_t bg_color; /**< Default display color when screens are transparent*/ - const void * bg_img; /**< An image source to display as wallpaper*/ - lv_opa_t bg_opa; /**offset.x = 0; label->offset.y = 0; - if(long_mode == LV_LABEL_LONG_SROLL || long_mode == LV_LABEL_LONG_SROLL_CIRC || long_mode == LV_LABEL_LONG_CLIP) + if(long_mode == LV_LABEL_LONG_SCROLL || long_mode == LV_LABEL_LONG_SCROLL_CIRCULAR || long_mode == LV_LABEL_LONG_CLIP) label->expand = 1; else label->expand = 0; @@ -777,7 +777,7 @@ static lv_draw_res_t lv_label_draw(lv_obj_t * obj, const lv_area_t * clip_area, /* In SROLL and SROLL_CIRC mode the CENTER and RIGHT are pointless so remove them. * (In addition they will result misalignment is this case)*/ - if((label->long_mode == LV_LABEL_LONG_SROLL || label->long_mode == LV_LABEL_LONG_SROLL_CIRC) && + if((label->long_mode == LV_LABEL_LONG_SCROLL || label->long_mode == LV_LABEL_LONG_SCROLL_CIRCULAR) && (align == LV_TEXT_ALIGN_CENTER || align == LV_TEXT_ALIGN_RIGHT)) { lv_point_t size; lv_txt_get_size(&size, label->text, label_draw_dsc.font, label_draw_dsc.letter_space, label_draw_dsc.line_space, @@ -788,7 +788,7 @@ static lv_draw_res_t lv_label_draw(lv_obj_t * obj, const lv_area_t * clip_area, } #if LV_LABEL_LONG_TXT_HINT lv_draw_label_hint_t * hint = &label->hint; - if(label->long_mode == LV_LABEL_LONG_SROLL_CIRC || lv_area_get_height(&txt_coords) < LV_LABEL_HINT_HEIGHT_LIMIT) + if(label->long_mode == LV_LABEL_LONG_SCROLL_CIRCULAR || lv_area_get_height(&txt_coords) < LV_LABEL_HINT_HEIGHT_LIMIT) hint = NULL; #else @@ -798,7 +798,7 @@ static lv_draw_res_t lv_label_draw(lv_obj_t * obj, const lv_area_t * clip_area, lv_draw_label(&txt_coords, &txt_clip, &label_draw_dsc, label->text, hint); - if(label->long_mode == LV_LABEL_LONG_SROLL_CIRC) { + if(label->long_mode == LV_LABEL_LONG_SCROLL_CIRCULAR) { lv_point_t size; lv_txt_get_size(&size, label->text, label_draw_dsc.font, label_draw_dsc.letter_space, label_draw_dsc.line_space, LV_COORD_MAX, flag); @@ -899,7 +899,7 @@ static void lv_label_refr_text(lv_obj_t * obj) lv_obj_set_size(obj, size.x, size.y); } /*In roll mode keep the size but start offset animations*/ - else if(label->long_mode == LV_LABEL_LONG_SROLL) { + else if(label->long_mode == LV_LABEL_LONG_SCROLL) { uint16_t anim_speed = lv_obj_get_style_anim_time(obj, LV_PART_MAIN); if(anim_speed == 0) anim_speed = LV_LABEL_DEF_SCROLL_SPEED; lv_anim_t a; @@ -982,7 +982,7 @@ static void lv_label_refr_text(lv_obj_t * obj) } } /*In roll inf. mode keep the size but start offset animations*/ - else if(label->long_mode == LV_LABEL_LONG_SROLL_CIRC) { + else if(label->long_mode == LV_LABEL_LONG_SCROLL_CIRCULAR) { uint16_t anim_speed = lv_obj_get_style_anim_time(obj, LV_PART_MAIN); if(anim_speed == 0) anim_speed = LV_LABEL_DEF_SCROLL_SPEED; lv_anim_t a; diff --git a/src/lv_widgets/lv_label.h b/src/lv_widgets/lv_label.h index 69b005958..ff5266348 100644 --- a/src/lv_widgets/lv_label.h +++ b/src/lv_widgets/lv_label.h @@ -42,12 +42,12 @@ LV_EXPORT_CONST_INT(LV_LABEL_TEXT_SEL_OFF); /** Long mode behaviors. Used in 'lv_label_ext_t' */ enum { - LV_LABEL_LONG_EXPAND, /**< Expand the object size to the text size*/ - LV_LABEL_LONG_WRAP, /**< Keep the object width, wrap the too long lines and expand the object height*/ - LV_LABEL_LONG_DOT, /**< Keep the size and write dots at the end if the text is too long*/ - LV_LABEL_LONG_SROLL, /**< Keep the size and roll the text back and forth*/ - LV_LABEL_LONG_SROLL_CIRC, /**< Keep the size and roll the text circularly*/ - LV_LABEL_LONG_CLIP, /**< Keep the size and clip the text out of it*/ + LV_LABEL_LONG_EXPAND, /**< Expand the object size to the text size*/ + LV_LABEL_LONG_WRAP, /**< Keep the object width, wrap the too long lines and expand the object height*/ + LV_LABEL_LONG_DOT, /**< Keep the size and write dots at the end if the text is too long*/ + LV_LABEL_LONG_SCROLL, /**< Keep the size and roll the text back and forth*/ + LV_LABEL_LONG_SCROLL_CIRCULAR, /**< Keep the size and roll the text circularly*/ + LV_LABEL_LONG_CLIP, /**< Keep the size and clip the text out of it*/ }; typedef uint8_t lv_label_long_mode_t; diff --git a/src/lv_widgets/lv_slider.c b/src/lv_widgets/lv_slider.c index 83732550c..cf65c9225 100644 --- a/src/lv_widgets/lv_slider.c +++ b/src/lv_widgets/lv_slider.c @@ -87,6 +87,7 @@ static void lv_slider_constructor(lv_obj_t * obj, const lv_obj_t * copy) /*Init the new slider slider*/ if(copy == NULL) { lv_obj_clear_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN); + lv_obj_clear_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS); lv_obj_clear_flag(obj, LV_OBJ_FLAG_SCROLLABLE); lv_obj_set_ext_click_area(obj, lv_dpx(5)); lv_obj_set_height(obj, LV_DPI_DEF / 15); diff --git a/src/lv_widgets/lv_switch.c b/src/lv_widgets/lv_switch.c index 3d1ea563f..0a5142735 100644 --- a/src/lv_widgets/lv_switch.c +++ b/src/lv_widgets/lv_switch.c @@ -78,6 +78,7 @@ static void lv_switch_constructor(lv_obj_t * obj, const lv_obj_t * copy) if(copy == NULL) { lv_obj_clear_flag(obj, LV_OBJ_FLAG_SCROLLABLE); + lv_obj_clear_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS); lv_obj_add_flag(obj, LV_OBJ_FLAG_CHECKABLE); lv_obj_set_size(obj, LV_DPX(60), LV_DPX(35)); }