From 093a6652cf20aa9092f8c70c97723a6e129369eb Mon Sep 17 00:00:00 2001 From: Gabor Kiss-Vamosi Date: Mon, 21 Dec 2020 10:56:25 +0100 Subject: [PATCH] integarte label and checkbox --- scripts/style_api_gen.py | 1 + src/lv_core/lv_obj.c | 81 ++- src/lv_core/lv_obj.h | 9 +- src/lv_core/lv_obj_draw.c | 2 +- src/lv_core/lv_obj_style.c | 35 +- src/lv_core/lv_obj_style.h | 3 + src/lv_core/lv_style.c | 4 + src/lv_core/lv_style.h | 131 ++--- src/lv_misc/lv_txt_ap.h | 2 +- src/lv_themes/lv_theme_default.c | 463 +++++++-------- src/lv_widgets/lv_bar.c | 39 +- src/lv_widgets/lv_btn.c | 2 +- src/lv_widgets/lv_checkbox.c | 243 ++++---- src/lv_widgets/lv_checkbox.h | 29 +- src/lv_widgets/lv_label.c | 968 +++++++++++++++---------------- src/lv_widgets/lv_label.h | 82 +-- src/lv_widgets/lv_slider.c | 28 +- 17 files changed, 994 insertions(+), 1128 deletions(-) diff --git a/scripts/style_api_gen.py b/scripts/style_api_gen.py index 1b811b5ef..a36aafb9e 100755 --- a/scripts/style_api_gen.py +++ b/scripts/style_api_gen.py @@ -47,6 +47,7 @@ props = [ {'name': 'IMG_RECOLOR_OPA', 'style_type': '_int', 'var_type': 'lv_opa_t' }, {'name': 'OUTLINE_WIDTH', 'style_type': '_int', 'var_type': 'lv_coord_t' }, {'name': 'OUTLINE_COLOR', 'style_type': '_color', 'var_type': 'lv_color_t' }, +{'name': 'OUTLINE_COLOR_FILTERED', 'style_type': '_color', 'var_type': 'lv_color_t' }, {'name': 'OUTLINE_OPA', 'style_type': '_int', 'var_type': 'lv_opa_t' }, {'name': 'OUTLINE_PAD', 'style_type': '_int', 'var_type': 'lv_coord_t' }, {'name': 'OUTLINE_BLEND_MODE', 'style_type': '_int', 'var_type': 'lv_blend_mode_t' }, diff --git a/src/lv_core/lv_obj.c b/src/lv_core/lv_obj.c index 5bb55c1cc..a98971956 100644 --- a/src/lv_core/lv_obj.c +++ b/src/lv_core/lv_obj.c @@ -58,6 +58,15 @@ typedef struct _lv_event_temp_data { struct _lv_event_temp_data * prev; } lv_event_temp_data_t; +typedef struct { + uint16_t time; + uint16_t delay; + lv_part_t part; + lv_state_t state; + lv_style_prop_t prop; + const lv_anim_path_t * path; +}trans_set_t; + /********************** * STATIC PROTOTYPES **********************/ @@ -74,22 +83,6 @@ static void lv_obj_destructor(void * obj); /********************** * STATIC VARIABLES **********************/ -static const uint16_t trans_prop_def[] = -{ - LV_STYLE_RADIUS, LV_STYLE_TRANSFORM_WIDTH, LV_STYLE_TRANSFORM_HEIGHT, LV_STYLE_TRANSFORM_ZOOM, LV_STYLE_TRANSFORM_ANGLE, LV_STYLE_OPA, - LV_STYLE_COLOR_FILTER_CB, LV_STYLE_COLOR_FILTER_OPA, - LV_STYLE_PAD_TOP, LV_STYLE_PAD_BOTTOM, LV_STYLE_PAD_LEFT, LV_STYLE_PAD_RIGHT, - LV_STYLE_MARGIN_TOP, LV_STYLE_MARGIN_BOTTOM, LV_STYLE_MARGIN_LEFT, LV_STYLE_MARGIN_RIGHT, - LV_STYLE_BG_COLOR, LV_STYLE_BG_OPA, LV_STYLE_BG_GRAD_COLOR, LV_STYLE_BG_MAIN_STOP, LV_STYLE_BG_GRAD_STOP, - LV_STYLE_BORDER_COLOR, LV_STYLE_BORDER_OPA, LV_STYLE_BORDER_WIDTH, - LV_STYLE_TEXT_COLOR, LV_STYLE_TEXT_OPA, LV_STYLE_TEXT_FONT, LV_STYLE_TEXT_LETTER_SPACE, LV_STYLE_TEXT_LINE_SPACE, - LV_STYLE_IMG_OPA, LV_STYLE_IMG_RECOLOR, LV_STYLE_IMG_RECOLOR_OPA, - LV_STYLE_OUTLINE_WIDTH, LV_STYLE_OUTLINE_COLOR, LV_STYLE_OUTLINE_OPA, LV_STYLE_OUTLINE_PAD, - LV_STYLE_SHADOW_WIDTH, LV_STYLE_SHADOW_OFS_X, LV_STYLE_SHADOW_OFS_Y, LV_STYLE_SHADOW_SPREAD, LV_STYLE_SHADOW_COLOR, LV_STYLE_SHADOW_OPA, - LV_STYLE_LINE_WIDTH, LV_STYLE_LINE_COLOR, LV_STYLE_LINE_OPA, - LV_STYLE_CONTENT_OFS_X, LV_STYLE_CONTENT_OFS_Y, - 0 -}; static bool lv_initialized = false; static lv_event_temp_data_t * event_temp_data_head; static const void * event_act_data; @@ -149,10 +142,20 @@ 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)); - + lv_mem_monitor_t mon; + lv_mem_monitor(&mon); + printf("used: %6d (%3d %%), frag: %3d %%, biggest free: %6d\n", + (int)mon.total_size - mon.free_size, mon.used_pct, mon.frag_pct, + (int)mon.free_biggest_size); lv_theme_t * th = LV_THEME_DEFAULT_INIT(LV_THEME_DEFAULT_COLOR_PRIMARY, LV_THEME_DEFAULT_COLOR_SECONDARY, LV_THEME_DEFAULT_FLAG, LV_THEME_DEFAULT_FONT_SMALL, LV_THEME_DEFAULT_FONT_NORMAL, LV_THEME_DEFAULT_FONT_SUBTITLE, LV_THEME_DEFAULT_FONT_TITLE); + + lv_mem_monitor(&mon); + printf("used: %6d (%3d %%), frag: %3d %%, biggest free: %6d\n", + (int)mon.total_size - mon.free_size, mon.used_pct, mon.frag_pct, + (int)mon.free_biggest_size); + lv_theme_set_act(th); /*Initialize the screen refresh system*/ @@ -215,12 +218,21 @@ lv_obj_t * lv_obj_create(lv_obj_t * parent, const lv_obj_t * copy) { lv_obj_t * obj = lv_class_new(&lv_obj); lv_obj.constructor(obj, parent, copy); - if(copy == NULL) lv_theme_apply(obj); -// else lv_style_list_copy(&obj->style_list, ©->style_list); + + lv_obj_create_finish(obj, parent, copy); return obj; } + +void lv_obj_create_finish(lv_obj_t * obj, lv_obj_t * parent, const lv_obj_t * copy) +{ + if(!copy) lv_theme_apply(obj); +// else lv_style_list_copy(&checkbox->style_indic, &checkbox_copy->style_indic); + + lv_obj_clear_state(obj, LV_STATE_BORN); +} + /** * Delete 'obj' and all of its children * @param obj pointer to an object to delete @@ -650,15 +662,6 @@ void lv_obj_set_state(lv_obj_t * obj, lv_state_t new_state) /*If there is no difference in styles there is nothing else to do*/ if(cmp_res == _LV_STYLE_STATE_CMP_SAME) return; - typedef struct { - uint16_t time; - uint16_t delay; - lv_part_t part; - lv_state_t state; - lv_style_prop_t prop; - const lv_anim_path_t * path; - }trans_set_t; - trans_set_t * ts = _lv_mem_buf_get(sizeof(trans_set_t) * STYLE_TRANSITION_MAX); _lv_memset_00(ts, sizeof(sizeof(trans_set_t) * 64)); uint32_t tsi = 0; @@ -1277,25 +1280,6 @@ lv_obj_t * _lv_obj_get_focused_obj(const lv_obj_t * obj) return (lv_obj_t *)focus_obj; } -/** - * Used in the signal callback to handle `LV_SIGNAL_GET_TYPE` signal - * @param obj pointer to an object - * @param buf pointer to `lv_obj_type_t`. (`param` in the signal callback) - * @param name name of the object. E.g. "lv_btn". (Only the pointer is saved) - * @return LV_RES_OK - */ -lv_res_t _lv_obj_handle_get_type_signal(lv_obj_type_t * buf, const char * name) -{ - uint8_t i; - for(i = 0; i < LV_MAX_ANCESTOR_NUM - 1; i++) { /*Find the last set data*/ - if(buf->type[i] == NULL) break; - } - buf->type[i] = name; - - return LV_RES_OK; -} - - /** * Get object's and its ancestors type. Put their name in `type_buf` starting with the current type. * E.g. buf.type[0]="lv_btn", buf.type[1]="lv_cont", buf.type[2]="lv_obj" @@ -1482,7 +1466,8 @@ static void lv_obj_constructor(lv_obj_t * obj, lv_obj_t * parent, const lv_obj_t obj->flags |= LV_OBJ_FLAG_SCROLL_MOMENTUM; obj->flags |= LV_OBJ_FLAG_FOCUS_SCROLL; if(parent) obj->flags |= LV_OBJ_FLAG_GESTURE_BUBBLE; - obj->state = LV_STATE_DEFAULT; + + obj->state = LV_STATE_BORN; /*Copy the attributes if required*/ if(copy != NULL) { diff --git a/src/lv_core/lv_obj.h b/src/lv_core/lv_obj.h index b1065cb41..69ceea813 100644 --- a/src/lv_core/lv_obj.h +++ b/src/lv_core/lv_obj.h @@ -162,6 +162,7 @@ enum { LV_STATE_PRESSED = 0x10, LV_STATE_SCROLLED = 0x20, LV_STATE_DISABLED = 0x40, + LV_STATE_BORN = 0x80, }; typedef uint8_t lv_state_t; @@ -255,16 +256,11 @@ enum { LV_PART_KNOB, LV_PART_PLACEHOLDER, LV_PART_HIGHLIGHT, + LV_PART_MARKER, }; typedef uint8_t lv_part_t; -/** Used by `lv_obj_get_type()`. The object's and its ancestor types are stored here*/ -typedef struct { - const char * type[LV_MAX_ANCESTOR_NUM]; /**< [0]: the actual type, [1]: ancestor, [2] #1's ancestor - ... [x]: "lv_obj" */ -} lv_obj_type_t; - typedef struct { lv_point_t * point; bool result; @@ -303,6 +299,7 @@ void lv_deinit(void); */ lv_obj_t * lv_obj_create(lv_obj_t * parent, const lv_obj_t * copy); +void lv_obj_create_finish(lv_obj_t * obj, lv_obj_t * parent, const lv_obj_t * copy); /** * Delete 'obj' and all of its children * @param obj pointer to an object to delete diff --git a/src/lv_core/lv_obj_draw.c b/src/lv_core/lv_obj_draw.c index a89c23a40..9033fdf18 100644 --- a/src/lv_core/lv_obj_draw.c +++ b/src/lv_core/lv_obj_draw.c @@ -88,7 +88,7 @@ void lv_obj_init_draw_rect_dsc(lv_obj_t * obj, uint8_t part, lv_draw_rect_dsc_t draw_dsc->border_opa = lv_obj_get_style_border_opa(obj, part); if(draw_dsc->border_opa > LV_OPA_MIN) { draw_dsc->border_side = lv_obj_get_style_border_side(obj, part); - draw_dsc->border_color = lv_obj_get_style_border_color(obj, part); + draw_dsc->border_color = lv_obj_get_style_border_color_filtered(obj, part); } #if LV_USE_BLEND_MODES draw_dsc->border_blend_mode = lv_obj_get_style_border_blend_mode(obj, part); diff --git a/src/lv_core/lv_obj_style.c b/src/lv_core/lv_obj_style.c index 23bb43830..094e246b1 100644 --- a/src/lv_core/lv_obj_style.c +++ b/src/lv_core/lv_obj_style.c @@ -32,30 +32,6 @@ typedef struct { lv_style_value_t end_value; } lv_style_trans_t; -typedef struct { - lv_draw_rect_dsc_t rect; - lv_draw_label_dsc_t label; - lv_draw_line_dsc_t line; - lv_draw_img_dsc_t img; - lv_coord_t pad_top; - lv_coord_t pad_bottom; - lv_coord_t pad_right; - lv_coord_t pad_left; - lv_coord_t pad_inner; - lv_coord_t margin_top; - lv_coord_t margin_bottom; - lv_coord_t margin_left; - lv_coord_t margin_right; - lv_coord_t transform_width; - lv_coord_t transform_height; - lv_coord_t transform_angle; - lv_coord_t transform_zoom; - lv_opa_t opa_scale; - uint32_t clip_corder :1; - uint32_t border_post :1; -}style_snapshot_t; - - /********************** * STATIC PROTOTYPES **********************/ @@ -756,12 +732,19 @@ static void trans_anim_cb(lv_style_trans_t * tr, lv_anim_value_t v) if(v == 0) value_final._int = tr->start_value._int; else if(v == 255) value_final._int = tr->end_value._int; else value_final._int = tr->start_value._int + ((int32_t)((int32_t)(tr->end_value._int - tr->start_value._int) * v) >> 8); - break; } + lv_style_value_t old_value; + bool refr = true; + if(lv_style_get_prop(list->styles[i].style, tr->prop, &old_value)) { + if(value_final._ptr == old_value._ptr && value_final._func == old_value._ptr && value_final._color.full == old_value._color.full && value_final._int == old_value._int) { + refr = false; + } + } + lv_style_set_prop(list->styles[i].style, tr->prop, value_final); - _lv_obj_refresh_style(tr->obj, tr->prop); + if (refr)_lv_obj_refresh_style(tr->obj, tr->prop); break; } diff --git a/src/lv_core/lv_obj_style.h b/src/lv_core/lv_obj_style.h index 347566a78..e21f4f44b 100644 --- a/src/lv_core/lv_obj_style.h +++ b/src/lv_core/lv_obj_style.h @@ -309,6 +309,9 @@ static inline lv_coord_t lv_obj_get_style_outline_width(const struct _lv_obj_t * static inline lv_color_t lv_obj_get_style_outline_color(const struct _lv_obj_t * obj, uint32_t part) { lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_OUTLINE_COLOR); return v._color; } +static inline lv_color_t lv_obj_get_style_outline_color_filtered(const struct _lv_obj_t * obj, uint32_t part) { + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_OUTLINE_COLOR_FILTERED); return v._color; } + static inline lv_opa_t lv_obj_get_style_outline_opa(const struct _lv_obj_t * obj, uint32_t part) { lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_OUTLINE_OPA); return v._int; } diff --git a/src/lv_core/lv_style.c b/src/lv_core/lv_style.c index a59d04f02..3a42440c8 100644 --- a/src/lv_core/lv_style.c +++ b/src/lv_core/lv_style.c @@ -101,6 +101,10 @@ void _alloc_ext(lv_style_t * style) style->ext = lv_mem_alloc(sizeof(lv_style_ext_t)); LV_ASSERT_MEM(style->ext); _lv_memset_00(style->ext, sizeof(lv_style_ext_t)); + + static uint32_t c = 0; +// printf("alloc: %d\n", c); + c++; } void lv_style_set_prop(lv_style_t * style, lv_style_prop_t prop, lv_style_value_t value) diff --git a/src/lv_core/lv_style.h b/src/lv_core/lv_style.h index 314a992d0..50e05a442 100644 --- a/src/lv_core/lv_style.h +++ b/src/lv_core/lv_style.h @@ -92,80 +92,80 @@ typedef enum { LV_STYLE_OPA = 7 | LV_STYLE_PROP_INHERIT, LV_STYLE_COLOR_FILTER_CB = 8, LV_STYLE_COLOR_FILTER_OPA = 9, + LV_STYLE_TRANSITION = 10, - LV_STYLE_PAD_TOP = 10 | LV_STYLE_PROP_LAYOUT_REFR, - LV_STYLE_PAD_BOTTOM = 11 | LV_STYLE_PROP_LAYOUT_REFR, - LV_STYLE_PAD_LEFT = 12 | LV_STYLE_PROP_LAYOUT_REFR, - LV_STYLE_PAD_RIGHT = 13 | LV_STYLE_PROP_LAYOUT_REFR, - LV_STYLE_MARGIN_TOP = 14 | LV_STYLE_PROP_LAYOUT_REFR, - LV_STYLE_MARGIN_BOTTOM = 15 | LV_STYLE_PROP_LAYOUT_REFR, - LV_STYLE_MARGIN_LEFT = 16 | LV_STYLE_PROP_LAYOUT_REFR, - LV_STYLE_MARGIN_RIGHT = 17 | LV_STYLE_PROP_LAYOUT_REFR, + LV_STYLE_PAD_TOP = 20 | LV_STYLE_PROP_LAYOUT_REFR, + LV_STYLE_PAD_BOTTOM = 21 | LV_STYLE_PROP_LAYOUT_REFR, + LV_STYLE_PAD_LEFT = 22 | LV_STYLE_PROP_LAYOUT_REFR, + LV_STYLE_PAD_RIGHT = 23 | LV_STYLE_PROP_LAYOUT_REFR, + LV_STYLE_MARGIN_TOP = 24 | LV_STYLE_PROP_LAYOUT_REFR, + LV_STYLE_MARGIN_BOTTOM = 25 | LV_STYLE_PROP_LAYOUT_REFR, + LV_STYLE_MARGIN_LEFT = 26 | LV_STYLE_PROP_LAYOUT_REFR, + LV_STYLE_MARGIN_RIGHT = 27 | LV_STYLE_PROP_LAYOUT_REFR, - LV_STYLE_BG_COLOR = 20, - LV_STYLE_BG_COLOR_FILTERED = 20 | LV_STYLE_PROP_FILTER, - LV_STYLE_BG_OPA = 21, - LV_STYLE_BG_GRAD_COLOR = 22, - LV_STYLE_BG_GRAD_COLOR_FILTERED = 22 | LV_STYLE_PROP_FILTER, - LV_STYLE_BG_GRAD_DIR = 23, - LV_STYLE_BG_BLEND_MODE = 24, - LV_STYLE_BG_MAIN_STOP = 25, - LV_STYLE_BG_GRAD_STOP = 26, + LV_STYLE_BG_COLOR = 30, + LV_STYLE_BG_COLOR_FILTERED = 30 | LV_STYLE_PROP_FILTER, + LV_STYLE_BG_OPA = 31, + LV_STYLE_BG_GRAD_COLOR = 32, + LV_STYLE_BG_GRAD_COLOR_FILTERED = 32 | LV_STYLE_PROP_FILTER, + LV_STYLE_BG_GRAD_DIR = 33, + LV_STYLE_BG_BLEND_MODE = 34, + LV_STYLE_BG_MAIN_STOP = 35, + LV_STYLE_BG_GRAD_STOP = 36, - LV_STYLE_BORDER_COLOR = 31, - LV_STYLE_BORDER_COLOR_FILTERED = 31 | LV_STYLE_PROP_FILTER, - LV_STYLE_BORDER_OPA = 32, - LV_STYLE_BORDER_WIDTH = 33, - LV_STYLE_BORDER_SIDE = 34, - LV_STYLE_BORDER_POST = 35, - LV_STYLE_BORDER_BLEND_MODE = 36, + LV_STYLE_BORDER_COLOR = 40, + LV_STYLE_BORDER_COLOR_FILTERED = 40 | LV_STYLE_PROP_FILTER, + LV_STYLE_BORDER_OPA = 41, + LV_STYLE_BORDER_WIDTH = 42, + LV_STYLE_BORDER_SIDE = 43, + LV_STYLE_BORDER_POST = 44, + LV_STYLE_BORDER_BLEND_MODE = 45, - LV_STYLE_TEXT_COLOR = 40 | LV_STYLE_PROP_INHERIT, - LV_STYLE_TEXT_COLOR_FILTERED = 40 | LV_STYLE_PROP_INHERIT | LV_STYLE_PROP_FILTER, - LV_STYLE_TEXT_OPA = 41 | LV_STYLE_PROP_INHERIT, - LV_STYLE_TEXT_FONT = 42 | LV_STYLE_PROP_INHERIT, - LV_STYLE_TEXT_LETTER_SPACE = 43 | LV_STYLE_PROP_INHERIT, - LV_STYLE_TEXT_LINE_SPACE = 44 | LV_STYLE_PROP_INHERIT, - LV_STYLE_TEXT_DECOR = 45 | LV_STYLE_PROP_INHERIT, - LV_STYLE_TEXT_BLEND_MODE = 46 | LV_STYLE_PROP_INHERIT, + LV_STYLE_TEXT_COLOR = 50 | LV_STYLE_PROP_INHERIT, + LV_STYLE_TEXT_COLOR_FILTERED = 50 | LV_STYLE_PROP_INHERIT | LV_STYLE_PROP_FILTER, + LV_STYLE_TEXT_OPA = 51 | LV_STYLE_PROP_INHERIT, + LV_STYLE_TEXT_FONT = 52 | LV_STYLE_PROP_INHERIT, + LV_STYLE_TEXT_LETTER_SPACE = 53 | LV_STYLE_PROP_INHERIT, + LV_STYLE_TEXT_LINE_SPACE = 54 | LV_STYLE_PROP_INHERIT, + LV_STYLE_TEXT_DECOR = 55 | LV_STYLE_PROP_INHERIT, + LV_STYLE_TEXT_BLEND_MODE = 56 | LV_STYLE_PROP_INHERIT, - LV_STYLE_IMG_OPA = 50, - LV_STYLE_IMG_BLEND_MODE = 51, - LV_STYLE_IMG_RECOLOR = 52, - LV_STYLE_IMG_RECOLOR_FILTERED = 52 | LV_STYLE_PROP_FILTER, - LV_STYLE_IMG_RECOLOR_OPA = 53, + LV_STYLE_IMG_OPA = 60, + LV_STYLE_IMG_BLEND_MODE = 61, + LV_STYLE_IMG_RECOLOR = 62, + LV_STYLE_IMG_RECOLOR_FILTERED = 62 | LV_STYLE_PROP_FILTER, + LV_STYLE_IMG_RECOLOR_OPA = 63, - LV_STYLE_OUTLINE_WIDTH = 61 | LV_STYLE_PROP_EXT_DRAW, - LV_STYLE_OUTLINE_COLOR = 62, - LV_STYLE_OUTLINE_COLOR_FILTERED = 62 | LV_STYLE_PROP_FILTER, - LV_STYLE_OUTLINE_OPA = 63 | LV_STYLE_PROP_EXT_DRAW, - LV_STYLE_OUTLINE_PAD = 64 | LV_STYLE_PROP_EXT_DRAW, - LV_STYLE_OUTLINE_BLEND_MODE = 65, + LV_STYLE_OUTLINE_WIDTH = 71 | LV_STYLE_PROP_EXT_DRAW, + LV_STYLE_OUTLINE_COLOR = 72, + LV_STYLE_OUTLINE_COLOR_FILTERED = 72 | LV_STYLE_PROP_FILTER, + LV_STYLE_OUTLINE_OPA = 73 | LV_STYLE_PROP_EXT_DRAW, + LV_STYLE_OUTLINE_PAD = 74 | LV_STYLE_PROP_EXT_DRAW, + LV_STYLE_OUTLINE_BLEND_MODE = 75, - LV_STYLE_SHADOW_WIDTH = 70 | LV_STYLE_PROP_EXT_DRAW, - LV_STYLE_SHADOW_OFS_X = 71 | LV_STYLE_PROP_EXT_DRAW, - LV_STYLE_SHADOW_OFS_Y = 72 | LV_STYLE_PROP_EXT_DRAW, - LV_STYLE_SHADOW_SPREAD = 73 | LV_STYLE_PROP_EXT_DRAW, - LV_STYLE_SHADOW_BLEND_MODE = 74, - LV_STYLE_SHADOW_COLOR = 75, - LV_STYLE_SHADOW_COLOR_FILTERED = 75 | LV_STYLE_PROP_FILTER, - LV_STYLE_SHADOW_OPA = 76 | LV_STYLE_PROP_EXT_DRAW, + LV_STYLE_SHADOW_WIDTH = 80 | LV_STYLE_PROP_EXT_DRAW, + LV_STYLE_SHADOW_OFS_X = 81 | LV_STYLE_PROP_EXT_DRAW, + LV_STYLE_SHADOW_OFS_Y = 82 | LV_STYLE_PROP_EXT_DRAW, + LV_STYLE_SHADOW_SPREAD = 83 | LV_STYLE_PROP_EXT_DRAW, + LV_STYLE_SHADOW_BLEND_MODE = 84, + LV_STYLE_SHADOW_COLOR = 85, + LV_STYLE_SHADOW_COLOR_FILTERED = 85 | LV_STYLE_PROP_FILTER, + LV_STYLE_SHADOW_OPA = 86 | LV_STYLE_PROP_EXT_DRAW, - LV_STYLE_LINE_WIDTH = 80 | LV_STYLE_PROP_EXT_DRAW, - LV_STYLE_LINE_BLEND_MODE = 81, - LV_STYLE_LINE_DASH_WIDTH = 82, - LV_STYLE_LINE_DASH_GAP = 83, - LV_STYLE_LINE_ROUNDED = 84, - LV_STYLE_LINE_COLOR = 85, - LV_STYLE_LINE_COLOR_FILTERED = 85 | LV_STYLE_PROP_FILTER, - LV_STYLE_LINE_OPA = 86, + LV_STYLE_LINE_WIDTH = 90 | LV_STYLE_PROP_EXT_DRAW, + LV_STYLE_LINE_BLEND_MODE = 91, + LV_STYLE_LINE_DASH_WIDTH = 92, + LV_STYLE_LINE_DASH_GAP = 93, + LV_STYLE_LINE_ROUNDED = 94, + LV_STYLE_LINE_COLOR = 95, + LV_STYLE_LINE_COLOR_FILTERED = 95 | LV_STYLE_PROP_FILTER, + LV_STYLE_LINE_OPA = 96, - LV_STYLE_CONTENT_SRC = 90 | LV_STYLE_PROP_EXT_DRAW, - LV_STYLE_CONTENT_ALIGN = 91 | LV_STYLE_PROP_EXT_DRAW, - LV_STYLE_CONTENT_OFS_X = 92 | LV_STYLE_PROP_EXT_DRAW, - LV_STYLE_CONTENT_OFS_Y = 93 | LV_STYLE_PROP_EXT_DRAW, + LV_STYLE_CONTENT_SRC = 100 | LV_STYLE_PROP_EXT_DRAW, + LV_STYLE_CONTENT_ALIGN = 101 | LV_STYLE_PROP_EXT_DRAW, + LV_STYLE_CONTENT_OFS_X = 102 | LV_STYLE_PROP_EXT_DRAW, + LV_STYLE_CONTENT_OFS_Y = 103 | LV_STYLE_PROP_EXT_DRAW, - LV_STYLE_TRANSITION = 100, _LV_STYLE_LAST_BUIL_IN_PROP, @@ -179,9 +179,6 @@ typedef struct { const struct _lv_style_transiton_t * transition; const char * content_text; - uint16_t transition_time; - uint16_t transition_delay; - lv_color_t bg_grad_color; lv_color_t outline_color; lv_color_t shadow_color; diff --git a/src/lv_misc/lv_txt_ap.h b/src/lv_misc/lv_txt_ap.h index d57420134..2f0ae998a 100644 --- a/src/lv_misc/lv_txt_ap.h +++ b/src/lv_misc/lv_txt_ap.h @@ -44,7 +44,7 @@ typedef struct { /********************** * GLOBAL PROTOTYPES **********************/ -uint32_t _lv_txt_ap_calc_bytes_cnt(const char * txt); +uint32_t _lv_txt_ap_proc(const char * txt); void _lv_txt_ap_proc(const char * txt, char * txt_out); /********************** diff --git a/src/lv_themes/lv_theme_default.c b/src/lv_themes/lv_theme_default.c index e7ecee735..06e857717 100644 --- a/src/lv_themes/lv_theme_default.c +++ b/src/lv_themes/lv_theme_default.c @@ -13,7 +13,7 @@ #include "../lv_misc/lv_gc.h" #if defined(LV_GC_INCLUDE) - #include LV_GC_INCLUDE +#include LV_GC_INCLUDE #endif /* LV_ENABLE_GC */ /********************* @@ -91,6 +91,7 @@ typedef struct { lv_style_t bg_color_gray; lv_style_t pressed; lv_style_t disabled; + lv_style_t pad_zero; lv_style_t pad_small; lv_style_t pad_small_negative; lv_style_t focus_border; @@ -101,6 +102,8 @@ typedef struct { lv_style_t no_radius; lv_style_t clip_corner; lv_style_t grow; + lv_style_t transition_delayed; + lv_style_t transition_normal; /*Parts*/ lv_style_t knob; @@ -113,10 +116,6 @@ typedef struct { lv_style_t arc_knob; #endif -#if LV_USE_BAR - lv_style_t bar_bg; - lv_style_t bar_indic; -#endif #if LV_USE_BTNMATRIX lv_style_t btnmatrix_btn; @@ -127,7 +126,7 @@ typedef struct { #endif #if LV_USE_CHECKBOX - lv_style_t cb_bg, cb_bullet; + lv_style_t cb_marker; #endif #if LV_USE_DROPDOWN @@ -146,9 +145,6 @@ typedef struct { lv_style_t roller_bg, roller_sel; #endif -#if LV_USE_SLIDER - lv_style_t slider_knob, slider_bg; -#endif #if LV_USE_SWITCH lv_style_t sw_knob; @@ -189,7 +185,7 @@ static bool inited; static void basic_init(void) { const static lv_style_prop_t trans_props[] = { - LV_STYLE_BG_OPA, LV_STYLE_TRANSFORM_WIDTH, LV_STYLE_TRANSFORM_HEIGHT, LV_STYLE_COLOR_FILTER_OPA, LV_STYLE_COLOR_FILTER_CB, 0 + LV_STYLE_BG_OPA, LV_STYLE_BG_COLOR, LV_STYLE_TRANSFORM_WIDTH, LV_STYLE_TRANSFORM_HEIGHT, LV_STYLE_COLOR_FILTER_OPA, LV_STYLE_COLOR_FILTER_CB, 0 }; static lv_style_transiton_t trans_delayed; @@ -201,6 +197,13 @@ static void basic_init(void) static lv_style_transiton_t trans_normal; lv_style_transition_init(&trans_normal, trans_props, &lv_anim_path_def, TRANSITION_TIME, 0); + style_init_reset(&styles->transition_delayed); + lv_style_set_transition(&styles->transition_delayed, &trans_delayed); /*Go back to default state with delay*/ + + style_init_reset(&styles->transition_normal); + lv_style_set_transition(&styles->transition_normal, &trans_normal); /*Go back to default state with delay*/ + + style_init_reset(&styles->scrollbar); lv_style_set_bg_opa(&styles->scrollbar, LV_OPA_COVER); lv_style_set_bg_color(&styles->scrollbar, (IS_LIGHT ? lv_color_hex(0xcccfd1) : lv_color_hex(0x777f85))); @@ -255,7 +258,6 @@ static void basic_init(void) lv_style_set_img_recolor(&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)); - lv_style_set_transition(&styles->btn, &trans_delayed); /*Go back to default state with delay*/ style_init_reset(&styles->btn_color); @@ -270,23 +272,24 @@ static void basic_init(void) style_init_reset(&styles->pressed); lv_style_set_color_filter_cb(&styles->pressed, lv_color_darken); lv_style_set_color_filter_opa(&styles->pressed, LV_OPA_20); - lv_style_set_transition(&styles->pressed, &trans_normal); style_init_reset(&styles->disabled); lv_style_set_color_filter_cb(&styles->disabled, lv_color_lighten); lv_style_set_color_filter_opa(&styles->disabled, LV_OPA_40); - lv_style_set_transition(&styles->disabled, &trans_normal); style_init_reset(&styles->clip_corner); lv_style_set_clip_corner(&styles->clip_corner, true); style_init_reset(&styles->pad_small); - lv_coord_t pad_small_value = lv_disp_get_size_category(NULL) <= LV_DISP_MEDIUM_LIMIT ? LV_DPX(10) : LV_DPX(20); + lv_coord_t pad_small_value = LV_DPX(10); lv_style_set_pad_all(&styles->pad_small, pad_small_value); style_init_reset(&styles->pad_small_negative); lv_style_set_pad_all(&styles->pad_small_negative, - LV_DPX(2)); + style_init_reset(&styles->pad_zero); + lv_style_set_pad_all(&styles->pad_zero, LV_DPX(2)); + style_init_reset(&styles->bg_color_primary); lv_style_set_bg_color(&styles->bg_color_primary, theme.color_primary); lv_style_set_bg_opa(&styles->bg_color_primary, LV_OPA_COVER); @@ -307,13 +310,41 @@ static void basic_init(void) lv_style_set_bg_opa(&styles->knob, LV_OPA_COVER); lv_style_set_pad_all(&styles->knob, LV_DPX(5)); lv_style_set_radius(&styles->knob, LV_RADIUS_CIRCLE); -} -static void btn_init(void) -{ -#if LV_USE_BTN != 0 -#endif + style_init_reset(&styles->cb_marker); + + //static void checkbox_init(void) + //{ + //#if LV_USE_CHECKBOX != 0 + // style_init_reset(&styles->cb_bg); + // lv_style_set_radius(&styles->cb_bg, LV_STATE_DEFAULT, LV_DPX(4)); + // lv_style_set_outline_color(&styles->cb_bg, LV_STATE_DEFAULT, theme.color_primary); + // lv_style_set_outline_opa(&styles->cb_bg, LV_STATE_DEFAULT, LV_OPA_TRANSP); + // lv_style_set_outline_opa(&styles->cb_bg, LV_STATE_FOCUSED, LV_OPA_50); + // lv_style_set_outline_width(&styles->cb_bg, LV_STATE_DEFAULT, OUTLINE_WIDTH); + // lv_style_set_outline_pad(&styles->cb_bg, LV_STATE_DEFAULT, LV_DPX(6)); + // lv_style_set_transition_time(&styles->cb_bg, LV_STATE_DEFAULT, TRANSITION_TIME); + // lv_style_set_transition_prop_6(&styles->cb_bg, LV_STATE_DEFAULT, LV_STYLE_OUTLINE_OPA); + // + // style_init_reset(&styles->cb_bullet); + // lv_style_set_outline_opa(&styles->cb_bullet, LV_STATE_FOCUSED, LV_OPA_TRANSP); + // lv_style_set_radius(&styles->cb_bullet, LV_STATE_DEFAULT, LV_DPX(4)); + // lv_style_set_pattern_image(&styles->cb_bullet, LV_STATE_CHECKED, LV_SYMBOL_OK); + // lv_style_set_pattern_recolor(&styles->cb_bullet, LV_STATE_CHECKED, LV_COLOR_WHITE); + // lv_style_set_pattern_opa(&styles->cb_bullet, LV_STATE_DEFAULT, LV_OPA_TRANSP); + // lv_style_set_pattern_opa(&styles->cb_bullet, LV_STATE_CHECKED, LV_OPA_COVER); + // lv_style_set_transition_prop_3(&styles->cb_bullet, LV_STATE_DEFAULT, LV_STYLE_PATTERN_OPA); + // lv_style_set_text_font(&styles->cb_bullet, LV_STATE_CHECKED, theme.font_small); + // lv_style_set_pad_left(&styles->cb_bullet, LV_STATE_DEFAULT, LV_DPX(3)); + // lv_style_set_pad_right(&styles->cb_bullet, LV_STATE_DEFAULT, LV_DPX(3)); + // lv_style_set_pad_top(&styles->cb_bullet, LV_STATE_DEFAULT, LV_DPX(3)); + // lv_style_set_pad_bottom(&styles->cb_bullet, LV_STATE_DEFAULT, LV_DPX(3)); + // lv_style_set_margin_right(&styles->cb_bullet, LV_STATE_DEFAULT, LV_DPX(6)); + //#endif + //} + + } static void btnmatrix_init(void) @@ -324,45 +355,6 @@ static void btnmatrix_init(void) #endif } -static void label_init(void) -{ -#if LV_USE_LABEL != 0 - -#endif -} - -static void bar_init(void) -{ -#if LV_USE_BAR -// style_init_reset(&styles->bar_bg); -// lv_style_set_radius(&styles->bar_bg, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE); -// lv_style_set_bg_opa(&styles->bar_bg, LV_STATE_DEFAULT, LV_OPA_COVER); -// lv_style_set_bg_color(&styles->bar_bg, LV_STATE_DEFAULT, COLOR_BG_SEC); -// lv_style_set_value_color(&styles->bar_bg, LV_STATE_DEFAULT, IS_LIGHT ? lv_color_hex(0x31404f) : LV_COLOR_WHITE); -// lv_style_set_outline_color(&styles->bar_bg, LV_STATE_DEFAULT, theme.color_primary); -// lv_style_set_outline_color(&styles->bar_bg, LV_STATE_EDITED, theme.color_secondary); -// lv_style_set_outline_opa(&styles->bar_bg, LV_STATE_DEFAULT, LV_OPA_TRANSP); -// lv_style_set_outline_opa(&styles->bar_bg, LV_STATE_FOCUSED, LV_OPA_50); -// lv_style_set_outline_width(&styles->bar_bg, LV_STATE_DEFAULT, OUTLINE_WIDTH); -// lv_style_set_transition_time(&styles->bar_bg, LV_STATE_DEFAULT, TRANSITION_TIME); -// lv_style_set_transition_prop_6(&styles->bar_bg, LV_STATE_DEFAULT, LV_STYLE_OUTLINE_OPA); -// -// style_init_reset(&styles->bar_indic); -// lv_style_set_bg_opa(&styles->bar_indic, LV_STATE_DEFAULT, LV_OPA_COVER); -// lv_style_set_radius(&styles->bar_indic, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE); -// lv_style_set_bg_color(&styles->bar_indic, LV_STATE_DEFAULT, theme.color_primary); -// lv_style_set_bg_color(&styles->bar_indic, LV_STATE_DISABLED, lv_color_hex3(0x888)); -// lv_style_set_value_color(&styles->bar_indic, LV_STATE_DEFAULT, IS_LIGHT ? lv_color_hex(0x41404f) : LV_COLOR_WHITE); -#endif -} - -static void img_init(void) -{ -#if LV_USE_IMG != 0 - -#endif -} - static void line_init(void) { #if LV_USE_LINE != 0 @@ -370,28 +362,6 @@ static void line_init(void) #endif } -static void slider_init(void) -{ -#if LV_USE_SLIDER != 0 -// style_init_reset(&styles->slider_knob); -// lv_style_set_bg_opa(&styles->slider_knob, LV_STATE_DEFAULT, LV_OPA_COVER); -// lv_style_set_bg_color(&styles->slider_knob, LV_STATE_DEFAULT, IS_LIGHT ? theme.color_primary : LV_COLOR_WHITE); -// lv_style_set_value_color(&styles->slider_knob, LV_STATE_DEFAULT, IS_LIGHT ? lv_color_hex(0x31404f) : LV_COLOR_WHITE); -// lv_style_set_radius(&styles->slider_knob, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE); -// lv_style_set_pad_left(&styles->slider_knob, LV_STATE_DEFAULT, LV_DPX(7)); -// lv_style_set_pad_right(&styles->slider_knob, LV_STATE_DEFAULT, LV_DPX(7)); -// lv_style_set_pad_top(&styles->slider_knob, LV_STATE_DEFAULT, LV_DPX(7)); -// lv_style_set_pad_bottom(&styles->slider_knob, LV_STATE_DEFAULT, LV_DPX(7)); -// -// style_init_reset(&styles->slider_bg); -// lv_style_set_margin_left(&styles->slider_bg, LV_STATE_DEFAULT, LV_DPX(10)); -// lv_style_set_margin_right(&styles->slider_bg, LV_STATE_DEFAULT, LV_DPX(10)); -// lv_style_set_margin_top(&styles->slider_bg, LV_STATE_DEFAULT, LV_DPX(10)); -// lv_style_set_margin_bottom(&styles->slider_bg, LV_STATE_DEFAULT, LV_DPX(10)); - -#endif -} - static void switch_init(void) { #if LV_USE_SWITCH != 0 @@ -510,36 +480,6 @@ static void chart_init(void) #endif } -static void checkbox_init(void) -{ -#if LV_USE_CHECKBOX != 0 - style_init_reset(&styles->cb_bg); - lv_style_set_radius(&styles->cb_bg, LV_STATE_DEFAULT, LV_DPX(4)); - lv_style_set_outline_color(&styles->cb_bg, LV_STATE_DEFAULT, theme.color_primary); - lv_style_set_outline_opa(&styles->cb_bg, LV_STATE_DEFAULT, LV_OPA_TRANSP); - lv_style_set_outline_opa(&styles->cb_bg, LV_STATE_FOCUSED, LV_OPA_50); - lv_style_set_outline_width(&styles->cb_bg, LV_STATE_DEFAULT, OUTLINE_WIDTH); - lv_style_set_outline_pad(&styles->cb_bg, LV_STATE_DEFAULT, LV_DPX(6)); - lv_style_set_transition_time(&styles->cb_bg, LV_STATE_DEFAULT, TRANSITION_TIME); - lv_style_set_transition_prop_6(&styles->cb_bg, LV_STATE_DEFAULT, LV_STYLE_OUTLINE_OPA); - - style_init_reset(&styles->cb_bullet); - lv_style_set_outline_opa(&styles->cb_bullet, LV_STATE_FOCUSED, LV_OPA_TRANSP); - lv_style_set_radius(&styles->cb_bullet, LV_STATE_DEFAULT, LV_DPX(4)); - lv_style_set_pattern_image(&styles->cb_bullet, LV_STATE_CHECKED, LV_SYMBOL_OK); - lv_style_set_pattern_recolor(&styles->cb_bullet, LV_STATE_CHECKED, LV_COLOR_WHITE); - lv_style_set_pattern_opa(&styles->cb_bullet, LV_STATE_DEFAULT, LV_OPA_TRANSP); - lv_style_set_pattern_opa(&styles->cb_bullet, LV_STATE_CHECKED, LV_OPA_COVER); - lv_style_set_transition_prop_3(&styles->cb_bullet, LV_STATE_DEFAULT, LV_STYLE_PATTERN_OPA); - lv_style_set_text_font(&styles->cb_bullet, LV_STATE_CHECKED, theme.font_small); - lv_style_set_pad_left(&styles->cb_bullet, LV_STATE_DEFAULT, LV_DPX(3)); - lv_style_set_pad_right(&styles->cb_bullet, LV_STATE_DEFAULT, LV_DPX(3)); - lv_style_set_pad_top(&styles->cb_bullet, LV_STATE_DEFAULT, LV_DPX(3)); - lv_style_set_pad_bottom(&styles->cb_bullet, LV_STATE_DEFAULT, LV_DPX(3)); - lv_style_set_margin_right(&styles->cb_bullet, LV_STATE_DEFAULT, LV_DPX(6)); -#endif -} - static void textarea_init(void) { #if LV_USE_TEXTAREA @@ -551,7 +491,7 @@ static void textarea_init(void) style_init_reset(&styles->ta_placeholder); lv_style_set_text_color(&styles->ta_placeholder, LV_STATE_DEFAULT, - IS_LIGHT ? COLOR_BG_TEXT_DIS : lv_color_hex(0xa1adbd)); + IS_LIGHT ? COLOR_BG_TEXT_DIS : lv_color_hex(0xa1adbd)); #endif } @@ -634,8 +574,8 @@ static void win_init(void) * @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, uint32_t flags, - const lv_font_t * font_small, const lv_font_t * font_normal, const lv_font_t * font_subtitle, - const lv_font_t * font_title) + const lv_font_t * font_small, const lv_font_t * font_normal, const lv_font_t * font_subtitle, + const lv_font_t * font_title) { /* This trick is required only to avoid the garbage collection of @@ -655,20 +595,14 @@ lv_theme_t * lv_theme_default_init(lv_color_t color_primary, lv_color_t color_se theme.flags = flags; basic_init(); - btn_init(); btnmatrix_init(); - label_init(); - bar_init(); - img_init(); line_init(); - slider_init(); switch_init(); linemeter_init(); gauge_init(); arc_init(); spinner_init(); chart_init(); - checkbox_init(); textarea_init(); ddlist_init(); roller_init(); @@ -707,229 +641,220 @@ static void theme_apply(lv_theme_t * th, lv_obj_t * obj) else if(lv_obj_check_type(obj, &lv_btn)) { 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->btn_color); + 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); lv_obj_add_style(obj, LV_PART_MAIN, LV_STATE_PRESSED, &styles->grow); + lv_obj_add_style(obj, LV_PART_MAIN, LV_STATE_BORN, &styles->grow); lv_obj_add_style(obj, LV_PART_MAIN, LV_STATE_CHECKED, &styles->btn_color_checked); } #endif #if LV_USE_BAR else if(lv_obj_check_type(obj, &lv_bar)) { - lv_obj_add_style(obj, LV_PART_MAIN, LV_STATE_DEFAULT, &styles->bg_color_gray); - lv_obj_add_style(obj, LV_PART_MAIN, LV_STATE_DEFAULT, &styles->circle); - lv_obj_add_style(obj, LV_PART_INDICATOR, LV_STATE_DEFAULT, &styles->bg_color_primary); - lv_obj_add_style(obj, LV_PART_INDICATOR, LV_STATE_DEFAULT, &styles->circle); + lv_obj_add_style(obj, LV_PART_MAIN, LV_STATE_DEFAULT, &styles->bg_color_gray); + lv_obj_add_style(obj, LV_PART_MAIN, LV_STATE_DEFAULT, &styles->circle); + lv_obj_add_style(obj, LV_PART_INDICATOR, LV_STATE_DEFAULT, &styles->bg_color_primary); + lv_obj_add_style(obj, LV_PART_INDICATOR, LV_STATE_DEFAULT, &styles->circle); } +#endif +#if LV_USE_SLIDER else if(lv_obj_check_type(obj, &lv_slider)) { - lv_obj_add_style(obj, LV_PART_MAIN, LV_STATE_DEFAULT, &styles->bg_color_gray); - lv_obj_add_style(obj, LV_PART_MAIN, LV_STATE_DEFAULT, &styles->circle); - lv_obj_add_style(obj, LV_PART_INDICATOR, LV_STATE_DEFAULT, &styles->bg_color_primary); - lv_obj_add_style(obj, LV_PART_INDICATOR, LV_STATE_DEFAULT, &styles->circle); - lv_obj_add_style(obj, LV_PART_KNOB, LV_STATE_DEFAULT, &styles->knob); + lv_obj_add_style(obj, LV_PART_MAIN, LV_STATE_DEFAULT, &styles->bg_color_gray); + lv_obj_add_style(obj, LV_PART_MAIN, LV_STATE_PRESSED, &styles->grow); + lv_obj_add_style(obj, LV_PART_MAIN, LV_STATE_DEFAULT, &styles->circle); + 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->transition_normal); + lv_obj_add_style(obj, LV_PART_INDICATOR, LV_STATE_DEFAULT, &styles->bg_color_primary); + lv_obj_add_style(obj, LV_PART_INDICATOR, LV_STATE_DEFAULT, &styles->circle); + lv_obj_add_style(obj, LV_PART_KNOB, LV_STATE_DEFAULT, &styles->knob); + lv_obj_add_style(obj, LV_PART_KNOB, LV_STATE_PRESSED, &styles->grow); + lv_obj_add_style(obj, LV_PART_KNOB, LV_STATE_DEFAULT, &styles->transition_delayed); + lv_obj_add_style(obj, LV_PART_KNOB, LV_STATE_PRESSED, &styles->transition_normal); + } +#endif + +#if LV_USE_CHECKBOX + else if(lv_obj_check_type(obj, &lv_checkbox)) { + lv_obj_add_style(obj, LV_PART_MARKER, LV_STATE_DEFAULT, &styles->card); + lv_obj_add_style(obj, LV_PART_MARKER, LV_STATE_DEFAULT, &styles->pad_zero); + lv_obj_add_style(obj, LV_PART_MARKER, LV_STATE_CHECKED, &styles->bg_color_primary); + lv_obj_add_style(obj, LV_PART_MARKER, LV_STATE_PRESSED, &styles->pressed); + lv_obj_add_style(obj, LV_PART_MAIN, LV_STATE_PRESSED, &styles->transition_normal); + lv_obj_add_style(obj, LV_PART_MARKER, LV_STATE_DEFAULT, &styles->transition_delayed); } #endif #if LV_USE_BTNMATRIX - case LV_THEME_BTNMATRIX: - list = _lv_obj_get_style_list(obj, LV_BTNMATRIX_PART_MAIN); - _lv_style_list_add_style(list, &styles->card); - _lv_style_list_add_style(list, &styles->pad_small); +case LV_THEME_BTNMATRIX: + list = _lv_obj_get_style_list(obj, LV_BTNMATRIX_PART_MAIN); + _lv_style_list_add_style(list, &styles->card); + _lv_style_list_add_style(list, &styles->pad_small); - list = _lv_obj_get_style_list(obj, LV_BTNMATRIX_PART_BTN); - _lv_style_list_add_style(list, &styles->card); - _lv_style_list_add_style(list, &styles->bg_click); - _lv_style_list_add_style(list, &styles->btnmatrix_btn); + list = _lv_obj_get_style_list(obj, LV_BTNMATRIX_PART_BTN); + _lv_style_list_add_style(list, &styles->card); + _lv_style_list_add_style(list, &styles->bg_click); + _lv_style_list_add_style(list, &styles->btnmatrix_btn); - list = _lv_obj_get_style_list(obj, LV_BTNMATRIX_PART_BTN_2); - _lv_style_list_add_style(list, &styles->card); - _lv_style_list_add_style(list, &styles->bg_click); - _lv_style_list_add_style(list, &styles->btnmatrix_btn); - break; + list = _lv_obj_get_style_list(obj, LV_BTNMATRIX_PART_BTN_2); + _lv_style_list_add_style(list, &styles->card); + _lv_style_list_add_style(list, &styles->bg_click); + _lv_style_list_add_style(list, &styles->btnmatrix_btn); + break; #endif #if LV_USE_SWITCH - case LV_THEME_SWITCH: - list = _lv_obj_get_style_list(obj, LV_SWITCH_PART_MAIN); - _lv_style_list_add_style(list, &styles->bar_bg); +case LV_THEME_SWITCH: + list = _lv_obj_get_style_list(obj, LV_SWITCH_PART_MAIN); + _lv_style_list_add_style(list, &styles->bar_bg); - list = _lv_obj_get_style_list(obj, LV_SWITCH_PART_INDIC); - _lv_style_list_add_style(list, &styles->bar_indic); + list = _lv_obj_get_style_list(obj, LV_SWITCH_PART_INDIC); + _lv_style_list_add_style(list, &styles->bar_indic); - list = _lv_obj_get_style_list(obj, LV_SWITCH_PART_KNOB); - _lv_style_list_add_style(list, &styles->sw_knob); - break; + list = _lv_obj_get_style_list(obj, LV_SWITCH_PART_KNOB); + _lv_style_list_add_style(list, &styles->sw_knob); + break; #endif #if LV_USE_IMG - case LV_THEME_IMAGE: - break; +case LV_THEME_IMAGE: + break; #endif #if LV_USE_IMGBTN - case LV_THEME_IMGBTN: - break; -#endif - -#if LV_USE_LABEL - case LV_THEME_LABEL: - break; +case LV_THEME_IMGBTN: + break; #endif #if LV_USE_LINE - case LV_THEME_LINE: - break; +case LV_THEME_LINE: + break; #endif #if LV_USE_ARC - case LV_THEME_ARC: - list = _lv_obj_get_style_list(obj, LV_ARC_PART_BG); - _lv_style_list_add_style(list, &styles->card); - _lv_style_list_add_style(list, &styles->arc_bg); - _lv_style_list_add_style(list, &styles->sb); +case LV_THEME_ARC: + list = _lv_obj_get_style_list(obj, LV_ARC_PART_BG); + _lv_style_list_add_style(list, &styles->card); + _lv_style_list_add_style(list, &styles->arc_bg); + _lv_style_list_add_style(list, &styles->sb); - list = _lv_obj_get_style_list(obj, LV_ARC_PART_INDIC); - _lv_style_list_add_style(list, &styles->arc_indic); + list = _lv_obj_get_style_list(obj, LV_ARC_PART_INDIC); + _lv_style_list_add_style(list, &styles->arc_indic); - list = _lv_obj_get_style_list(obj, LV_ARC_PART_KNOB); - _lv_style_list_add_style(list, &styles->card); - _lv_style_list_add_style(list, &styles->bg_click); - _lv_style_list_add_style(list, &styles->arc_knob); - break; -#endif - -#if LV_USE_SLIDER -// case LV_THEME_SLIDER: -// list = _lv_obj_get_style_list(obj, LV_SLIDER_PART_MAIN); -// _lv_style_list_add_style(list, &styles->bar_bg); -// _lv_style_list_add_style(list, &styles->slider_bg); -// -// list = _lv_obj_get_style_list(obj, LV_SLIDER_PART_INDIC); -// _lv_style_list_add_style(list, &styles->bar_indic); -// -// list = _lv_obj_get_style_list(obj, LV_SLIDER_PART_KNOB); -// _lv_style_list_add_style(list, &styles->slider_knob); -// break; -#endif - -#if LV_USE_CHECKBOX - case LV_THEME_CHECKBOX: - list = _lv_obj_get_style_list(obj, LV_CHECKBOX_PART_MAIN); - _lv_style_list_add_style(list, &styles->cb_bg); - _lv_style_list_add_style(list, &styles->sb); - - list = _lv_obj_get_style_list(obj, LV_CHECKBOX_PART_BULLET); - _lv_style_list_add_style(list, &styles->btn); - _lv_style_list_add_style(list, &styles->cb_bullet); - break; + list = _lv_obj_get_style_list(obj, LV_ARC_PART_KNOB); + _lv_style_list_add_style(list, &styles->card); + _lv_style_list_add_style(list, &styles->bg_click); + _lv_style_list_add_style(list, &styles->arc_knob); + break; #endif #if LV_USE_ROLLER - case LV_THEME_ROLLER: - list = _lv_obj_get_style_list(obj, LV_ROLLER_PART_BG); - _lv_style_list_add_style(list, &styles->card); - _lv_style_list_add_style(list, &styles->roller_bg); - _lv_style_list_add_style(list, &styles->sb); +case LV_THEME_ROLLER: + list = _lv_obj_get_style_list(obj, LV_ROLLER_PART_BG); + _lv_style_list_add_style(list, &styles->card); + _lv_style_list_add_style(list, &styles->roller_bg); + _lv_style_list_add_style(list, &styles->sb); - list = _lv_obj_get_style_list(obj, LV_ROLLER_PART_SELECTED); - _lv_style_list_add_style(list, &styles->roller_sel); - break; + list = _lv_obj_get_style_list(obj, LV_ROLLER_PART_SELECTED); + _lv_style_list_add_style(list, &styles->roller_sel); + break; #endif #if LV_USE_OBJMASK - case LV_THEME_OBJMASK: - list = _lv_obj_get_style_list(obj, LV_OBJMASK_PART_MAIN); - break; +case LV_THEME_OBJMASK: + list = _lv_obj_get_style_list(obj, LV_OBJMASK_PART_MAIN); + break; #endif #if LV_USE_DROPDOWN - case LV_THEME_DROPDOWN: - list = _lv_obj_get_style_list(obj, LV_DROPDOWN_PART_MAIN); - _lv_style_list_add_style(list, &styles->card); - _lv_style_list_add_style(list, &styles->bg_click); - _lv_style_list_add_style(list, &styles->pad_small); +case LV_THEME_DROPDOWN: + list = _lv_obj_get_style_list(obj, LV_DROPDOWN_PART_MAIN); + _lv_style_list_add_style(list, &styles->card); + _lv_style_list_add_style(list, &styles->bg_click); + _lv_style_list_add_style(list, &styles->pad_small); - list = _lv_obj_get_style_list(obj, LV_DROPDOWN_PART_LIST); - _lv_style_list_add_style(list, &styles->card); - _lv_style_list_add_style(list, &styles->ddlist_page); - _lv_style_list_add_style(list, &styles->sb); + list = _lv_obj_get_style_list(obj, LV_DROPDOWN_PART_LIST); + _lv_style_list_add_style(list, &styles->card); + _lv_style_list_add_style(list, &styles->ddlist_page); + _lv_style_list_add_style(list, &styles->sb); - list = _lv_obj_get_style_list(obj, LV_DROPDOWN_PART_SELECTED); - _lv_style_list_add_style(list, &styles->ddlist_sel); - break; + list = _lv_obj_get_style_list(obj, LV_DROPDOWN_PART_SELECTED); + _lv_style_list_add_style(list, &styles->ddlist_sel); + break; #endif #if LV_USE_CHART - case LV_THEME_CHART: - list = _lv_obj_get_style_list(obj, LV_CHART_PART_BG); - _lv_style_list_add_style(list, &styles->card); - _lv_style_list_add_style(list, &styles->chart_bg); - _lv_style_list_add_style(list, &styles->pad_small); +case LV_THEME_CHART: + list = _lv_obj_get_style_list(obj, LV_CHART_PART_BG); + _lv_style_list_add_style(list, &styles->card); + _lv_style_list_add_style(list, &styles->chart_bg); + _lv_style_list_add_style(list, &styles->pad_small); - list = _lv_obj_get_style_list(obj, LV_CHART_PART_SERIES_BG); - _lv_style_list_add_style(list, &styles->pad_small); - _lv_style_list_add_style(list, &styles->chart_series_bg); + list = _lv_obj_get_style_list(obj, LV_CHART_PART_SERIES_BG); + _lv_style_list_add_style(list, &styles->pad_small); + _lv_style_list_add_style(list, &styles->chart_series_bg); - list = _lv_obj_get_style_list(obj, LV_CHART_PART_CURSOR); - _lv_style_list_add_style(list, &styles->chart_series_bg); + list = _lv_obj_get_style_list(obj, LV_CHART_PART_CURSOR); + _lv_style_list_add_style(list, &styles->chart_series_bg); - list = _lv_obj_get_style_list(obj, LV_CHART_PART_SERIES); - _lv_style_list_add_style(list, &styles->chart_series); - break; + list = _lv_obj_get_style_list(obj, LV_CHART_PART_SERIES); + _lv_style_list_add_style(list, &styles->chart_series); + break; #endif #if LV_USE_TABLE - case LV_THEME_TABLE: { - list = _lv_obj_get_style_list(obj, LV_TABLE_PART_BG); - _lv_style_list_add_style(list, &styles->card); +case LV_THEME_TABLE: { + list = _lv_obj_get_style_list(obj, LV_TABLE_PART_BG); + _lv_style_list_add_style(list, &styles->card); - int idx = 1; /* start value should be 1, not zero, since cell styles + int idx = 1; /* start value should be 1, not zero, since cell styles start at 1 due to presence of LV_TABLE_PART_BG=0 in the enum (lv_table.h) */ - /* declaring idx outside loop to work with older compilers */ - for(; idx <= LV_TABLE_CELL_STYLE_CNT; idx ++) { - list = _lv_obj_get_style_list(obj, idx); - _lv_style_list_add_style(list, &styles->table_cell); - } - break; - } + /* declaring idx outside loop to work with older compilers */ + for(; idx <= LV_TABLE_CELL_STYLE_CNT; idx ++) { + list = _lv_obj_get_style_list(obj, idx); + _lv_style_list_add_style(list, &styles->table_cell); + } + break; +} #endif #if LV_USE_TEXTAREA - case LV_THEME_TEXTAREA: - list = _lv_obj_get_style_list(obj, LV_TEXTAREA_PART_MAIN); - _lv_style_list_add_style(list, &styles->card); - _lv_style_list_add_style(list, &styles->pad_small); - _lv_style_list_add_style(list, &styles->sb); +case LV_THEME_TEXTAREA: + list = _lv_obj_get_style_list(obj, LV_TEXTAREA_PART_MAIN); + _lv_style_list_add_style(list, &styles->card); + _lv_style_list_add_style(list, &styles->pad_small); + _lv_style_list_add_style(list, &styles->sb); - list = _lv_obj_get_style_list(obj, LV_TEXTAREA_PART_PLACEHOLDER); - _lv_style_list_add_style(list, &styles->ta_placeholder); + list = _lv_obj_get_style_list(obj, LV_TEXTAREA_PART_PLACEHOLDER); + _lv_style_list_add_style(list, &styles->ta_placeholder); - list = _lv_obj_get_style_list(obj, LV_TEXTAREA_PART_CURSOR); - _lv_style_list_add_style(list, &styles->ta_cursor); - break; + list = _lv_obj_get_style_list(obj, LV_TEXTAREA_PART_CURSOR); + _lv_style_list_add_style(list, &styles->ta_cursor); + break; #endif #if LV_USE_LINEMETER - case LV_THEME_LINEMETER: - list = _lv_obj_get_style_list(obj, LV_LINEMETER_PART_MAIN); - _lv_style_list_add_style(list, &styles->card); - _lv_style_list_add_style(list, &styles->lmeter); - break; +case LV_THEME_LINEMETER: + list = _lv_obj_get_style_list(obj, LV_LINEMETER_PART_MAIN); + _lv_style_list_add_style(list, &styles->card); + _lv_style_list_add_style(list, &styles->lmeter); + break; #endif #if LV_USE_GAUGE - case LV_THEME_GAUGE: - list = _lv_obj_get_style_list(obj, LV_GAUGE_PART_MAIN); - _lv_style_list_add_style(list, &styles->card); - _lv_style_list_add_style(list, &styles->gauge_main); +case LV_THEME_GAUGE: + list = _lv_obj_get_style_list(obj, LV_GAUGE_PART_MAIN); + _lv_style_list_add_style(list, &styles->card); + _lv_style_list_add_style(list, &styles->gauge_main); - list = _lv_obj_get_style_list(obj, LV_GAUGE_PART_MAJOR); - _lv_style_list_add_style(list, &styles->gauge_strong); + list = _lv_obj_get_style_list(obj, LV_GAUGE_PART_MAJOR); + _lv_style_list_add_style(list, &styles->gauge_strong); - list = _lv_obj_get_style_list(obj, LV_GAUGE_PART_NEEDLE); - _lv_style_list_add_style(list, &styles->gauge_needle); - break; + list = _lv_obj_get_style_list(obj, LV_GAUGE_PART_NEEDLE); + _lv_style_list_add_style(list, &styles->gauge_needle); + break; #endif } diff --git a/src/lv_widgets/lv_bar.c b/src/lv_widgets/lv_bar.c index b495156ca..b1080580b 100644 --- a/src/lv_widgets/lv_bar.c +++ b/src/lv_widgets/lv_bar.c @@ -1,5 +1,3 @@ - - /** * @file lv_bar.c * @@ -85,10 +83,7 @@ lv_obj_t * lv_bar_create(lv_obj_t * parent, const lv_obj_t * copy) lv_obj_t * obj = lv_class_new(&lv_bar); lv_bar.constructor(obj, parent, copy); - lv_bar_t * bar = (lv_bar_t *) obj; - const lv_bar_t * bar_copy = (const lv_bar_t *) copy; - if(!copy) lv_theme_apply(obj); -// else lv_style_list_copy(&bar->style_indic, &bar_copy->style_indic); + lv_obj_create_finish(obj, parent, copy); return obj; } @@ -409,10 +404,19 @@ static void draw_indic(lv_obj_t * obj, const lv_area_t * clip_area) lv_bidi_dir_t base_dir = lv_obj_get_base_dir(obj); - lv_coord_t objw = lv_obj_get_width(obj); - lv_coord_t objh = lv_obj_get_height(obj); + lv_area_t bar_coords; + lv_obj_get_coords(obj, &bar_coords); + + lv_coord_t transf_w = lv_obj_get_style_transform_width(obj, LV_PART_MAIN); + lv_coord_t transf_h = lv_obj_get_style_transform_height(obj, LV_PART_MAIN); + bar_coords.x1 -= transf_w; + bar_coords.x2 += transf_w; + bar_coords.y1 -= transf_h; + bar_coords.y2 += transf_h; + lv_coord_t barw = lv_area_get_width(&bar_coords); + lv_coord_t barh = lv_area_get_height(&bar_coords); int32_t range = bar->max_value - bar->min_value; - bool hor = objw >= objh ? true : false; + bool hor = barw >= barh ? true : false; bool sym = false; if(bar->type == LV_BAR_TYPE_SYMMETRICAL && bar->min_value < 0 && bar->max_value > 0 && bar->start_value == bar->min_value) sym = true; @@ -422,20 +426,19 @@ static void draw_indic(lv_obj_t * obj, const lv_area_t * clip_area) lv_coord_t bg_right = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); lv_coord_t bg_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); lv_coord_t bg_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); - /*Respect padding and minimum width/height too*/ - lv_area_copy(&bar->indic_area, &bar->coords); + lv_area_copy(&bar->indic_area, &bar_coords); bar->indic_area.x1 += bg_left; bar->indic_area.x2 -= bg_right; bar->indic_area.y1 += bg_top; bar->indic_area.y2 -= bg_bottom; if(hor && lv_area_get_height(&bar->indic_area) < LV_BAR_SIZE_MIN) { - bar->indic_area.y1 = bar->coords.y1 + (objh / 2) - (LV_BAR_SIZE_MIN / 2); + bar->indic_area.y1 = bar->coords.y1 + (barh / 2) - (LV_BAR_SIZE_MIN / 2); bar->indic_area.y2 = bar->indic_area.y1 + LV_BAR_SIZE_MIN; } else if(!hor && lv_area_get_width(&bar->indic_area) < LV_BAR_SIZE_MIN) { - bar->indic_area.x1 = bar->coords.x1 + (objw / 2) - (LV_BAR_SIZE_MIN / 2); + bar->indic_area.x1 = bar->coords.x1 + (barw / 2) - (LV_BAR_SIZE_MIN / 2); bar->indic_area.x2 = bar->indic_area.x1 + LV_BAR_SIZE_MIN; } @@ -532,7 +535,7 @@ static void draw_indic(lv_obj_t * obj, const lv_area_t * clip_area) if(!sym && indic_length_calc(&bar->indic_area) <= 1) return; uint16_t bg_radius = lv_obj_get_style_radius(obj, LV_PART_MAIN); - lv_coord_t short_side = LV_MATH_MIN(objw, objh); + lv_coord_t short_side = LV_MATH_MIN(barw, barh); if(bg_radius > short_side >> 1) bg_radius = short_side >> 1; lv_draw_rect_dsc_t draw_indic_dsc; @@ -557,7 +560,7 @@ static void draw_indic(lv_obj_t * obj, const lv_area_t * clip_area) } lv_draw_mask_radius_param_t mask_bg_param; - lv_draw_mask_radius_init(&mask_bg_param, &bar->coords, bg_radius, false); + lv_draw_mask_radius_init(&mask_bg_param, &bar_coords, bg_radius, false); int16_t mask_bg_id = lv_draw_mask_add(&mask_bg_param, NULL); /*Draw_only the background and the pattern*/ @@ -570,17 +573,17 @@ static void draw_indic(lv_obj_t * obj, const lv_area_t * clip_area) /*Get the max possible indicator area. The gradient should be applied on this*/ lv_area_t mask_indic_max_area; - lv_area_copy(&mask_indic_max_area, &bar->coords); + lv_area_copy(&mask_indic_max_area, &bar_coords); mask_indic_max_area.x1 += bg_left; mask_indic_max_area.y1 += bg_top; mask_indic_max_area.x2 -= bg_right; mask_indic_max_area.y2 -= bg_bottom; if(hor && lv_area_get_height(&mask_indic_max_area) < LV_BAR_SIZE_MIN) { - mask_indic_max_area.y1 = bar->coords.y1 + (objh / 2) - (LV_BAR_SIZE_MIN / 2); + mask_indic_max_area.y1 = bar->coords.y1 + (barh / 2) - (LV_BAR_SIZE_MIN / 2); mask_indic_max_area.y2 = mask_indic_max_area.y1 + LV_BAR_SIZE_MIN; } else if(!hor && lv_area_get_width(&mask_indic_max_area) < LV_BAR_SIZE_MIN) { - mask_indic_max_area.x1 = bar->coords.x1 + (objw / 2) - (LV_BAR_SIZE_MIN / 2); + mask_indic_max_area.x1 = bar->coords.x1 + (barw / 2) - (LV_BAR_SIZE_MIN / 2); mask_indic_max_area.x2 = mask_indic_max_area.x1 + LV_BAR_SIZE_MIN; } diff --git a/src/lv_widgets/lv_btn.c b/src/lv_widgets/lv_btn.c index 71e701f8b..4cca4b6be 100644 --- a/src/lv_widgets/lv_btn.c +++ b/src/lv_widgets/lv_btn.c @@ -68,7 +68,7 @@ lv_obj_t * lv_btn_create(lv_obj_t * parent, const lv_obj_t * copy) lv_obj_t * obj = lv_class_new(&lv_btn); lv_btn.constructor(obj, parent, copy); - if(!copy) lv_theme_apply(obj); + lv_obj_create_finish(obj, parent, copy); LV_LOG_TRACE("button create started"); return obj; diff --git a/src/lv_widgets/lv_checkbox.c b/src/lv_widgets/lv_checkbox.c index d08919d4e..31672fa36 100644 --- a/src/lv_widgets/lv_checkbox.c +++ b/src/lv_widgets/lv_checkbox.c @@ -26,15 +26,15 @@ /********************** * STATIC PROTOTYPES **********************/ -static lv_design_res_t lv_checkbox_design(lv_obj_t * cb, const lv_area_t * clip_area, lv_design_mode_t mode); -static lv_res_t lv_checkbox_signal(lv_obj_t * cb, lv_signal_t sign, void * param); -static lv_style_list_t * lv_checkbox_get_style(lv_obj_t * cb, uint8_t type); +static void lv_checkbox_constructor(lv_obj_t * obj, lv_obj_t * parent, const lv_obj_t * copy); +static void lv_checkbox_destructor(void * obj); +static lv_design_res_t lv_checkbox_design(lv_obj_t * obj, const lv_area_t * clip_area, lv_design_mode_t mode); +static lv_res_t lv_checkbox_signal(lv_obj_t * obj, lv_signal_t sign, void * param); /********************** * STATIC VARIABLES **********************/ -static lv_signal_cb_t ancestor_signal; -static lv_design_cb_t ancestor_design; +lv_checkbox_class_t lv_checkbox; /********************** * MACROS @@ -50,51 +50,25 @@ static lv_design_cb_t ancestor_design; * @param copy pointer to a check box object, if not NULL then the new object will be copied from it * @return pointer to the created check box */ -lv_obj_t * lv_checkbox_create(lv_obj_t * par, const lv_obj_t * copy) +lv_obj_t * lv_checkbox_create(lv_obj_t * parent, const lv_obj_t * copy) { LV_LOG_TRACE("check box create started"); - /*Create the ancestor basic object*/ - lv_obj_t * cb = lv_obj_create(par, copy); - LV_ASSERT_MEM(cb); - if(cb == NULL) return NULL; - - if(ancestor_signal == NULL) ancestor_signal = lv_obj_get_signal_cb(cb); - if(ancestor_design == NULL) ancestor_design = lv_obj_get_design_cb(cb); - - lv_checkbox_ext_t * ext = lv_obj_allocate_ext_attr(cb, sizeof(lv_checkbox_ext_t)); - LV_ASSERT_MEM(ext); - if(ext == NULL) { - lv_obj_del(cb); - return NULL; + if(!lv_checkbox._inited) { + LV_CLASS_INIT(lv_checkbox, lv_obj); + lv_checkbox.constructor = lv_checkbox_constructor; + lv_checkbox.destructor = lv_checkbox_destructor; + lv_checkbox.design_cb = lv_checkbox_design; + lv_checkbox.signal_cb = lv_checkbox_signal; } - lv_style_list_init(&ext->style_bullet); + lv_obj_t * obj = lv_class_new(&lv_checkbox); + lv_checkbox.constructor(obj, parent, copy); - lv_obj_set_signal_cb(cb, lv_checkbox_signal); - lv_obj_set_design_cb(cb, lv_checkbox_design); - - /*Init the new checkbox object*/ - if(copy == NULL) { - ext->txt = "Check box"; - ext->static_txt = 1; - lv_theme_apply(cb, LV_THEME_CHECKBOX); - lv_obj_add_flag(cb, LV_OBJ_FLAG_CLICKABLE); - lv_obj_add_flag(cb, LV_OBJ_FLAG_CHECKABLE); - lv_obj_set_size(cb, LV_SIZE_AUTO, LV_SIZE_AUTO); - } - else { - - lv_checkbox_ext_t * copy_ext = lv_obj_get_ext_attr(copy); - lv_style_list_copy(&ext->style_bullet, ©_ext->style_bullet); - - /*Refresh the style with new signal function*/ - _lv_obj_refresh_style(cb, LV_OBJ_PART_ALL, LV_STYLE_PROP_ALL); - } + lv_obj_create_finish(obj, parent, copy); LV_LOG_INFO("check box created"); - - return cb; + return obj; } /*===================== @@ -107,18 +81,26 @@ lv_obj_t * lv_checkbox_create(lv_obj_t * par, const lv_obj_t * copy) * @param cb pointer to a check box * @param txt the text of the check box. NULL to refresh with the current text. */ -void lv_checkbox_set_text(lv_obj_t * cb, const char * txt) +void lv_checkbox_set_text(lv_obj_t * obj, const char * txt) { - lv_checkbox_ext_t * ext = lv_obj_get_ext_attr(cb); + lv_checkbox_t * cb = (lv_checkbox_t *) obj; +#if LV_USE_ARABIC_PERSIAN_CHARS + size_t len = _lv_txt_ap_proc(txt); +#else size_t len = strlen(txt); +#endif - if(!ext->static_txt) ext->txt = lv_mem_realloc(ext->txt, len + 1); - else ext->txt = lv_mem_alloc(len + 1); + if(!cb->static_txt) cb->txt = lv_mem_realloc(cb->txt, len + 1); + else cb->txt = lv_mem_alloc(len + 1); +#if LV_USE_ARABIC_PERSIAN_CHARS + _lv_txt_ap_proc(txt, cb->txt); +#else + strcpy(cb->txt, txt); +#endif - strcpy(ext->txt, txt); - ext->static_txt = 0; + cb->static_txt = 0; - _lv_obj_handle_self_size_chg(cb); + _lv_obj_handle_self_size_chg(obj); } /** @@ -127,16 +109,16 @@ void lv_checkbox_set_text(lv_obj_t * cb, const char * txt) * @param cb pointer to a check box * @param txt the text of the check box. NULL to refresh with the current text. */ -void lv_checkbox_set_text_static(lv_obj_t * cb, const char * txt) +void lv_checkbox_set_text_static(lv_obj_t * obj, const char * txt) { - lv_checkbox_ext_t * ext = lv_obj_get_ext_attr(cb); + lv_checkbox_t * cb = (lv_checkbox_t *) obj; - if(!ext->static_txt) lv_mem_free(ext->txt); + if(!cb->static_txt) lv_mem_free(cb->txt); - ext->txt = (char*)txt; - ext->static_txt = 1; + cb->txt = (char*)txt; + cb->static_txt = 1; - _lv_obj_handle_self_size_chg(cb); + _lv_obj_handle_self_size_chg(obj); } /*===================== @@ -148,16 +130,56 @@ void lv_checkbox_set_text_static(lv_obj_t * cb, const char * txt) * @param cb pointer to check box object * @return pointer to the text of the check box */ -const char * lv_checkbox_get_text(const lv_obj_t * cb) +const char * lv_checkbox_get_text(const lv_obj_t * obj) { - lv_checkbox_ext_t * ext = lv_obj_get_ext_attr(cb); - return ext->txt; + lv_checkbox_t * cb = (lv_checkbox_t *) obj; + return cb->txt; } /********************** * STATIC FUNCTIONS **********************/ +static void lv_checkbox_constructor(lv_obj_t * obj, lv_obj_t * parent, const lv_obj_t * copy) +{ + LV_LOG_TRACE("lv_checkbox create started"); + + LV_CLASS_CONSTRUCTOR_BEGIN(obj, lv_checkbox) + lv_checkbox.base_p->constructor(obj, parent, copy); + + lv_checkbox_t * cb = (lv_checkbox_t *) obj; + /*Create the ancestor basic object*/ + + /*Init the new checkbox object*/ + if(copy == NULL) { + cb->txt = "Check box"; + cb->static_txt = 1; + lv_obj_add_flag(obj, LV_OBJ_FLAG_CLICKABLE); + lv_obj_add_flag(obj, LV_OBJ_FLAG_CHECKABLE); + lv_obj_set_size(obj, LV_SIZE_AUTO, LV_SIZE_AUTO); + } + else { + const lv_checkbox_t * copy_ext = (const lv_checkbox_t *)copy; + } + + + LV_CLASS_CONSTRUCTOR_END(obj, lv_checkbox) + LV_LOG_INFO("lv_checkbox created"); +} + +static void lv_checkbox_destructor(void * obj) +{ +// lv_checkbox_t * bar = obj; +// +// _lv_obj_reset_style_list_no_refr(obj, LV_PART_INDICATOR); +//#if LV_USE_ANIMATION +// lv_anim_del(&bar->cur_value_anim, NULL); +// lv_anim_del(&bar->start_value_anim, NULL); +//#endif + +// bar->class_p->base_p->destructor(obj); +} + /** * Handle the drawing related tasks of the check box * @param cb pointer to a check box object @@ -168,52 +190,50 @@ const char * lv_checkbox_get_text(const lv_obj_t * cb) * LV_DESIGN_DRAW_POST: drawing after every children are drawn * @param return an element of `lv_design_res_t` */ -static lv_design_res_t lv_checkbox_design(lv_obj_t * cb, const lv_area_t * clip_area, lv_design_mode_t mode) +static lv_design_res_t lv_checkbox_design(lv_obj_t * obj, const lv_area_t * clip_area, lv_design_mode_t mode) { /* A label never covers an area */ if(mode == LV_DESIGN_COVER_CHK) - return LV_DESIGN_RES_NOT_COVER; + return lv_checkbox.base_p->design_cb(obj, clip_area, mode); else if(mode == LV_DESIGN_DRAW_MAIN) { /*Draw the background*/ - ancestor_design(cb, clip_area, mode); + lv_checkbox.base_p->design_cb(obj, clip_area, mode); - lv_checkbox_ext_t * ext = lv_obj_get_ext_attr(cb); + lv_checkbox_t * cb = (lv_checkbox_t *) obj; - const lv_font_t * font = lv_obj_get_style_text_font(cb, LV_CHECKBOX_PART_MAIN); + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); lv_coord_t font_h = lv_font_get_line_height(font); - lv_coord_t bg_topp = lv_obj_get_style_pad_top(cb, LV_CHECKBOX_PART_MAIN); - lv_coord_t bg_leftp = lv_obj_get_style_pad_left(cb, LV_CHECKBOX_PART_MAIN); + lv_coord_t bg_topp = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + lv_coord_t bg_leftp = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); - lv_coord_t bullet_leftm = lv_obj_get_style_margin_left(cb, LV_CHECKBOX_PART_BULLET); - lv_coord_t bullet_topm = lv_obj_get_style_margin_top(cb, LV_CHECKBOX_PART_BULLET); - lv_coord_t bullet_rightm = lv_obj_get_style_margin_right(cb, LV_CHECKBOX_PART_BULLET); + lv_coord_t bullet_rightm = lv_obj_get_style_margin_right(obj, LV_PART_MARKER); - lv_coord_t bullet_leftp = lv_obj_get_style_pad_left(cb, LV_CHECKBOX_PART_BULLET); - lv_coord_t bullet_rightp = lv_obj_get_style_pad_right(cb, LV_CHECKBOX_PART_BULLET); - lv_coord_t bullet_topp = lv_obj_get_style_pad_top(cb, LV_CHECKBOX_PART_BULLET); - lv_coord_t bullet_bottomp = lv_obj_get_style_pad_bottom(cb, LV_CHECKBOX_PART_BULLET); + lv_coord_t bullet_leftp = lv_obj_get_style_pad_left(obj, LV_PART_MARKER); + lv_coord_t bullet_rightp = lv_obj_get_style_pad_right(obj, LV_PART_MARKER); + lv_coord_t bullet_topp = lv_obj_get_style_pad_top(obj, LV_PART_MARKER); + lv_coord_t bullet_bottomp = lv_obj_get_style_pad_bottom(obj, LV_PART_MARKER); lv_draw_rect_dsc_t bullet_dsc; lv_draw_rect_dsc_init(&bullet_dsc); - lv_obj_init_draw_rect_dsc(cb, LV_CHECKBOX_PART_BULLET, &bullet_dsc); + lv_obj_init_draw_rect_dsc(obj, LV_PART_MARKER, &bullet_dsc); lv_area_t bullet_area; - bullet_area.x1 = cb->coords.x1 + bg_leftp + bullet_leftm; + bullet_area.x1 = cb->coords.x1 + bg_leftp; bullet_area.x2 = bullet_area.x1 + font_h + bullet_leftp + bullet_rightp - 1; - bullet_area.y1 = cb->coords.y1 + bg_topp + bullet_topm; + bullet_area.y1 = cb->coords.y1 + bg_topp; bullet_area.y2 = bullet_area.y1 + font_h + bullet_topp + bullet_bottomp - 1; lv_draw_rect(&bullet_area, clip_area, &bullet_dsc); - lv_coord_t line_space = lv_obj_get_style_text_line_space(cb, LV_CHECKBOX_PART_MAIN); - lv_coord_t letter_space = lv_obj_get_style_text_letter_space(cb, LV_CHECKBOX_PART_MAIN); + lv_coord_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + lv_coord_t letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_MAIN); lv_point_t txt_size; - _lv_txt_get_size(&txt_size, ext->txt, font, letter_space, line_space, LV_COORD_MAX, LV_TXT_FLAG_NONE); + _lv_txt_get_size(&txt_size, cb->txt, font, letter_space, line_space, LV_COORD_MAX, LV_TXT_FLAG_NONE); lv_draw_label_dsc_t txt_dsc; lv_draw_label_dsc_init(&txt_dsc); - lv_obj_init_draw_label_dsc(cb, LV_CHECKBOX_PART_MAIN, &txt_dsc); + lv_obj_init_draw_label_dsc(obj, LV_PART_MAIN, &txt_dsc); lv_coord_t y_ofs = (lv_area_get_height(&bullet_area) - font_h) / 2; lv_area_t txt_area; @@ -222,10 +242,10 @@ static lv_design_res_t lv_checkbox_design(lv_obj_t * cb, const lv_area_t * clip_ txt_area.y1 = cb->coords.y1 + bg_topp + y_ofs; txt_area.y2 = txt_area.y1 + txt_size.y; - lv_draw_label(&txt_area, clip_area, &txt_dsc, ext->txt, NULL); + lv_draw_label(&txt_area, clip_area, &txt_dsc, cb->txt, NULL); } else { - ancestor_design(cb, clip_area, mode); + lv_checkbox.base_p->design_cb(obj, clip_area, mode); } return LV_DESIGN_RES_OK; @@ -237,45 +257,34 @@ static lv_design_res_t lv_checkbox_design(lv_obj_t * cb, const lv_area_t * clip_ * @param param pointer to a signal specific variable * @return LV_RES_OK: the object is not deleted in the function; LV_RES_INV: the object is deleted */ -static lv_res_t lv_checkbox_signal(lv_obj_t * cb, lv_signal_t sign, void * param) +static lv_res_t lv_checkbox_signal(lv_obj_t * obj, lv_signal_t sign, void * param) { lv_res_t res; /* Include the ancient signal function */ - res = ancestor_signal(cb, sign, param); + res = lv_checkbox.base_p->signal_cb(obj, sign, param); if(res != LV_RES_OK) return res; - if(sign == LV_SIGNAL_GET_STYLE) { - lv_get_style_info_t * info = param; - info->result = lv_checkbox_get_style(cb, info->part); - if(info->result != NULL) return LV_RES_OK; - else return ancestor_signal(cb, sign, param); - } - else if (sign == LV_SIGNAL_GET_TYPE) { - return _lv_obj_handle_get_type_signal(param, LV_OBJX_NAME); - } else if (sign == LV_SIGNAL_GET_SELF_SIZE) { lv_point_t * p = param; - lv_checkbox_ext_t * ext = lv_obj_get_ext_attr(cb); + lv_checkbox_t * cb = (lv_checkbox_t *) obj; - const lv_font_t * font = lv_obj_get_style_text_font(cb, LV_CHECKBOX_PART_MAIN); + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); lv_coord_t font_h = lv_font_get_line_height(font); - lv_coord_t line_space = lv_obj_get_style_text_line_space(cb, LV_CHECKBOX_PART_MAIN); - lv_coord_t letter_space = lv_obj_get_style_text_letter_space(cb, LV_CHECKBOX_PART_MAIN); + lv_coord_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + lv_coord_t letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_MAIN); lv_point_t txt_size; - _lv_txt_get_size(&txt_size, ext->txt, font, letter_space, line_space, LV_COORD_MAX, LV_TXT_FLAG_NONE); + _lv_txt_get_size(&txt_size, cb->txt, font, letter_space, line_space, LV_COORD_MAX, LV_TXT_FLAG_NONE); - lv_coord_t bullet_leftm = lv_obj_get_style_margin_left(cb, LV_CHECKBOX_PART_BULLET); - lv_coord_t bullet_topm = lv_obj_get_style_margin_top(cb, LV_CHECKBOX_PART_BULLET); - lv_coord_t bullet_rightm = lv_obj_get_style_margin_right(cb, LV_CHECKBOX_PART_BULLET); - lv_coord_t bullet_bottomm = lv_obj_get_style_margin_bottom(cb, LV_CHECKBOX_PART_BULLET); - lv_coord_t bullet_leftp = lv_obj_get_style_pad_left(cb, LV_CHECKBOX_PART_BULLET); - lv_coord_t bullet_rightp = lv_obj_get_style_pad_right(cb, LV_CHECKBOX_PART_BULLET); - lv_coord_t bullet_topp = lv_obj_get_style_pad_top(cb, LV_CHECKBOX_PART_BULLET); - lv_coord_t bullet_bottomp = lv_obj_get_style_pad_bottom(cb, LV_CHECKBOX_PART_BULLET); + lv_coord_t bullet_rightm = lv_obj_get_style_margin_right(obj, LV_PART_MARKER); + lv_coord_t bullet_bottomm = lv_obj_get_style_margin_bottom(obj, LV_PART_MARKER); + lv_coord_t bullet_leftp = lv_obj_get_style_pad_left(obj, LV_PART_MARKER); + lv_coord_t bullet_rightp = lv_obj_get_style_pad_right(obj, LV_PART_MARKER); + lv_coord_t bullet_topp = lv_obj_get_style_pad_top(obj, LV_PART_MARKER); + lv_coord_t bullet_bottomp = lv_obj_get_style_pad_bottom(obj, LV_PART_MARKER); lv_point_t bullet_size; - bullet_size.x = font_h + bullet_leftm + bullet_rightm + bullet_leftp + bullet_rightp; - bullet_size.y = font_h + bullet_topm + bullet_bottomm + bullet_topp + bullet_bottomp; + bullet_size.x = font_h + bullet_rightm + bullet_leftp + bullet_rightp; + bullet_size.y = font_h + bullet_bottomm + bullet_topp + bullet_bottomp; p->x = bullet_size.x + txt_size.x; p->y = LV_MATH_MAX(bullet_size.y, txt_size.y); @@ -285,24 +294,4 @@ static lv_res_t lv_checkbox_signal(lv_obj_t * cb, lv_signal_t sign, void * param return res; } - -static lv_style_list_t * lv_checkbox_get_style(lv_obj_t * cb, uint8_t type) -{ - lv_style_list_t * style_dsc_p; - - lv_checkbox_ext_t * ext = lv_obj_get_ext_attr(cb); - switch(type) { - case LV_CHECKBOX_PART_MAIN: - style_dsc_p = &cb->style_list; - break; - case LV_CHECKBOX_PART_BULLET: - style_dsc_p = &ext->style_bullet; - break; - default: - style_dsc_p = NULL; - } - - return style_dsc_p; -} - #endif diff --git a/src/lv_widgets/lv_checkbox.h b/src/lv_widgets/lv_checkbox.h index 3899bcd82..5ae760117 100644 --- a/src/lv_widgets/lv_checkbox.h +++ b/src/lv_widgets/lv_checkbox.h @@ -31,21 +31,22 @@ extern "C" { * TYPEDEFS **********************/ -/*Data of check box*/ -typedef struct { - /*New data for this widget */ - lv_style_list_t style_bullet; - char * txt; - uint32_t static_txt :1; -} lv_checkbox_ext_t; -/** Checkbox styles. */ -enum { - LV_CHECKBOX_PART_MAIN = LV_OBJ_PART_MAIN, /**< Style of object background. */ - LV_CHECKBOX_PART_BULLET, /**< Style of the bullet */ - _LV_CHECKBOX_PART_VIRTUAL_LAST, -}; -typedef uint8_t lv_checkbox_style_t; +LV_CLASS_DECLARE_START(lv_checkbox, lv_obj); + +#define _lv_checkbox_constructor void (*constructor)(struct _lv_obj_t * obj, struct _lv_obj_t * parent, const struct _lv_obj_t * copy) + +#define _lv_checkbox_data \ + _lv_obj_data \ + char * txt; \ + uint32_t static_txt :1; + +#define _lv_checkbox_class_dsc \ + _lv_obj_class_dsc + +LV_CLASS_DECLARE_END(lv_checkbox, lv_obj); + +extern lv_checkbox_class_t lv_checkbox; /********************** * GLOBAL PROTOTYPES diff --git a/src/lv_widgets/lv_label.c b/src/lv_widgets/lv_label.c index a4f961cf5..ad81e5d48 100644 --- a/src/lv_widgets/lv_label.c +++ b/src/lv_widgets/lv_label.c @@ -29,9 +29,8 @@ #define LV_LABEL_DEF_SCROLL_SPEED (25) #endif -#define LV_LABEL_DOT_END_INV 0xFFFF -#define LV_LABEL_HINT_HEIGHT_LIMIT \ - 1024 /*Enable "hint" to buffer info about labels larger than this. (Speed up their drawing)*/ +#define LV_LABEL_DOT_END_INV 0xFFFFFFFF +#define LV_LABEL_HINT_HEIGHT_LIMIT 1024 /*Enable "hint" to buffer info about labels larger than this. (Speed up drawing)*/ /********************** * TYPEDEFS @@ -40,6 +39,10 @@ /********************** * STATIC PROTOTYPES **********************/ +lv_label_class_t lv_label; + +static void lv_label_constructor(lv_obj_t * obj, lv_obj_t * parent, const lv_obj_t * copy); +static void lv_label_destructor(void * obj); static lv_res_t lv_label_signal(lv_obj_t * label, lv_signal_t sign, void * param); static lv_design_res_t lv_label_design(lv_obj_t * label, const lv_area_t * clip_area, lv_design_mode_t mode); static void lv_label_revert_dots(lv_obj_t * label); @@ -57,7 +60,6 @@ static void get_txt_coords(const lv_obj_t * label, lv_area_t * area); /********************** * STATIC VARIABLES **********************/ -static lv_signal_cb_t ancestor_signal; /********************** * MACROS @@ -76,62 +78,20 @@ static lv_signal_cb_t ancestor_signal; */ lv_obj_t * lv_label_create(lv_obj_t * parent, const lv_obj_t * copy) { - LV_LOG_TRACE("label create started"); - - /*Create a basic object*/ - lv_obj_t * new_label = lv_obj_create(parent, copy); - LV_ASSERT_MEM(new_label); - if(new_label == NULL) return NULL; - - if(ancestor_signal == NULL) ancestor_signal = lv_obj_get_signal_cb(new_label); - - /*Extend the basic object to a label object*/ - lv_obj_allocate_ext_attr(new_label, sizeof(lv_label_ext_t)); - - lv_label_ext_t * ext = lv_obj_get_ext_attr(new_label); - LV_ASSERT_MEM(ext); - if(ext == NULL) { - lv_obj_del(new_label); - return NULL; + if(!lv_label._inited) { + LV_CLASS_INIT(lv_label, lv_obj); + lv_label.constructor = lv_label_constructor; + lv_label.destructor = lv_label_destructor; + lv_label.design_cb = lv_label_design; + lv_label.signal_cb = lv_label_signal; } - ext->text = NULL; - ext->static_txt = 0; - ext->recolor = 0; - ext->align = LV_LABEL_ALIGN_AUTO; - ext->dot_end = LV_LABEL_DOT_END_INV; - ext->long_mode = LV_LABEL_LONG_EXPAND; -#if LV_USE_ANIMATION - ext->anim_speed = LV_LABEL_DEF_SCROLL_SPEED; -#endif - ext->offset.x = 0; - ext->offset.y = 0; + lv_obj_t * obj = lv_class_new(&lv_label); + lv_label.constructor(obj, parent, copy); -#if LV_LABEL_LONG_TXT_HINT - ext->hint.line_start = -1; - ext->hint.coord_y = 0; - ext->hint.y = 0; -#endif + lv_obj_create_finish(obj, parent, copy); -#if LV_LABEL_TEXT_SEL - ext->sel_start = LV_DRAW_LABEL_NO_TXT_SEL; - ext->sel_end = LV_DRAW_LABEL_NO_TXT_SEL; -#endif - ext->dot.tmp_ptr = NULL; - ext->dot_tmp_alloc = 0; - - lv_obj_set_design_cb(new_label, lv_label_design); - lv_obj_set_signal_cb(new_label, lv_label_signal); - - /*Init the new label*/ - lv_theme_apply(new_label, LV_THEME_LABEL); - lv_obj_clear_flag(new_label, LV_OBJ_FLAG_CLICKABLE); - lv_label_set_long_mode(new_label, LV_LABEL_LONG_EXPAND); - lv_label_set_text(new_label, "Text"); - - LV_LOG_INFO("label created"); - - return new_label; + return obj; } /*===================== @@ -143,69 +103,68 @@ lv_obj_t * lv_label_create(lv_obj_t * parent, const lv_obj_t * copy) * @param label pointer to a label object * @param text '\0' terminated character string. NULL to refresh with the current text. */ -void lv_label_set_text(lv_obj_t * label, const char * text) +void lv_label_set_text(lv_obj_t * obj, const char * text) { - LV_ASSERT_OBJ(label, LV_OBJX_NAME); + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + lv_label_t * label = (lv_label_t *) obj; - lv_obj_invalidate(label); - - lv_label_ext_t * ext = lv_obj_get_ext_attr(label); + lv_obj_invalidate(obj); /*If text is NULL then just refresh with the current text */ - if(text == NULL) text = ext->text; + if(text == NULL) text = label->text; LV_ASSERT_STR(text); - if(ext->text == text && ext->static_txt == 0) { + if(label->text == text && label->static_txt == 0) { /*If set its own text then reallocate it (maybe its size changed)*/ #if LV_USE_ARABIC_PERSIAN_CHARS /*Get the size of the text and process it*/ size_t len = _lv_txt_ap_calc_bytes_cnt(text); - ext->text = lv_mem_realloc(ext->text, len); - LV_ASSERT_MEM(ext->text); - if(ext->text == NULL) return; + label->text = lv_mem_realloc(label->text, len); + LV_ASSERT_MEM(label->text); + if(label->text == NULL) return; - _lv_txt_ap_proc(ext->text, ext->text); + _lv_txt_ap_proc(label->text, label->text); #else - ext->text = lv_mem_realloc(ext->text, strlen(ext->text) + 1); + label->text = lv_mem_realloc(label->text, strlen(label->text) + 1); #endif - LV_ASSERT_MEM(ext->text); - if(ext->text == NULL) return; + LV_ASSERT_MEM(label->text); + if(label->text == NULL) return; } else { /*Free the old text*/ - if(ext->text != NULL && ext->static_txt == 0) { - lv_mem_free(ext->text); - ext->text = NULL; + if(label->text != NULL && label->static_txt == 0) { + lv_mem_free(label->text); + label->text = NULL; } #if LV_USE_ARABIC_PERSIAN_CHARS /*Get the size of the text and process it*/ size_t len = _lv_txt_ap_calc_bytes_cnt(text); - ext->text = lv_mem_alloc(len); - LV_ASSERT_MEM(ext->text); - if(ext->text == NULL) return; + label->text = lv_mem_alloc(len); + LV_ASSERT_MEM(label->text); + if(label->text == NULL) return; - _lv_txt_ap_proc(text, ext->text); + _lv_txt_ap_proc(text, label->text); #else /*Get the size of the text*/ size_t len = strlen(text) + 1; /*Allocate space for the new text*/ - ext->text = lv_mem_alloc(len); - LV_ASSERT_MEM(ext->text); - if(ext->text == NULL) return; - strcpy(ext->text, text); + label->text = lv_mem_alloc(len); + LV_ASSERT_MEM(label->text); + if(label->text == NULL) return; + strcpy(label->text, text); #endif /*Now the text is dynamically allocated*/ - ext->static_txt = 0; + label->static_txt = 0; } - lv_label_refr_text(label); + lv_label_refr_text(obj); } /** @@ -213,33 +172,32 @@ void lv_label_set_text(lv_obj_t * label, const char * text) * @param label pointer to a label object * @param fmt `printf`-like format */ -void lv_label_set_text_fmt(lv_obj_t * label, const char * fmt, ...) +void lv_label_set_text_fmt(lv_obj_t * obj, const char * fmt, ...) { - LV_ASSERT_OBJ(label, LV_OBJX_NAME); + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); LV_ASSERT_STR(fmt); - lv_obj_invalidate(label); - - lv_label_ext_t * ext = lv_obj_get_ext_attr(label); + lv_obj_invalidate(obj); + lv_label_t * label = (lv_label_t *) obj; /*If text is NULL then refresh */ if(fmt == NULL) { - lv_label_refr_text(label); + lv_label_refr_text(obj); return; } - if(ext->text != NULL && ext->static_txt == 0) { - lv_mem_free(ext->text); - ext->text = NULL; + if(label->text != NULL && label->static_txt == 0) { + lv_mem_free(label->text); + label->text = NULL; } va_list args; va_start(args, fmt); - ext->text = _lv_txt_set_text_vfmt(fmt, args); + label->text = _lv_txt_set_text_vfmt(fmt, args); va_end(args); - ext->static_txt = 0; /*Now the text is dynamically allocated*/ + label->static_txt = 0; /*Now the text is dynamically allocated*/ - lv_label_refr_text(label); + lv_label_refr_text(obj); } /** @@ -248,22 +206,22 @@ void lv_label_set_text_fmt(lv_obj_t * label, const char * fmt, ...) * @param label pointer to a label object * @param text pointer to a text. NULL to refresh with the current text. */ -void lv_label_set_text_static(lv_obj_t * label, const char * text) +void lv_label_set_text_static(lv_obj_t * obj, const char * text) { - LV_ASSERT_OBJ(label, LV_OBJX_NAME); + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + lv_label_t * label = (lv_label_t *) obj; - lv_label_ext_t * ext = lv_obj_get_ext_attr(label); - if(ext->static_txt == 0 && ext->text != NULL) { - lv_mem_free(ext->text); - ext->text = NULL; + if(label->static_txt == 0 && label->text != NULL) { + lv_mem_free(label->text); + label->text = NULL; } if(text != NULL) { - ext->static_txt = 1; - ext->text = (char *)text; + label->static_txt = 1; + label->text = (char *)text; } - lv_label_refr_text(label); + lv_label_refr_text(obj); } /** @@ -273,34 +231,34 @@ void lv_label_set_text_static(lv_obj_t * label, const char * text) * In LV_LONG_BREAK/LONG/ROLL the size of the label should be set AFTER this * function */ -void lv_label_set_long_mode(lv_obj_t * label, lv_label_long_mode_t long_mode) +void lv_label_set_long_mode(lv_obj_t * obj, lv_label_long_mode_t long_mode) { - LV_ASSERT_OBJ(label, LV_OBJX_NAME); + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); - lv_label_ext_t * ext = lv_obj_get_ext_attr(label); + lv_label_t * label = (lv_label_t *) obj; #if LV_USE_ANIMATION /*Delete the old animation (if exists)*/ - lv_anim_del(label, (lv_anim_exec_xcb_t)lv_obj_set_x); - lv_anim_del(label, (lv_anim_exec_xcb_t)lv_obj_set_y); - lv_anim_del(label, (lv_anim_exec_xcb_t)lv_label_set_offset_x); - lv_anim_del(label, (lv_anim_exec_xcb_t)lv_label_set_offset_y); + lv_anim_del(obj, (lv_anim_exec_xcb_t)lv_obj_set_x); + lv_anim_del(obj, (lv_anim_exec_xcb_t)lv_obj_set_y); + lv_anim_del(obj, (lv_anim_exec_xcb_t)lv_label_set_offset_x); + lv_anim_del(obj, (lv_anim_exec_xcb_t)lv_label_set_offset_y); #endif - ext->offset.x = 0; - ext->offset.y = 0; + label->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_CROP) - ext->expand = 1; + if(long_mode == LV_LABEL_LONG_SROLL || long_mode == LV_LABEL_LONG_SROLL_CIRC || long_mode == LV_LABEL_LONG_CLIP) + label->expand = 1; else - ext->expand = 0; + label->expand = 0; /*Restore the character under the dots*/ - if(ext->long_mode == LV_LABEL_LONG_DOT && ext->dot_end != LV_LABEL_DOT_END_INV) { - lv_label_revert_dots(label); + if(label->long_mode == LV_LABEL_LONG_DOT && label->dot_end != LV_LABEL_DOT_END_INV) { + lv_label_revert_dots(obj); } - ext->long_mode = long_mode; - lv_label_refr_text(label); + label->long_mode = long_mode; + lv_label_refr_text(obj); } /** @@ -308,17 +266,17 @@ void lv_label_set_long_mode(lv_obj_t * label, lv_label_long_mode_t long_mode) * @param label pointer to a label object * @param align 'LV_LABEL_ALIGN_LEFT' or 'LV_LABEL_ALIGN_LEFT' */ -void lv_label_set_align(lv_obj_t * label, lv_label_align_t align) +void lv_label_set_align(lv_obj_t * obj, lv_label_align_t align) { - LV_ASSERT_OBJ(label, LV_OBJX_NAME); + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); - lv_label_ext_t * ext = lv_obj_get_ext_attr(label); - if(ext->align == align) return; + lv_label_t * label = (lv_label_t *) obj; + if(label->align == align) return; - ext->align = align; + label->align = align; - lv_obj_invalidate(label); /*Enough to invalidate because alignment is only drawing related - (lv_refr_label_text() not required)*/ + /*Enough to invalidate because alignment is only drawing related (lv_refr_label_text() not required)*/ + lv_obj_invalidate(obj); } /** @@ -326,17 +284,17 @@ void lv_label_set_align(lv_obj_t * label, lv_label_align_t align) * @param label pointer to a label object * @param en true: enable recoloring, false: disable */ -void lv_label_set_recolor(lv_obj_t * label, bool en) +void lv_label_set_recolor(lv_obj_t * obj, bool en) { - LV_ASSERT_OBJ(label, LV_OBJX_NAME); + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); - lv_label_ext_t * ext = lv_obj_get_ext_attr(label); - if(ext->recolor == en) return; + lv_label_t * label = (lv_label_t *) obj; + if(label->recolor == en) return; - ext->recolor = en == false ? 0 : 1; + label->recolor = en == false ? 0 : 1; - lv_label_refr_text(label); /*Refresh the text because the potential color codes in text needs to - be hidden or revealed*/ + /*Refresh the text because the potential color codes in text needs to be hidden or revealed*/ + lv_label_refr_text(obj); } /** @@ -344,18 +302,18 @@ void lv_label_set_recolor(lv_obj_t * label, bool en) * @param label pointer to a label object * @param anim_speed speed of animation in px/sec unit */ -void lv_label_set_anim_speed(lv_obj_t * label, uint16_t anim_speed) +void lv_label_set_anim_speed(lv_obj_t * obj, uint16_t anim_speed) { - LV_ASSERT_OBJ(label, LV_OBJX_NAME); + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); #if LV_USE_ANIMATION - lv_label_ext_t * ext = lv_obj_get_ext_attr(label); - if(ext->anim_speed == anim_speed) return; + lv_label_t * label = (lv_label_t *) obj; + if(label->anim_speed == anim_speed) return; - ext->anim_speed = anim_speed; + label->anim_speed = anim_speed; - if(ext->long_mode == LV_LABEL_LONG_SROLL || ext->long_mode == LV_LABEL_LONG_SROLL_CIRC) { - lv_label_refr_text(label); + if(label->long_mode == LV_LABEL_LONG_SROLL || label->long_mode == LV_LABEL_LONG_SROLL_CIRC) { + lv_label_refr_text(obj); } #else (void)label; /*Unused*/ @@ -363,28 +321,28 @@ void lv_label_set_anim_speed(lv_obj_t * label, uint16_t anim_speed) #endif } -void lv_label_set_text_sel_start(lv_obj_t * label, uint32_t index) +void lv_label_set_text_sel_start(lv_obj_t * obj, uint32_t index) { - LV_ASSERT_OBJ(label, LV_OBJX_NAME); + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); #if LV_LABEL_TEXT_SEL - lv_label_ext_t * ext = lv_obj_get_ext_attr(label); - ext->sel_start = index; - lv_obj_invalidate(label); + lv_label_t * label = (lv_label_t *) obj; + label->sel_start = index; + lv_obj_invalidate(obj); #else (void)label; /*Unused*/ (void)index; /*Unused*/ #endif } -void lv_label_set_text_sel_end(lv_obj_t * label, uint32_t index) +void lv_label_set_text_sel_end(lv_obj_t * obj, uint32_t index) { - LV_ASSERT_OBJ(label, LV_OBJX_NAME); + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); #if LV_LABEL_TEXT_SEL - lv_label_ext_t * ext = lv_obj_get_ext_attr(label); - ext->sel_end = index; - lv_obj_invalidate(label); + lv_label_t * label = (lv_label_t *) obj; + label->sel_end = index; + lv_obj_invalidate(obj); #else (void)label; /*Unused*/ (void)index; /*Unused*/ @@ -400,13 +358,11 @@ void lv_label_set_text_sel_end(lv_obj_t * label, uint32_t index) * @param label pointer to a label object * @return the text of the label */ -char * lv_label_get_text(const lv_obj_t * label) +char * lv_label_get_text(const lv_obj_t * obj) { - LV_ASSERT_OBJ(label, LV_OBJX_NAME); - - lv_label_ext_t * ext = lv_obj_get_ext_attr(label); - - return ext->text; + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + lv_label_t * label = (lv_label_t *) obj; + return label->text; } /** @@ -414,12 +370,11 @@ char * lv_label_get_text(const lv_obj_t * label) * @param label pointer to a label object * @return the long mode */ -lv_label_long_mode_t lv_label_get_long_mode(const lv_obj_t * label) +lv_label_long_mode_t lv_label_get_long_mode(const lv_obj_t * obj) { - LV_ASSERT_OBJ(label, LV_OBJX_NAME); - - lv_label_ext_t * ext = lv_obj_get_ext_attr(label); - return ext->long_mode; + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + lv_label_t * label = (lv_label_t *) obj; + return label->long_mode; } /** @@ -427,18 +382,17 @@ lv_label_long_mode_t lv_label_get_long_mode(const lv_obj_t * label) * @param label pointer to a label object * @return LV_LABEL_ALIGN_LEFT or LV_LABEL_ALIGN_CENTER */ -lv_label_align_t lv_label_get_align(const lv_obj_t * label) +lv_label_align_t lv_label_get_align(const lv_obj_t * obj) { - LV_ASSERT_OBJ(label, LV_OBJX_NAME); + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); - lv_label_ext_t * ext = lv_obj_get_ext_attr(label); - - lv_label_align_t align = ext->align; + lv_label_t * label = (lv_label_t *) obj; + lv_label_align_t align = label->align; if(align == LV_LABEL_ALIGN_AUTO) { #if LV_USE_BIDI lv_bidi_dir_t base_dir = lv_obj_get_base_dir(label); - if(base_dir == LV_BIDI_DIR_AUTO) base_dir = _lv_bidi_detect_base_dir(ext->text); + if(base_dir == LV_BIDI_DIR_AUTO) base_dir = _lv_bidi_detect_base_dir(label->text); if(base_dir == LV_BIDI_DIR_LTR) align = LV_LABEL_ALIGN_LEFT; else if(base_dir == LV_BIDI_DIR_RTL) align = LV_LABEL_ALIGN_RIGHT; @@ -455,12 +409,12 @@ lv_label_align_t lv_label_get_align(const lv_obj_t * label) * @param label pointer to a label object * @return true: recoloring is enabled, false: disable */ -bool lv_label_get_recolor(const lv_obj_t * label) +bool lv_label_get_recolor(const lv_obj_t * obj) { - LV_ASSERT_OBJ(label, LV_OBJX_NAME); + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); - lv_label_ext_t * ext = lv_obj_get_ext_attr(label); - return ext->recolor == 0 ? false : true; + lv_label_t * label = (lv_label_t *) obj; + return label->recolor == 0 ? false : true; } /** @@ -468,13 +422,13 @@ bool lv_label_get_recolor(const lv_obj_t * label) * @param label pointer to a label object * @return speed of animation in px/sec unit */ -uint16_t lv_label_get_anim_speed(const lv_obj_t * label) +uint16_t lv_label_get_anim_speed(const lv_obj_t * obj) { - LV_ASSERT_OBJ(label, LV_OBJX_NAME); + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); #if LV_USE_ANIMATION - lv_label_ext_t * ext = lv_obj_get_ext_attr(label); - return ext->anim_speed; + lv_label_t * label = (lv_label_t *) obj; + return label->anim_speed; #else (void)label; /*Unused*/ return 0; @@ -488,13 +442,13 @@ uint16_t lv_label_get_anim_speed(const lv_obj_t * label) * index (different in UTF-8) * @param pos store the result here (E.g. index = 0 gives 0;0 coordinates) */ -void lv_label_get_letter_pos(const lv_obj_t * label, uint32_t char_id, lv_point_t * pos) +void lv_label_get_letter_pos(const lv_obj_t * obj, uint32_t char_id, lv_point_t * pos) { - LV_ASSERT_OBJ(label, LV_OBJX_NAME); + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); LV_ASSERT_NULL(pos); - const char * txt = lv_label_get_text(label); - lv_label_align_t align = lv_label_get_align(label); + const char * txt = lv_label_get_text(obj); + lv_label_align_t align = lv_label_get_align(obj); if(txt[0] == '\0') { pos->y = 0; @@ -503,32 +457,32 @@ void lv_label_get_letter_pos(const lv_obj_t * label, uint32_t char_id, lv_point_ pos->x = 0; break; case LV_LABEL_ALIGN_RIGHT: - pos->x = lv_obj_get_width(label); + pos->x = lv_obj_get_width_fit(obj); break; case LV_LABEL_ALIGN_CENTER: - pos->x = lv_obj_get_width(label) / 2; + pos->x = lv_obj_get_width_fit(obj) / 2; break; } return; } lv_area_t txt_coords; - get_txt_coords(label, &txt_coords); + get_txt_coords(obj, &txt_coords); - lv_label_ext_t * ext = lv_obj_get_ext_attr(label); + lv_label_t * label = (lv_label_t *) obj; uint32_t line_start = 0; uint32_t new_line_start = 0; lv_coord_t max_w = lv_area_get_width(&txt_coords); - const lv_font_t * font = lv_obj_get_style_text_font(label, LV_LABEL_PART_MAIN); - lv_style_int_t line_space = lv_obj_get_style_text_line_space(label, LV_LABEL_PART_MAIN); - lv_style_int_t letter_space = lv_obj_get_style_text_letter_space(label, LV_LABEL_PART_MAIN); + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + lv_coord_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + lv_coord_t letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_MAIN); lv_coord_t letter_height = lv_font_get_line_height(font); lv_coord_t y = 0; lv_txt_flag_t flag = LV_TXT_FLAG_NONE; - if(ext->recolor != 0) flag |= LV_TXT_FLAG_RECOLOR; - if(ext->expand != 0) flag |= LV_TXT_FLAG_EXPAND; - if(ext->long_mode == LV_LABEL_LONG_EXPAND) flag |= LV_TXT_FLAG_FIT; + if(label->recolor != 0) flag |= LV_TXT_FLAG_RECOLOR; + if(label->expand != 0) flag |= LV_TXT_FLAG_EXPAND; + if(label->long_mode == LV_LABEL_LONG_EXPAND) flag |= LV_TXT_FLAG_FIT; if(align == LV_LABEL_ALIGN_CENTER) flag |= LV_TXT_FLAG_CENTER; if(align == LV_LABEL_ALIGN_RIGHT) flag |= LV_TXT_FLAG_RIGHT; @@ -545,7 +499,7 @@ void lv_label_get_letter_pos(const lv_obj_t * label, uint32_t char_id, lv_point_ line_start = new_line_start; } - /*If the last character is line break then go to the next line*/ + /*If the last character is line break then go to the nlabel line*/ if(byte_id > 0) { if((txt[byte_id - 1] == '\n' || txt[byte_id - 1] == '\r') && txt[byte_id] == '\0') { y += letter_height + line_space; @@ -610,36 +564,36 @@ void lv_label_get_letter_pos(const lv_obj_t * label, uint32_t char_id, lv_point_ * @return the index of the letter on the 'pos_p' point (E.g. on 0;0 is the 0. letter) * Expressed in character index and not byte index (different in UTF-8) */ -uint32_t lv_label_get_letter_on(const lv_obj_t * label, lv_point_t * pos_in) +uint32_t lv_label_get_letter_on(const lv_obj_t * obj, lv_point_t * pos_in) { - LV_ASSERT_OBJ(label, LV_OBJX_NAME); + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); LV_ASSERT_NULL(pos_in); + lv_label_t * label = (lv_label_t *) obj; lv_point_t pos; - pos.x = pos_in->x - lv_obj_get_style_pad_left(label, LV_LABEL_PART_MAIN); - pos.y = pos_in->y - lv_obj_get_style_pad_top(label, LV_LABEL_PART_MAIN); + pos.x = pos_in->x - lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + pos.y = pos_in->y - lv_obj_get_style_pad_top(obj, LV_PART_MAIN); lv_area_t txt_coords; - get_txt_coords(label, &txt_coords); - const char * txt = lv_label_get_text(label); - lv_label_ext_t * ext = lv_obj_get_ext_attr(label); + get_txt_coords(obj, &txt_coords); + const char * txt = lv_label_get_text(obj); uint32_t line_start = 0; uint32_t new_line_start = 0; lv_coord_t max_w = lv_area_get_width(&txt_coords); - const lv_font_t * font = lv_obj_get_style_text_font(label, LV_LABEL_PART_MAIN); - lv_style_int_t line_space = lv_obj_get_style_text_line_space(label, LV_LABEL_PART_MAIN); - lv_style_int_t letter_space = lv_obj_get_style_text_letter_space(label, LV_LABEL_PART_MAIN); + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + lv_coord_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + lv_coord_t letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_MAIN); lv_coord_t letter_height = lv_font_get_line_height(font); lv_coord_t y = 0; lv_txt_flag_t flag = LV_TXT_FLAG_NONE; uint32_t logical_pos; char * bidi_txt; - if(ext->recolor != 0) flag |= LV_TXT_FLAG_RECOLOR; - if(ext->expand != 0) flag |= LV_TXT_FLAG_EXPAND; - if(ext->long_mode == LV_LABEL_LONG_EXPAND) flag |= LV_TXT_FLAG_FIT; + if(label->recolor != 0) flag |= LV_TXT_FLAG_RECOLOR; + if(label->expand != 0) flag |= LV_TXT_FLAG_EXPAND; + if(label->long_mode == LV_LABEL_LONG_EXPAND) flag |= LV_TXT_FLAG_FIT; - lv_label_align_t align = lv_label_get_align(label); + lv_label_align_t align = lv_label_get_align(obj); if(align == LV_LABEL_ALIGN_CENTER) flag |= LV_TXT_FLAG_CENTER; if(align == LV_LABEL_ALIGN_RIGHT) flag |= LV_TXT_FLAG_RIGHT; @@ -693,8 +647,8 @@ uint32_t lv_label_get_letter_on(const lv_obj_t * label, lv_point_t * pos_in) /* Get the current letter.*/ uint32_t letter = _lv_txt_encoded_next(bidi_txt, &i); - /*Get the next letter too for kerning*/ - uint32_t letter_next = _lv_txt_encoded_next(&bidi_txt[i], NULL); + /*Get the nlabel letter too for kerning*/ + uint32_t letter_nlabel = _lv_txt_encoded_next(&bidi_txt[i], NULL); /*Handle the recolor command*/ if((flag & LV_TXT_FLAG_RECOLOR) != 0) { @@ -703,9 +657,9 @@ uint32_t lv_label_get_letter_on(const lv_obj_t * label, lv_point_t * pos_in) } } - lv_coord_t gw = lv_font_get_glyph_width(font, letter, letter_next); + lv_coord_t gw = lv_font_get_glyph_width(font, letter, letter_nlabel); - /*Finish if the x position or the last char of the next line is reached*/ + /*Finish if the x position or the last char of the nlabel line is reached*/ if(pos.x < x + gw || i + line_start == new_line_start || txt[i_act + line_start] == '\0') { i = i_act; break; @@ -741,13 +695,13 @@ uint32_t lv_label_get_letter_on(const lv_obj_t * label, lv_point_t * pos_in) * @param label pointer to a label object. * @return selection start index. `LV_LABEL_TXT_SEL_OFF` if nothing is selected. */ -uint32_t lv_label_get_text_sel_start(const lv_obj_t * label) +uint32_t lv_label_get_text_sel_start(const lv_obj_t * obj) { - LV_ASSERT_OBJ(label, LV_OBJX_NAME); + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); #if LV_LABEL_TEXT_SEL - lv_label_ext_t * ext = lv_obj_get_ext_attr(label); - return ext->sel_start; + lv_label_t * label = (lv_label_t *) obj; + return label->sel_start; #else (void)label; /*Unused*/ @@ -760,13 +714,13 @@ uint32_t lv_label_get_text_sel_start(const lv_obj_t * label) * @param label pointer to a label object. * @return selection end index. `LV_LABEL_TXT_SEL_OFF` if nothing is selected. */ -uint32_t lv_label_get_text_sel_end(const lv_obj_t * label) +uint32_t lv_label_get_text_sel_end(const lv_obj_t * obj) { - LV_ASSERT_OBJ(label, LV_OBJX_NAME); + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); #if LV_LABEL_TEXT_SEL - lv_label_ext_t * ext = lv_obj_get_ext_attr(label); - return ext->sel_end; + lv_label_t * label = (lv_label_t *) obj; + return label->sel_end; #else (void)label; /*Unused*/ return LV_LABEL_TEXT_SEL_OFF; @@ -779,105 +733,92 @@ uint32_t lv_label_get_text_sel_end(const lv_obj_t * label) * @param pos Point to check for character under * @return whether a character is drawn under the point */ -bool lv_label_is_char_under_pos(const lv_obj_t * label, lv_point_t * pos) -{ - LV_ASSERT_OBJ(label, LV_OBJX_NAME); - LV_ASSERT_NULL(pos); +//bool lv_label_is_char_under_pos(const lv_obj_t * label, lv_point_t * pos) +//{ +// LV_ASSERT_OBJ(label, LV_OBJX_NAME); +// LV_ASSERT_NULL(pos); +// +// lv_area_t txt_coords; +// get_txt_coords(label, &txt_coords); +// const char * txt = lv_label_get_text(obj); +// lv_label_label_t * label = lv_obj_get_label_attr(label); +// uint32_t line_start = 0; +// uint32_t new_line_start = 0; +// lv_coord_t max_w = lv_area_get_width(&txt_coords); +// const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); +// lv_coord_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); +// lv_coord_t letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_MAIN); +// lv_coord_t letter_height = lv_font_get_line_height(font); +// lv_coord_t y = 0; +// lv_txt_flag_t flag = LV_TXT_FLAG_NONE; +// lv_label_align_t align = lv_label_get_align(label); +// +// if(label->recolor != 0) flag |= LV_TXT_FLAG_RECOLOR; +// if(label->expand != 0) flag |= LV_TXT_FLAG_EXPAND; +// if(label->long_mode == LV_LABEL_LONG_EXPAND) flag |= LV_TXT_FLAG_FIT; +// if(align == LV_LABEL_ALIGN_CENTER) flag |= LV_TXT_FLAG_CENTER; +// +// /*Search the line of the index letter */; +// while(txt[line_start] != '\0') { +// new_line_start += _lv_txt_get_next_line(&txt[line_start], font, letter_space, max_w, flag); +// +// if(pos->y <= y + letter_height) break; /*The line is found (stored in 'line_start')*/ +// y += letter_height + line_space; +// +// line_start = new_line_start; +// } +// +// /*Calculate the x coordinate*/ +// lv_coord_t x = 0; +// lv_coord_t last_x = 0; +// if(align == LV_LABEL_ALIGN_CENTER) { +// lv_coord_t line_w; +// line_w = _lv_txt_get_width(&txt[line_start], new_line_start - line_start, font, letter_space, flag); +// x += lv_area_get_width(&txt_coords) / 2 - line_w / 2; +// } +// else if(align == LV_LABEL_ALIGN_RIGHT) { +// lv_coord_t line_w; +// line_w = _lv_txt_get_width(&txt[line_start], new_line_start - line_start, font, letter_space, flag); +// x += lv_area_get_width(&txt_coords) - line_w; +// } +// +// lv_txt_cmd_state_t cmd_state = LV_TXT_CMD_STATE_WAIT; +// +// uint32_t i = line_start; +// uint32_t i_current = i; +// uint32_t letter = '\0'; +// uint32_t letter_nlabel = '\0'; +// +// if(new_line_start > 0) { +// while(i <= new_line_start - 1) { +// /* Get the current letter +// * Be careful 'i' already points to the nlabel character */ +// letter = _lv_txt_encoded_next(txt, &i); +// +// /*Get the nlabel letter for kerning*/ +// letter_nlabel = _lv_txt_encoded_next(&txt[i], NULL); +// +// /*Handle the recolor command*/ +// if((flag & LV_TXT_FLAG_RECOLOR) != 0) { +// if(_lv_txt_is_cmd(&cmd_state, txt[i]) != false) { +// continue; /*Skip the letter is it is part of a command*/ +// } +// } +// last_x = x; +// x += lv_font_get_glyph_width(font, letter, letter_nlabel); +// if(pos->x < x) { +// i = i_current; +// break; +// } +// x += letter_space; +// i_current = i; +// } +// } +// +// int32_t max_diff = lv_font_get_glyph_width(font, letter, letter_nlabel) + letter_space + 1; +// return (pos->x >= (last_x - letter_space) && pos->x <= (last_x + max_diff)); +//} - lv_area_t txt_coords; - get_txt_coords(label, &txt_coords); - const char * txt = lv_label_get_text(label); - lv_label_ext_t * ext = lv_obj_get_ext_attr(label); - uint32_t line_start = 0; - uint32_t new_line_start = 0; - lv_coord_t max_w = lv_area_get_width(&txt_coords); - const lv_font_t * font = lv_obj_get_style_text_font(label, LV_LABEL_PART_MAIN); - lv_style_int_t line_space = lv_obj_get_style_text_line_space(label, LV_LABEL_PART_MAIN); - lv_style_int_t letter_space = lv_obj_get_style_text_letter_space(label, LV_LABEL_PART_MAIN); - lv_coord_t letter_height = lv_font_get_line_height(font); - lv_coord_t y = 0; - lv_txt_flag_t flag = LV_TXT_FLAG_NONE; - lv_label_align_t align = lv_label_get_align(label); - - if(ext->recolor != 0) flag |= LV_TXT_FLAG_RECOLOR; - if(ext->expand != 0) flag |= LV_TXT_FLAG_EXPAND; - if(ext->long_mode == LV_LABEL_LONG_EXPAND) flag |= LV_TXT_FLAG_FIT; - if(align == LV_LABEL_ALIGN_CENTER) flag |= LV_TXT_FLAG_CENTER; - - /*Search the line of the index letter */; - while(txt[line_start] != '\0') { - new_line_start += _lv_txt_get_next_line(&txt[line_start], font, letter_space, max_w, flag); - - if(pos->y <= y + letter_height) break; /*The line is found (stored in 'line_start')*/ - y += letter_height + line_space; - - line_start = new_line_start; - } - - /*Calculate the x coordinate*/ - lv_coord_t x = 0; - lv_coord_t last_x = 0; - if(align == LV_LABEL_ALIGN_CENTER) { - lv_coord_t line_w; - line_w = _lv_txt_get_width(&txt[line_start], new_line_start - line_start, font, letter_space, flag); - x += lv_area_get_width(&txt_coords) / 2 - line_w / 2; - } - else if(align == LV_LABEL_ALIGN_RIGHT) { - lv_coord_t line_w; - line_w = _lv_txt_get_width(&txt[line_start], new_line_start - line_start, font, letter_space, flag); - x += lv_area_get_width(&txt_coords) - line_w; - } - - lv_txt_cmd_state_t cmd_state = LV_TXT_CMD_STATE_WAIT; - - uint32_t i = line_start; - uint32_t i_current = i; - uint32_t letter = '\0'; - uint32_t letter_next = '\0'; - - if(new_line_start > 0) { - while(i <= new_line_start - 1) { - /* Get the current letter - * Be careful 'i' already points to the next character */ - letter = _lv_txt_encoded_next(txt, &i); - - /*Get the next letter for kerning*/ - letter_next = _lv_txt_encoded_next(&txt[i], NULL); - - /*Handle the recolor command*/ - if((flag & LV_TXT_FLAG_RECOLOR) != 0) { - if(_lv_txt_is_cmd(&cmd_state, txt[i]) != false) { - continue; /*Skip the letter is it is part of a command*/ - } - } - last_x = x; - x += lv_font_get_glyph_width(font, letter, letter_next); - if(pos->x < x) { - i = i_current; - break; - } - x += letter_space; - i_current = i; - } - } - - int32_t max_diff = lv_font_get_glyph_width(font, letter, letter_next) + letter_space + 1; - return (pos->x >= (last_x - letter_space) && pos->x <= (last_x + max_diff)); -} - -lv_style_list_t * lv_label_get_style(lv_obj_t * label, uint8_t type) -{ - lv_style_list_t * style_dsc_p; - switch(type) { - case LV_LABEL_PART_MAIN: - style_dsc_p = &label->style_list; - break; - default: - style_dsc_p = NULL; - } - - return style_dsc_p; -} /*===================== * Other functions *====================*/ @@ -889,28 +830,28 @@ lv_style_list_t * lv_label_get_style(lv_obj_t * label, uint8_t type) * in UTF-8) 0: before first char. LV_LABEL_POS_LAST: after last char. * @param txt pointer to the text to insert */ -void lv_label_ins_text(lv_obj_t * label, uint32_t pos, const char * txt) +void lv_label_ins_text(lv_obj_t * obj, uint32_t pos, const char * txt) { - LV_ASSERT_OBJ(label, LV_OBJX_NAME); + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); LV_ASSERT_STR(txt); - lv_label_ext_t * ext = lv_obj_get_ext_attr(label); + lv_label_t * label = (lv_label_t *) obj; /*Can not append to static text*/ - if(ext->static_txt != 0) return; + if(label->static_txt != 0) return; - lv_obj_invalidate(label); + lv_obj_invalidate(obj); /*Allocate space for the new text*/ - size_t old_len = strlen(ext->text); + size_t old_len = strlen(label->text); size_t ins_len = strlen(txt); size_t new_len = ins_len + old_len; - ext->text = lv_mem_realloc(ext->text, new_len + 1); - LV_ASSERT_MEM(ext->text); - if(ext->text == NULL) return; + label->text = lv_mem_realloc(label->text, new_len + 1); + LV_ASSERT_MEM(label->text); + if(label->text == NULL) return; if(pos == LV_LABEL_POS_LAST) { - pos = _lv_txt_get_encoded_length(ext->text); + pos = _lv_txt_get_encoded_length(label->text); } #if LV_USE_BIDI @@ -919,13 +860,13 @@ void lv_label_ins_text(lv_obj_t * label, uint32_t pos, const char * txt) if(bidi_buf == NULL) return; _lv_bidi_process(txt, bidi_buf, lv_obj_get_base_dir(label)); - _lv_txt_ins(ext->text, pos, bidi_buf); + _lv_txt_ins(label->text, pos, bidi_buf); _lv_mem_buf_release(bidi_buf); #else - _lv_txt_ins(ext->text, pos, txt); + _lv_txt_ins(label->text, pos, txt); #endif - lv_label_set_text(label, NULL); + lv_label_set_text(obj, NULL); } /** @@ -935,68 +876,66 @@ void lv_label_ins_text(lv_obj_t * label, uint32_t pos, const char * txt) * in UTF-8) 0: before first char. * @param cnt number of characters to cut */ -void lv_label_cut_text(lv_obj_t * label, uint32_t pos, uint32_t cnt) +void lv_label_cut_text(lv_obj_t * obj, uint32_t pos, uint32_t cnt) { - LV_ASSERT_OBJ(label, LV_OBJX_NAME); - - lv_label_ext_t * ext = lv_obj_get_ext_attr(label); + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + lv_label_t * label = (lv_label_t *) obj; /*Can not append to static text*/ - if(ext->static_txt != 0) return; + if(label->static_txt != 0) return; - lv_obj_invalidate(label); + lv_obj_invalidate(obj); - char * label_txt = lv_label_get_text(label); + char * label_txt = lv_label_get_text(obj); /*Delete the characters*/ _lv_txt_cut(label_txt, pos, cnt); /*Refresh the label*/ - lv_label_refr_text(label); + lv_label_refr_text(obj); } /** - * Refresh the label with its text stored in its extended data + * Refresh the label with its text stored in its labelended data * @param label pointer to a label object */ -void lv_label_refr_text(lv_obj_t * label) +void lv_label_refr_text(lv_obj_t * obj) { - lv_label_ext_t * ext = lv_obj_get_ext_attr(label); - - if(ext->text == NULL) return; + lv_label_t * label = (lv_label_t *) obj; + if(label->text == NULL) return; #if LV_LABEL_LONG_TXT_HINT - ext->hint.line_start = -1; /*The hint is invalid if the text changes*/ + label->hint.line_start = -1; /*The hint is invalid if the text changes*/ #endif lv_area_t txt_coords; - get_txt_coords(label, &txt_coords); + get_txt_coords(obj, &txt_coords); lv_coord_t max_w = lv_area_get_width(&txt_coords); - const lv_font_t * font = lv_obj_get_style_text_font(label, LV_LABEL_PART_MAIN); - lv_style_int_t line_space = lv_obj_get_style_text_line_space(label, LV_LABEL_PART_MAIN); - lv_style_int_t letter_space = lv_obj_get_style_text_letter_space(label, LV_LABEL_PART_MAIN); + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + lv_coord_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + lv_coord_t letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_MAIN); /*Calc. the height and longest line*/ lv_point_t size; lv_txt_flag_t flag = LV_TXT_FLAG_NONE; - if(ext->recolor != 0) flag |= LV_TXT_FLAG_RECOLOR; - if(ext->expand != 0) flag |= LV_TXT_FLAG_EXPAND; - if(ext->long_mode == LV_LABEL_LONG_EXPAND) flag |= LV_TXT_FLAG_FIT; - _lv_txt_get_size(&size, ext->text, font, letter_space, line_space, max_w, flag); + if(label->recolor != 0) flag |= LV_TXT_FLAG_RECOLOR; + if(label->expand != 0) flag |= LV_TXT_FLAG_EXPAND; + if(label->long_mode == LV_LABEL_LONG_EXPAND) flag |= LV_TXT_FLAG_FIT; + _lv_txt_get_size(&size, label->text, font, letter_space, line_space, max_w, flag); /*Set the full size in expand mode*/ - if(ext->long_mode == LV_LABEL_LONG_EXPAND) { - size.x += lv_obj_get_style_pad_left(label, LV_LABEL_PART_MAIN) + lv_obj_get_style_pad_right(label, LV_LABEL_PART_MAIN); - size.y += lv_obj_get_style_pad_top(label, LV_LABEL_PART_MAIN) + lv_obj_get_style_pad_bottom(label, LV_LABEL_PART_MAIN); - lv_obj_set_size(label, size.x, size.y); + if(label->long_mode == LV_LABEL_LONG_EXPAND) { + size.x += lv_obj_get_style_pad_left(obj, LV_PART_MAIN) + lv_obj_get_style_pad_right(obj, LV_PART_MAIN); + size.y += lv_obj_get_style_pad_top(obj, LV_PART_MAIN) + lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); + lv_obj_set_size(obj, size.x, size.y); } /*In roll mode keep the size but start offset animations*/ - else if(ext->long_mode == LV_LABEL_LONG_SROLL) { + else if(label->long_mode == LV_LABEL_LONG_SROLL) { #if LV_USE_ANIMATION lv_anim_t a; lv_anim_init(&a); lv_anim_set_var(&a, label); lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE); lv_anim_set_playback_delay(&a, (((lv_font_get_glyph_width(font, ' ', ' ') + letter_space) * 1000) / - ext->anim_speed) * + label->anim_speed) * LV_LABEL_WAIT_CHAR_COUNT); lv_anim_set_repeat_delay(&a, a.playback_delay); @@ -1004,7 +943,7 @@ void lv_label_refr_text(lv_obj_t * label) if(size.x > lv_area_get_width(&txt_coords)) { lv_anim_set_values(&a, 0, lv_area_get_width(&txt_coords) - size.x); lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)lv_label_set_offset_x); - lv_anim_set_time(&a, lv_anim_speed_to_time(ext->anim_speed, a.start, a.end)); + lv_anim_set_time(&a, lv_anim_speed_to_time(label->anim_speed, a.start, a.end)); lv_anim_set_playback_time(&a, a.time); lv_anim_t * anim_cur = lv_anim_get(label, (lv_anim_exec_xcb_t)lv_label_set_offset_x); @@ -1033,13 +972,13 @@ void lv_label_refr_text(lv_obj_t * label) else { /*Delete the offset animation if not required*/ lv_anim_del(label, (lv_anim_exec_xcb_t)lv_label_set_offset_x); - ext->offset.x = 0; + label->offset.x = 0; } if(size.y > lv_area_get_height(&txt_coords) && hor_anim == false) { lv_anim_set_values(&a, 0, lv_area_get_height(&txt_coords) - size.y - (lv_font_get_line_height(font))); lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)lv_label_set_offset_y); - lv_anim_set_time(&a, lv_anim_speed_to_time(ext->anim_speed, a.start, a.end)); + lv_anim_set_time(&a, lv_anim_speed_to_time(label->anim_speed, a.start, a.end)); lv_anim_set_playback_time(&a, a.time); lv_anim_t * anim_cur = lv_anim_get(label, (lv_anim_exec_xcb_t)lv_label_set_offset_y); @@ -1067,12 +1006,12 @@ void lv_label_refr_text(lv_obj_t * label) else { /*Delete the offset animation if not required*/ lv_anim_del(label, (lv_anim_exec_xcb_t)lv_label_set_offset_y); - ext->offset.y = 0; + label->offset.y = 0; } #endif } /*In roll inf. mode keep the size but start offset animations*/ - else if(ext->long_mode == LV_LABEL_LONG_SROLL_CIRC) { + else if(label->long_mode == LV_LABEL_LONG_SROLL_CIRC) { #if LV_USE_ANIMATION lv_anim_t a; lv_anim_init(&a); @@ -1083,7 +1022,7 @@ void lv_label_refr_text(lv_obj_t * label) if(size.x > lv_area_get_width(&txt_coords)) { lv_anim_set_values(&a, 0, -size.x - lv_font_get_glyph_width(font, ' ', ' ') * LV_LABEL_WAIT_CHAR_COUNT); lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)lv_label_set_offset_x); - lv_anim_set_time(&a, lv_anim_speed_to_time(ext->anim_speed, a.start, a.end)); + lv_anim_set_time(&a, lv_anim_speed_to_time(label->anim_speed, a.start, a.end)); lv_anim_t * anim_cur = lv_anim_get(label, (lv_anim_exec_xcb_t)lv_label_set_offset_x); int32_t act_time = anim_cur ? anim_cur->act_time : 0; @@ -1098,13 +1037,13 @@ void lv_label_refr_text(lv_obj_t * label) else { /*Delete the offset animation if not required*/ lv_anim_del(label, (lv_anim_exec_xcb_t)lv_label_set_offset_x); - ext->offset.x = 0; + label->offset.x = 0; } if(size.y > lv_area_get_height(&txt_coords) && hor_anim == false) { lv_anim_set_values(&a, 0, -size.y - (lv_font_get_line_height(font))); lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)lv_label_set_offset_y); - lv_anim_set_time(&a, lv_anim_speed_to_time(ext->anim_speed, a.start, a.end)); + lv_anim_set_time(&a, lv_anim_speed_to_time(label->anim_speed, a.start, a.end)); lv_anim_t * anim_cur = lv_anim_get(label, (lv_anim_exec_xcb_t)lv_label_set_offset_y); int32_t act_time = anim_cur ? anim_cur->act_time : 0; @@ -1118,16 +1057,16 @@ void lv_label_refr_text(lv_obj_t * label) else { /*Delete the offset animation if not required*/ lv_anim_del(label, (lv_anim_exec_xcb_t)lv_label_set_offset_y); - ext->offset.y = 0; + label->offset.y = 0; } #endif } - else if(ext->long_mode == LV_LABEL_LONG_DOT) { + else if(label->long_mode == LV_LABEL_LONG_DOT) { if(size.y <= lv_area_get_height(&txt_coords)) { /*No dots are required, the text is short enough*/ - ext->dot_end = LV_LABEL_DOT_END_INV; + label->dot_end = LV_LABEL_DOT_END_INV; } - else if(_lv_txt_get_encoded_length(ext->text) <= LV_LABEL_DOT_NUM) { /*Don't turn to dots all the characters*/ - ext->dot_end = LV_LABEL_DOT_END_INV; + else if(_lv_txt_get_encoded_length(label->text) <= LV_LABEL_DOT_NUM) { /*Don't turn to dots all the characters*/ + label->dot_end = LV_LABEL_DOT_END_INV; } else { lv_point_t p; @@ -1147,14 +1086,14 @@ void lv_label_refr_text(lv_obj_t * label) p.y -= line_space; } - uint32_t letter_id = lv_label_get_letter_on(label, &p); + uint32_t letter_id = lv_label_get_letter_on(obj, &p); /*Be sure there is space for the dots*/ - size_t txt_len = strlen(ext->text); - uint32_t byte_id = _lv_txt_encoded_get_byte_id(ext->text, letter_id); + size_t txt_len = strlen(label->text); + uint32_t byte_id = _lv_txt_encoded_get_byte_id(label->text, letter_id); while(byte_id + LV_LABEL_DOT_NUM > txt_len) { - _lv_txt_encoded_prev(ext->text, &byte_id); + _lv_txt_encoded_prev(label->text, &byte_id); letter_id--; } @@ -1163,36 +1102,96 @@ void lv_label_refr_text(lv_obj_t * label) uint32_t i; uint8_t len = 0; for(i = 0; i <= LV_LABEL_DOT_NUM; i++) { - len += _lv_txt_encoded_size(&ext->text[byte_id]); - _lv_txt_encoded_next(ext->text, &byte_id); + len += _lv_txt_encoded_size(&label->text[byte_id]); + _lv_txt_encoded_next(label->text, &byte_id); } - if(lv_label_set_dot_tmp(label, &ext->text[byte_id_ori], len)) { + if(lv_label_set_dot_tmp(obj, &label->text[byte_id_ori], len)) { for(i = 0; i < LV_LABEL_DOT_NUM; i++) { - ext->text[byte_id_ori + i] = '.'; + label->text[byte_id_ori + i] = '.'; } - ext->text[byte_id_ori + LV_LABEL_DOT_NUM] = '\0'; - ext->dot_end = letter_id + LV_LABEL_DOT_NUM; + label->text[byte_id_ori + LV_LABEL_DOT_NUM] = '\0'; + label->dot_end = letter_id + LV_LABEL_DOT_NUM; } } } /*In break mode only the height can change*/ - else if(ext->long_mode == LV_LABEL_LONG_BREAK) { - size.y += lv_obj_get_style_pad_top(label, LV_LABEL_PART_MAIN) + lv_obj_get_style_pad_bottom(label, LV_LABEL_PART_MAIN); - lv_obj_set_height(label, size.y); + else if(label->long_mode == LV_LABEL_LONG_WRAP) { + size.y += lv_obj_get_style_pad_top(obj, LV_PART_MAIN) + lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); + lv_obj_set_height(obj, size.y); } /*Do not set the size in Clip mode*/ - else if(ext->long_mode == LV_LABEL_LONG_CROP) { + else if(label->long_mode == LV_LABEL_LONG_CLIP) { /*Do nothing*/ } - lv_obj_invalidate(label); + lv_obj_invalidate(obj); } /********************** * STATIC FUNCTIONS **********************/ + +static void lv_label_constructor(lv_obj_t * obj, lv_obj_t * parent, const lv_obj_t * copy) +{ + LV_LOG_TRACE("label create started"); + + LV_CLASS_CONSTRUCTOR_BEGIN(obj, lv_label) + lv_label.base_p->constructor(obj, parent, copy); + + lv_label_t * label = (lv_label_t *) obj; + + label->text = NULL; + label->static_txt = 0; + label->recolor = 0; + label->align = LV_LABEL_ALIGN_AUTO; + label->dot_end = LV_LABEL_DOT_END_INV; + label->long_mode = LV_LABEL_LONG_EXPAND; +#if LV_USE_ANIMATION + label->anim_speed = LV_LABEL_DEF_SCROLL_SPEED; +#endif + label->offset.x = 0; + label->offset.y = 0; + +#if LV_LABEL_LONG_TXT_HINT + label->hint.line_start = -1; + label->hint.coord_y = 0; + label->hint.y = 0; +#endif + +#if LV_LABEL_TEXT_SEL + label->sel_start = LV_DRAW_LABEL_NO_TXT_SEL; + label->sel_end = LV_DRAW_LABEL_NO_TXT_SEL; +#endif + label->dot.tmp_ptr = NULL; + label->dot_tmp_alloc = 0; + + lv_obj_clear_flag(obj, LV_OBJ_FLAG_CLICKABLE); + lv_label_set_long_mode(obj, LV_LABEL_LONG_EXPAND); + lv_label_set_text(obj, "Text"); + + LV_CLASS_CONSTRUCTOR_END(obj, lv_label) + + LV_LOG_INFO("label created"); +} + +static void lv_label_destructor(void * obj) +{ +// lv_label_dot_tmp_free(label->dot_...); +// lv_label_dot_tmp_free(label->text); + +// lv_bar_t * bar = obj; +// +// _lv_obj_reset_style_list_no_refr(obj, LV_PART_INDICATOR); +//#if LV_USE_ANIMATION +// lv_anim_del(&bar->cur_value_anim, NULL); +// lv_anim_del(&bar->start_value_anim, NULL); +//#endif + +// bar->class_p->base_p->destructor(obj); +} + /** * Handle the drawing related tasks of the labels * @param label pointer to a label object @@ -1203,16 +1202,17 @@ void lv_label_refr_text(lv_obj_t * label) * LV_DESIGN_DRAW_POST: drawing after every children are drawn * @param return an element of `lv_design_res_t` */ -static lv_design_res_t lv_label_design(lv_obj_t * label, const lv_area_t * clip_area, lv_design_mode_t mode) +static lv_design_res_t lv_label_design(lv_obj_t * obj, const lv_area_t * clip_area, lv_design_mode_t mode) { /* A label never covers an area */ if(mode == LV_DESIGN_COVER_CHK) return LV_DESIGN_RES_NOT_COVER; else if(mode == LV_DESIGN_DRAW_MAIN) { - lv_label_ext_t * ext = lv_obj_get_ext_attr(label); - lv_coord_t w = lv_obj_get_style_transform_width(label, LV_LABEL_PART_MAIN); - lv_coord_t h = lv_obj_get_style_transform_height(label, LV_LABEL_PART_MAIN); + lv_label_t * label = (lv_label_t *) obj; + + lv_coord_t w = lv_obj_get_style_transform_width(obj, LV_PART_MAIN); + lv_coord_t h = lv_obj_get_style_transform_height(obj, LV_PART_MAIN); lv_area_t bg_coords; lv_area_copy(&bg_coords, &label->coords); bg_coords.x1 -= w; @@ -1222,42 +1222,42 @@ static lv_design_res_t lv_label_design(lv_obj_t * label, const lv_area_t * clip_ lv_draw_rect_dsc_t draw_rect_dsc; lv_draw_rect_dsc_init(&draw_rect_dsc); - lv_obj_init_draw_rect_dsc(label, LV_LABEL_PART_MAIN, &draw_rect_dsc); + lv_obj_init_draw_rect_dsc(obj, LV_PART_MAIN, &draw_rect_dsc); lv_draw_rect(&bg_coords, clip_area, &draw_rect_dsc); lv_area_t txt_coords; - get_txt_coords(label, &txt_coords); + get_txt_coords(obj, &txt_coords); lv_area_t txt_clip; bool is_common = _lv_area_intersect(&txt_clip, clip_area, &txt_coords); if(!is_common) return LV_DESIGN_RES_OK; - lv_label_align_t align = lv_label_get_align(label); + lv_label_align_t align = lv_label_get_align(obj); lv_txt_flag_t flag = LV_TXT_FLAG_NONE; - if(ext->recolor != 0) flag |= LV_TXT_FLAG_RECOLOR; - if(ext->expand != 0) flag |= LV_TXT_FLAG_EXPAND; - if(ext->long_mode == LV_LABEL_LONG_EXPAND) flag |= LV_TXT_FLAG_FIT; + if(label->recolor != 0) flag |= LV_TXT_FLAG_RECOLOR; + if(label->expand != 0) flag |= LV_TXT_FLAG_EXPAND; + if(label->long_mode == LV_LABEL_LONG_EXPAND) flag |= LV_TXT_FLAG_FIT; if(align == LV_LABEL_ALIGN_CENTER) flag |= LV_TXT_FLAG_CENTER; if(align == LV_LABEL_ALIGN_RIGHT) flag |= LV_TXT_FLAG_RIGHT; lv_draw_label_dsc_t label_draw_dsc; lv_draw_label_dsc_init(&label_draw_dsc); - label_draw_dsc.sel_start = lv_label_get_text_sel_start(label); - label_draw_dsc.sel_end = lv_label_get_text_sel_end(label); - label_draw_dsc.ofs_x = ext->offset.x; - label_draw_dsc.ofs_y = ext->offset.y; + label_draw_dsc.sel_start = lv_label_get_text_sel_start(obj); + label_draw_dsc.sel_end = lv_label_get_text_sel_end(obj); + label_draw_dsc.ofs_x = label->offset.x; + label_draw_dsc.ofs_y = label->offset.y; label_draw_dsc.flag = flag; - lv_obj_init_draw_label_dsc(label, LV_LABEL_PART_MAIN, &label_draw_dsc); + lv_obj_init_draw_label_dsc(obj, LV_PART_MAIN, &label_draw_dsc); /* 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((ext->long_mode == LV_LABEL_LONG_SROLL || ext->long_mode == LV_LABEL_LONG_SROLL_CIRC) && - (ext->align == LV_LABEL_ALIGN_CENTER || ext->align == LV_LABEL_ALIGN_RIGHT)) { + if((label->long_mode == LV_LABEL_LONG_SROLL || label->long_mode == LV_LABEL_LONG_SROLL_CIRC) && + (label->align == LV_LABEL_ALIGN_CENTER || label->align == LV_LABEL_ALIGN_RIGHT)) { lv_point_t size; - _lv_txt_get_size(&size, ext->text, label_draw_dsc.font, label_draw_dsc.letter_space, label_draw_dsc.line_space, + _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); if(size.x > lv_area_get_width(&txt_coords)) { label_draw_dsc.flag &= ~LV_TXT_FLAG_RIGHT; @@ -1265,8 +1265,8 @@ static lv_design_res_t lv_label_design(lv_obj_t * label, const lv_area_t * clip_ } } #if LV_LABEL_LONG_TXT_HINT - lv_draw_label_hint_t * hint = &ext->hint; - if(ext->long_mode == LV_LABEL_LONG_SROLL_CIRC || lv_area_get_height(&txt_coords) < LV_LABEL_HINT_HEIGHT_LIMIT) + 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) hint = NULL; #else @@ -1274,28 +1274,28 @@ static lv_design_res_t lv_label_design(lv_obj_t * label, const lv_area_t * clip_ lv_draw_label_hint_t * hint = NULL; #endif - lv_draw_label(&txt_coords, &txt_clip, &label_draw_dsc, ext->text, hint); + lv_draw_label(&txt_coords, &txt_clip, &label_draw_dsc, label->text, hint); - if(ext->long_mode == LV_LABEL_LONG_SROLL_CIRC) { + if(label->long_mode == LV_LABEL_LONG_SROLL_CIRC) { lv_point_t size; - _lv_txt_get_size(&size, ext->text, label_draw_dsc.font, label_draw_dsc.letter_space, label_draw_dsc.line_space, + _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); - /*Draw the text again next to the original to make an circular effect */ + /*Draw the text again nlabel to the original to make an circular effect */ if(size.x > lv_area_get_width(&txt_coords)) { - label_draw_dsc.ofs_x = ext->offset.x + size.x + + label_draw_dsc.ofs_x = label->offset.x + size.x + lv_font_get_glyph_width(label_draw_dsc.font, ' ', ' ') * LV_LABEL_WAIT_CHAR_COUNT; - label_draw_dsc.ofs_y = ext->offset.y; + label_draw_dsc.ofs_y = label->offset.y; - lv_draw_label(&txt_coords, &txt_clip, &label_draw_dsc, ext->text, hint); + lv_draw_label(&txt_coords, &txt_clip, &label_draw_dsc, label->text, hint); } /*Draw the text again below the original to make an circular effect */ if(size.y > lv_area_get_height(&txt_coords)) { - label_draw_dsc.ofs_x = ext->offset.x; - label_draw_dsc.ofs_y = ext->offset.y + size.y + lv_font_get_line_height(label_draw_dsc.font); + label_draw_dsc.ofs_x = label->offset.x; + label_draw_dsc.ofs_y = label->offset.y + size.y + lv_font_get_line_height(label_draw_dsc.font); - lv_draw_label(&txt_coords, &txt_clip, &label_draw_dsc, ext->text, hint); + lv_draw_label(&txt_coords, &txt_clip, &label_draw_dsc, label->text, hint); } } } @@ -1310,93 +1310,74 @@ static lv_design_res_t lv_label_design(lv_obj_t * label, const lv_area_t * clip_ * @param param pointer to a signal specific variable * @return LV_RES_OK: the object is not deleted in the function; LV_RES_INV: the object is deleted */ -static lv_res_t lv_label_signal(lv_obj_t * label, lv_signal_t sign, void * param) +static lv_res_t lv_label_signal(lv_obj_t * obj, lv_signal_t sign, void * param) { lv_res_t res; - if(sign == LV_SIGNAL_GET_STYLE) { - lv_get_style_info_t * info = param; - info->result = lv_label_get_style(label, info->part); - if(info->result != NULL) return LV_RES_OK; - else return ancestor_signal(label, sign, param); - } - /* Include the ancient signal function */ - res = ancestor_signal(label, sign, param); + res = lv_label.base_p->signal_cb(obj, sign, param); if(res != LV_RES_OK) return res; - if(sign == LV_SIGNAL_GET_TYPE) return _lv_obj_handle_get_type_signal(param, LV_OBJX_NAME); - lv_label_ext_t * ext = lv_obj_get_ext_attr(label); - if(sign == LV_SIGNAL_CLEANUP) { - if(ext->static_txt == 0) { - lv_mem_free(ext->text); - ext->text = NULL; - } - lv_label_dot_tmp_free(label); - } - else if(sign == LV_SIGNAL_STYLE_CHG) { + + lv_label_t * label = (lv_label_t *) obj; + + if(sign == LV_SIGNAL_STYLE_CHG) { /*Revert dots for proper refresh*/ - lv_label_revert_dots(label); - lv_label_refr_text(label); + lv_label_revert_dots(obj); + lv_label_refr_text(obj); } else if(sign == LV_SIGNAL_COORD_CHG) { if(lv_area_get_width(&label->coords) != lv_area_get_width(param) || lv_area_get_height(&label->coords) != lv_area_get_height(param)) { - lv_label_revert_dots(label); - lv_label_refr_text(label); + lv_label_revert_dots(obj); + lv_label_refr_text(obj); } } else if(sign == LV_SIGNAL_BASE_DIR_CHG) { #if LV_USE_BIDI - if(ext->static_txt == 0) lv_label_set_text(label, NULL); + if(label->static_txt == 0) lv_label_set_text(label, NULL); #endif } - else if(sign == LV_SIGNAL_GET_TYPE) { - lv_obj_type_t * buf = param; - uint8_t i; - for(i = 0; i < LV_MAX_ANCESTOR_NUM - 1; i++) { /*Find the last set data*/ - if(buf->type[i] == NULL) break; - } - buf->type[i] = "lv_label"; - } return res; } -static void lv_label_revert_dots(lv_obj_t * label) +static void lv_label_revert_dots(lv_obj_t * obj) { - lv_label_ext_t * ext = lv_obj_get_ext_attr(label); - if(ext->long_mode != LV_LABEL_LONG_DOT) return; - if(ext->dot_end == LV_LABEL_DOT_END_INV) return; - uint32_t letter_i = ext->dot_end - LV_LABEL_DOT_NUM; - uint32_t byte_i = _lv_txt_encoded_get_byte_id(ext->text, letter_i); + + lv_label_t * label = (lv_label_t *) obj; + + if(label->long_mode != LV_LABEL_LONG_DOT) return; + if(label->dot_end == LV_LABEL_DOT_END_INV) return; + uint32_t letter_i = label->dot_end - LV_LABEL_DOT_NUM; + uint32_t byte_i = _lv_txt_encoded_get_byte_id(label->text, letter_i); /*Restore the characters*/ uint8_t i = 0; - char * dot_tmp = lv_label_get_dot_tmp(label); - while(ext->text[byte_i + i] != '\0') { - ext->text[byte_i + i] = dot_tmp[i]; + char * dot_tmp = lv_label_get_dot_tmp(obj); + while(label->text[byte_i + i] != '\0') { + label->text[byte_i + i] = dot_tmp[i]; i++; } - ext->text[byte_i + i] = dot_tmp[i]; - lv_label_dot_tmp_free(label); + label->text[byte_i + i] = dot_tmp[i]; + lv_label_dot_tmp_free(obj); - ext->dot_end = LV_LABEL_DOT_END_INV; + label->dot_end = LV_LABEL_DOT_END_INV; } #if LV_USE_ANIMATION -static void lv_label_set_offset_x(lv_obj_t * label, lv_coord_t x) +static void lv_label_set_offset_x(lv_obj_t * obj, lv_coord_t x) { - lv_label_ext_t * ext = lv_obj_get_ext_attr(label); - ext->offset.x = x; - lv_obj_invalidate(label); + lv_label_t * label = (lv_label_t *) obj; + label->offset.x = x; + lv_obj_invalidate(obj); } -static void lv_label_set_offset_y(lv_obj_t * label, lv_coord_t y) +static void lv_label_set_offset_y(lv_obj_t * obj, lv_coord_t y) { - lv_label_ext_t * ext = lv_obj_get_ext_attr(label); - ext->offset.y = y; - lv_obj_invalidate(label); + lv_label_t * label = (lv_label_t *) obj; + label->offset.y = y; + lv_obj_invalidate(obj); } #endif @@ -1407,26 +1388,27 @@ static void lv_label_set_offset_y(lv_obj_t * label, lv_coord_t y) * @param len Number of characters to store. * @return true on success. */ -static bool lv_label_set_dot_tmp(lv_obj_t * label, char * data, uint32_t len) +static bool lv_label_set_dot_tmp(lv_obj_t * obj, char * data, uint32_t len) { - lv_label_ext_t * ext = lv_obj_get_ext_attr(label); - lv_label_dot_tmp_free(label); /* Deallocate any existing space */ + + lv_label_t * label = (lv_label_t *) obj; + lv_label_dot_tmp_free(obj); /* Deallocate any existing space */ if(len > sizeof(char *)) { /* Memory needs to be allocated. Allocates an additional byte * for a NULL-terminator so it can be copied. */ - ext->dot.tmp_ptr = lv_mem_alloc(len + 1); - if(ext->dot.tmp_ptr == NULL) { + label->dot.tmp_ptr = lv_mem_alloc(len + 1); + if(label->dot.tmp_ptr == NULL) { LV_LOG_ERROR("Failed to allocate memory for dot_tmp_ptr"); return false; } - _lv_memcpy(ext->dot.tmp_ptr, data, len); - ext->dot.tmp_ptr[len] = '\0'; - ext->dot_tmp_alloc = true; + _lv_memcpy(label->dot.tmp_ptr, data, len); + label->dot.tmp_ptr[len] = '\0'; + label->dot_tmp_alloc = true; } else { /* Characters can be directly stored in object */ - ext->dot_tmp_alloc = false; - _lv_memcpy(ext->dot.tmp, data, len); + label->dot_tmp_alloc = false; + _lv_memcpy(label->dot.tmp, data, len); } return true; } @@ -1436,14 +1418,14 @@ static bool lv_label_set_dot_tmp(lv_obj_t * label, char * data, uint32_t len) * @param label pointer to label object * @return char pointer to a stored characters. Is *not* necessarily NULL-terminated. */ -static char * lv_label_get_dot_tmp(lv_obj_t * label) +static char * lv_label_get_dot_tmp(lv_obj_t * obj) { - lv_label_ext_t * ext = lv_obj_get_ext_attr(label); - if(ext->dot_tmp_alloc) { - return ext->dot.tmp_ptr; + lv_label_t * label = (lv_label_t *) obj; + if(label->dot_tmp_alloc) { + return label->dot.tmp_ptr; } else { - return ext->dot.tmp; + return label->dot.tmp; } } @@ -1452,24 +1434,24 @@ static char * lv_label_get_dot_tmp(lv_obj_t * label) * Always clears the field * @param label pointer to label object. */ -static void lv_label_dot_tmp_free(lv_obj_t * label) +static void lv_label_dot_tmp_free(lv_obj_t * obj) { - lv_label_ext_t * ext = lv_obj_get_ext_attr(label); - if(ext->dot_tmp_alloc && ext->dot.tmp_ptr) { - lv_mem_free(ext->dot.tmp_ptr); + lv_label_t * label = (lv_label_t *) obj; + if(label->dot_tmp_alloc && label->dot.tmp_ptr) { + lv_mem_free(label->dot.tmp_ptr); } - ext->dot_tmp_alloc = false; - ext->dot.tmp_ptr = NULL; + label->dot_tmp_alloc = false; + label->dot.tmp_ptr = NULL; } -static void get_txt_coords(const lv_obj_t * label, lv_area_t * area) +static void get_txt_coords(const lv_obj_t * obj, lv_area_t * area) { - lv_obj_get_coords(label, area); + lv_obj_get_coords(obj, area); - lv_coord_t left = lv_obj_get_style_pad_left(label, LV_LABEL_PART_MAIN); - lv_coord_t right = lv_obj_get_style_pad_right(label, LV_LABEL_PART_MAIN); - lv_coord_t top = lv_obj_get_style_pad_top(label, LV_LABEL_PART_MAIN); - lv_coord_t bottom = lv_obj_get_style_pad_bottom(label, LV_LABEL_PART_MAIN); + lv_coord_t left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + lv_coord_t right = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); + lv_coord_t top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + lv_coord_t bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); area->x1 += left; area->x2 -= right; area->y1 += top; diff --git a/src/lv_widgets/lv_label.h b/src/lv_widgets/lv_label.h index 097846c5c..fbf5d99c6 100644 --- a/src/lv_widgets/lv_label.h +++ b/src/lv_widgets/lv_label.h @@ -41,13 +41,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_BREAK, /**< Keep the object width, break 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_CROP, /**< Keep the size and crop 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_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*/ }; typedef uint8_t lv_label_long_mode_t; @@ -60,50 +59,55 @@ enum { }; typedef uint8_t lv_label_align_t; -/** Data of label*/ -typedef struct { - /*Inherited from 'base_obj' so no inherited ext.*/ /*Ext. of ancestor*/ - /*New data for this type */ - char * text; /*Text of the label*/ - union { - char * tmp_ptr; /* Pointer to the allocated memory containing the character which are replaced by dots (Handled - by the library)*/ - char tmp[LV_LABEL_DOT_NUM + 1]; /* Directly store the characters if <=4 characters */ - } dot; +LV_CLASS_DECLARE_START(lv_label, lv_obj); - uint32_t dot_end; /*The text end position in dot mode (Handled by the library)*/ +#define _lv_label_constructor void (*constructor)(struct _lv_obj_t * obj, struct _lv_obj_t * parent, const struct _lv_obj_t * copy) #if LV_USE_ANIMATION - uint16_t anim_speed; /*Speed of scroll and roll animation in px/sec unit*/ +#define LV_LABEL_ANIM_DATA uint32_t anim_speed; +#else +#define LV_LABEL_ANIM_DATA #endif - lv_point_t offset; /*Text draw position offset*/ - #if LV_LABEL_LONG_TXT_HINT - lv_draw_label_hint_t hint; /*Used to buffer info about large text*/ +#define LV_LABEL_HINT_DATA lv_draw_label_hint_t hint; +#else +#define LV_LABEL_HINT_DATA #endif #if LV_LABEL_TEXT_SEL - uint32_t sel_start; - uint32_t sel_end; +#define LV_LABEL_TEXT_SEL_DATA uint32_t sel_start; uint32_t sel_end; +#else +#define LV_LABEL_TEXT_SEL_DATA #endif - lv_label_long_mode_t long_mode : 3; /*Determinate what to do with the long texts*/ - uint8_t static_txt : 1; /*Flag to indicate the text is static*/ - uint8_t align : 2; /*Align type from 'lv_label_align_t'*/ - uint8_t recolor : 1; /*Enable in-line letter re-coloring*/ - uint8_t expand : 1; /*Ignore real width (used by the library with LV_LABEL_LONG_SROLL)*/ - uint8_t dot_tmp_alloc : 1; /*True if dot_tmp has been allocated. False if dot_tmp directly holds up to 4 bytes of - characters */ -} lv_label_ext_t; -/** Label styles*/ -enum { - LV_LABEL_PART_MAIN, -}; +#define _lv_label_data \ + _lv_obj_data \ + char * text; \ + union { \ + char * tmp_ptr; /* Pointer to the allocated memory containing the character replaced by dots*/ \ + char tmp[LV_LABEL_DOT_NUM + 1]; /* Directly store the characters if <=4 characters */ \ + } dot; \ + uint32_t dot_end; /*The real text length, used in dot mode*/ \ + LV_LABEL_ANIM_DATA /*Speed of scroll and roll animation in px/sec unit*/ \ + LV_LABEL_HINT_DATA /*Used to buffer info about large text*/ \ + LV_LABEL_TEXT_SEL_DATA \ + lv_point_t offset; /*Text draw position offset*/ \ + lv_label_long_mode_t long_mode : 3; /*Determinate what to do with the long texts*/ \ + uint8_t static_txt : 1; /*Flag to indicate the text is static*/ \ + uint8_t align : 2; /*Align type from 'lv_label_align_t'*/ \ + uint8_t recolor : 1; /*Enable in-line letter re-coloring*/ \ + uint8_t expand : 1; /*Ignore real width (used by the library with LV_LABEL_LONG_SROLL)*/ \ + uint8_t dot_tmp_alloc : 1; /*1: dot_tmp has been allocated;.0: dot_tmp directly holds up to 4 bytes of characters */ \ -typedef uint8_t lv_label_part_t; +#define _lv_label_class_dsc \ + _lv_obj_class_dsc + +LV_CLASS_DECLARE_END(lv_label, lv_obj); + +extern lv_label_class_t lv_label; /********************** * GLOBAL PROTOTYPES @@ -187,6 +191,7 @@ void lv_label_set_text_sel_start(lv_obj_t * label, uint32_t index); * @param index index to set. `LV_LABEL_TXT_SEL_OFF` to select nothing. */ void lv_label_set_text_sel_end(lv_obj_t * label, uint32_t index); + /*===================== * Getter functions *====================*/ @@ -266,9 +271,6 @@ uint32_t lv_label_get_text_sel_start(const lv_obj_t * label); */ uint32_t lv_label_get_text_sel_end(const lv_obj_t * label); - -lv_style_list_t * lv_label_get_style(lv_obj_t * label, uint8_t type); - /*===================== * Other functions *====================*/ diff --git a/src/lv_widgets/lv_slider.c b/src/lv_widgets/lv_slider.c index 036dad79a..7cbf72068 100644 --- a/src/lv_widgets/lv_slider.c +++ b/src/lv_widgets/lv_slider.c @@ -72,21 +72,10 @@ lv_obj_t * lv_slider_create(lv_obj_t * parent, const lv_obj_t * copy) lv_slider.design_cb = lv_slider_design; } - lv_obj_t * obj = lv_class_new(&lv_slider); lv_slider.constructor(obj, parent, copy); - lv_slider_t * slider = (lv_slider_t *) obj; - - /*Init the new slider slider*/ - if(copy == NULL) { - lv_theme_apply(obj); - } else { -// lv_slider_t * copy_slider = (lv_slider_t *) copy; -// lv_style_list_copy(&slider->style_knob, ©_slider->style_knob); -// -// _lv_obj_refresh_style(obj, LV_OBJ_PART_ALL, LV_STYLE_PROP_ALL); - } + lv_obj_create_finish(obj, parent, copy); LV_LOG_INFO("slider created"); @@ -426,7 +415,9 @@ static lv_res_t lv_slider_signal(lv_obj_t * obj, lv_signal_t sign, void * param) lv_coord_t knob_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_KNOB); /* The smaller size is the knob diameter*/ - lv_coord_t knob_size = LV_MATH_MIN(lv_obj_get_width(obj), lv_obj_get_height(obj)) >> 1; + lv_coord_t trans_w = lv_obj_get_style_transform_width(obj, LV_PART_MAIN); + lv_coord_t trans_h = lv_obj_get_style_transform_height(obj, LV_PART_MAIN); + lv_coord_t knob_size = LV_MATH_MIN(lv_obj_get_width(obj) + 2 * trans_w, lv_obj_get_height(obj) + 2 * trans_h) >> 1; knob_size += LV_MATH_MAX(LV_MATH_MAX(knob_left, knob_right), LV_MATH_MAX(knob_bottom, knob_top)); knob_size += 2; /*For rounding error*/ @@ -488,11 +479,14 @@ static void lv_slider_position_knob(lv_obj_t * slider, lv_area_t * knob_area, lv lv_coord_t knob_top = lv_obj_get_style_pad_top(slider, LV_PART_KNOB); lv_coord_t knob_bottom = lv_obj_get_style_pad_bottom(slider, LV_PART_KNOB); + lv_coord_t transf_w = lv_obj_get_style_transform_width(slider, LV_PART_KNOB); + lv_coord_t transf_h = lv_obj_get_style_transform_height(slider, LV_PART_KNOB); + /*Apply the paddings on the knob area*/ - knob_area->x1 -= knob_left; - knob_area->x2 += knob_right; - knob_area->y1 -= knob_top; - knob_area->y2 += knob_bottom; + knob_area->x1 -= knob_left + transf_w; + knob_area->x2 += knob_right + transf_w; + knob_area->y1 -= knob_top + transf_h; + knob_area->y2 += knob_bottom + transf_h; } static void lv_slider_draw_knob(lv_obj_t * slider, const lv_area_t * knob_area, const lv_area_t * clip_area)