diff --git a/lv_conf_template.h b/lv_conf_template.h index 94c599b9e..6919bbf70 100644 --- a/lv_conf_template.h +++ b/lv_conf_template.h @@ -279,9 +279,7 @@ typedef void * lv_indev_drv_user_data_t; /*Type of user data in the i #define LV_USE_ASSERT_MEM 1 /*Check the integrity of `lv_mem` after critical operations. (Slow)*/ -#ifndef LV_USE_ASSERT_MEM_INTEGRITY #define LV_USE_ASSERT_MEM_INTEGRITY 0 -#endif /* Check the strings. * Search for NULL, very long strings, invalid characters, and unnatural repetitions. (Slow) @@ -293,7 +291,7 @@ typedef void * lv_indev_drv_user_data_t; /*Type of user data in the i #define LV_USE_ASSERT_OBJ 0 /*Check if the styles are properly initialized. (Fast)*/ -#define LV_USE_ASSERT_STYLE 1 +#define LV_USE_ASSERT_STYLE 0 #endif /*LV_USE_DEBUG*/ @@ -522,6 +520,10 @@ typedef void * lv_obj_user_data_t; /*LED (dependencies: -)*/ #define LV_USE_LED 1 +#if LV_USE_LED +# define LV_LED_BRIGHT_MIN 60 /*Minimal brightness*/ +# define LV_LED_BRIGHT_MAX 255 /*Maximal brightness*/ +#endif /*Line (dependencies: -*/ #define LV_USE_LINE 1 diff --git a/scripts/infer_run.sh b/scripts/infer_run.sh new file mode 100755 index 000000000..2d33d5b84 --- /dev/null +++ b/scripts/infer_run.sh @@ -0,0 +1,10 @@ +# https://github.com/facebook/infer +# +# Install: +# VERSION=0.17.0; \ +# curl -sSL "https://github.com/facebook/infer/releases/download/v$VERSION/infer-linux64-v$VERSION.tar.xz" \ +# | sudo tar -C /opt -xJ && \ +# sudoln -s "/opt/infer-linux64-v$VERSION/bin/infer" /usr/local/bin/infer + + +infer run -- make -j8 diff --git a/src/lv_conf_internal.h b/src/lv_conf_internal.h index abd306607..59307fa08 100644 --- a/src/lv_conf_internal.h +++ b/src/lv_conf_internal.h @@ -766,6 +766,14 @@ #ifndef LV_USE_LED #define LV_USE_LED 1 #endif +#if LV_USE_LED +#ifndef LV_LED_BRIGHT_MIN +# define LV_LED_BRIGHT_MIN 60 /*Minimal brightness*/ +#endif +#ifndef LV_LED_BRIGHT_MAX +# define LV_LED_BRIGHT_MAX 255 /*Maximal brightness*/ +#endif +#endif /*Line (dependencies: -*/ #ifndef LV_USE_LINE diff --git a/src/lv_core/lv_disp.c b/src/lv_core/lv_disp.c index f87f19962..125707113 100644 --- a/src/lv_core/lv_disp.c +++ b/src/lv_core/lv_disp.c @@ -57,7 +57,7 @@ lv_obj_t * lv_disp_get_scr_act(lv_disp_t * disp) void lv_disp_load_scr(lv_obj_t * scr) { lv_disp_t * d = lv_obj_get_disp(scr); - + if(!d) return; /*Shouldn't happen, just to be sure*/ d->act_scr = scr; lv_obj_invalidate(scr); @@ -151,7 +151,8 @@ uint32_t lv_disp_get_inactive_time(const lv_disp_t * disp) uint32_t t = UINT32_MAX; d = lv_disp_get_next(NULL); while(d) { - t = LV_MATH_MIN(t, lv_tick_elaps(d->last_activity_time)); + uint32_t elaps = lv_tick_elaps(d->last_activity_time); + t = LV_MATH_MIN(t, elaps); d = lv_disp_get_next(d); } diff --git a/src/lv_core/lv_group.c b/src/lv_core/lv_group.c index fd6216e5e..5467a0213 100644 --- a/src/lv_core/lv_group.c +++ b/src/lv_core/lv_group.c @@ -110,7 +110,6 @@ void lv_group_del(lv_group_t * group) void lv_group_add_obj(lv_group_t * group, lv_obj_t * obj) { if(group == NULL) return; - /*Do not add the object twice*/ lv_obj_t ** obj_i; LV_LL_READ(group->obj_ll, obj_i) { diff --git a/src/lv_core/lv_indev.c b/src/lv_core/lv_indev.c index d269aa19d..5f4142aed 100644 --- a/src/lv_core/lv_indev.c +++ b/src/lv_core/lv_indev.c @@ -247,6 +247,11 @@ void lv_indev_set_button_points(lv_indev_t * indev, const lv_point_t * points) */ void lv_indev_get_point(const lv_indev_t * indev, lv_point_t * point) { + if(indev == NULL) { + point->x = 0; + point->y = 0; + return; + } if(indev->driver.type != LV_INDEV_TYPE_POINTER && indev->driver.type != LV_INDEV_TYPE_BUTTON) { point->x = -1; point->y = -1; @@ -488,6 +493,14 @@ static void indev_keypad_proc(lv_indev_t * i, lv_indev_data_t * data) } /*Pressing*/ else if(data->state == LV_INDEV_STATE_PR && prev_state == LV_INDEV_STATE_PR) { + + if(data->key == LV_KEY_ENTER) { + indev_obj_act->signal_cb(indev_obj_act, LV_SIGNAL_PRESSING, NULL); + if(indev_reset_check(&i->proc)) return; + lv_event_send(indev_obj_act, LV_EVENT_PRESSING, NULL); + if(indev_reset_check(&i->proc)) return; + } + /*Long press time has elapsed?*/ if(i->proc.long_pr_sent == 0 && lv_tick_elaps(i->proc.pr_timestamp) > i->driver.long_press_time) { i->proc.long_pr_sent = 1; @@ -780,6 +793,11 @@ static void indev_proc_press(lv_indev_proc_t * proc) indev_drag_throw(proc); } + /*Do not use disabled objects*/ + if((lv_obj_get_state(indev_obj_act, LV_OBJ_PART_MAIN) & LV_STATE_DISABLED)) { + indev_obj_act = proc->types.pointer.act_obj; + } + /*If a new object was found reset some variables and send a pressed signal*/ if(indev_obj_act != proc->types.pointer.act_obj) { proc->types.pointer.last_point.x = proc->types.pointer.act_point.x; @@ -1044,8 +1062,7 @@ lv_obj_t * lv_indev_search_obj(lv_obj_t * obj, lv_point_t * point) /*If then the children was not ok, and this obj is clickable * and it or its parent is not hidden then save this object*/ - if(found_p == NULL && lv_obj_get_click(obj) != false && - (lv_obj_get_state(obj, LV_OBJ_PART_MAIN) & LV_STATE_DISABLED) == 0) { + if(found_p == NULL && lv_obj_get_click(obj) != false) { lv_obj_t * hidden_i = obj; while(hidden_i != NULL) { if(lv_obj_get_hidden(hidden_i) == true) break; diff --git a/src/lv_core/lv_obj.c b/src/lv_core/lv_obj.c index c488787ac..b649eb066 100644 --- a/src/lv_core/lv_obj.c +++ b/src/lv_core/lv_obj.c @@ -389,6 +389,14 @@ lv_res_t lv_obj_del(lv_obj_t * obj) LV_ASSERT_OBJ(obj, LV_OBJX_NAME); lv_obj_invalidate(obj); + lv_disp_t * disp = NULL; + bool act_scr_del = false; + if(obj->parent == NULL) { + disp = lv_obj_get_disp(obj); + if(!disp) return LV_RES_INV; /*Shouldn't happen*/ + if(disp->act_scr == obj) act_scr_del = true; + } + /*Delete from the group*/ #if LV_USE_GROUP lv_group_t * group = lv_obj_get_group(obj); @@ -402,8 +410,10 @@ lv_res_t lv_obj_del(lv_obj_t * obj) #endif /*Delete the user data*/ +#if LV_USE_USER_DATA #if LV_USE_USER_DATA_FREE LV_USER_DATA_FREE(obj); +#endif #endif /*Recursively delete the children*/ @@ -467,6 +477,11 @@ lv_res_t lv_obj_del(lv_obj_t * obj) par->signal_cb(par, LV_SIGNAL_CHILD_CHG, NULL); } + /*Handle if the active screen was deleted*/ + if(act_scr_del) { + disp->act_scr = NULL; + } + return LV_RES_INV; } @@ -1139,7 +1154,7 @@ void lv_obj_add_style(lv_obj_t * obj, uint8_t part, lv_style_t * style) #if LV_USE_ANIMATION trans_del(obj, part, 0xFF, NULL); #endif - lv_obj_refresh_style(obj); + lv_obj_refresh_style(obj, LV_STYLE_PROP_ALL); } /** @@ -1176,7 +1191,7 @@ void lv_obj_reset_style_list(lv_obj_t * obj, uint8_t part) { lv_obj_clean_style_list(obj, part); - lv_obj_refresh_style(obj); + lv_obj_refresh_style(obj, LV_STYLE_PROP_ALL); } /** @@ -1198,7 +1213,7 @@ void _lv_obj_set_style_local_int(lv_obj_t * obj, uint8_t part, lv_style_property #if LV_USE_ANIMATION trans_del(obj, part, prop, NULL); #endif - lv_obj_refresh_style(obj); + lv_obj_refresh_style(obj, prop & (~LV_STYLE_STATE_MASK)); } /** @@ -1220,7 +1235,7 @@ void _lv_obj_set_style_local_color(lv_obj_t * obj, uint8_t part, lv_style_proper #if LV_USE_ANIMATION trans_del(obj, part, prop, NULL); #endif - lv_obj_refresh_style(obj); + lv_obj_refresh_style(obj, prop & (~LV_STYLE_STATE_MASK)); } /** @@ -1242,7 +1257,7 @@ void _lv_obj_set_style_local_opa(lv_obj_t * obj, uint8_t part, lv_style_property #if LV_USE_ANIMATION trans_del(obj, part, prop, NULL); #endif - lv_obj_refresh_style(obj); + lv_obj_refresh_style(obj, prop & (~LV_STYLE_STATE_MASK)); } /** @@ -1264,7 +1279,7 @@ void _lv_obj_set_style_local_ptr(lv_obj_t * obj, uint8_t part, lv_style_property #if LV_USE_ANIMATION trans_del(obj, part, prop, NULL); #endif - lv_obj_refresh_style(obj); + lv_obj_refresh_style(obj, prop & (~LV_STYLE_STATE_MASK)); } /** @@ -1289,17 +1304,62 @@ bool _lv_obj_remove_style_local_prop(lv_obj_t * obj, uint8_t part, lv_style_prop /** * Notify an object (and its children) about its style is modified * @param obj pointer to an object + * @param prop `LV_STYLE_PROP_ALL` or an `LV_STYLE_...` property. It is used the optimize what needs to be refreshed. */ -void lv_obj_refresh_style(lv_obj_t * obj) +void lv_obj_refresh_style(lv_obj_t * obj, lv_style_property_t prop) { LV_ASSERT_OBJ(obj, LV_OBJX_NAME); - lv_obj_invalidate(obj); - obj->signal_cb(obj, LV_SIGNAL_STYLE_CHG, NULL); - lv_obj_invalidate(obj); + /*If a real style refresh is required*/ + bool real_refr = false; + switch(prop) { + case LV_STYLE_PROP_ALL: + case LV_STYLE_CLIP_CORNER: + case LV_STYLE_SIZE: + case LV_STYLE_TRANSFORM_WIDTH: + case LV_STYLE_TRANSFORM_HEIGHT: + case LV_STYLE_PAD_TOP: + case LV_STYLE_PAD_BOTTOM: + case LV_STYLE_PAD_LEFT: + case LV_STYLE_PAD_RIGHT: + case LV_STYLE_PAD_INNER: + case LV_STYLE_OUTLINE_WIDTH: + case LV_STYLE_OUTLINE_PAD: + case LV_STYLE_OUTLINE_OPA: + case LV_STYLE_SHADOW_WIDTH: + case LV_STYLE_SHADOW_OPA: + case LV_STYLE_SHADOW_OFS_X: + case LV_STYLE_SHADOW_OFS_Y: + case LV_STYLE_SHADOW_SPREAD: + case LV_STYLE_VALUE_LETTER_SPACE: + case LV_STYLE_VALUE_LINE_SPACE: + case LV_STYLE_VALUE_OFS_X: + case LV_STYLE_VALUE_OFS_Y: + case LV_STYLE_VALUE_ALIGN: + case LV_STYLE_VALUE_STR: + case LV_STYLE_VALUE_FONT: + case LV_STYLE_VALUE_OPA: + case LV_STYLE_TEXT_LETTER_SPACE: + case LV_STYLE_TEXT_LINE_SPACE: + case LV_STYLE_TEXT_FONT: + case LV_STYLE_LINE_WIDTH: + real_refr = true; + break; + default: + real_refr = false; + } - /*Send style change signals*/ - refresh_children_style(obj); + if(real_refr) { + lv_obj_invalidate(obj); + obj->signal_cb(obj, LV_SIGNAL_STYLE_CHG, NULL); + lv_obj_invalidate(obj); + + if(prop == LV_STYLE_PROP_ALL || (prop & LV_STYLE_INHERIT_MASK)) + /*Send style change signals*/ + refresh_children_style(obj); + } else { + lv_obj_invalidate(obj); + } } /** @@ -1517,7 +1577,7 @@ void lv_obj_set_state(lv_obj_t * obj, lv_state_t new_state) #if LV_USE_ANIMATION == 0 obj->state = new_state; - lv_obj_refresh_style(obj); + lv_obj_refresh_style(obj, LV_STYLE_PROP_ALL); #else lv_state_t prev_state = obj->state; obj->state = new_state; @@ -1539,7 +1599,6 @@ void lv_obj_set_state(lv_obj_t * obj, lv_state_t new_state) props[4] = lv_obj_get_style_transition_prop_5(obj, part); props[5] = lv_obj_get_style_transition_prop_6(obj, part); - uint8_t i; for(i = 0; i < LV_STYLE_TRANS_NUM_MAX; i++) { if(props[i] != 0) { @@ -1553,23 +1612,18 @@ void lv_obj_set_state(lv_obj_t * obj, lv_state_t new_state) tr->prop = props[i]; tr->part = part; - if(time == 0) { - trans_anim_cb(tr, 255); - } - else { - lv_anim_t a; - lv_anim_init(&a); - lv_anim_set_var(&a, tr); - lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)trans_anim_cb); - lv_anim_set_start_cb(&a, trans_anim_start_cb); - lv_anim_set_ready_cb(&a, trans_anim_ready_cb); - lv_anim_set_values(&a, 0x00, 0xFF); - lv_anim_set_time(&a, time); - lv_anim_set_delay(&a, delay); - lv_anim_set_path_cb(&a, path); - a.early_apply = 0; - lv_anim_start(&a); - } + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_var(&a, tr); + lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)trans_anim_cb); + lv_anim_set_start_cb(&a, trans_anim_start_cb); + lv_anim_set_ready_cb(&a, trans_anim_ready_cb); + lv_anim_set_values(&a, 0x00, 0xFF); + lv_anim_set_time(&a, time); + lv_anim_set_delay(&a, delay); + lv_anim_set_path_cb(&a, path); + a.early_apply = 0; + lv_anim_start(&a); } } @@ -1577,7 +1631,7 @@ void lv_obj_set_state(lv_obj_t * obj, lv_state_t new_state) } #endif - lv_obj_refresh_style(obj); + lv_obj_refresh_style(obj, LV_STYLE_PROP_ALL); } @@ -3118,23 +3172,24 @@ lv_coord_t lv_obj_get_draw_rect_ext_pad_size(lv_obj_t * obj, uint8_t part) { lv_coord_t s = 0; - lv_opa_t sh_opa = lv_obj_get_style_shadow_opa(obj, part); - if(sh_opa > LV_OPA_MIN) { - lv_coord_t sh_width = lv_obj_get_style_shadow_width(obj, part); - if(sh_width) { + lv_coord_t sh_width = lv_obj_get_style_shadow_width(obj, part); + if(sh_width) { + lv_opa_t sh_opa = lv_obj_get_style_shadow_opa(obj, part); + if(sh_opa > LV_OPA_MIN) { sh_width = sh_width / 2; /*THe blur adds only half width*/ sh_width++; sh_width += lv_obj_get_style_shadow_spread(obj, part); - sh_width += LV_MATH_MAX(LV_MATH_ABS(lv_obj_get_style_shadow_ofs_x(obj, part)), - LV_MATH_ABS(lv_obj_get_style_shadow_ofs_y(obj, part))); + lv_style_int_t sh_ofs_x = lv_obj_get_style_shadow_ofs_x(obj, part); + lv_style_int_t sh_ofs_y = lv_obj_get_style_shadow_ofs_y(obj, part); + sh_width += LV_MATH_MAX(LV_MATH_ABS(sh_ofs_x), LV_MATH_ABS(sh_ofs_y)); s = LV_MATH_MAX(s, sh_width); } } - lv_opa_t value_opa = lv_obj_get_style_value_opa(obj, part); - if(value_opa > LV_OPA_MIN) { - const char * value_str = lv_obj_get_style_value_str(obj, part); - if(value_str) { + const char * value_str = lv_obj_get_style_value_str(obj, part); + if(value_str) { + lv_opa_t value_opa = lv_obj_get_style_value_opa(obj, part); + if(value_opa > LV_OPA_MIN) { lv_style_int_t letter_space = lv_obj_get_style_value_letter_space(obj, part); lv_style_int_t line_space = lv_obj_get_style_value_letter_space(obj, part); const lv_font_t * font = lv_obj_get_style_value_font(obj, part); @@ -3166,10 +3221,10 @@ lv_coord_t lv_obj_get_draw_rect_ext_pad_size(lv_obj_t * obj, uint8_t part) } } - lv_opa_t outline_opa = lv_obj_get_style_outline_opa(obj, part); - if(outline_opa > LV_OPA_MIN) { - lv_style_int_t outline_width = lv_obj_get_style_outline_width(obj, part); - if(outline_width) { + lv_style_int_t outline_width = lv_obj_get_style_outline_width(obj, part); + if(outline_width) { + lv_opa_t outline_opa = lv_obj_get_style_outline_opa(obj, part); + if(outline_opa > LV_OPA_MIN) { lv_style_int_t outline_pad = lv_obj_get_style_outline_pad(obj, part); s = LV_MATH_MAX(s, outline_pad + outline_width); } @@ -3289,7 +3344,6 @@ static lv_design_res_t lv_obj_design(lv_obj_t * obj, const lv_area_t * clip_area lv_obj_init_draw_rect_dsc(obj, LV_OBJ_PART_MAIN, &draw_dsc); - lv_coord_t w = lv_obj_get_style_transform_width(obj, LV_OBJ_PART_MAIN); lv_coord_t h = lv_obj_get_style_transform_height(obj, LV_OBJ_PART_MAIN); lv_area_t coords; @@ -3336,7 +3390,6 @@ static lv_design_res_t lv_obj_design(lv_obj_t * obj, const lv_area_t * clip_area coords.y2 += h; lv_draw_rect(&coords, clip_area, &draw_dsc); } - } return LV_DESIGN_RES_OK; @@ -3366,7 +3419,8 @@ static lv_res_t lv_obj_signal(lv_obj_t * obj, lv_signal_t sign, void * param) if(lv_obj_is_protected(obj, LV_PROTECT_CHILD_CHG) != false) res = LV_RES_INV; } else if(sign == LV_SIGNAL_REFR_EXT_DRAW_PAD) { - obj->ext_draw_pad = LV_MATH_MAX(obj->ext_draw_pad, lv_obj_get_draw_rect_ext_pad_size(obj, LV_OBJ_PART_MAIN)); + lv_coord_t d = lv_obj_get_draw_rect_ext_pad_size(obj, LV_OBJ_PART_MAIN); + obj->ext_draw_pad = LV_MATH_MAX(obj->ext_draw_pad, d); } #if LV_USE_OBJ_REALIGN else if(sign == LV_SIGNAL_PARENT_SIZE_CHG) { @@ -3442,7 +3496,7 @@ static void report_style_mod_core(void * style, lv_obj_t * obj) for(ci = 0; ci < dsc->style_cnt; ci++) { lv_style_t * class = lv_style_list_get_style(dsc, ci); if(class == style) { - lv_obj_refresh_style(obj); + lv_obj_refresh_style(obj, LV_STYLE_PROP_ALL); /*It's enough to handle once (if duplicated)*/ break; } @@ -3457,8 +3511,6 @@ static void report_style_mod_core(void * style, lv_obj_t * obj) } - - /** * Recursively refresh the style of the children. Go deeper until a not NULL style is found * because the NULL styles are inherited from the parent @@ -3697,6 +3749,12 @@ static void trans_del(lv_obj_t * obj, uint8_t part, lv_style_property_t prop, lv tr_prev = lv_ll_get_prev(&LV_GC_ROOT(_lv_obj_style_trans_ll), tr); if(tr->obj == obj && (part == tr->part || part == 0xFF) && (prop == tr->prop || prop == 0xFF)) { + /* Remove the transitioned property from trans. style + * to allow changing it by normal styles*/ + lv_style_list_t * list = lv_obj_get_style_list(tr->obj, tr->part); + lv_style_t * style_trans = lv_style_list_get_transition_style(list); + lv_style_remove_prop(style_trans, tr->prop); + lv_anim_del(tr, NULL); lv_ll_remove(&LV_GC_ROOT(_lv_obj_style_trans_ll), tr); lv_mem_free(tr); @@ -3737,22 +3795,16 @@ static void trans_anim_cb(lv_style_trans_t * tr, lv_anim_value_t v) else x = tr->end_value._ptr; _lv_style_set_ptr(style, tr->prop, x); } - lv_obj_refresh_style(tr->obj); + lv_obj_refresh_style(tr->obj, tr->prop); } static void trans_anim_start_cb(lv_anim_t * a) { lv_style_trans_t * tr = a->var; + lv_style_property_t prop_tmp = tr->prop; - /*Init prop to an invalid values to be sure `trans_del` won't delete the just added `tr`*/ - tr->prop = 0; - /*Delete the relate transition if any*/ - trans_del(tr->obj, tr->part, prop_tmp, tr); - - tr->prop = prop_tmp; - /*Start the animation from the current value*/ if((prop_tmp & 0xF) < LV_STYLE_ID_COLOR) { /*Int*/ tr->start_value._int = _lv_obj_get_style_int(tr->obj, tr->part, prop_tmp); @@ -3766,11 +3818,26 @@ static void trans_anim_start_cb(lv_anim_t * a) else { /*Ptr*/ tr->start_value._ptr = _lv_obj_get_style_ptr(tr->obj, tr->part, prop_tmp); } + + /*Init prop to an invalid values to be sure `trans_del` won't delete this added `tr`*/ + tr->prop = 0; + /*Delete the relate transition if any*/ + trans_del(tr->obj, tr->part, prop_tmp, tr); + + tr->prop = prop_tmp; + } static void trans_anim_ready_cb(lv_anim_t * a) { lv_style_trans_t * tr = a->var; + + /* Remove the transitioned property from trans. style + * to allow changing it by normal styles*/ + lv_style_list_t * list = lv_obj_get_style_list(tr->obj, tr->part); + lv_style_t * style_trans = lv_style_list_get_transition_style(list); + lv_style_remove_prop(style_trans, tr->prop); + lv_ll_remove(&LV_GC_ROOT(_lv_obj_style_trans_ll), tr); lv_mem_free(tr); } diff --git a/src/lv_core/lv_obj.h b/src/lv_core/lv_obj.h index bc20069c2..94f36c6b7 100644 --- a/src/lv_core/lv_obj.h +++ b/src/lv_core/lv_obj.h @@ -507,7 +507,7 @@ void lv_obj_reset_style_list(lv_obj_t * obj, uint8_t part); * Notify an object about its style is modified * @param obj pointer to an object */ -void lv_obj_refresh_style(lv_obj_t * obj); +void lv_obj_refresh_style(lv_obj_t * obj, lv_style_property_t prop); /** * Notify all object if a style is modified diff --git a/src/lv_core/lv_refr.c b/src/lv_core/lv_refr.c index bde597fb8..740393c15 100644 --- a/src/lv_core/lv_refr.c +++ b/src/lv_core/lv_refr.c @@ -184,6 +184,12 @@ void lv_disp_refr_task(lv_task_t * task) disp_refr = task->user_data; + /*Do nothing if there is no active screen*/ + if(disp_refr->act_scr == NULL) { + disp_refr->inv_p = 0; + return; + } + lv_refr_join_area(); lv_refr_areas(); @@ -516,6 +522,7 @@ static void lv_refr_obj_and_children(lv_obj_t * top_p, const lv_area_t * mask_p) * but in special cases (e.g. if the screen has alpha) it won't. * In this case use the screen directly */ if(top_p == NULL) top_p = lv_disp_get_scr_act(disp_refr); + if(top_p == NULL) return; /*Shouldn't happen*/ /*Refresh the top object and its children*/ lv_refr_obj(top_p, mask_p); diff --git a/src/lv_core/lv_style.h b/src/lv_core/lv_style.h index 2b567a1a4..81fbce257 100644 --- a/src/lv_core/lv_style.h +++ b/src/lv_core/lv_style.h @@ -42,6 +42,8 @@ LV_EXPORT_CONST_INT(LV_RADIUS_CIRCLE); #define LV_STYLE_TRANS_NUM_MAX 6 +#define LV_STYLE_PROP_ALL 0xFF + /********************** * TYPEDEFS **********************/ @@ -198,6 +200,7 @@ typedef uint16_t lv_style_property_t; #define LV_STYLE_STATE_POS 8 #define LV_STYLE_STATE_MASK 0x7F00 +#define LV_STYLE_INHERIT_MASK 0x8000 typedef uint16_t lv_style_state_t; diff --git a/src/lv_draw/lv_draw_blend.c b/src/lv_draw/lv_draw_blend.c index c9d696ee6..454a653c0 100644 --- a/src/lv_draw/lv_draw_blend.c +++ b/src/lv_draw/lv_draw_blend.c @@ -260,8 +260,9 @@ static void fill_normal(const lv_area_t * disp_area, lv_color_t * disp_buf, con /*Fill the first line. Use `memcpy` because it's faster then simple value assignment*/ /*Set the first pixels manually*/ + int32_t fill_end = draw_area->x1 + FILL_DIRECT_LEN + (draw_area_w & FILL_DIRECT_MASK) - 1; int32_t direct_fill_end = LV_MATH_MIN(draw_area->x2, - draw_area->x1 + FILL_DIRECT_LEN + (draw_area_w & FILL_DIRECT_MASK) - 1); + fill_end); for(x = draw_area->x1; x <= direct_fill_end ; x++) { disp_buf_tmp[x].full = color.full; } diff --git a/src/lv_draw/lv_draw_label.c b/src/lv_draw/lv_draw_label.c index 0e6cacb28..3f06873a5 100644 --- a/src/lv_draw/lv_draw_label.c +++ b/src/lv_draw/lv_draw_label.c @@ -389,6 +389,9 @@ static void lv_draw_letter(const lv_point_t * pos_p, const lv_area_t * clip_area return; } + /* Don't draw anything if the character is empty. E.g. space */ + if((g.box_h == 0) && (g.box_w == 0)) return; + int32_t pos_x = pos_p->x + g.ofs_x; int32_t pos_y = pos_p->y + (font_p->line_height - font_p->base_line) - g.box_h - g.ofs_y; @@ -446,13 +449,9 @@ static void draw_letter_normal(lv_coord_t pos_x, lv_coord_t pos_y, lv_font_glyph return; /*Invalid bpp. Can't render the letter*/ } - - int32_t col, row; int32_t box_w = g->box_w; int32_t box_h = g->box_h; - int32_t width_byte_scr = box_w >> 3; /*Width in bytes (on the screen finally) (e.g. w = 11 -> 2 bytes wide)*/ - if(box_w & 0x7) width_byte_scr++; int32_t width_bit = box_w * bpp; /*Letter width in bits*/ /* Calculate the col/row start/end on the map*/ @@ -596,8 +595,6 @@ static void draw_letter_subpx(lv_coord_t pos_x, lv_coord_t pos_y, lv_font_glyph_ int32_t box_w = g->box_w; int32_t box_h = g->box_h; - int32_t width_byte_scr = box_w >> 3; /*Width in bytes (on the screen finally) (e.g. w = 11 -> 2 bytes wide)*/ - if(box_w & 0x7) width_byte_scr++; int32_t width_bit = box_w * bpp; /*Letter width in bits*/ diff --git a/src/lv_draw/lv_draw_line.c b/src/lv_draw/lv_draw_line.c index d1bfdcbfa..e4b419544 100644 --- a/src/lv_draw/lv_draw_line.c +++ b/src/lv_draw/lv_draw_line.c @@ -412,9 +412,8 @@ static void draw_line_skew(const lv_point_t * point1, const lv_point_t * point2, /* The real draw area is around the line. * It's easy to calculate with steep lines, but the area can be very wide with very flat lines. * So deal with it only with steep lines. */ - int32_t draw_area_w; - if(flat) draw_area_w = lv_area_get_width(&draw_area); - else draw_area_w = LV_MATH_MIN(lv_area_get_width(&draw_area), dsc->width * 2 + 2); + int32_t draw_area_w = lv_area_get_width(&draw_area); + if(!flat) draw_area_w = LV_MATH_MIN(draw_area_w, dsc->width * 2 + 2); /*Draw the background line by line*/ int32_t h; diff --git a/src/lv_draw/lv_draw_mask.c b/src/lv_draw/lv_draw_mask.c index 91722a12a..e5501ce18 100644 --- a/src/lv_draw/lv_draw_mask.c +++ b/src/lv_draw/lv_draw_mask.c @@ -99,11 +99,11 @@ lv_draw_mask_res_t lv_draw_mask_apply(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_ bool changed = false; lv_draw_mask_common_dsc_t * dsc; - lv_draw_mask_res_t res = LV_DRAW_MASK_RES_FULL_COVER; uint8_t i; for(i = 0; i < LV_MASK_MAX_NUM; i++) { if(mask_list[i].param) { dsc = mask_list[i].param; + lv_draw_mask_res_t res = LV_DRAW_MASK_RES_FULL_COVER; res = dsc->cb(mask_buf, abs_x, abs_y, len, (void *)mask_list[i].param); if(res == LV_DRAW_MASK_RES_FULL_TRANSP) return LV_DRAW_MASK_RES_FULL_TRANSP; else if(res == LV_DRAW_MASK_RES_CHANGED) changed = true; @@ -361,8 +361,9 @@ void lv_draw_mask_angle_init(lv_draw_mask_angle_param_t * param, lv_coord_t vert */ void lv_draw_mask_radius_init(lv_draw_mask_radius_param_t * param, const lv_area_t * rect, lv_coord_t radius, bool inv) { - - int32_t short_side = LV_MATH_MIN(lv_area_get_width(rect), lv_area_get_height(rect)); + lv_coord_t w = lv_area_get_width(rect); + lv_coord_t h = lv_area_get_height(rect); + int32_t short_side = LV_MATH_MIN(w, h); if(radius > short_side >> 1) radius = short_side >> 1; lv_area_copy(¶m->cfg.rect, rect); diff --git a/src/lv_draw/lv_draw_rect.c b/src/lv_draw/lv_draw_rect.c index e7976702f..71d6cdccc 100644 --- a/src/lv_draw/lv_draw_rect.c +++ b/src/lv_draw/lv_draw_rect.c @@ -287,7 +287,6 @@ static void draw_bg(const lv_area_t * coords, const lv_area_t * clip, lv_draw_re } if(dsc->bg_grad_dir == LV_GRAD_DIR_NONE && other_mask_cnt == 0) { - lv_area_t fill_area; /*Central part*/ fill_area.x1 = coords_bg.x1 + rout; fill_area.x2 = coords_bg.x2 - rout; diff --git a/src/lv_draw/lv_img_decoder.c b/src/lv_draw/lv_img_decoder.c index 7a8916b27..74171a892 100644 --- a/src/lv_draw/lv_img_decoder.c +++ b/src/lv_draw/lv_img_decoder.c @@ -336,18 +336,21 @@ lv_res_t lv_img_decoder_built_in_open(lv_img_decoder_t * decoder, lv_img_decoder /*If the file was open successfully save the file descriptor*/ if(dsc->user_data == NULL) { dsc->user_data = lv_mem_alloc(sizeof(lv_img_decoder_built_in_data_t)); + LV_ASSERT_MEM(dsc->user_data); if(dsc->user_data == NULL) { LV_LOG_ERROR("img_decoder_built_in_open: out of memory"); - LV_ASSERT_MEM(dsc->user_data); + return LV_RES_INV; } memset(dsc->user_data, 0, sizeof(lv_img_decoder_built_in_data_t)); } lv_img_decoder_built_in_data_t * user_data = dsc->user_data; - user_data->f = lv_mem_alloc(sizeof(f)); + user_data->f = lv_mem_alloc(sizeof(f)); + LV_ASSERT_MEM(user_data->f); if(user_data->f == NULL) { LV_LOG_ERROR("img_decoder_built_in_open: out of memory"); - LV_ASSERT_MEM(user_data->f); + lv_img_decoder_built_in_close(decoder, dsc); + return LV_RES_INV; } memcpy(user_data->f, &f, sizeof(f)); @@ -390,21 +393,24 @@ lv_res_t lv_img_decoder_built_in_open(lv_img_decoder_t * decoder, lv_img_decoder /*Allocate the palette*/ if(dsc->user_data == NULL) { dsc->user_data = lv_mem_alloc(sizeof(lv_img_decoder_built_in_data_t)); + LV_ASSERT_MEM(dsc->user_data); if(dsc->user_data == NULL) { LV_LOG_ERROR("img_decoder_built_in_open: out of memory"); - LV_ASSERT_MEM(dsc->user_data); + lv_img_decoder_built_in_close(decoder, dsc); + return LV_RES_INV; } memset(dsc->user_data, 0, sizeof(lv_img_decoder_built_in_data_t)); } lv_img_decoder_built_in_data_t * user_data = dsc->user_data; user_data->palette = lv_mem_alloc(palette_size * sizeof(lv_color_t)); + LV_ASSERT_MEM(user_data->palette); user_data->opa = lv_mem_alloc(palette_size * sizeof(lv_opa_t)); + LV_ASSERT_MEM(user_data->opa); if(user_data->palette == NULL || user_data->opa == NULL) { LV_LOG_ERROR("img_decoder_built_in_open: out of memory"); -#if LV_USE_FILESYSTEM - LV_ASSERT_MEM(user_data->f); -#endif + lv_img_decoder_built_in_close(decoder, dsc); + return LV_RES_INV; } if(dsc->src_type == LV_IMG_SRC_FILE) { diff --git a/src/lv_misc/lv_anim.c b/src/lv_misc/lv_anim.c index 13ad39917..55e155109 100644 --- a/src/lv_misc/lv_anim.c +++ b/src/lv_misc/lv_anim.c @@ -26,7 +26,7 @@ *********************/ #define LV_ANIM_RESOLUTION 1024 #define LV_ANIM_RES_SHIFT 10 -#define LV_ANIM_TASK_PRIO LV_TASK_PRIO_MID +#define LV_ANIM_TASK_PRIO LV_TASK_PRIO_HIGH /********************** * TYPEDEFS @@ -163,7 +163,7 @@ uint16_t lv_anim_count_running(void) lv_anim_t * a; LV_LL_READ(LV_GC_ROOT(_lv_anim_ll), a) cnt++; - return cnt++; + return cnt; } /** diff --git a/src/lv_misc/lv_area.c b/src/lv_misc/lv_area.c index 562124415..04db991c9 100644 --- a/src/lv_misc/lv_area.c +++ b/src/lv_misc/lv_area.c @@ -161,7 +161,9 @@ bool lv_area_is_point_on(const lv_area_t * a_p, const lv_point_t * p_p, lv_coord /*No radius, it is within the rectangle*/ return true; } - lv_coord_t max_radius = LV_MATH_MIN(lv_area_get_width(a_p) / 2, lv_area_get_height(a_p) / 2); + lv_coord_t w = lv_area_get_width(a_p) / 2; + lv_coord_t h = lv_area_get_height(a_p) / 2; + lv_coord_t max_radius = LV_MATH_MIN(w, h); if(radius > max_radius) radius = max_radius; diff --git a/src/lv_misc/lv_color.c b/src/lv_misc/lv_color.c index 57551c597..a1f647370 100644 --- a/src/lv_misc/lv_color.c +++ b/src/lv_misc/lv_color.c @@ -66,9 +66,6 @@ lv_color_t lv_color_hsv_to_rgb(uint16_t h, uint8_t s, uint8_t v) uint8_t region, remainder, p, q, t; if(s == 0) { - r = v; - g = v; - b = v; return lv_color_make(v, v, v); } diff --git a/src/lv_misc/lv_log.c b/src/lv_misc/lv_log.c index 9fe1fba52..26bc75544 100644 --- a/src/lv_misc/lv_log.c +++ b/src/lv_misc/lv_log.c @@ -10,6 +10,7 @@ #if LV_USE_LOG #include +#include #include "lv_printf.h" #if LV_LOG_PRINTF @@ -52,15 +53,17 @@ void lv_log_register_print_cb(lv_log_print_g_cb_t print_cb) custom_print_cb = print_cb; } + /** * Add a log * @param level the level of log. (From `lv_log_level_t` enum) * @param file name of the file when the log added * @param line line number in the source code where the log added + * @param func name of the function when the log added * @param format printf-like format string * @param ... parameters for `format` */ -void lv_log_add(lv_log_level_t level, const char * file, int line, const char * format, ...) +void lv_log_add(lv_log_level_t level, const char * file, int line, const char * func, const char * format, ...) { if(level >= _LV_LOG_LEVEL_NUM) return; /*Invalid level*/ @@ -72,10 +75,19 @@ void lv_log_add(lv_log_level_t level, const char * file, int line, const char * va_end(args); #if LV_LOG_PRINTF + /*Use only the file name not the path*/ + size_t p; + for(p = strlen(file); p > 0; p--) { + if(file[p] == '/' || file[p] == '\\') { + p++; /*Skip the slash*/ + break; + } + } + static const char * lvl_prefix[] = {"Trace", "Info", "Warn", "Error", "User"}; - printf("%s: %s \t(%s #%d)\n", lvl_prefix[level], buf, file, line); + printf("%s: %s \t(%s #%d %s())\n", lvl_prefix[level], buf, &file[p], line ,func); #else - if(custom_print_cb) custom_print_cb(level, file, line, buf); + if(custom_print_cb) custom_print_cb(level, file, line, func, buf); #endif } } diff --git a/src/lv_misc/lv_log.h b/src/lv_misc/lv_log.h index b84aa2d7b..942384812 100644 --- a/src/lv_misc/lv_log.h +++ b/src/lv_misc/lv_log.h @@ -45,9 +45,9 @@ typedef int8_t lv_log_level_t; **********************/ /** - * Log print function. Receives "Log Level", "File path", "Line number" and "Description". + * Log print function. Receives "Log Level", "File path", "Line number", "Function name" and "Description". */ -typedef void (*lv_log_print_g_cb_t)(lv_log_level_t level, const char *, uint32_t, const char *); +typedef void (*lv_log_print_g_cb_t)(lv_log_level_t level, const char *, uint32_t, const char *, const char *); /********************** * GLOBAL PROTOTYPES @@ -66,17 +66,18 @@ void lv_log_register_print_cb(lv_log_print_g_cb_t print_cb); * @param level the level of log. (From `lv_log_level_t` enum) * @param file name of the file when the log added * @param line line number in the source code where the log added + * @param func name of the function when the log added * @param format printf-like format string * @param ... parameters for `format` */ -void lv_log_add(lv_log_level_t level, const char * file, int line, const char * format, ...); +void lv_log_add(lv_log_level_t level, const char * file, int line, const char * func, const char * format, ...); /********************** * MACROS **********************/ #if LV_LOG_LEVEL <= LV_LOG_LEVEL_TRACE -#define LV_LOG_TRACE(...) lv_log_add(LV_LOG_LEVEL_TRACE, __FILE__, __LINE__, __VA_ARGS__); +#define LV_LOG_TRACE(...) lv_log_add(LV_LOG_LEVEL_TRACE, __FILE__, __LINE__, __func__, __VA_ARGS__); #else #define LV_LOG_TRACE(...) \ { \ @@ -85,7 +86,7 @@ void lv_log_add(lv_log_level_t level, const char * file, int line, const char * #endif #if LV_LOG_LEVEL <= LV_LOG_LEVEL_INFO -#define LV_LOG_INFO(...) lv_log_add(LV_LOG_LEVEL_INFO, __FILE__, __LINE__, __VA_ARGS__); +#define LV_LOG_INFO(...) lv_log_add(LV_LOG_LEVEL_INFO, __FILE__, __LINE__, __func__, __VA_ARGS__); #else #define LV_LOG_INFO(...) \ { \ @@ -94,7 +95,7 @@ void lv_log_add(lv_log_level_t level, const char * file, int line, const char * #endif #if LV_LOG_LEVEL <= LV_LOG_LEVEL_WARN -#define LV_LOG_WARN(...) lv_log_add(LV_LOG_LEVEL_WARN, __FILE__, __LINE__, __VA_ARGS__); +#define LV_LOG_WARN(...) lv_log_add(LV_LOG_LEVEL_WARN, __FILE__, __LINE__, __func__, __VA_ARGS__); #else #define LV_LOG_WARN(...) \ { \ @@ -103,7 +104,7 @@ void lv_log_add(lv_log_level_t level, const char * file, int line, const char * #endif #if LV_LOG_LEVEL <= LV_LOG_LEVEL_ERROR -#define LV_LOG_ERROR(...) lv_log_add(LV_LOG_LEVEL_ERROR, __FILE__, __LINE__, __VA_ARGS__); +#define LV_LOG_ERROR(...) lv_log_add(LV_LOG_LEVEL_ERROR, __FILE__, __LINE__, __func__, __VA_ARGS__); #else #define LV_LOG_ERROR(...) \ { \ @@ -112,7 +113,7 @@ void lv_log_add(lv_log_level_t level, const char * file, int line, const char * #endif #if LV_LOG_LEVEL <= LV_LOG_LEVEL_USER -#define LV_LOG_USER(...) lv_log_add(LV_LOG_LEVEL_USER, __FILE__, __LINE__, __VA_ARGS__); +#define LV_LOG_USER(...) lv_log_add(LV_LOG_LEVEL_USER, __FILE__, __LINE__, __func__, __VA_ARGS__); #else #define LV_LOG_USER(...) \ { \ diff --git a/src/lv_themes/lv_theme.h b/src/lv_themes/lv_theme.h index 0a6d1ab49..29f50bbaa 100644 --- a/src/lv_themes/lv_theme.h +++ b/src/lv_themes/lv_theme.h @@ -37,45 +37,111 @@ typedef enum { LV_THEME_NONE = 0, LV_THEME_SCR, LV_THEME_OBJ, +#if LV_USE_ARC LV_THEME_ARC, +#endif +#if LV_USE_BAR LV_THEME_BAR, +#endif +#if LV_USE_BTN LV_THEME_BTN, +#endif +#if LV_USE_BTNMATRIX LV_THEME_BTNMATRIX, +#endif +#if LV_USE_CALENDAR LV_THEME_CALENDAR, +#endif +#if LV_USE_CANVAS LV_THEME_CANVAS, +#endif +#if LV_USE_CHECKBOX LV_THEME_CHECKBOX, +#endif +#if LV_USE_CHART LV_THEME_CHART, +#endif +#if LV_USE_CONT LV_THEME_CONT, +#endif +#if LV_USE_CPICKER LV_THEME_CPICKER, +#endif +#if LV_USE_DROPDOWN LV_THEME_DROPDOWN, +#endif +#if LV_USE_GAUGE LV_THEME_GAUGE, +#endif +#if LV_USE_IMG LV_THEME_IMAGE, +#endif +#if LV_USE_IMGBTN LV_THEME_IMGBTN, +#endif +#if LV_USE_KEYBOARD LV_THEME_KEYBOARD, +#endif +#if LV_USE_LABEL LV_THEME_LABEL, +#endif +#if LV_USE_LED LV_THEME_LED, +#endif +#if LV_USE_LINE LV_THEME_LINE, +#endif +#if LV_USE_LIST LV_THEME_LIST, LV_THEME_LIST_BTN, +#endif +#if LV_USE_LINEMETER LV_THEME_LINEMETER, +#endif +#if LV_USE_MSGBOX LV_THEME_MSGBOX, LV_THEME_MSGBOX_BTNS, /*The button matrix of the buttons are initialized separately*/ +#endif +#if LV_USE_OBJMASK LV_THEME_OBJMASK, +#endif +#if LV_USE_PAGE LV_THEME_PAGE, +#endif +#if LV_USE_ROLLER LV_THEME_ROLLER, +#endif +#if LV_USE_SLIDER LV_THEME_SLIDER, +#endif +#if LV_USE_SPINBOX LV_THEME_SPINBOX, LV_THEME_SPINBOX_BTN, /*Button extra for spinbox*/ +#endif +#if LV_USE_SPINNER LV_THEME_SPINNER, +#endif +#if LV_USE_SWITCH LV_THEME_SWITCH, +#endif +#if LV_USE_TABLE LV_THEME_TABLE, +#endif +#if LV_USE_TABVIEW LV_THEME_TABVIEW, LV_THEME_TABVIEW_PAGE, /*The tab pages are initialized separately*/ +#endif +#if LV_USE_TEXTAREA LV_THEME_TEXTAREA, LV_THEME_TEXTAREA_ONELINE, +#endif +#if LV_USE_TILEVIEW LV_THEME_TILEVIEW, +#endif +#if LV_USE_WIN LV_THEME_WIN, LV_THEME_WIN_BTN, /*The buttons are initialized separately*/ +#endif } lv_theme_style_t; typedef struct { diff --git a/src/lv_themes/lv_theme_material.c b/src/lv_themes/lv_theme_material.c index 937e05409..943479797 100644 --- a/src/lv_themes/lv_theme_material.c +++ b/src/lv_themes/lv_theme_material.c @@ -178,6 +178,7 @@ static void basic_init(void) lv_style_set_border_color(&panel, LV_STATE_FOCUSED, color_panel_border(LV_STATE_FOCUSED)); lv_style_set_border_width(&panel, LV_STATE_DEFAULT, BORDER_WIDTH); lv_style_set_border_side(&panel, LV_STATE_DEFAULT, LV_BORDER_SIDE_TOP); + lv_style_set_border_post(&panel, LV_STATE_DEFAULT, true); lv_style_set_text_font(&panel, LV_STATE_DEFAULT, _font_normal); lv_style_set_text_color(&panel, LV_STATE_DEFAULT, color_panel_txt(LV_STATE_DEFAULT)); lv_style_set_value_color(&panel, LV_STATE_DEFAULT, color_panel_txt(LV_STATE_DEFAULT)); @@ -924,7 +925,6 @@ void lv_theme_material_apply(lv_obj_t * obj, lv_theme_style_t name) #if LV_USE_BTNMATRIX case LV_THEME_BTNMATRIX: lv_obj_clean_style_list(obj, LV_BTNMATRIX_PART_BG); - list = lv_obj_get_style_list(obj, LV_BTNMATRIX_PART_BG); lv_obj_clean_style_list(obj, LV_BTNMATRIX_PART_BTN); list = lv_obj_get_style_list(obj, LV_BTNMATRIX_PART_BTN); @@ -978,35 +978,30 @@ void lv_theme_material_apply(lv_obj_t * obj, lv_theme_style_t name) #if LV_USE_CANVAS case LV_THEME_CANVAS: lv_obj_clean_style_list(obj, LV_CANVAS_PART_MAIN); - list = lv_obj_get_style_list(obj, LV_CANVAS_PART_MAIN); break; #endif #if LV_USE_IMG case LV_THEME_IMAGE: lv_obj_clean_style_list(obj, LV_IMG_PART_MAIN); - list = lv_obj_get_style_list(obj, LV_IMG_PART_MAIN); break; #endif #if LV_USE_IMGBTN case LV_THEME_IMGBTN: lv_obj_clean_style_list(obj, LV_IMG_PART_MAIN); - list = lv_obj_get_style_list(obj, LV_IMG_PART_MAIN); break; #endif #if LV_USE_LABEL case LV_THEME_LABEL: lv_obj_clean_style_list(obj, LV_LABEL_PART_MAIN); - list = lv_obj_get_style_list(obj, LV_LABEL_PART_MAIN); break; #endif #if LV_USE_LINE case LV_THEME_LINE: lv_obj_clean_style_list(obj, LV_LABEL_PART_MAIN); - list = lv_obj_get_style_list(obj, LV_LABEL_PART_MAIN); break; #endif @@ -1028,8 +1023,8 @@ void lv_theme_material_apply(lv_obj_t * obj, lv_theme_style_t name) list = lv_obj_get_style_list(obj, LV_SPINNER_PART_BG); lv_style_list_add_style(list, &arc_bg); - lv_obj_clean_style_list(obj, LV_SPINNER_PART_ARC); - list = lv_obj_get_style_list(obj, LV_SPINNER_PART_ARC); + lv_obj_clean_style_list(obj, LV_SPINNER_PART_INDIC); + list = lv_obj_get_style_list(obj, LV_SPINNER_PART_INDIC); lv_style_list_add_style(list, &arc); break; #endif @@ -1109,7 +1104,6 @@ void lv_theme_material_apply(lv_obj_t * obj, lv_theme_style_t name) lv_style_list_add_style(list, &scr); lv_obj_clean_style_list(obj, LV_TABVIEW_PART_BG_SCRL); - list = lv_obj_get_style_list(obj, LV_TABVIEW_PART_BG_SCRL); lv_obj_clean_style_list(obj, LV_TABVIEW_PART_TAB_BG); list = lv_obj_get_style_list(obj, LV_TABVIEW_PART_TAB_BG); @@ -1126,7 +1120,6 @@ void lv_theme_material_apply(lv_obj_t * obj, lv_theme_style_t name) case LV_THEME_TABVIEW_PAGE: lv_obj_clean_style_list(obj, LV_PAGE_PART_BG); - list = lv_obj_get_style_list(obj, LV_PAGE_PART_BG); lv_obj_clean_style_list(obj, LV_PAGE_PART_SCRL); list = lv_obj_get_style_list(obj, LV_PAGE_PART_SCRL); @@ -1158,8 +1151,8 @@ void lv_theme_material_apply(lv_obj_t * obj, lv_theme_style_t name) list = lv_obj_get_style_list(obj, LV_ROLLER_PART_BG); lv_style_list_add_style(list, &roller_bg); - lv_obj_clean_style_list(obj, LV_ROLLER_PART_SEL); - list = lv_obj_get_style_list(obj, LV_ROLLER_PART_SEL); + lv_obj_clean_style_list(obj, LV_ROLLER_PART_SELECTED); + list = lv_obj_get_style_list(obj, LV_ROLLER_PART_SELECTED); lv_style_list_add_style(list, &roller_sel); break; #endif @@ -1179,7 +1172,6 @@ void lv_theme_material_apply(lv_obj_t * obj, lv_theme_style_t name) lv_style_list_add_style(list, &list_bg); lv_obj_clean_style_list(obj, LV_LIST_PART_SCRL); - list = lv_obj_get_style_list(obj, LV_LIST_PART_SCRL); lv_obj_clean_style_list(obj, LV_LIST_PART_SCRLBAR); list = lv_obj_get_style_list(obj, LV_LIST_PART_SCRLBAR); @@ -1195,8 +1187,8 @@ void lv_theme_material_apply(lv_obj_t * obj, lv_theme_style_t name) #if LV_USE_DROPDOWN case LV_THEME_DROPDOWN: - lv_obj_clean_style_list(obj, LV_DROPDOWN_PART_BTN); - list = lv_obj_get_style_list(obj, LV_DROPDOWN_PART_BTN); + lv_obj_clean_style_list(obj, LV_DROPDOWN_PART_MAIN); + list = lv_obj_get_style_list(obj, LV_DROPDOWN_PART_MAIN); lv_style_list_add_style(list, &ddlist_btn); lv_obj_clean_style_list(obj, LV_DROPDOWN_PART_LIST); @@ -1231,7 +1223,6 @@ void lv_theme_material_apply(lv_obj_t * obj, lv_theme_style_t name) #if LV_USE_TABLE case LV_THEME_TABLE: lv_obj_clean_style_list(obj, LV_TABLE_PART_BG); - list = lv_obj_get_style_list(obj, LV_TABLE_PART_BG); lv_obj_clean_style_list(obj, LV_TABLE_PART_CELL1); list = lv_obj_get_style_list(obj, LV_TABLE_PART_CELL1); @@ -1378,8 +1369,8 @@ void lv_theme_material_apply(lv_obj_t * obj, lv_theme_style_t name) list = lv_obj_get_style_list(obj, LV_GAUGE_PART_MAIN); lv_style_list_add_style(list, &gauge_main); - lv_obj_clean_style_list(obj, LV_GAUGE_PART_STRONG); - list = lv_obj_get_style_list(obj, LV_GAUGE_PART_STRONG); + lv_obj_clean_style_list(obj, LV_GAUGE_PART_MAJOR); + list = lv_obj_get_style_list(obj, LV_GAUGE_PART_MAJOR); lv_style_list_add_style(list, &gauge_strong); lv_obj_clean_style_list(obj, LV_GAUGE_PART_NEEDLE); @@ -1392,7 +1383,7 @@ void lv_theme_material_apply(lv_obj_t * obj, lv_theme_style_t name) } - lv_obj_refresh_style(obj); + lv_obj_refresh_style(obj, LV_STYLE_PROP_ALL); } diff --git a/src/lv_themes/lv_theme_template.c b/src/lv_themes/lv_theme_template.c index f29d9daf4..a64ac45d2 100644 --- a/src/lv_themes/lv_theme_template.c +++ b/src/lv_themes/lv_theme_template.c @@ -60,6 +60,7 @@ static void basic_init(void) lv_style_init(&style_bg); lv_style_set_bg_opa(&style_bg, LV_STATE_DEFAULT, LV_OPA_COVER); lv_style_set_border_width(&style_bg, LV_STATE_DEFAULT, 1); + lv_style_set_border_width(&style_bg, LV_STATE_FOCUSED, 2); lv_style_set_border_color(&style_bg, LV_STATE_FOCUSED, _color_secondary); lv_style_set_border_color(&style_bg, LV_STATE_EDITED, lv_color_darken(_color_secondary, LV_OPA_30)); lv_style_set_line_width(&style_bg, LV_STATE_DEFAULT, 1); @@ -80,7 +81,6 @@ static void basic_init(void) lv_style_set_text_color(&style_btn, LV_STATE_DISABLED, LV_COLOR_GRAY); lv_style_set_image_recolor(&style_btn, LV_STATE_DISABLED, LV_COLOR_GRAY); - lv_style_init(&style_round); lv_style_set_radius(&style_round, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE); @@ -543,8 +543,8 @@ void lv_theme_material_apply(lv_obj_t * obj, lv_theme_style_t name) lv_style_list_add_style(list, &style_bg); lv_style_list_add_style(list, &style_tick_line); - lv_obj_clean_style_list(obj, LV_SPINNER_PART_ARC); - list = lv_obj_get_style_list(obj, LV_SPINNER_PART_ARC); + lv_obj_clean_style_list(obj, LV_SPINNER_PART_INDIC); + list = lv_obj_get_style_list(obj, LV_SPINNER_PART_INDIC); lv_style_list_add_style(list, &style_bg); lv_style_list_add_style(list, &style_color); lv_style_list_add_style(list, &style_tick_line); @@ -687,8 +687,8 @@ void lv_theme_material_apply(lv_obj_t * obj, lv_theme_style_t name) list = lv_obj_get_style_list(obj, LV_ROLLER_PART_BG); lv_style_list_add_style(list, &style_bg); - lv_obj_clean_style_list(obj, LV_ROLLER_PART_SEL); - list = lv_obj_get_style_list(obj, LV_ROLLER_PART_SEL); + lv_obj_clean_style_list(obj, LV_ROLLER_PART_SELECTED); + list = lv_obj_get_style_list(obj, LV_ROLLER_PART_SELECTED); lv_style_list_add_style(list, &style_bg); lv_style_list_add_style(list, &style_color); break; @@ -726,8 +726,8 @@ void lv_theme_material_apply(lv_obj_t * obj, lv_theme_style_t name) #if LV_USE_DROPDOWN case LV_THEME_DROPDOWN: - lv_obj_clean_style_list(obj, LV_DROPDOWN_PART_BTN); - list = lv_obj_get_style_list(obj, LV_DROPDOWN_PART_BTN); + lv_obj_clean_style_list(obj, LV_DROPDOWN_PART_MAIN); + list = lv_obj_get_style_list(obj, LV_DROPDOWN_PART_MAIN); lv_style_list_add_style(list, &style_bg); lv_style_list_add_style(list, &style_btn); @@ -922,8 +922,8 @@ void lv_theme_material_apply(lv_obj_t * obj, lv_theme_style_t name) lv_style_list_add_style(list, &style_bg); lv_style_list_add_style(list, &style_round); - lv_obj_clean_style_list(obj, LV_GAUGE_PART_STRONG); - list = lv_obj_get_style_list(obj, LV_GAUGE_PART_STRONG); + lv_obj_clean_style_list(obj, LV_GAUGE_PART_MAJOR); + list = lv_obj_get_style_list(obj, LV_GAUGE_PART_MAJOR); lv_style_list_add_style(list, &style_tick_line); lv_obj_clean_style_list(obj, LV_GAUGE_PART_NEEDLE); @@ -936,7 +936,7 @@ void lv_theme_material_apply(lv_obj_t * obj, lv_theme_style_t name) } - lv_obj_refresh_style(obj); + lv_obj_refresh_style(obj, LV_STYLE_PROP_ALL); } diff --git a/src/lv_widgets/lv_arc.c b/src/lv_widgets/lv_arc.c index ff3862f01..89c577abc 100644 --- a/src/lv_widgets/lv_arc.c +++ b/src/lv_widgets/lv_arc.c @@ -100,7 +100,7 @@ lv_obj_t * lv_arc_create(lv_obj_t * par, const lv_obj_t * copy) lv_style_list_copy(&ext->style_arc, ©_ext->style_arc); /*Refresh the style with new signal function*/ - lv_obj_refresh_style(arc); + lv_obj_refresh_style(arc, LV_STYLE_PROP_ALL); } LV_LOG_INFO("arc created"); @@ -132,6 +132,7 @@ void lv_arc_set_start_angle(lv_obj_t * arc, int16_t start) lv_arc_ext_t * ext = lv_obj_get_ext_attr(arc); if(start > 360) start -= 360; + if(start < 0) start += 360; /*Too large move, the whole arc need to be invalidated anyway*/ if(LV_MATH_ABS(start - ext->arc_angle_start) >= 180) { @@ -164,6 +165,9 @@ void lv_arc_set_end_angle(lv_obj_t * arc, int16_t end) lv_arc_ext_t * ext = lv_obj_get_ext_attr(arc); + if(end > 360) end -= 360; + if(end < 0) end += 360; + /*Too large move, the whole arc need to be invalidated anyway*/ if(LV_MATH_ABS(end - ext->arc_angle_end) >= 180) { lv_obj_invalidate(arc); @@ -191,14 +195,17 @@ void lv_arc_set_end_angle(lv_obj_t * arc, int16_t end) * @param start the start angle * @param end the end angle */ -void lv_arc_set_angles(lv_obj_t * arc, uint16_t start, uint16_t end) +void lv_arc_set_angles(lv_obj_t * arc, int16_t start, int16_t end) { LV_ASSERT_OBJ(arc, LV_OBJX_NAME); lv_arc_ext_t * ext = lv_obj_get_ext_attr(arc); if(end > 360) end -= 360; + if(end < 0) end += 360; + if(start > 360) start -= 360; + if(start < 0) start += 360; inv_arc_area(arc, ext->arc_angle_start, ext->arc_angle_end); @@ -220,6 +227,7 @@ void lv_arc_set_bg_start_angle(lv_obj_t * arc, int16_t start) lv_arc_ext_t * ext = lv_obj_get_ext_attr(arc); if(start > 360) start -= 360; + if(start < 0) start += 360; /*Too large move, the whole arc need to be invalidated anyway*/ if(LV_MATH_ABS(start - ext->bg_angle_start) >= 180) { @@ -253,6 +261,7 @@ void lv_arc_set_bg_end_angle(lv_obj_t * arc, int16_t end) lv_arc_ext_t * ext = lv_obj_get_ext_attr(arc); if(end > 360) end -= 360; + if(end < 0) end += 360; /*Too large move, the whole arc need to be invalidated anyway*/ if(LV_MATH_ABS(end - ext->bg_angle_end) >= 180) { @@ -280,14 +289,17 @@ void lv_arc_set_bg_end_angle(lv_obj_t * arc, int16_t end) * @param start the start angle * @param end the end angle */ -void lv_arc_set_bg_angles(lv_obj_t * arc, uint16_t start, uint16_t end) +void lv_arc_set_bg_angles(lv_obj_t * arc, int16_t start, int16_t end) { LV_ASSERT_OBJ(arc, LV_OBJX_NAME); lv_arc_ext_t * ext = lv_obj_get_ext_attr(arc); if(end > 360) end -= 360; + if(end < 0) end += 360; + if(start > 360) start -= 360; + if(start < 0) start += 360; inv_arc_area(arc, ext->bg_angle_start, ext->bg_angle_end); diff --git a/src/lv_widgets/lv_arc.h b/src/lv_widgets/lv_arc.h index 3ba8a7b2d..81b2e6bcc 100644 --- a/src/lv_widgets/lv_arc.h +++ b/src/lv_widgets/lv_arc.h @@ -86,7 +86,7 @@ void lv_arc_set_end_angle(lv_obj_t * arc, int16_t end); * @param start the start angle * @param end the end angle */ -void lv_arc_set_angles(lv_obj_t * arc, uint16_t start, uint16_t end); +void lv_arc_set_angles(lv_obj_t * arc, int16_t start, int16_t end); /** * Set the start angle of an arc background. 0 deg: right, 90 bottom, etc. @@ -108,7 +108,7 @@ void lv_arc_set_bg_end_angle(lv_obj_t * arc, int16_t end); * @param start the start angle * @param end the end angle */ -void lv_arc_set_bg_angles(lv_obj_t * arc, uint16_t start, uint16_t end); +void lv_arc_set_bg_angles(lv_obj_t * arc, int16_t start, int16_t end); /*===================== * Getter functions diff --git a/src/lv_widgets/lv_bar.c b/src/lv_widgets/lv_bar.c index 594e61a0a..498a0973f 100644 --- a/src/lv_widgets/lv_bar.c +++ b/src/lv_widgets/lv_bar.c @@ -130,7 +130,7 @@ lv_obj_t * lv_bar_create(lv_obj_t * par, const lv_obj_t * copy) lv_style_list_copy(&ext->style_indic, &ext_copy->style_indic); /*Refresh the style with new signal function*/ - lv_obj_refresh_style(bar); + lv_obj_refresh_style(bar, LV_STYLE_PROP_ALL); lv_bar_set_value(bar, ext->cur_value, LV_ANIM_OFF); } diff --git a/src/lv_widgets/lv_btn.c b/src/lv_widgets/lv_btn.c index 26f913c3f..0a4174a35 100644 --- a/src/lv_widgets/lv_btn.c +++ b/src/lv_widgets/lv_btn.c @@ -97,7 +97,7 @@ lv_obj_t * lv_btn_create(lv_obj_t * par, const lv_obj_t * copy) ext->checkable = copy_ext->checkable; /*Refresh the style with new signal function*/ - lv_obj_refresh_style(btn); + lv_obj_refresh_style(btn, LV_STYLE_PROP_ALL); } LV_LOG_INFO("button created"); diff --git a/src/lv_widgets/lv_btnmatrix.c b/src/lv_widgets/lv_btnmatrix.c index 4a294356a..352c8d31d 100644 --- a/src/lv_widgets/lv_btnmatrix.c +++ b/src/lv_widgets/lv_btnmatrix.c @@ -280,12 +280,11 @@ void lv_btnmatrix_set_ctrl_map(lv_obj_t * btnm, const lv_btnmatrix_ctrl_t ctrl_m } /** - * Set the pressed button i.e. visually highlight it. - * Mainly used a when the btnm is in a group to show the selected button + * Set the focused button i.e. visually highlight it. * @param btnm pointer to button matrix object - * @param id index of the currently pressed button (`LV_BTNMATRIX_BTN_NONE` to unpress) + * @param id index of the button to focus(`LV_BTNMATRIX_BTN_NONE` to remove focus) */ -void lv_btnmatrix_set_pressed(lv_obj_t * btnm, uint16_t id) +void lv_btnmatrix_set_focused_btn(lv_obj_t * btnm, uint16_t id) { LV_ASSERT_OBJ(btnm, LV_OBJX_NAME); @@ -293,9 +292,9 @@ void lv_btnmatrix_set_pressed(lv_obj_t * btnm, uint16_t id) if(id >= ext->btn_cnt && id != LV_BTNMATRIX_BTN_NONE) return; - if(id == ext->btn_id_pr) return; + if(id == ext->btn_id_focused) return; - ext->btn_id_pr = id; + ext->btn_id_focused = id; lv_obj_invalidate(btnm); } @@ -492,7 +491,7 @@ const char * lv_btnmatrix_get_active_btn_text(const lv_obj_t * btnm) * @param btnm pointer to button matrix object * @return index of the pressed button (LV_BTNMATRIX_BTN_NONE: if unset) */ -uint16_t lv_btnmatrix_get_pressed_btn(const lv_obj_t * btnm) +uint16_t lv_btnmatrix_get_focused_btn(const lv_obj_t * btnm) { LV_ASSERT_OBJ(btnm, LV_OBJX_NAME); @@ -829,9 +828,13 @@ static lv_res_t lv_btnmatrix_signal(lv_obj_t * btnm, lv_signal_t sign, void * pa } } else if(sign == LV_SIGNAL_PRESSING) { - uint16_t btn_pr; + uint16_t btn_pr = LV_BTNMATRIX_BTN_NONE; /*Search the pressed area*/ - lv_indev_get_point(param, &p); + lv_indev_t * indev = lv_indev_get_act(); + lv_indev_type_t indev_type = lv_indev_get_type(indev); + if(indev_type == LV_INDEV_TYPE_ENCODER || indev_type == LV_INDEV_TYPE_KEYPAD) return LV_RES_OK; + + lv_indev_get_point(indev, &p); btn_pr = get_button_from_point(btnm, &p); /*Invalidate to old and the new areas*/ if(btn_pr != ext->btn_id_pr) { diff --git a/src/lv_widgets/lv_btnmatrix.h b/src/lv_widgets/lv_btnmatrix.h index 6d404154f..3b01d8e32 100644 --- a/src/lv_widgets/lv_btnmatrix.h +++ b/src/lv_widgets/lv_btnmatrix.h @@ -108,12 +108,11 @@ void lv_btnmatrix_set_map(lv_obj_t * btnm, const char * map[]); void lv_btnmatrix_set_ctrl_map(lv_obj_t * btnm, const lv_btnmatrix_ctrl_t ctrl_map[]); /** - * Set the pressed button i.e. visually highlight it. - * Mainly used a when the btnm is in a group to show the selected button + * Set the focused button i.e. visually highlight it. * @param btnm pointer to button matrix object - * @param id index of the currently pressed button (`LV_BTNMATRIX_BTN_NONE` to unpress) + * @param id index of the button to focus(`LV_BTNMATRIX_BTN_NONE` to remove focus) */ -void lv_btnmatrix_set_pressed(lv_obj_t * btnm, uint16_t id); +void lv_btnmatrix_set_focused_btn(lv_obj_t * btnm, uint16_t id); /** * Set a style of a button matrix @@ -214,12 +213,11 @@ uint16_t lv_btnmatrix_get_active_btn(const lv_obj_t * btnm); const char * lv_btnmatrix_get_active_btn_text(const lv_obj_t * btnm); /** - * Get the pressed button's index. - * The button be really pressed by the user or manually set to pressed with `lv_btnmatrix_set_pressed` + * Get the focused button's index. * @param btnm pointer to button matrix object - * @return index of the pressed button (LV_BTNMATRIX_BTN_NONE: if unset) + * @return index of the focused button (LV_BTNMATRIX_BTN_NONE: if unset) */ -uint16_t lv_btnmatrix_get_pressed_btn(const lv_obj_t * btnm); +uint16_t lv_btnmatrix_get_focused_btn(const lv_obj_t * btnm); /** * Get the button's text diff --git a/src/lv_widgets/lv_canvas.c b/src/lv_widgets/lv_canvas.c index bc1be27b3..849112b4f 100644 --- a/src/lv_widgets/lv_canvas.c +++ b/src/lv_widgets/lv_canvas.c @@ -652,7 +652,7 @@ void lv_canvas_fill_bg(lv_obj_t * canvas, lv_color_t color, lv_opa_t opa) lv_img_dsc_t * dsc = lv_canvas_get_img(canvas); - uint32_t x = dsc->header.w * dsc->header.h; + uint32_t x; uint32_t y; for(y = 0; y < dsc->header.h; y++) { for(x = 0; x < dsc->header.w; x++) { diff --git a/src/lv_widgets/lv_chart.c b/src/lv_widgets/lv_chart.c index 087bbc58e..d2a761f77 100644 --- a/src/lv_widgets/lv_chart.c +++ b/src/lv_widgets/lv_chart.c @@ -152,7 +152,7 @@ lv_obj_t * lv_chart_create(lv_obj_t * par, const lv_obj_t * copy) memcpy(&ext->secondary_y_axis, &ext_copy->secondary_y_axis, sizeof(lv_chart_axis_cfg_t)); /*Refresh the style with new signal function*/ - lv_obj_refresh_style(chart); + lv_obj_refresh_style(chart, LV_STYLE_PROP_ALL); } LV_LOG_INFO("chart created"); diff --git a/src/lv_widgets/lv_checkbox.h b/src/lv_widgets/lv_checkbox.h index db17e617b..daef1bdf7 100644 --- a/src/lv_widgets/lv_checkbox.h +++ b/src/lv_widgets/lv_checkbox.h @@ -49,7 +49,9 @@ typedef struct { /** Checkbox styles. */ enum { LV_CHECKBOX_PART_BG = LV_BTN_PART_MAIN, /**< Style of object background. */ + _LV_CHECKBOX_PART_VIRTUAL_LAST, LV_CHECKBOX_PART_BULLET = _LV_BTN_PART_REAL_LAST, /**< Style of box (released). */ + _LV_CHECKBOX_PART_REAL_LAST }; typedef uint8_t lv_checkbox_style_t; @@ -99,7 +101,7 @@ static inline void lv_checkbox_set_checked(lv_obj_t * cb, bool checked) * Make the check box inactive (disabled) * @param cb pointer to a check box object */ -static inline void lv_checkbox_set_inactive(lv_obj_t * cb) +static inline void lv_checkbox_set_disabled(lv_obj_t * cb) { lv_btn_set_state(cb, LV_BTN_STATE_DISABLED); } diff --git a/src/lv_widgets/lv_cont.c b/src/lv_widgets/lv_cont.c index 6ef1f41e6..bd435a5da 100644 --- a/src/lv_widgets/lv_cont.c +++ b/src/lv_widgets/lv_cont.c @@ -113,7 +113,7 @@ lv_obj_t * lv_cont_create(lv_obj_t * par, const lv_obj_t * copy) ext->layout = copy_ext->layout; /*Refresh the style with new signal function*/ - lv_obj_refresh_style(cont); + lv_obj_refresh_style(cont, LV_STYLE_PROP_ALL); } LV_LOG_INFO("container created"); @@ -243,7 +243,7 @@ lv_fit_t lv_cont_get_fit_bottom(const lv_obj_t * cont) /********************** * STATIC FUNCTIONS **********************/ - +extern uint32_t cont_sign; /** * Signal function of the container * @param cont pointer to a container object @@ -282,7 +282,7 @@ static lv_res_t lv_cont_signal(lv_obj_t * cont, lv_signal_t sign, void * param) } } else if(sign == LV_SIGNAL_PARENT_SIZE_CHG) { - /*FLOOD and FILL fit needs to be refreshed if the parent's size has changed*/ + /*MAX and EDGE fit needs to be refreshed if the parent's size has changed*/ lv_cont_refr_autofit(cont); } @@ -523,7 +523,8 @@ static void lv_cont_layout_pretty(lv_obj_t * cont) break; } w_row += lv_obj_get_width(child_rc) + inner; /*Add the object width + opad*/ - h_row = LV_MATH_MAX(h_row, lv_obj_get_height(child_rc)); /*Search the highest object*/ + lv_coord_t child_h = lv_obj_get_height(child_rc); + h_row = LV_MATH_MAX(h_row, child_h); /*Search the highest object*/ obj_num++; if(lv_obj_is_protected(child_rc, LV_PROTECT_FOLLOW)) break; /*If can not be followed by an other object then break here*/ diff --git a/src/lv_widgets/lv_cpicker.c b/src/lv_widgets/lv_cpicker.c index 25fcf9a79..4b7189100 100644 --- a/src/lv_widgets/lv_cpicker.c +++ b/src/lv_widgets/lv_cpicker.c @@ -144,7 +144,7 @@ lv_obj_t * lv_cpicker_create(lv_obj_t * par, const lv_obj_t * copy) lv_style_list_copy(&ext->indic.style_list, ©_ext->indic.style_list); /*Refresh the style with new signal function*/ - lv_obj_refresh_style(cpicker); + lv_obj_refresh_style(cpicker, LV_STYLE_PROP_ALL); } refr_indic_pos(cpicker); @@ -483,14 +483,18 @@ static void draw_disc_grad(lv_obj_t * cpicker, const lv_area_t * mask) uint16_t i; lv_coord_t cir_w = lv_obj_get_style_scale_width(cpicker, LV_CPICKER_PART_MAIN); + /* The inner line ends will be masked out. + * So make lines a little bit longer because the masking makes a more even result */ + lv_coord_t cir_w_extra = cir_w + line_dsc.width; + for(i = 0; i <= 360; i += LV_CPICKER_DEF_QF) { line_dsc.color = angle_to_mode_color(cpicker, i); lv_point_t p[2]; p[0].x = cx + (r * lv_trigo_sin(i) >> LV_TRIGO_SHIFT); p[0].y = cy + (r * lv_trigo_sin(i + 90) >> LV_TRIGO_SHIFT); - p[1].x = cx + ((r - cir_w) * lv_trigo_sin(i) >> LV_TRIGO_SHIFT); - p[1].y = cy + ((r - cir_w) * lv_trigo_sin(i + 90) >> LV_TRIGO_SHIFT); + p[1].x = cx + ((r - cir_w_extra) * lv_trigo_sin(i) >> LV_TRIGO_SHIFT); + p[1].y = cy + ((r - cir_w_extra) * lv_trigo_sin(i + 90) >> LV_TRIGO_SHIFT); lv_draw_line(&p[0], &p[1], mask, &line_dsc); } @@ -697,6 +701,7 @@ static lv_res_t lv_cpicker_signal(lv_obj_t * cpicker, lv_signal_t sign, void * p } else if(sign == LV_SIGNAL_CONTROL) { uint32_t c = *((uint32_t *)param); /*uint32_t because can be UTF-8*/ + if(c == LV_KEY_RIGHT || c == LV_KEY_UP) { lv_color_hsv_t hsv_cur; hsv_cur = ext->hsv; @@ -718,7 +723,7 @@ static lv_res_t lv_cpicker_signal(lv_obj_t * cpicker, lv_signal_t sign, void * p if(res != LV_RES_OK) return res; } } - else if(c == LV_KEY_LEFT || c == LV_KEY_DOWN) { + else if(c == LV_KEY_LEFT || c == LV_KEY_DOWN) { lv_color_hsv_t hsv_cur; hsv_cur = ext->hsv; @@ -750,8 +755,15 @@ static lv_res_t lv_cpicker_signal(lv_obj_t * cpicker, lv_signal_t sign, void * p lv_indev_t * indev = lv_indev_get_act(); if(indev == NULL) return res; + lv_indev_type_t indev_type = lv_indev_get_type(indev); lv_point_t p; - lv_indev_get_point(indev, &p); + if(indev_type == LV_INDEV_TYPE_ENCODER || indev_type == LV_INDEV_TYPE_KEYPAD) { + p.x = cpicker->coords.x1 + lv_obj_get_width(cpicker) / 2; + p.y = cpicker->coords.y1 + lv_obj_get_height(cpicker) / 2; + } + else { + lv_indev_get_point(indev, &p); + } if((LV_MATH_ABS(p.x - ext->last_press_point.x) > indev->driver.drag_limit / 2) || (LV_MATH_ABS(p.y - ext->last_press_point.y) > indev->driver.drag_limit / 2)) { diff --git a/src/lv_widgets/lv_dropdown.c b/src/lv_widgets/lv_dropdown.c index 45096a257..eb483483a 100644 --- a/src/lv_widgets/lv_dropdown.c +++ b/src/lv_widgets/lv_dropdown.c @@ -89,7 +89,7 @@ lv_obj_t * lv_dropdown_create(lv_obj_t * par, const lv_obj_t * copy) LV_LOG_TRACE("drop down list create started"); /*Create the ancestor drop down list*/ - lv_obj_t * ddlist = lv_btn_create(par, copy); + lv_obj_t * ddlist = lv_obj_create(par, copy); LV_ASSERT_MEM(ddlist); if(ddlist == NULL) return NULL; @@ -109,14 +109,14 @@ lv_obj_t * lv_dropdown_create(lv_obj_t * par, const lv_obj_t * copy) ext->options = NULL; ext->symbol = LV_SYMBOL_DOWN; ext->text = "Select"; - ext->static_txt = 0; + ext->static_txt = 1; ext->show_selected = 1; ext->sel_opt_id = 0; ext->sel_opt_id_orig = 0; ext->pr_opt_id = LV_DROPDOWN_PR_NONE; ext->option_cnt = 0; ext->dir = LV_DROPDOWN_DIR_DOWN; - ext->max_height = LV_DPI * 2; + ext->max_height = (3 * lv_disp_get_ver_res(NULL)) / 4; ext->anim_time = LV_DROPDOWN_DEF_ANIM_TIME; lv_style_list_init(&ext->style_page); lv_style_list_init(&ext->style_scrlbar); @@ -128,8 +128,7 @@ lv_obj_t * lv_dropdown_create(lv_obj_t * par, const lv_obj_t * copy) /*Init the new drop down list drop down list*/ if(copy == NULL) { - ext->options = NULL; - + lv_dropdown_set_static_options(ddlist, "Option 1\nOption 2\nOption 3"); lv_theme_apply(ddlist, LV_THEME_DROPDOWN); } /*Copy an existing drop down list*/ @@ -178,6 +177,26 @@ void lv_dropdown_set_text(lv_obj_t * ddlist, const char * txt) lv_obj_invalidate(ddlist); } +/** + * Clear any options in a drop down list. Static or dynamic. + * @param ddlist pointer to drop down list object + */ +void lv_dropdown_clear_options(lv_obj_t * ddlist) +{ + LV_ASSERT_OBJ(ddlist, LV_OBJX_NAME); + lv_dropdown_ext_t * ext = lv_obj_get_ext_attr(ddlist); + if(ext->options == NULL) return; + + if(ext->static_txt == 0) + lv_mem_free(ext->options); + + ext->options = NULL; + ext->static_txt = 0; + ext->option_cnt = 0; + + lv_obj_invalidate(ddlist); +} + /** * Set the options in a drop down list from a string * @param ddlist pointer to drop down list object @@ -263,8 +282,18 @@ void lv_dropdown_add_option(lv_obj_t * ddlist, const char * option, uint16_t pos lv_dropdown_ext_t * ext = lv_obj_get_ext_attr(ddlist); - /*Can not append to static options*/ - if(ext->static_txt != 0) return; + /*Convert static options to dynmaic*/ + if(ext->static_txt != 0) { + char * static_options = ext->options; + size_t len = strlen(static_options) + 1; + + ext->options = lv_mem_alloc(len); + LV_ASSERT_MEM(ext->options); + if(ext->options == NULL) return; + + strcpy(ext->options, static_options); + ext->static_txt = 0; + } /*Allocate space for the new option*/ size_t old_len = (ext->options == NULL) ? 0 : strlen(ext->options); @@ -326,10 +355,26 @@ void lv_dropdown_set_selected(lv_obj_t * ddlist, uint16_t sel_opt) } /** - * Set a fix height for the drop down list - * If 0 then the opened ddlist will be auto. sized else the set height will be applied. + * Set the direction of the a drop down list + * @param ddlist pointer to a drop down list object + * @param dir LV_DROPDOWN_DIR_LEF/RIGHT/TOP/BOTTOM + */ +void lv_dropdown_set_dir(lv_obj_t * ddlist, lv_dropdown_dir_t dir) +{ + LV_ASSERT_OBJ(ddlist, LV_OBJX_NAME); + + lv_dropdown_ext_t * ext = lv_obj_get_ext_attr(ddlist); + if(ext->dir == dir) return; + + ext->dir = dir; + + lv_obj_invalidate(ddlist); +} + +/** + * Set the maximal height for the drop down list * @param ddlist pointer to a drop down list - * @param h the height when the list is opened (0: auto size) + * @param h the maximal height */ void lv_dropdown_set_max_height(lv_obj_t * ddlist, lv_coord_t h) { @@ -365,23 +410,6 @@ void lv_dropdown_set_symbol(lv_obj_t * ddlist, const char * symbol) lv_obj_invalidate(ddlist); } -/** - * Set the direction of the a drop down list - * @param ddlist pointer to a drop down list object - * @param dir LV_DROPDOWN_DIR_LEF/RIGHT/TOP/BOTTOM - */ -void lv_dropdown_set_dir(lv_obj_t * ddlist, lv_dropdown_dir_t dir) -{ - LV_ASSERT_OBJ(ddlist, LV_OBJX_NAME); - - lv_dropdown_ext_t * ext = lv_obj_get_ext_attr(ddlist); - if(ext->dir == dir) return; - - ext->dir = dir; - - lv_obj_invalidate(ddlist); -} - /** * Set whether the ddlist highlight the last selected option and display its text or not * @param ddlist pointer to a drop down list object @@ -552,7 +580,7 @@ bool lv_dropdown_get_show_selected(lv_obj_t * ddlist) void lv_dropdown_open(lv_obj_t * ddlist, lv_anim_enable_t anim) { #if LV_USE_ANIMATION == 0 - anim = false; + (void) anim; /*Unused*/ #endif lv_dropdown_ext_t * ext = lv_obj_get_ext_attr(ddlist); if(ext->page) return; @@ -566,6 +594,12 @@ void lv_dropdown_open(lv_obj_t * ddlist, lv_anim_enable_t anim) if(ancestor_page_design == NULL) ancestor_page_design = lv_obj_get_design_cb(ext->page); lv_dropdown_page_ext_t * page_ext = lv_obj_allocate_ext_attr(ext->page, sizeof(lv_dropdown_page_ext_t)); + LV_ASSERT_MEM(page_ext); + if(page_ext == NULL) { + lv_obj_del(ext->page); + ext->page = NULL; + return; + } page_ext->ddlist = ddlist; lv_obj_set_design_cb(ext->page, lv_dropdown_page_design); @@ -575,7 +609,7 @@ void lv_dropdown_open(lv_obj_t * ddlist, lv_anim_enable_t anim) lv_style_list_copy(lv_obj_get_style_list(ext->page, LV_PAGE_PART_BG), &ext->style_page); lv_style_list_copy(lv_obj_get_style_list(ext->page, LV_PAGE_PART_SCRLBAR), &ext->style_scrlbar); lv_obj_clean_style_list(ext->page, LV_PAGE_PART_SCRL); - lv_obj_refresh_style(ext->page); + lv_obj_refresh_style(ext->page, LV_STYLE_PROP_ALL); lv_page_set_scrl_fit(ext->page, LV_FIT_TIGHT); @@ -613,7 +647,7 @@ void lv_dropdown_open(lv_obj_t * ddlist, lv_anim_enable_t anim) } #if LV_USE_ANIMATION - if(ext->dir != LV_DROPDOWN_DIR_UP) { + if(anim == LV_ANIM_ON && ext->dir != LV_DROPDOWN_DIR_UP) { lv_anim_t a; lv_anim_init(&a); lv_anim_set_var(&a, ddlist); @@ -695,13 +729,13 @@ static lv_design_res_t lv_dropdown_design(lv_obj_t * ddlist, const lv_area_t * c lv_dropdown_ext_t * ext = lv_obj_get_ext_attr(ddlist); - lv_style_int_t left = lv_obj_get_style_pad_left(ddlist, LV_DROPDOWN_PART_BTN); - lv_style_int_t right = lv_obj_get_style_pad_right(ddlist, LV_DROPDOWN_PART_BTN); - lv_style_int_t top = lv_obj_get_style_pad_top(ddlist, LV_DROPDOWN_PART_BTN); + lv_style_int_t left = lv_obj_get_style_pad_left(ddlist, LV_DROPDOWN_PART_MAIN); + lv_style_int_t right = lv_obj_get_style_pad_right(ddlist, LV_DROPDOWN_PART_MAIN); + lv_style_int_t top = lv_obj_get_style_pad_top(ddlist, LV_DROPDOWN_PART_MAIN); lv_draw_label_dsc_t label_dsc; lv_draw_label_dsc_init(&label_dsc); - lv_obj_init_draw_label_dsc(ddlist, LV_DROPDOWN_PART_BTN, &label_dsc); + lv_obj_init_draw_label_dsc(ddlist, LV_DROPDOWN_PART_MAIN, &label_dsc); lv_area_t txt_area; lv_point_t txt_size; @@ -852,7 +886,6 @@ static lv_res_t lv_dropdown_signal(lv_obj_t * ddlist, lv_signal_t sign, void * p return LV_RES_OK; } else if(sign == LV_SIGNAL_GET_STATE_DSC) { - lv_dropdown_ext_t * ext = lv_obj_get_ext_attr(ddlist); lv_get_state_info_t * info = param; if(info->part == LV_DROPDOWN_PART_LIST || info->part == LV_DROPDOWN_PART_SCRLBAR || @@ -915,12 +948,12 @@ static lv_res_t lv_dropdown_signal(lv_obj_t * ddlist, lv_signal_t sign, void * p if(ext->page) lv_dropdown_close(ddlist, LV_ANIM_OFF); } else if(sign == LV_SIGNAL_STYLE_CHG) { - lv_style_int_t top = lv_obj_get_style_pad_top(ddlist, LV_DROPDOWN_PART_BTN); - lv_style_int_t bottom = lv_obj_get_style_pad_bottom(ddlist, LV_DROPDOWN_PART_BTN); - const lv_font_t * font = lv_obj_get_style_text_font(ddlist, LV_DROPDOWN_PART_BTN); + lv_style_int_t top = lv_obj_get_style_pad_top(ddlist, LV_DROPDOWN_PART_MAIN); + lv_style_int_t bottom = lv_obj_get_style_pad_bottom(ddlist, LV_DROPDOWN_PART_MAIN); + const lv_font_t * font = lv_obj_get_style_text_font(ddlist, LV_DROPDOWN_PART_MAIN); lv_obj_set_height(ddlist, top + bottom + lv_font_get_line_height(font)); - if(ext->page) lv_obj_refresh_style(ext->page); + if(ext->page) lv_obj_refresh_style(ext->page, LV_STYLE_PROP_ALL); } else if(sign == LV_SIGNAL_CONTROL) { char c = *((char *)param); @@ -982,7 +1015,7 @@ static lv_res_t lv_dropdown_page_signal(lv_obj_t * page, lv_signal_t sign, void lv_style_int_t left = lv_obj_get_style_pad_left(ddlist, LV_DROPDOWN_PART_LIST); lv_style_int_t right = lv_obj_get_style_pad_right(ddlist, LV_DROPDOWN_PART_LIST); lv_obj_t * scrl = lv_page_get_scrl(page); - scrl->ext_draw_pad = LV_MATH_MAX(scrl->ext_draw_pad, LV_MATH_MAX(left, right)); + scrl->ext_draw_pad = LV_MATH_MAX3(scrl->ext_draw_pad, left, right); } else if(sign == LV_SIGNAL_RELEASED) { if(lv_indev_is_dragging(lv_indev_get_act()) == false) { @@ -1039,7 +1072,7 @@ static lv_res_t lv_dropdown_page_scrl_signal(lv_obj_t * scrl, lv_signal_t sign, * (The scrollabel is scrolled the "select rectangle" is drawn on the bg too)*/ lv_style_int_t left = lv_obj_get_style_pad_left(ddlist, LV_DROPDOWN_PART_LIST); lv_style_int_t right = lv_obj_get_style_pad_right(ddlist, LV_DROPDOWN_PART_LIST); - scrl->ext_draw_pad = LV_MATH_MAX(scrl->ext_draw_pad, LV_MATH_MAX(left, right)); + scrl->ext_draw_pad = LV_MATH_MAX3(scrl->ext_draw_pad, left, right); } return res; @@ -1060,7 +1093,7 @@ static lv_style_list_t * lv_dropdown_get_style(lv_obj_t * ddlist, uint8_t part) lv_style_list_t * style_dsc_p; switch(part) { - case LV_DROPDOWN_PART_BTN: + case LV_DROPDOWN_PART_MAIN: style_dsc_p = &ddlist->style_list; break; case LV_DROPDOWN_PART_LIST: @@ -1131,6 +1164,8 @@ static void draw_box_label(lv_obj_t * ddlist, const lv_area_t * clip_area, uint1 lv_coord_t font_h = lv_font_get_line_height(label_dsc.font); lv_obj_t * label = get_label(ddlist); + if(label == NULL) return; + lv_area_t area_sel; area_sel.y1 = label->coords.y1; area_sel.y1 += id * (font_h + label_dsc.line_space); @@ -1212,6 +1247,7 @@ static void page_press_handler(lv_obj_t * page) static uint16_t get_id_on_point(lv_obj_t * ddlist, lv_coord_t x, lv_coord_t y) { lv_obj_t * label = get_label(ddlist); + if(label == NULL) return 0; x -= label->coords.x1; y -= label->coords.y1; uint16_t letter_i; @@ -1247,6 +1283,7 @@ static void pos_selected(lv_obj_t * ddlist) lv_coord_t font_h = lv_font_get_line_height(font); lv_obj_t * scrl = lv_page_get_scrl(ext->page); lv_obj_t * label = get_label(ddlist); + if(label == NULL) return; lv_coord_t h = lv_obj_get_height(ext->page); lv_style_int_t line_space = lv_obj_get_style_text_line_space(ddlist, LV_DROPDOWN_PART_LIST); diff --git a/src/lv_widgets/lv_dropdown.h b/src/lv_widgets/lv_dropdown.h index 18cb78db8..c6ada1a07 100644 --- a/src/lv_widgets/lv_dropdown.h +++ b/src/lv_widgets/lv_dropdown.h @@ -26,7 +26,6 @@ extern "C" { #error "lv_ddlist: lv_label is required. Enable it in lv_conf.h (LV_USE_LABEL 1) " #endif -#include "../lv_widgets/lv_btn.h" #include "../lv_widgets/lv_page.h" #include "../lv_widgets/lv_label.h" @@ -50,7 +49,6 @@ typedef uint8_t lv_dropdown_dir_t; /*Data of drop down list*/ typedef struct { - lv_btn_ext_t btn; /*Ext. of ancestor*/ /*New data for this type */ lv_obj_t * page; /*The dropped down list*/ const char * text; /*Text to display on the ddlist's button*/ @@ -71,8 +69,8 @@ typedef struct { } lv_dropdown_ext_t; enum { - LV_DROPDOWN_PART_BTN = LV_BTN_PART_MAIN, - LV_DROPDOWN_PART_LIST = _LV_BTN_PART_REAL_LAST, + LV_DROPDOWN_PART_MAIN = LV_OBJ_PART_MAIN, + LV_DROPDOWN_PART_LIST = _LV_OBJ_PART_REAL_LAST, LV_DROPDOWN_PART_SCRLBAR, LV_DROPDOWN_PART_SELECTED, }; @@ -101,6 +99,12 @@ lv_obj_t * lv_dropdown_create(lv_obj_t * par, const lv_obj_t * copy); */ void lv_dropdown_set_text(lv_obj_t * ddlist, const char * txt); +/** + * Clear any options in a drop down list. Static or dynamic. + * @param ddlist pointer to drop down list object + */ +void lv_dropdown_clear_options(lv_obj_t * ddlist); + /** * Set the options in a drop down list from a string * @param ddlist pointer to drop down list object @@ -131,11 +135,18 @@ void lv_dropdown_add_option(lv_obj_t * ddlist, const char * option, uint16_t pos */ void lv_dropdown_set_selected(lv_obj_t * ddlist, uint16_t sel_opt); + /** - * Set a maximum height for the drop down list - * If 0 then the opened ddlist will be auto. sized else the set height will be applied. + * Set the direction of the a drop down list + * @param ddlist pointer to a drop down list object + * @param dir LV_DROPDOWN_DIR_LEF/RIGHT/TOP/BOTTOM + */ +void lv_dropdown_set_dir(lv_obj_t * ddlist, lv_dropdown_dir_t dir); + +/** + * Set the maximal height for the drop down list * @param ddlist pointer to a drop down list - * @param h the height when the list is opened (0: auto size) + * @param h the maximal height */ void lv_dropdown_set_max_height(lv_obj_t * ddlist, lv_coord_t h); @@ -147,14 +158,12 @@ void lv_dropdown_set_max_height(lv_obj_t * ddlist, lv_coord_t h); void lv_dropdown_set_symbol(lv_obj_t * ddlist, const char * symbol); /** - * Set the scroll bar mode of a drop down list + * Set whether the ddlist highlight the last selected option and display its text or not * @param ddlist pointer to a drop down list object - * @param sb_mode the new mode from 'lv_page_sb_mode_t' enum + * @param show true/false */ -static inline void lv_dropdown_set_sb_mode(lv_obj_t * ddlist, lv_sb_mode_t mode) -{ - lv_page_set_sb_mode(ddlist, mode); -} +void lv_dropdown_set_show_selected(lv_obj_t * ddlist, bool show); + /** * Set the open/close animation time. * @param ddlist pointer to a drop down list @@ -165,20 +174,6 @@ static inline void lv_dropdown_set_anim_time(lv_obj_t * ddlist, uint16_t anim_ti lv_page_set_anim_time(ddlist, anim_time); } -/** - * Set the direction of the a drop down list - * @param ddlist pointer to a drop down list object - * @param dir LV_DROPDOWN_DIR_LEF/RIGHT/TOP/BOTTOM - */ -void lv_dropdown_set_dir(lv_obj_t * ddlist, lv_dropdown_dir_t dir); - -/** - * Set whether the ddlist highlight the last selected option and display its text or not - * @param ddlist pointer to a drop down list object - * @param show true/false - */ -void lv_dropdown_set_show_selected(lv_obj_t * ddlist, bool show); - /*===================== * Getter functions *====================*/ @@ -247,16 +242,6 @@ lv_dropdown_dir_t lv_dropdown_get_dir(const lv_obj_t * ddlist); */ bool lv_dropdown_get_show_selected(lv_obj_t * ddlist); -/** - * Get the scroll bar mode of a drop down list - * @param ddlist pointer to a drop down list object - * @return scrollbar mode from 'lv_page_sb_mode_t' enum - */ -static inline lv_sb_mode_t lv_dropdown_get_sb_mode(const lv_obj_t * ddlist) -{ - return lv_page_get_sb_mode(ddlist); -} - /** * Get the open/close animation time. * @param ddlist pointer to a drop down list @@ -267,13 +252,6 @@ static inline uint16_t lv_dropdown_get_anim_time(const lv_obj_t * ddlist) return lv_page_get_anim_time(ddlist); } -/** - * Get the alignment of the labels in a drop down list - * @param ddlist pointer to a drop down list object - * @return alignment of labels - */ -lv_label_align_t lv_dropdown_get_align(const lv_obj_t * ddlist); - /*===================== * Other functions *====================*/ diff --git a/src/lv_widgets/lv_gauge.c b/src/lv_widgets/lv_gauge.c index 70c547d6c..f353cc282 100644 --- a/src/lv_widgets/lv_gauge.c +++ b/src/lv_widgets/lv_gauge.c @@ -118,8 +118,9 @@ lv_obj_t * lv_gauge_create(lv_obj_t * par, const lv_obj_t * copy) ext->values[i] = copy_ext->values[i]; } ext->label_count = copy_ext->label_count; + /*Refresh the style with new signal function*/ - // lv_obj_refresh_style(new_gauge); + lv_obj_refresh_style(new_gauge, LV_STYLE_PROP_ALL); } LV_LOG_INFO("gauge created"); @@ -358,7 +359,7 @@ static lv_design_res_t lv_gauge_design(lv_obj_t * gauge, const lv_area_t * clip_ /*Add the strong lines*/ uint16_t line_cnt_tmp = ext->lmeter.line_cnt; ext->lmeter.line_cnt = ext->label_count; /*Only to labels*/ - lv_linemeter_draw_scale(gauge, clip_area, LV_GAUGE_PART_STRONG); + lv_linemeter_draw_scale(gauge, clip_area, LV_GAUGE_PART_MAJOR); ext->lmeter.line_cnt = line_cnt_tmp; /*Restore the parameters*/ lv_gauge_draw_needle(gauge, clip_area); @@ -398,7 +399,7 @@ static lv_res_t lv_gauge_signal(lv_obj_t * gauge, lv_signal_t sign, void * param lv_mem_free(ext->values); ext->values = NULL; lv_obj_clean_style_list(gauge, LV_GAUGE_PART_NEEDLE); - lv_obj_clean_style_list(gauge, LV_GAUGE_PART_STRONG); + lv_obj_clean_style_list(gauge, LV_GAUGE_PART_MAJOR); } return res; @@ -420,7 +421,7 @@ static lv_style_list_t * lv_gauge_get_style(lv_obj_t * gauge, uint8_t part) case LV_GAUGE_PART_MAIN: style_dsc_p = &gauge->style_list; break; - case LV_GAUGE_PART_STRONG: + case LV_GAUGE_PART_MAJOR: style_dsc_p = &ext->style_strong; break; case LV_GAUGE_PART_NEEDLE: @@ -442,7 +443,7 @@ static void lv_gauge_draw_labels(lv_obj_t * gauge, const lv_area_t * mask) char scale_txt[16]; lv_gauge_ext_t * ext = lv_obj_get_ext_attr(gauge); - lv_style_int_t scale_width = lv_obj_get_style_scale_width(gauge, LV_GAUGE_PART_STRONG); + lv_style_int_t scale_width = lv_obj_get_style_scale_width(gauge, LV_GAUGE_PART_MAJOR); lv_style_int_t left = lv_obj_get_style_pad_left(gauge, LV_GAUGE_PART_MAIN); lv_style_int_t right = lv_obj_get_style_pad_right(gauge, LV_GAUGE_PART_MAIN); lv_style_int_t top = lv_obj_get_style_pad_top(gauge, LV_GAUGE_PART_MAIN); @@ -458,7 +459,7 @@ static void lv_gauge_draw_labels(lv_obj_t * gauge, const lv_area_t * mask) lv_draw_label_dsc_t label_dsc; lv_draw_label_dsc_init(&label_dsc); - lv_obj_init_draw_label_dsc(gauge, LV_GAUGE_PART_STRONG, &label_dsc); + lv_obj_init_draw_label_dsc(gauge, LV_GAUGE_PART_MAJOR, &label_dsc); uint8_t i; for(i = 0; i < label_num; i++) { @@ -564,7 +565,6 @@ static void lv_gauge_draw_needle(lv_obj_t * gauge, const lv_area_t * clip_area) } } - lv_draw_rect_dsc_t mid_dsc; lv_draw_rect_dsc_init(&mid_dsc); lv_obj_init_draw_rect_dsc(gauge, LV_GAUGE_PART_NEEDLE, &mid_dsc); diff --git a/src/lv_widgets/lv_gauge.h b/src/lv_widgets/lv_gauge.h index ba57a95af..436fefb0b 100644 --- a/src/lv_widgets/lv_gauge.h +++ b/src/lv_widgets/lv_gauge.h @@ -52,7 +52,7 @@ typedef struct { /*Styles*/ enum { LV_GAUGE_PART_MAIN = LV_LINEMETER_PART_MAIN, - LV_GAUGE_PART_STRONG = _LV_LINEMETER_PART_VIRTUAL_LAST, + LV_GAUGE_PART_MAJOR = _LV_LINEMETER_PART_VIRTUAL_LAST, LV_GAUGE_PART_NEEDLE, _LV_GAUGE_PART_VIRTUAL_LAST = _LV_LINEMETER_PART_VIRTUAL_LAST, _LV_GAUGE_PART_REAL_LAST = _LV_LINEMETER_PART_REAL_LAST, @@ -123,6 +123,16 @@ static inline void lv_gauge_set_critical_value(lv_obj_t * gauge, int16_t value) */ void lv_gauge_set_scale(lv_obj_t * gauge, uint16_t angle, uint8_t line_cnt, uint8_t label_cnt); +/** + * Set the set an offset for the gauge's angles to rotate it. + * @param gauge pointer to a line meter object + * @param angle angle offset (0..360), rotates clockwise + */ +static inline void lv_gauge_set_angle_offset(lv_obj_t * gauge, uint16_t angle) +{ + lv_linemeter_set_angle_offset(gauge, angle); +} + /** * Set an image to display as needle(s). * The needle image should be horizontal and pointing to the right (`--->`). @@ -210,6 +220,16 @@ static inline uint16_t lv_gauge_get_scale_angle(const lv_obj_t * gauge) return lv_linemeter_get_scale_angle(gauge); } +/** + * Get the offset for the gauge. + * @param gauge pointer to a gauge object + * @return angle offset (0..360) + */ +static inline uint16_t lv_gauge_get_angle_offset(lv_obj_t * gauge) +{ + return lv_linemeter_get_angle_offset(gauge); +} + /** * Get an image to display as needle(s). * @param gauge pointer to a gauge object diff --git a/src/lv_widgets/lv_img.c b/src/lv_widgets/lv_img.c index 71ec32fa8..fb3653eef 100644 --- a/src/lv_widgets/lv_img.c +++ b/src/lv_widgets/lv_img.c @@ -121,7 +121,7 @@ lv_obj_t * lv_img_create(lv_obj_t * par, const lv_obj_t * copy) lv_img_set_src(img, copy_ext->src); /*Refresh the style with new signal function*/ - lv_obj_refresh_style(img); + lv_obj_refresh_style(img, LV_STYLE_PROP_ALL); } LV_LOG_INFO("image created"); diff --git a/src/lv_widgets/lv_imgbtn.c b/src/lv_widgets/lv_imgbtn.c index 7135b9216..6cddf895f 100644 --- a/src/lv_widgets/lv_imgbtn.c +++ b/src/lv_widgets/lv_imgbtn.c @@ -73,13 +73,12 @@ lv_obj_t * lv_imgbtn_create(lv_obj_t * par, const lv_obj_t * copy) if(ancestor_design == NULL) ancestor_design = lv_obj_get_design_cb(imgbtn); /*Initialize the allocated 'ext' */ -#if LV_IMGBTN_TILED == 0 - memset((void *)ext->img_src, 0, sizeof(ext->img_src)); -#else + memset((void *)ext->img_src_mid, 0, sizeof(ext->img_src_mid)); +#if LV_IMGBTN_TILED memset(ext->img_src_left, 0, sizeof(ext->img_src_left)); - memset(ext->img_src_mid, 0, sizeof(ext->img_src_mid)); memset(ext->img_src_right, 0, sizeof(ext->img_src_right)); #endif + ext->tiled = 0; ext->act_cf = LV_IMG_CF_UNKNOWN; @@ -94,15 +93,14 @@ lv_obj_t * lv_imgbtn_create(lv_obj_t * par, const lv_obj_t * copy) /*Copy an existing image button*/ else { lv_imgbtn_ext_t * copy_ext = lv_obj_get_ext_attr(copy); -#if LV_IMGBTN_TILED == 0 - memcpy((void *)ext->img_src, copy_ext->img_src, sizeof(ext->img_src)); -#else - memcpy((void *)ext->img_src_left, copy_ext->img_src_left, sizeof(ext->img_src_left)); memcpy((void *)ext->img_src_mid, copy_ext->img_src_mid, sizeof(ext->img_src_mid)); +#if LV_IMGBTN_TILED + memcpy((void *)ext->img_src_left, copy_ext->img_src_left, sizeof(ext->img_src_left)); memcpy((void *)ext->img_src_right, copy_ext->img_src_right, sizeof(ext->img_src_right)); #endif + ext->tiled = copy_ext->tiled; /*Refresh the style with new signal function*/ - lv_obj_refresh_style(imgbtn); + lv_obj_refresh_style(imgbtn, LV_STYLE_PROP_ALL); } LV_LOG_INFO("image button created"); @@ -114,7 +112,6 @@ lv_obj_t * lv_imgbtn_create(lv_obj_t * par, const lv_obj_t * copy) * Setter functions *====================*/ -#if LV_IMGBTN_TILED == 0 /** * Set images for a state of the image button * @param imgbtn pointer to an image button object @@ -127,12 +124,16 @@ void lv_imgbtn_set_src(lv_obj_t * imgbtn, lv_btn_state_t state, const void * src lv_imgbtn_ext_t * ext = lv_obj_get_ext_attr(imgbtn); - ext->img_src[state] = src; - + ext->img_src_mid[state] = src; +#if LV_IMGBTN_TILED + ext->img_src_left[state] = NULL; + ext->img_src_right[state] = NULL; +#endif + ext->tiled = 0; refr_img(imgbtn); } -#else +#if LV_IMGBTN_TILED /** * Set images for a state of the image button * @param imgbtn pointer to an image button object @@ -144,12 +145,11 @@ void lv_imgbtn_set_src(lv_obj_t * imgbtn, lv_btn_state_t state, const void * src * @param src_right pointer to an image source for the right side of the button (a C array or path * to a file) */ -void lv_imgbtn_set_src(lv_obj_t * imgbtn, lv_btn_state_t state, const void * src_left, const void * src_mid, +void lv_imgbtn_set_src_tiled(lv_obj_t * imgbtn, lv_btn_state_t state, const void * src_left, const void * src_mid, const void * src_right) { LV_ASSERT_OBJ(imgbtn, LV_OBJX_NAME); - if(lv_img_src_get_type(src_left) == LV_IMG_SRC_SYMBOL || lv_img_src_get_type(src_mid) == LV_IMG_SRC_SYMBOL || lv_img_src_get_type(src_right) == LV_IMG_SRC_SYMBOL) { @@ -163,6 +163,8 @@ void lv_imgbtn_set_src(lv_obj_t * imgbtn, lv_btn_state_t state, const void * src ext->img_src_mid[state] = src_mid; ext->img_src_right[state] = src_right; + ext->tiled = 1; + refr_img(imgbtn); } @@ -172,7 +174,6 @@ void lv_imgbtn_set_src(lv_obj_t * imgbtn, lv_btn_state_t state, const void * src * Getter functions *====================*/ -#if LV_IMGBTN_TILED == 0 /** * Get the images in a given state * @param imgbtn pointer to an image button object @@ -185,9 +186,9 @@ const void * lv_imgbtn_get_src(lv_obj_t * imgbtn, lv_btn_state_t state) lv_imgbtn_ext_t * ext = lv_obj_get_ext_attr(imgbtn); - return ext->img_src[state]; + return ext->img_src_mid[state]; } -#else +#if LV_IMGBTN_TILED /** * Get the left image in a given state @@ -276,97 +277,99 @@ static lv_design_res_t lv_imgbtn_design(lv_obj_t * imgbtn, const lv_area_t * cli /*Just draw an image*/ lv_imgbtn_ext_t * ext = lv_obj_get_ext_attr(imgbtn); lv_btn_state_t state = lv_imgbtn_get_state(imgbtn); -#if LV_IMGBTN_TILED == 0 - const void * src = ext->img_src[state]; - if(lv_img_src_get_type(src) == LV_IMG_SRC_SYMBOL) { - lv_draw_label_dsc_t label_dsc; - lv_draw_label_dsc_init(&label_dsc); - lv_obj_init_draw_label_dsc(imgbtn, LV_IMGBTN_PART_MAIN, &label_dsc); - lv_draw_label(&imgbtn->coords, clip_area, &label_dsc, src, NULL); - } - else { + + /*Simply draw the middle src if no tiled*/ + if(!ext->tiled) { + const void * src = ext->img_src_mid[state]; + if(lv_img_src_get_type(src) == LV_IMG_SRC_SYMBOL) { + lv_draw_label_dsc_t label_dsc; + lv_draw_label_dsc_init(&label_dsc); + lv_obj_init_draw_label_dsc(imgbtn, LV_IMGBTN_PART_MAIN, &label_dsc); + lv_draw_label(&imgbtn->coords, clip_area, &label_dsc, src, NULL); + } + else { + lv_draw_img_dsc_t img_dsc; + lv_draw_img_dsc_init(&img_dsc); + lv_obj_init_draw_img_dsc(imgbtn, LV_IMGBTN_PART_MAIN, &img_dsc); + lv_draw_img(&imgbtn->coords, clip_area, src, &img_dsc); + } + } else { +#if LV_IMGBTN_TILED + const void * src = ext->img_src_left[state]; + if(lv_img_src_get_type(src) == LV_IMG_SRC_SYMBOL) { + LV_LOG_WARN("lv_imgbtn_design: SYMBOLS are not supported in tiled mode") + return LV_DESIGN_RES_OK; + } + + lv_coord_t w = lv_obj_get_style_transform_width(imgbtn, LV_OBJ_PART_MAIN); + lv_coord_t h = lv_obj_get_style_transform_height(imgbtn, LV_OBJ_PART_MAIN); + lv_area_t coords; + lv_area_copy(&coords, &imgbtn->coords); + coords.x1 -= w; + coords.x2 += w; + coords.y1 -= h; + coords.y2 += h; + lv_draw_img_dsc_t img_dsc; lv_draw_img_dsc_init(&img_dsc); lv_obj_init_draw_img_dsc(imgbtn, LV_IMGBTN_PART_MAIN, &img_dsc); - lv_draw_img(&imgbtn->coords, clip_area, src, &img_dsc); - } -#else - const void * src = ext->img_src_left[state]; - if(lv_img_src_get_type(src) == LV_IMG_SRC_SYMBOL) { - LV_LOG_WARN("lv_imgbtn_design: SYMBOLS are not supported in tiled mode") - return LV_DESIGN_RES_OK; - } - lv_coord_t w = lv_obj_get_style_transform_width(imgbtn, LV_OBJ_PART_MAIN); - lv_coord_t h = lv_obj_get_style_transform_height(imgbtn, LV_OBJ_PART_MAIN); - lv_area_t coords; - lv_area_copy(&coords, &imgbtn->coords); - coords.x1 -= w; - coords.x2 += w; - coords.y1 -= h; - coords.y2 += h; + lv_img_header_t header; + lv_area_t coords_part; + lv_coord_t left_w = 0; + lv_coord_t right_w = 0; - lv_draw_img_dsc_t img_dsc; - lv_draw_img_dsc_init(&img_dsc); - lv_obj_init_draw_img_dsc(imgbtn, LV_IMGBTN_PART_MAIN, &img_dsc); - - lv_img_header_t header; - lv_area_t coords_part; - lv_coord_t left_w = 0; - lv_coord_t right_w = 0; - - if(src) { - lv_img_decoder_get_info(src, &header); - left_w = header.w; - coords_part.x1 = coords.x1; - coords_part.y1 = coords.y1; - coords_part.x2 = coords.x1 + header.w - 1; - coords_part.y2 = coords.y1 + header.h - 1; - lv_draw_img(&coords_part, clip_area, src, &img_dsc); - } - - src = ext->img_src_right[state]; - if(src) { - lv_img_decoder_get_info(src, &header); - right_w = header.w; - coords_part.x1 = coords.x2 - header.w + 1; - coords_part.y1 = coords.y1; - coords_part.x2 = coords.x2; - coords_part.y2 = coords.y1 + header.h - 1; - lv_draw_img(&coords_part, clip_area, src, &img_dsc); - } - - src = ext->img_src_mid[state]; - if(src) { - lv_area_t clip_center_area; - clip_center_area.x1 = coords.x1 + left_w; - clip_center_area.x2 = coords.x2 - right_w; - clip_center_area.y1 = coords.y1; - clip_center_area.y2 = coords.y2; - - bool comm_res; - comm_res = lv_area_intersect(&clip_center_area, &clip_center_area, clip_area); - if(comm_res) { - lv_coord_t obj_w = lv_obj_get_width(imgbtn); - lv_coord_t i; + if(src) { lv_img_decoder_get_info(src, &header); - - coords_part.x1 = coords.x1 + left_w; + left_w = header.w; + coords_part.x1 = coords.x1; coords_part.y1 = coords.y1; - coords_part.x2 = coords_part.x1 + header.w - 1; - coords_part.y2 = coords_part.y1 + header.h - 1; + coords_part.x2 = coords.x1 + header.w - 1; + coords_part.y2 = coords.y1 + header.h - 1; + lv_draw_img(&coords_part, clip_area, src, &img_dsc); + } - for(i = 0; i < obj_w - right_w - left_w; i += header.w) { + src = ext->img_src_right[state]; + if(src) { + lv_img_decoder_get_info(src, &header); + right_w = header.w; + coords_part.x1 = coords.x2 - header.w + 1; + coords_part.y1 = coords.y1; + coords_part.x2 = coords.x2; + coords_part.y2 = coords.y1 + header.h - 1; + lv_draw_img(&coords_part, clip_area, src, &img_dsc); + } - lv_draw_img(&coords_part, &clip_center_area, src, &img_dsc); - coords_part.x1 = coords_part.x2 + 1; - coords_part.x2 += header.w; + src = ext->img_src_mid[state]; + if(src) { + lv_area_t clip_center_area; + clip_center_area.x1 = coords.x1 + left_w; + clip_center_area.x2 = coords.x2 - right_w; + clip_center_area.y1 = coords.y1; + clip_center_area.y2 = coords.y2; + + bool comm_res; + comm_res = lv_area_intersect(&clip_center_area, &clip_center_area, clip_area); + if(comm_res) { + lv_coord_t obj_w = lv_obj_get_width(imgbtn); + lv_coord_t i; + lv_img_decoder_get_info(src, &header); + + coords_part.x1 = coords.x1 + left_w; + coords_part.y1 = coords.y1; + coords_part.x2 = coords_part.x1 + header.w - 1; + coords_part.y2 = coords_part.y1 + header.h - 1; + + for(i = 0; i < obj_w - right_w - left_w; i += header.w) { + + lv_draw_img(&coords_part, &clip_center_area, src, &img_dsc); + coords_part.x1 = coords_part.x2 + 1; + coords_part.x2 += header.w; + } } } - } - #endif - + } } /*Post draw when the children are drawn*/ else if(mode == LV_DESIGN_DRAW_POST) { @@ -409,11 +412,7 @@ static void refr_img(lv_obj_t * imgbtn) lv_btn_state_t state = lv_imgbtn_get_state(imgbtn); lv_img_header_t header; -#if LV_IMGBTN_TILED == 0 - const void * src = ext->img_src[state]; -#else const void * src = ext->img_src_mid[state]; -#endif lv_res_t info_res = LV_RES_OK; if(lv_img_src_get_type(src) == LV_IMG_SRC_SYMBOL) { @@ -429,11 +428,8 @@ static void refr_img(lv_obj_t * imgbtn) if(info_res == LV_RES_OK) { ext->act_cf = header.cf; -#if LV_IMGBTN_TILED == 0 - lv_obj_set_size(imgbtn, header.w, header.h); -#else - lv_obj_set_height(imgbtn, header.h); -#endif + if(ext->tiled) lv_obj_set_height(imgbtn, header.h); /*Keep the suer defined width*/ + else lv_obj_set_size(imgbtn, header.w, header.h); } else { ext->act_cf = LV_IMG_CF_UNKNOWN; diff --git a/src/lv_widgets/lv_imgbtn.h b/src/lv_widgets/lv_imgbtn.h index 150bd2a15..f9eaf5143 100644 --- a/src/lv_widgets/lv_imgbtn.h +++ b/src/lv_widgets/lv_imgbtn.h @@ -37,14 +37,13 @@ extern "C" { typedef struct { lv_btn_ext_t btn; /*Ext. of ancestor*/ /*New data for this type */ -#if LV_IMGBTN_TILED == 0 - const void * img_src[_LV_BTN_STATE_LAST]; /*Store images to each state*/ -#else - const void * img_src_left[_LV_BTN_STATE_LAST]; /*Store left side images to each state*/ const void * img_src_mid[_LV_BTN_STATE_LAST]; /*Store center images to each state*/ +#if LV_IMGBTN_TILED + const void * img_src_left[_LV_BTN_STATE_LAST]; /*Store left side images to each state*/ const void * img_src_right[_LV_BTN_STATE_LAST]; /*Store right side images to each state*/ #endif lv_img_cf_t act_cf; /*Color format of the currently active image*/ + uint8_t tiled :1; /*1: the middle src will be repeated to fill the user defined width*/ } lv_imgbtn_ext_t; /*Parts of the image button*/ @@ -74,7 +73,6 @@ lv_obj_t * lv_imgbtn_create(lv_obj_t * par, const lv_obj_t * copy); * Setter functions *====================*/ -#if LV_IMGBTN_TILED == 0 /** * Set images for a state of the image button * @param imgbtn pointer to an image button object @@ -82,7 +80,8 @@ lv_obj_t * lv_imgbtn_create(lv_obj_t * par, const lv_obj_t * copy); * @param src pointer to an image source (a C array or path to a file) */ void lv_imgbtn_set_src(lv_obj_t * imgbtn, lv_btn_state_t state, const void * src); -#else + +#if LV_IMGBTN_TILED /** * Set images for a state of the image button * @param imgbtn pointer to an image button object @@ -94,7 +93,7 @@ void lv_imgbtn_set_src(lv_obj_t * imgbtn, lv_btn_state_t state, const void * src * @param src_right pointer to an image source for the right side of the button (a C array or path * to a file) */ -void lv_imgbtn_set_src(lv_obj_t * imgbtn, lv_btn_state_t state, const void * src_left, const void * src_mid, +void lv_imgbtn_set_src_tiled(lv_obj_t * imgbtn, lv_btn_state_t state, const void * src_left, const void * src_mid, const void * src_right); #endif diff --git a/src/lv_widgets/lv_keyboard.c b/src/lv_widgets/lv_keyboard.c index b81964bf2..4314efdec 100644 --- a/src/lv_widgets/lv_keyboard.c +++ b/src/lv_widgets/lv_keyboard.c @@ -134,7 +134,6 @@ lv_obj_t * lv_keyboard_create(lv_obj_t * par, const lv_obj_t * copy) } /*Initialize the allocated 'ext' */ - ext->ta = NULL; ext->mode = LV_KEYBOARD_MODE_TEXT_LOWER; ext->cursor_mng = 0; @@ -187,7 +186,7 @@ lv_obj_t * lv_keyboard_create(lv_obj_t * par, const lv_obj_t * copy) * @param kb pointer to a Keyboard object * @param ta pointer to a Text Area object to write there */ -void lv_keyboard_set_ta(lv_obj_t * kb, lv_obj_t * ta) +void lv_keyboard_set_textarea(lv_obj_t * kb, lv_obj_t * ta) { LV_ASSERT_OBJ(kb, LV_OBJX_NAME); if(ta) LV_ASSERT_OBJ(ta, "lv_ta"); @@ -286,7 +285,7 @@ void lv_keyboard_set_ctrl_map(lv_obj_t * kb, lv_keyboard_mode_t mode, const lv_b * @param kb pointer to a Keyboard object * @return pointer to the assigned Text Area object */ -lv_obj_t * lv_keyboard_get_ta(const lv_obj_t * kb) +lv_obj_t * lv_keyboard_get_textarea(const lv_obj_t * kb) { LV_ASSERT_OBJ(kb, LV_OBJX_NAME); @@ -371,7 +370,7 @@ void lv_keyboard_def_event_cb(lv_obj_t * kb, lv_event_t event) if(res != LV_RES_OK) return; } else { - lv_keyboard_set_ta(kb, NULL); /*De-assign the text area to hide it cursor if needed*/ + lv_keyboard_set_textarea(kb, NULL); /*De-assign the text area to hide it cursor if needed*/ lv_obj_del(kb); return; } @@ -383,7 +382,7 @@ void lv_keyboard_def_event_cb(lv_obj_t * kb, lv_event_t event) if(res != LV_RES_OK) return; } else { - lv_keyboard_set_ta(kb, NULL); /*De-assign the text area to hide it cursor if needed*/ + lv_keyboard_set_textarea(kb, NULL); /*De-assign the text area to hide it cursor if needed*/ } return; } diff --git a/src/lv_widgets/lv_keyboard.h b/src/lv_widgets/lv_keyboard.h index 3427e1841..3edd344b0 100644 --- a/src/lv_widgets/lv_keyboard.h +++ b/src/lv_widgets/lv_keyboard.h @@ -83,7 +83,7 @@ lv_obj_t * lv_keyboard_create(lv_obj_t * par, const lv_obj_t * copy); * @param kb pointer to a Keyboard object * @param ta pointer to a Text Area object to write there */ -void lv_keyboard_set_ta(lv_obj_t * kb, lv_obj_t * ta); +void lv_keyboard_set_textarea(lv_obj_t * kb, lv_obj_t * ta); /** * Set a new a mode (text or number map) @@ -128,7 +128,7 @@ void lv_keyboard_set_ctrl_map(lv_obj_t * kb, lv_keyboard_mode_t mode, const lv_b * @param kb pointer to a Keyboard object * @return pointer to the assigned Text Area object */ -lv_obj_t * lv_keyboard_get_ta(const lv_obj_t * kb); +lv_obj_t * lv_keyboard_get_textarea(const lv_obj_t * kb); /** * Set a new a mode (text or number map) diff --git a/src/lv_widgets/lv_label.c b/src/lv_widgets/lv_label.c index 98ae3c6da..29711588a 100644 --- a/src/lv_widgets/lv_label.c +++ b/src/lv_widgets/lv_label.c @@ -161,7 +161,7 @@ lv_obj_t * lv_label_create(lv_obj_t * par, const lv_obj_t * copy) ext->dot_end = copy_ext->dot_end; /*Refresh the style with new signal function*/ - lv_obj_refresh_style(new_label); + lv_obj_refresh_style(new_label, LV_STYLE_PROP_ALL); } LV_LOG_INFO("label created"); @@ -1153,7 +1153,6 @@ static lv_res_t lv_label_signal(lv_obj_t * label, lv_signal_t sign, void * param else if(sign == LV_SIGNAL_STYLE_CHG) { /*Revert dots for proper refresh*/ lv_label_revert_dots(label); - lv_label_refr_text(label); } else if(sign == LV_SIGNAL_COORD_CHG) { diff --git a/src/lv_widgets/lv_led.c b/src/lv_widgets/lv_led.c index c98ac8743..0376452b5 100644 --- a/src/lv_widgets/lv_led.c +++ b/src/lv_widgets/lv_led.c @@ -20,8 +20,6 @@ #define LV_LED_WIDTH_DEF (LV_DPI / 3) #define LV_LED_HEIGHT_DEF (LV_DPI / 3) -#define LV_LED_BRIGHT_OFF 60 -#define LV_LED_BRIGHT_ON 255 /********************** * TYPEDEFS @@ -73,7 +71,7 @@ lv_obj_t * lv_led_create(lv_obj_t * par, const lv_obj_t * copy) return NULL; } - ext->bright = LV_LED_BRIGHT_ON; + ext->bright = LV_LED_BRIGHT_MAX; lv_obj_set_signal_cb(led, lv_led_signal); lv_obj_set_design_cb(led, lv_led_design); @@ -90,7 +88,7 @@ lv_obj_t * lv_led_create(lv_obj_t * par, const lv_obj_t * copy) ext->bright = copy_ext->bright; /*Refresh the style with new signal function*/ - lv_obj_refresh_style(led); + lv_obj_refresh_style(led, LV_STYLE_PROP_ALL); } LV_LOG_INFO("led created"); @@ -105,7 +103,7 @@ lv_obj_t * lv_led_create(lv_obj_t * par, const lv_obj_t * copy) /** * Set the brightness of a LED object * @param led pointer to a LED object - * @param bright 0 (max. dark) ... 255 (max. light) + * @param bright LV_LED_BRIGHT_MIN (max. dark) ... LV_LED_BRIGHT_MAX (max. light) */ void lv_led_set_bright(lv_obj_t * led, uint8_t bright) { @@ -115,6 +113,9 @@ void lv_led_set_bright(lv_obj_t * led, uint8_t bright) lv_led_ext_t * ext = lv_obj_get_ext_attr(led); if(ext->bright == bright) return; + if(bright <= LV_LED_BRIGHT_MIN) bright = LV_LED_BRIGHT_MIN; + if(bright >= LV_LED_BRIGHT_MAX) bright = LV_LED_BRIGHT_MAX; + ext->bright = bright; /*Invalidate the object there fore it will be redrawn*/ @@ -129,7 +130,7 @@ void lv_led_on(lv_obj_t * led) { LV_ASSERT_OBJ(led, LV_OBJX_NAME); - lv_led_set_bright(led, LV_LED_BRIGHT_ON); + lv_led_set_bright(led, LV_LED_BRIGHT_MAX); } /** @@ -140,7 +141,7 @@ void lv_led_off(lv_obj_t * led) { LV_ASSERT_OBJ(led, LV_OBJX_NAME); - lv_led_set_bright(led, LV_LED_BRIGHT_OFF); + lv_led_set_bright(led, LV_LED_BRIGHT_MIN); } /** @@ -152,7 +153,7 @@ void lv_led_toggle(lv_obj_t * led) LV_ASSERT_OBJ(led, LV_OBJX_NAME); uint8_t bright = lv_led_get_bright(led); - if(bright > (LV_LED_BRIGHT_OFF + LV_LED_BRIGHT_ON) >> 1) + if(bright > (LV_LED_BRIGHT_MIN + LV_LED_BRIGHT_MAX) >> 1) lv_led_off(led); else lv_led_on(led); @@ -211,8 +212,8 @@ static lv_design_res_t lv_led_design(lv_obj_t * led, const lv_area_t * clip_area /*Set the current shadow width according to brightness proportionally between LV_LED_BRIGHT_OFF * and LV_LED_BRIGHT_ON*/ - rect_dsc.shadow_width = ((ext->bright - LV_LED_BRIGHT_OFF) * rect_dsc.shadow_width) / - (LV_LED_BRIGHT_ON - LV_LED_BRIGHT_OFF); + rect_dsc.shadow_width = ((ext->bright - LV_LED_BRIGHT_MIN) * rect_dsc.shadow_width) / + (LV_LED_BRIGHT_MAX - LV_LED_BRIGHT_MIN); lv_draw_rect(&led->coords, clip_area, &rect_dsc); } diff --git a/src/lv_widgets/lv_led.h b/src/lv_widgets/lv_led.h index 2ef640954..7ab33cef1 100644 --- a/src/lv_widgets/lv_led.h +++ b/src/lv_widgets/lv_led.h @@ -55,7 +55,7 @@ lv_obj_t * lv_led_create(lv_obj_t * par, const lv_obj_t * copy); /** * Set the brightness of a LED object * @param led pointer to a LED object - * @param bright 0 (max. dark) ... 255 (max. light) + * @param bright LV_LED_BRIGHT_MIN (max. dark) ... LV_LED_BRIGHT_MAX (max. light) */ void lv_led_set_bright(lv_obj_t * led, uint8_t bright); diff --git a/src/lv_widgets/lv_line.c b/src/lv_widgets/lv_line.c index 7a5694078..2ac14456c 100644 --- a/src/lv_widgets/lv_line.c +++ b/src/lv_widgets/lv_line.c @@ -95,7 +95,7 @@ lv_obj_t * lv_line_create(lv_obj_t * par, const lv_obj_t * copy) lv_line_set_points(line, copy_ext->point_array, copy_ext->point_num); /*Refresh the style with new signal function*/ - lv_obj_refresh_style(line); + lv_obj_refresh_style(line, LV_STYLE_PROP_ALL); } LV_LOG_INFO("line created"); diff --git a/src/lv_widgets/lv_linemeter.c b/src/lv_widgets/lv_linemeter.c index e1578b679..e6fe6af94 100644 --- a/src/lv_widgets/lv_linemeter.c +++ b/src/lv_widgets/lv_linemeter.c @@ -255,7 +255,7 @@ uint16_t lv_linemeter_get_scale_angle(const lv_obj_t * lmeter) } /** - * get the set an offset for the line meter. + * Get the offset for the line meter. * @param lmeter pointer to a line meter object * @return angle offset (0..360) */ diff --git a/src/lv_widgets/lv_linemeter.h b/src/lv_widgets/lv_linemeter.h index ff83e0852..27691ea38 100644 --- a/src/lv_widgets/lv_linemeter.h +++ b/src/lv_widgets/lv_linemeter.h @@ -133,7 +133,7 @@ uint16_t lv_linemeter_get_line_count(const lv_obj_t * lmeter); uint16_t lv_linemeter_get_scale_angle(const lv_obj_t * lmeter); /** - * get the set an offset for the line meter. + * Get the offset for the line meter. * @param lmeter pointer to a line meter object * @return angle offset (0..360) */ diff --git a/src/lv_widgets/lv_list.c b/src/lv_widgets/lv_list.c index 7b74d6c4a..b8dd5fada 100644 --- a/src/lv_widgets/lv_list.c +++ b/src/lv_widgets/lv_list.c @@ -85,7 +85,7 @@ lv_obj_t * lv_list_create(lv_obj_t * par, const lv_obj_t * copy) } #if LV_USE_GROUP - ext->last_sel_btn = NULL; + ext->last_sel_btn = NULL; #endif ext->act_sel_btn = NULL; @@ -97,7 +97,7 @@ lv_obj_t * lv_list_create(lv_obj_t * par, const lv_obj_t * copy) lv_page_set_scrl_fit2(list, LV_FIT_PARENT, LV_FIT_TIGHT); lv_obj_set_size(list, 2 * LV_DPI, 3 * LV_DPI); lv_page_set_scrl_layout(list, LV_LIST_LAYOUT_DEF); - lv_list_set_sb_mode(list, LV_SB_MODE_DRAG); + lv_list_set_sb_mode(list, LV_SCRLBAR_MODE_DRAG); lv_theme_apply(list, LV_THEME_LIST); @@ -115,7 +115,7 @@ lv_obj_t * lv_list_create(lv_obj_t * par, const lv_obj_t * copy) } /*Refresh the style with new signal function*/ - lv_obj_refresh_style(list); + lv_obj_refresh_style(list, LV_STYLE_PROP_ALL); } LV_LOG_INFO("list created"); diff --git a/src/lv_widgets/lv_list.h b/src/lv_widgets/lv_list.h index 1c9efb4d6..2c965044d 100644 --- a/src/lv_widgets/lv_list.h +++ b/src/lv_widgets/lv_list.h @@ -122,9 +122,9 @@ void lv_list_focus_btn(lv_obj_t * list, lv_obj_t * btn); * @param list pointer to a list object * @param sb_mode the new mode from 'lv_page_sb_mode_t' enum */ -static inline void lv_list_set_sb_mode(lv_obj_t * list, lv_sb_mode_t mode) +static inline void lv_list_set_sb_mode(lv_obj_t * list, lv_scrlbar_mode_t mode) { - lv_page_set_sb_mode(list, mode); + lv_page_set_scrlbar_mode(list, mode); } /** @@ -241,7 +241,7 @@ lv_layout_t lv_list_get_layout(lv_obj_t * list); * @param list pointer to a list object * @return scrollbar mode from 'lv_page_sb_mode_t' enum */ -static inline lv_sb_mode_t lv_list_get_sb_mode(const lv_obj_t * list) +static inline lv_scrlbar_mode_t lv_list_get_sb_mode(const lv_obj_t * list) { return lv_page_get_sb_mode(list); } diff --git a/src/lv_widgets/lv_msgbox.c b/src/lv_widgets/lv_msgbox.c index 3cf6a0905..ee2bdd148 100644 --- a/src/lv_widgets/lv_msgbox.c +++ b/src/lv_widgets/lv_msgbox.c @@ -120,7 +120,7 @@ lv_obj_t * lv_msgbox_create(lv_obj_t * par, const lv_obj_t * copy) if(copy_ext->btnm) ext->btnm = lv_btnmatrix_create(mbox, copy_ext->btnm); /*Refresh the style with new signal function*/ - lv_obj_refresh_style(mbox); + lv_obj_refresh_style(mbox, LV_STYLE_PROP_ALL); } LV_LOG_INFO("message box created"); @@ -408,9 +408,12 @@ static lv_res_t lv_msgbox_signal(lv_obj_t * mbox, lv_signal_t sign, void * param else if(sign == LV_SIGNAL_GET_STATE_DSC) { lv_get_state_info_t * info = param; lv_msgbox_ext_t * ext = lv_obj_get_ext_attr(mbox); - if(ext->btnm && info->part == LV_MSGBOX_PART_BTN_BG) info->result = lv_obj_get_state(ext->btnm, LV_BTNMATRIX_PART_BG); - else if(ext->btnm && - info->part == LV_MSGBOX_PART_BTN) info->result = lv_obj_get_state(ext->btnm, LV_BTNMATRIX_PART_BTN); + if(ext->btnm && info->part == LV_MSGBOX_PART_BTN_BG) { + info->result = lv_obj_get_state(ext->btnm, LV_BTNMATRIX_PART_BG); + } + else if(ext->btnm && info->part == LV_MSGBOX_PART_BTN) { + info->result = lv_obj_get_state(ext->btnm, LV_BTNMATRIX_PART_BTN); + } return LV_RES_OK; } @@ -499,7 +502,7 @@ static void mbox_realign(lv_obj_t * mbox) { lv_msgbox_ext_t * ext = lv_obj_get_ext_attr(mbox); - lv_coord_t w = lv_obj_get_width_fit(mbox); + lv_coord_t w = lv_obj_get_width_fit(mbox); if(ext->text) { lv_obj_set_width(ext->text, w); @@ -508,12 +511,21 @@ static void mbox_realign(lv_obj_t * mbox) if(ext->btnm) { lv_style_int_t bg_top = lv_obj_get_style_pad_top(mbox, LV_MSGBOX_PART_BTN_BG); lv_style_int_t bg_bottom = lv_obj_get_style_pad_bottom(mbox, LV_MSGBOX_PART_BTN_BG); + lv_style_int_t bg_inner = lv_obj_get_style_pad_inner(mbox, LV_MSGBOX_PART_BTN_BG); lv_style_int_t btn_top = lv_obj_get_style_pad_top(mbox, LV_MSGBOX_PART_BTN); lv_style_int_t btn_bottom = lv_obj_get_style_pad_bottom(mbox, LV_MSGBOX_PART_BTN); const lv_font_t * font = lv_obj_get_style_text_font(mbox, LV_MSGBOX_PART_BTN); + uint16_t btnm_lines = 1; + const char ** btnm_map = lv_btnmatrix_get_map_array(ext->btnm); + uint16_t i; + for(i = 0; btnm_map[i][0] != '\0'; i++) { + if(btnm_map[i][0] == '\n') btnm_lines++; + } + lv_coord_t font_h = lv_font_get_line_height(font); - lv_obj_set_size(ext->btnm, w, font_h + btn_top + btn_bottom + bg_top + bg_bottom); + lv_coord_t btn_h = font_h + btn_top + btn_bottom; + lv_obj_set_size(ext->btnm, w, btn_h * btnm_lines + bg_inner * (btnm_lines - 1) + bg_top + bg_bottom); } } diff --git a/src/lv_widgets/lv_objmask.c b/src/lv_widgets/lv_objmask.c index 7a3f85c52..b9ee16238 100644 --- a/src/lv_widgets/lv_objmask.c +++ b/src/lv_widgets/lv_objmask.c @@ -86,7 +86,7 @@ lv_obj_t * lv_objmask_create(lv_obj_t * par, const lv_obj_t * copy) /* lv_objmask_ext_t * copy_ext = lv_obj_get_ext_attr(copy); */ /*Refresh the style with new signal function*/ - lv_obj_refresh_style(objmask); + lv_obj_refresh_style(objmask, LV_STYLE_PROP_ALL); } LV_LOG_INFO("object mask created"); @@ -115,9 +115,11 @@ lv_objmask_mask_t * lv_objmask_add_mask(lv_obj_t * objmask, void * param) uint16_t param_size = get_param_size(dsc->type); lv_objmask_mask_t * m = lv_ll_ins_head(&ext->mask_ll); + LV_ASSERT_MEM(m); + if(m == NULL) return NULL; m->param = lv_mem_alloc(param_size); LV_ASSERT_MEM(m->param); - if(m == NULL) return NULL; + if(m->param == NULL) return NULL; memcpy(m->param, param, param_size); diff --git a/src/lv_widgets/lv_page.c b/src/lv_widgets/lv_page.c index e0140bb48..020da1f43 100644 --- a/src/lv_widgets/lv_page.c +++ b/src/lv_widgets/lv_page.c @@ -99,7 +99,7 @@ lv_obj_t * lv_page_create(lv_obj_t * par, const lv_obj_t * copy) lv_style_list_init(&ext->scrlbar.style); ext->scrlbar.hor_draw = 0; ext->scrlbar.ver_draw = 0; - ext->scrlbar.mode = LV_SB_MODE_AUTO; + ext->scrlbar.mode = LV_SCRLBAR_MODE_AUTO; #if LV_USE_ANIMATION lv_style_list_init(&ext->edge_flash.style); ext->edge_flash.enabled = 0; @@ -129,7 +129,7 @@ lv_obj_t * lv_page_create(lv_obj_t * par, const lv_obj_t * copy) lv_obj_set_signal_cb(page, lv_page_signal); lv_obj_set_design_cb(page, lv_page_design); - lv_page_set_sb_mode(page, ext->scrlbar.mode); + lv_page_set_scrlbar_mode(page, ext->scrlbar.mode); lv_theme_apply(page, LV_THEME_PAGE); @@ -148,7 +148,7 @@ lv_obj_t * lv_page_create(lv_obj_t * par, const lv_obj_t * copy) // lv_page_set_style(new_page, LV_PAGE_STYLE_SCRL, lv_page_get_style(copy, LV_PAGE_STYLE_SCRL)); // lv_page_set_style(new_page, LV_PAGE_STYLE_SCRLBAR, lv_page_get_style(copy, LV_PAGE_STYLE_SCRLBAR)); - lv_page_set_sb_mode(page, copy_ext->scrlbar.mode); + lv_page_set_scrlbar_mode(page, copy_ext->scrlbar.mode); } @@ -180,19 +180,19 @@ void lv_page_clean(lv_obj_t * page) * @param page pointer to a page object * @param sb_mode the new mode from 'lv_page_sb.mode_t' enum */ -void lv_page_set_sb_mode(lv_obj_t * page, lv_sb_mode_t sb_mode) +void lv_page_set_scrlbar_mode(lv_obj_t * page, lv_scrlbar_mode_t sb_mode) { LV_ASSERT_OBJ(page, LV_OBJX_NAME); lv_page_ext_t * ext = lv_obj_get_ext_attr(page); if(ext->scrlbar.mode == sb_mode) return; - if(sb_mode == LV_SB_MODE_HIDE) - ext->scrlbar.mode |= LV_SB_MODE_HIDE; /*Set the hidden flag*/ - else if(sb_mode == LV_SB_MODE_UNHIDE) - ext->scrlbar.mode &= (~LV_SB_MODE_HIDE); /*Clear the hidden flag*/ + if(sb_mode == LV_SCRLBAR_MODE_HIDE) + ext->scrlbar.mode |= LV_SCRLBAR_MODE_HIDE; /*Set the hidden flag*/ + else if(sb_mode == LV_SCRLBAR_MODE_UNHIDE) + ext->scrlbar.mode &= (~LV_SCRLBAR_MODE_HIDE); /*Clear the hidden flag*/ else { - if(ext->scrlbar.mode & LV_SB_MODE_HIDE) sb_mode |= LV_SB_MODE_HIDE; + if(ext->scrlbar.mode & LV_SCRLBAR_MODE_HIDE) sb_mode |= LV_SCRLBAR_MODE_HIDE; ext->scrlbar.mode = sb_mode; } @@ -299,7 +299,7 @@ uint16_t lv_page_get_anim_time(const lv_obj_t * page) * @param page pointer to a page object * @return the mode from 'lv_page_sb.mode_t' enum */ -lv_sb_mode_t lv_page_get_sb_mode(const lv_obj_t * page) +lv_scrlbar_mode_t lv_page_get_sb_mode(const lv_obj_t * page) { LV_ASSERT_OBJ(page, LV_OBJX_NAME); @@ -659,11 +659,11 @@ static lv_design_res_t lv_page_design(lv_obj_t * page, const lv_area_t * clip_ar lv_draw_rect_dsc_t rect_dsc; lv_draw_rect_dsc_init(&rect_dsc); lv_obj_init_draw_rect_dsc(page, LV_PAGE_PART_SCRLBAR, &rect_dsc); - if(ext->scrlbar.hor_draw && (ext->scrlbar.mode & LV_SB_MODE_HIDE) == 0) { + if(ext->scrlbar.hor_draw && (ext->scrlbar.mode & LV_SCRLBAR_MODE_HIDE) == 0) { lv_draw_rect(&sb_hor_area, clip_area, &rect_dsc); } - if(ext->scrlbar.ver_draw && (ext->scrlbar.mode & LV_SB_MODE_HIDE) == 0) { + if(ext->scrlbar.ver_draw && (ext->scrlbar.mode & LV_SCRLBAR_MODE_HIDE) == 0) { lv_draw_rect(&sb_ver_area, clip_area, &rect_dsc); } } @@ -986,6 +986,13 @@ static lv_res_t lv_page_scrollable_signal(lv_obj_t * scrl, lv_signal_t sign, voi lv_page_sb_refresh(page); } + else if(sign == LV_SIGNAL_DRAG_BEGIN) { + if(page_ext->scrlbar.mode == LV_SCRLBAR_MODE_DRAG) { + page_ext->scrlbar.ver_draw = 1; + page_ext->scrlbar.hor_draw = 1; + lv_obj_invalidate(page); + } + } else if(sign == LV_SIGNAL_DRAG_END) { /*Scroll propagation is finished on drag end*/ @@ -1003,12 +1010,19 @@ static lv_res_t lv_page_scrollable_signal(lv_obj_t * scrl, lv_signal_t sign, voi lv_obj_set_drag_parent(scroller_page, false); lv_obj_set_drag_parent(lv_page_get_scrl(scroller_page), false); + lv_page_ext_t * scroller_page_ext = lv_obj_get_ext_attr(scroller_page); + /*Hide scrollbars if required*/ + if(scroller_page_ext->scrlbar.mode == LV_SCRLBAR_MODE_DRAG) { + scroller_page_ext->scrlbar.hor_draw = 0; + scroller_page_ext->scrlbar.ver_draw = 0; + lv_obj_invalidate(scroller_page); + } scroller_ext = lv_obj_get_ext_attr(scroller_page); } } /*Hide scrollbars if required*/ - if(page_ext->scrlbar.mode == LV_SB_MODE_DRAG) { + if(page_ext->scrlbar.mode == LV_SCRLBAR_MODE_DRAG) { lv_area_t sb_area_tmp; if(page_ext->scrlbar.hor_draw) { lv_area_copy(&sb_area_tmp, &page_ext->scrlbar.hor_area); @@ -1031,10 +1045,17 @@ static lv_res_t lv_page_scrollable_signal(lv_obj_t * scrl, lv_signal_t sign, voi } } else if(sign == LV_SIGNAL_FOCUS) { - res = lv_signal_send(page, LV_SIGNAL_FOCUS, NULL); - if(res != LV_RES_OK) return res; - res = lv_event_send(page, LV_EVENT_FOCUSED, NULL); - if(res != LV_RES_OK) return res; +#if LV_USE_GROUP + if(lv_obj_get_group(page)) { + lv_group_focus_obj(page); + } else +#endif + { + res = lv_signal_send(page, LV_SIGNAL_FOCUS, NULL); + if(res != LV_RES_OK) return res; + res = lv_event_send(page, LV_EVENT_FOCUSED, NULL); + if(res != LV_RES_OK) return res; + } } else if(sign == LV_SIGNAL_DEFOCUS) { res = lv_signal_send(page, LV_SIGNAL_DEFOCUS, NULL); @@ -1136,9 +1157,9 @@ static void lv_page_sb_refresh(lv_obj_t * page) lv_coord_t sb_hor_pad = LV_MATH_MAX(sb_width, sb_right); lv_coord_t sb_ver_pad = LV_MATH_MAX(sb_width, sb_bottom); - if(ext->scrlbar.mode == LV_SB_MODE_OFF) return; + if(ext->scrlbar.mode == LV_SCRLBAR_MODE_OFF) return; - if(ext->scrlbar.mode == LV_SB_MODE_ON) { + if(ext->scrlbar.mode == LV_SCRLBAR_MODE_ON) { ext->scrlbar.hor_draw = 1; ext->scrlbar.ver_draw = 1; } @@ -1162,7 +1183,7 @@ static void lv_page_sb_refresh(lv_obj_t * page) lv_obj_invalidate_area(page, &sb_area_tmp); } - if(ext->scrlbar.mode == LV_SB_MODE_DRAG && lv_indev_is_dragging(lv_indev_get_act()) == false) { + if(ext->scrlbar.mode == LV_SCRLBAR_MODE_DRAG && lv_indev_is_dragging(lv_indev_get_act()) == false) { ext->scrlbar.hor_draw = 0; ext->scrlbar.ver_draw = 0; return; @@ -1173,7 +1194,7 @@ static void lv_page_sb_refresh(lv_obj_t * page) lv_area_set_width(&ext->scrlbar.hor_area, obj_w - 2 * sb_hor_pad); lv_area_set_pos(&ext->scrlbar.hor_area, sb_hor_pad, obj_h - sb_width - sb_bottom); - if(ext->scrlbar.mode == LV_SB_MODE_AUTO || ext->scrlbar.mode == LV_SB_MODE_DRAG) ext->scrlbar.hor_draw = 0; + if(ext->scrlbar.mode == LV_SCRLBAR_MODE_AUTO || ext->scrlbar.mode == LV_SCRLBAR_MODE_DRAG) ext->scrlbar.hor_draw = 0; } /*Smaller horizontal scrollbar*/ else { @@ -1188,7 +1209,7 @@ static void lv_page_sb_refresh(lv_obj_t * page) (scrl_w + bg_left + bg_right - obj_w), obj_h - sb_width - sb_bottom); - if(ext->scrlbar.mode == LV_SB_MODE_AUTO || ext->scrlbar.mode == LV_SB_MODE_DRAG) ext->scrlbar.hor_draw = 1; + if(ext->scrlbar.mode == LV_SCRLBAR_MODE_AUTO || ext->scrlbar.mode == LV_SCRLBAR_MODE_DRAG) ext->scrlbar.hor_draw = 1; } /*Full sized vertical scroll bar*/ @@ -1196,7 +1217,7 @@ static void lv_page_sb_refresh(lv_obj_t * page) lv_area_set_height(&ext->scrlbar.ver_area, obj_h - 2 * sb_ver_pad); lv_area_set_pos(&ext->scrlbar.ver_area, obj_w - sb_width - sb_right, sb_ver_pad); - if(ext->scrlbar.mode == LV_SB_MODE_AUTO || ext->scrlbar.mode == LV_SB_MODE_DRAG) ext->scrlbar.ver_draw = 0; + if(ext->scrlbar.mode == LV_SCRLBAR_MODE_AUTO || ext->scrlbar.mode == LV_SCRLBAR_MODE_DRAG) ext->scrlbar.ver_draw = 0; } /*Smaller vertical scroll bar*/ else { @@ -1211,7 +1232,7 @@ static void lv_page_sb_refresh(lv_obj_t * page) (obj_h - size_tmp - 2 * sb_ver_pad)) / (scrl_h + bg_top + bg_bottom - obj_h)); - if(ext->scrlbar.mode == LV_SB_MODE_AUTO || ext->scrlbar.mode == LV_SB_MODE_DRAG) ext->scrlbar.ver_draw = 1; + if(ext->scrlbar.mode == LV_SCRLBAR_MODE_AUTO) ext->scrlbar.ver_draw = 1; } /*Invalidate the new scrollbar areas*/ diff --git a/src/lv_widgets/lv_page.h b/src/lv_widgets/lv_page.h index 04f2ca2f2..f46ace205 100644 --- a/src/lv_widgets/lv_page.h +++ b/src/lv_widgets/lv_page.h @@ -36,14 +36,14 @@ extern "C" { /** Scrollbar modes: shows when should the scrollbars be visible*/ enum { - LV_SB_MODE_OFF = 0x0, /**< Never show scrollbars*/ - LV_SB_MODE_ON = 0x1, /**< Always show scrollbars*/ - LV_SB_MODE_DRAG = 0x2, /**< Show scrollbars when page is being dragged*/ - LV_SB_MODE_AUTO = 0x3, /**< Show scrollbars when the scrollable container is large enough to be scrolled*/ - LV_SB_MODE_HIDE = 0x4, /**< Hide the scroll bar temporally*/ - LV_SB_MODE_UNHIDE = 0x5, /**< Unhide the previously hidden scrollbar. Recover it's type too*/ + LV_SCRLBAR_MODE_OFF = 0x0, /**< Never show scroll bars*/ + LV_SCRLBAR_MODE_ON = 0x1, /**< Always show scroll bars*/ + LV_SCRLBAR_MODE_DRAG = 0x2, /**< Show scroll bars when page is being dragged*/ + LV_SCRLBAR_MODE_AUTO = 0x3, /**< Show scroll bars when the scrollable container is large enough to be scrolled*/ + LV_SCRLBAR_MODE_HIDE = 0x4, /**< Hide the scroll bar temporally*/ + LV_SCRLBAR_MODE_UNHIDE = 0x5, /**< Unhide the previously hidden scroll bar. Recover original mode too*/ }; -typedef uint8_t lv_sb_mode_t; +typedef uint8_t lv_scrlbar_mode_t; /** Edges: describes the four edges of the page*/ enum { LV_PAGE_EDGE_LEFT = 0x1, LV_PAGE_EDGE_TOP = 0x2, LV_PAGE_EDGE_RIGHT = 0x4, LV_PAGE_EDGE_BOTTOM = 0x8 }; @@ -60,7 +60,7 @@ typedef struct { lv_area_t ver_area; /*Vertical scrollbar area relative to the page (Handled by the library)*/ uint8_t hor_draw : 1; /*1: horizontal scrollbar is visible now (Handled by the library)*/ uint8_t ver_draw : 1; /*1: vertical scrollbar is visible now (Handled by the library)*/ - lv_sb_mode_t mode : 3; /*Scrollbar visibility from 'lv_page_sb_mode_t'*/ + lv_scrlbar_mode_t mode : 3; /*Scrollbar visibility from 'lv_page_sb_mode_t'*/ } scrlbar; #if LV_USE_ANIMATION struct { @@ -135,7 +135,7 @@ uint16_t lv_page_get_anim_time(const lv_obj_t * page); * @param page pointer to a page object * @param sb_mode the new mode from 'lv_page_sb.mode_t' enum */ -void lv_page_set_sb_mode(lv_obj_t * page, lv_sb_mode_t sb_mode); +void lv_page_set_scrlbar_mode(lv_obj_t * page, lv_scrlbar_mode_t sb_mode); /** * Set the animation time for the page @@ -237,7 +237,7 @@ static inline void lv_page_set_scrl_layout(lv_obj_t * page, lv_layout_t layout) * @param page pointer to a page object * @return the mode from 'lv_page_sb.mode_t' enum */ -lv_sb_mode_t lv_page_get_sb_mode(const lv_obj_t * page); +lv_scrlbar_mode_t lv_page_get_sb_mode(const lv_obj_t * page); /** * Get the scroll propagation property diff --git a/src/lv_widgets/lv_roller.c b/src/lv_widgets/lv_roller.c index 40e36d5e5..ecb28e7a3 100644 --- a/src/lv_widgets/lv_roller.c +++ b/src/lv_widgets/lv_roller.c @@ -103,7 +103,7 @@ lv_obj_t * lv_roller_create(lv_obj_t * par, const lv_obj_t * copy) lv_label_set_align(label, LV_LABEL_ALIGN_CENTER); lv_obj_t * scrl = lv_page_get_scrl(roller); - lv_obj_set_drag(scrl, true); /*In ddlist it might be disabled*/ + lv_obj_set_drag(scrl, true); lv_page_set_scrl_fit2(roller, LV_FIT_PARENT, LV_FIT_NONE); /*Height is specified directly*/ lv_roller_set_anim_time(roller, LV_ROLLER_DEF_ANIM_TIME); lv_roller_set_options(roller, "Option 1\nOption 2\nOption 3\nOption 4\nOption 5", LV_ROLLER_MODE_NORMAL); @@ -154,9 +154,9 @@ void lv_roller_set_options(lv_obj_t * roller, const char * options, lv_roller_mo /*Count the '\n'-s to determine the number of options*/ ext->option_cnt = 0; - uint16_t i; - for(i = 0; options[i] != '\0'; i++) { - if(options[i] == '\n') ext->option_cnt++; + uint16_t cnt; + for(cnt = 0; options[cnt] != '\0'; cnt++) { + if(options[cnt] == '\n') ext->option_cnt++; } ext->option_cnt++; /*Last option has no `\n`*/ @@ -225,6 +225,13 @@ void lv_roller_set_selected(lv_obj_t * roller, uint16_t sel_opt, lv_anim_enable_ * nothing will continue the animation. */ lv_roller_ext_t * ext = lv_obj_get_ext_attr(roller); + + /*In infinite mode interpret the new ID relative to the currently visible "page"*/ + if(ext->mode == LV_ROLLER_MODE_INIFINITE) { + uint16_t page = ext->sel_opt_id / LV_ROLLER_INF_PAGES; + sel_opt = page * LV_ROLLER_INF_PAGES + sel_opt; + } + ext->sel_opt_id = sel_opt < ext->option_cnt ? sel_opt : ext->option_cnt - 1; ext->sel_opt_id_ori = ext->sel_opt_id; @@ -389,14 +396,14 @@ static lv_design_res_t lv_roller_design(lv_obj_t * roller, const lv_area_t * cli lv_draw_rect_dsc_t sel_dsc; lv_draw_rect_dsc_init(&sel_dsc); - lv_obj_init_draw_rect_dsc(roller, LV_ROLLER_PART_SEL, &sel_dsc); + lv_obj_init_draw_rect_dsc(roller, LV_ROLLER_PART_SELECTED, &sel_dsc); lv_draw_rect(&rect_area, clip_area, &sel_dsc); } /*Post draw when the children are drawn*/ else if(mode == LV_DESIGN_DRAW_POST) { lv_draw_label_dsc_t label_dsc; lv_draw_label_dsc_init(&label_dsc); - lv_obj_init_draw_label_dsc(roller, LV_ROLLER_PART_SEL, &label_dsc); + lv_obj_init_draw_label_dsc(roller, LV_ROLLER_PART_SELECTED, &label_dsc); lv_coord_t font_h = lv_font_get_line_height(label_dsc.font); @@ -445,12 +452,9 @@ static lv_res_t lv_roller_signal(lv_obj_t * roller, lv_signal_t sign, void * par else return ancestor_signal(roller, sign, param); } - /*Don't let the drop down list to handle the control signals. It works differently*/ - if(sign != LV_SIGNAL_CONTROL && sign != LV_SIGNAL_FOCUS && sign != LV_SIGNAL_DEFOCUS) { - /* Include the ancient signal function */ - res = ancestor_signal(roller, sign, param); - if(res != LV_RES_OK) return res; - } + /* Include the ancient signal function */ + res = ancestor_signal(roller, 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); @@ -496,7 +500,7 @@ static lv_res_t lv_roller_signal(lv_obj_t * roller, lv_signal_t sign, void * par } else { ext->sel_opt_id_ori = ext->sel_opt_id; /*Save the current value. Used to revert this state if - ENER wont't be pressed*/ + ENTER wont't be pressed*/ } #endif } @@ -527,7 +531,7 @@ static lv_res_t lv_roller_signal(lv_obj_t * roller, lv_signal_t sign, void * par } } else if(sign == LV_SIGNAL_CLEANUP) { - lv_obj_clean_style_list(roller, LV_ROLLER_PART_SEL); + lv_obj_clean_style_list(roller, LV_ROLLER_PART_SELECTED); } return res; } @@ -549,7 +553,7 @@ static lv_style_list_t * lv_roller_get_style(lv_obj_t * roller, uint8_t part) case LV_ROLLER_PART_BG: style_dsc_p = &roller->style_list; break; - case LV_ROLLER_PART_SEL: + case LV_ROLLER_PART_SELECTED: style_dsc_p = &ext->style_sel; break; default: @@ -745,18 +749,21 @@ static lv_res_t release_handler(lv_obj_t * roller) lv_indev_t * indev = lv_indev_get_act(); #if LV_USE_GROUP /*Leave edit mode once a new option is selected*/ - if(lv_indev_get_type(indev) == LV_INDEV_TYPE_ENCODER) { + lv_indev_type_t indev_type = lv_indev_get_type(indev); + if(indev_type == LV_INDEV_TYPE_ENCODER || indev_type == LV_INDEV_TYPE_KEYPAD) { ext->sel_opt_id_ori = ext->sel_opt_id; - lv_group_t * g = lv_obj_get_group(roller); - if(lv_group_get_editing(g)) { - lv_group_set_editing(g, false); + + if(indev_type == LV_INDEV_TYPE_ENCODER) { + lv_group_t * g = lv_obj_get_group(roller); + if(lv_group_get_editing(g)) { + lv_group_set_editing(g, false); + } } } #endif lv_obj_t * label = get_label(roller); - - + if(label == NULL) return LV_RES_OK; if(lv_indev_get_type(indev) == LV_INDEV_TYPE_POINTER || lv_indev_get_type(indev) == LV_INDEV_TYPE_BUTTON) { /*Search the clicked option (For KEYPAD and ENCODER the new value should be already set)*/ @@ -791,13 +798,14 @@ static lv_res_t release_handler(lv_obj_t * roller) static void refr_width(lv_obj_t * roller) { lv_obj_t * label = get_label(roller); + if(label == NULL) return; + lv_coord_t label_w = lv_obj_get_width(label); lv_style_int_t left = lv_obj_get_style_pad_left(roller, LV_ROLLER_PART_BG); lv_style_int_t right = lv_obj_get_style_pad_right(roller, LV_ROLLER_PART_BG); lv_obj_set_width(roller, label_w + left + right); - } /** @@ -807,6 +815,7 @@ static void refr_width(lv_obj_t * roller) static void refr_height(lv_obj_t * roller) { lv_obj_t * label = get_label(roller); + if(label == NULL) return; lv_obj_set_height(lv_page_get_scrl(roller), lv_obj_get_height(label) + lv_obj_get_height(roller)); lv_obj_align(label, NULL, LV_ALIGN_CENTER, 0, 0); diff --git a/src/lv_widgets/lv_roller.h b/src/lv_widgets/lv_roller.h index f9da7e431..fd7f9366d 100644 --- a/src/lv_widgets/lv_roller.h +++ b/src/lv_widgets/lv_roller.h @@ -58,7 +58,7 @@ typedef struct { enum { LV_ROLLER_PART_BG = LV_PAGE_PART_BG, - LV_ROLLER_PART_SEL = _LV_PAGE_PART_VIRTUAL_LAST, + LV_ROLLER_PART_SELECTED = _LV_PAGE_PART_VIRTUAL_LAST, _LV_ROLLER_PART_VIRTUAL_LAST, }; typedef uint8_t lv_roller_part_t; @@ -168,12 +168,6 @@ static inline uint16_t lv_roller_get_anim_time(const lv_obj_t * roller) return lv_page_get_anim_time(roller); } -/** - * Get the auto width set attribute - * @param roller pointer to a roller object - * @return true: auto size enabled; false: manual width settings enabled - */ -bool lv_roller_get_hor_fit(const lv_obj_t * roller); /********************** * MACROS diff --git a/src/lv_widgets/lv_slider.c b/src/lv_widgets/lv_slider.c index abad580f7..21b4e359e 100644 --- a/src/lv_widgets/lv_slider.c +++ b/src/lv_widgets/lv_slider.c @@ -404,12 +404,12 @@ static lv_res_t lv_slider_signal(lv_obj_t * slider, lv_signal_t sign, void * par char c = *((char *)param); if(c == LV_KEY_RIGHT || c == LV_KEY_UP) { - lv_slider_set_value(slider, lv_slider_get_value(slider) + 1, true); + lv_slider_set_value(slider, lv_slider_get_value(slider) + 1, LV_ANIM_ON); res = lv_event_send(slider, LV_EVENT_VALUE_CHANGED, NULL); if(res != LV_RES_OK) return res; } else if(c == LV_KEY_LEFT || c == LV_KEY_DOWN) { - lv_slider_set_value(slider, lv_slider_get_value(slider) - 1, true); + lv_slider_set_value(slider, lv_slider_get_value(slider) - 1, LV_ANIM_ON); res = lv_event_send(slider, LV_EVENT_VALUE_CHANGED, NULL); if(res != LV_RES_OK) return res; } diff --git a/src/lv_widgets/lv_slider.h b/src/lv_widgets/lv_slider.h index 869b62939..de66430cd 100644 --- a/src/lv_widgets/lv_slider.h +++ b/src/lv_widgets/lv_slider.h @@ -35,10 +35,11 @@ extern "C" { enum { LV_SLIDER_TYPE_NORMAL, - LV_SLIDER_TYPE_SYM, + LV_SLIDER_TYPE_SYMMETRICAL, LV_SLIDER_TYPE_RANGE }; typedef uint8_t lv_slider_type_t; + /*Data of slider*/ typedef struct { lv_bar_ext_t bar; /*Ext. of ancestor*/ @@ -56,7 +57,6 @@ enum { LV_SLIDER_PART_INDIC, /** Slider indicator (filled area) style. */ LV_SLIDER_PART_KNOB, /** Slider knob style. */ }; -typedef uint8_t lv_slider_style_t; /********************** * GLOBAL PROTOTYPES @@ -127,7 +127,7 @@ static inline void lv_slider_set_type(lv_obj_t * slider, lv_slider_type_t type) { if(type == LV_SLIDER_TYPE_NORMAL) lv_bar_set_type(slider, LV_BAR_TYPE_NORMAL); - else if(type == LV_SLIDER_TYPE_SYM) + else if(type == LV_SLIDER_TYPE_SYMMETRICAL) lv_bar_set_type(slider, LV_BAR_TYPE_SYMMETRICAL); else if(type == LV_SLIDER_TYPE_RANGE) lv_bar_set_type(slider, LV_BAR_TYPE_CUSTOM); @@ -181,13 +181,6 @@ static inline int16_t lv_slider_get_max_value(const lv_obj_t * slider) */ bool lv_slider_is_dragged(const lv_obj_t * slider); -/** - * Get an image to display on the knob of the slider - * @param slider pointer to a slider object - * @return the image source: pointer to an `lv_img_dsc_t` variable or a path to an image (not an `lv_img` object) - */ -const void * lv_slider_get_knob_img(lv_obj_t * slider, const void * img_src); - /** * Get the animation time of the slider * @param slider pointer to a slider object @@ -207,7 +200,7 @@ static inline lv_slider_type_t lv_slider_get_type(lv_obj_t * slider) { lv_bar_type_t type = lv_bar_get_type(slider); if(type == LV_BAR_TYPE_SYMMETRICAL) - return LV_SLIDER_TYPE_SYM; + return LV_SLIDER_TYPE_SYMMETRICAL; else if(type == LV_BAR_TYPE_CUSTOM) return LV_SLIDER_TYPE_RANGE; else diff --git a/src/lv_widgets/lv_spinbox.c b/src/lv_widgets/lv_spinbox.c index 93ca77f24..6d9a98227 100644 --- a/src/lv_widgets/lv_spinbox.c +++ b/src/lv_widgets/lv_spinbox.c @@ -105,7 +105,7 @@ lv_obj_t * lv_spinbox_create(lv_obj_t * par, const lv_obj_t * copy) /*Refresh the style with new signal function*/ - lv_obj_refresh_style(spinbox); + lv_obj_refresh_style(spinbox, LV_STYLE_PROP_ALL); } lv_spinbox_updatevalue(spinbox); diff --git a/src/lv_widgets/lv_spinner.c b/src/lv_widgets/lv_spinner.c index 60df1768d..2f7186a24 100644 --- a/src/lv_widgets/lv_spinner.c +++ b/src/lv_widgets/lv_spinner.c @@ -1,5 +1,5 @@ /** - * @file lv_preload.c + * @file lv_spinner.c * */ @@ -39,7 +39,7 @@ /********************** * STATIC PROTOTYPES **********************/ -static lv_res_t lv_spinner_signal(lv_obj_t * preload, lv_signal_t sign, void * param); +static lv_res_t lv_spinner_signal(lv_obj_t * spinner, lv_signal_t sign, void * param); /********************** * STATIC VARIABLES @@ -64,23 +64,23 @@ static lv_design_cb_t ancestor_design; */ lv_obj_t * lv_spinner_create(lv_obj_t * par, const lv_obj_t * copy) { - LV_LOG_TRACE("preload create started"); + LV_LOG_TRACE("spinner create started"); /*Create the ancestor of pre loader*/ - lv_obj_t * preload = lv_arc_create(par, copy); - LV_ASSERT_MEM(preload); - if(preload == NULL) return NULL; + lv_obj_t * spinner = lv_arc_create(par, copy); + LV_ASSERT_MEM(spinner); + if(spinner == NULL) return NULL; /*Allocate the pre loader type specific extended data*/ - lv_spinner_ext_t * ext = lv_obj_allocate_ext_attr(preload, sizeof(lv_spinner_ext_t)); + lv_spinner_ext_t * ext = lv_obj_allocate_ext_attr(spinner, sizeof(lv_spinner_ext_t)); LV_ASSERT_MEM(ext); if(ext == NULL) { - lv_obj_del(preload); + lv_obj_del(spinner); return NULL; } - if(ancestor_signal == NULL) ancestor_signal = lv_obj_get_signal_cb(preload); - if(ancestor_design == NULL) ancestor_design = lv_obj_get_design_cb(preload); + if(ancestor_signal == NULL) ancestor_signal = lv_obj_get_signal_cb(spinner); + if(ancestor_design == NULL) ancestor_design = lv_obj_get_design_cb(spinner); /*Initialize the allocated 'ext' */ ext->arc_length = LV_SPINNER_DEF_ARC_LENGTH; @@ -89,14 +89,14 @@ lv_obj_t * lv_spinner_create(lv_obj_t * par, const lv_obj_t * copy) ext->time = LV_SPINNER_DEF_SPIN_TIME; /*The signal and design functions are not copied so set them here*/ - lv_obj_set_signal_cb(preload, lv_spinner_signal); + lv_obj_set_signal_cb(spinner, lv_spinner_signal); /*Init the new spinner spinner*/ if(copy == NULL) { ext->arc.bg_angle_start = 0; ext->arc.bg_angle_end = 360; - lv_obj_set_size(preload, LV_DPI, LV_DPI); - lv_theme_apply(preload, LV_THEME_SPINNER); + lv_obj_set_size(spinner, LV_DPI, LV_DPI); + lv_theme_apply(spinner, LV_THEME_SPINNER); } /*Copy an existing spinner*/ @@ -106,14 +106,14 @@ lv_obj_t * lv_spinner_create(lv_obj_t * par, const lv_obj_t * copy) ext->time = copy_ext->time; ext->anim_dir = copy_ext->anim_dir; /*Refresh the style with new signal function*/ - lv_obj_refresh_style(preload); + lv_obj_refresh_style(spinner, LV_STYLE_PROP_ALL); } - lv_spinner_set_type(preload, ext->anim_type); + lv_spinner_set_type(spinner, ext->anim_type); - LV_LOG_INFO("preload created"); + LV_LOG_INFO("spinner created"); - return preload; + return spinner; } /*====================== @@ -122,55 +122,55 @@ lv_obj_t * lv_spinner_create(lv_obj_t * par, const lv_obj_t * copy) /** * Set the length of the spinning arc in degrees - * @param preload pointer to a preload object + * @param spinner pointer to a spinner object * @param deg length of the arc */ -void lv_spinner_set_arc_length(lv_obj_t * preload, lv_anim_value_t deg) +void lv_spinner_set_arc_length(lv_obj_t * spinner, lv_anim_value_t deg) { - LV_ASSERT_OBJ(preload, LV_OBJX_NAME); + LV_ASSERT_OBJ(spinner, LV_OBJX_NAME); - lv_spinner_ext_t * ext = lv_obj_get_ext_attr(preload); + lv_spinner_ext_t * ext = lv_obj_get_ext_attr(spinner); ext->arc_length = deg; } /** * Set the spin time of the arc - * @param preload pointer to a preload object + * @param spinner pointer to a spinner object * @param time time of one round in milliseconds */ -void lv_spinner_set_spin_time(lv_obj_t * preload, uint16_t time) +void lv_spinner_set_spin_time(lv_obj_t * spinner, uint16_t time) { - LV_ASSERT_OBJ(preload, LV_OBJX_NAME); + LV_ASSERT_OBJ(spinner, LV_OBJX_NAME); - lv_spinner_ext_t * ext = lv_obj_get_ext_attr(preload); + lv_spinner_ext_t * ext = lv_obj_get_ext_attr(spinner); ext->time = time; - lv_spinner_set_type(preload, ext->anim_type); + lv_spinner_set_type(spinner, ext->anim_type); } /*===================== * Setter functions *====================*/ /** - * Set the animation type of a preloadeer. - * @param preload pointer to pre loader object - * @param type animation type of the preload + * Set the animation type of a spinnereer. + * @param spinner pointer to pre loader object + * @param type animation type of the spinner * */ -void lv_spinner_set_type(lv_obj_t * preload, lv_spinner_type_t type) +void lv_spinner_set_type(lv_obj_t * spinner, lv_spinner_type_t type) { - LV_ASSERT_OBJ(preload, LV_OBJX_NAME); + LV_ASSERT_OBJ(spinner, LV_OBJX_NAME); - lv_spinner_ext_t * ext = lv_obj_get_ext_attr(preload); + lv_spinner_ext_t * ext = lv_obj_get_ext_attr(spinner); /*delete previous animation*/ - lv_anim_del(preload, NULL); + lv_anim_del(spinner, NULL); switch(type) { case LV_SPINNER_TYPE_FILLSPIN_ARC: { ext->anim_type = LV_SPINNER_TYPE_FILLSPIN_ARC; lv_anim_t a; lv_anim_init(&a); - lv_anim_set_var(&a, preload); + lv_anim_set_var(&a, spinner); lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)lv_spinner_anim_cb); lv_anim_set_path_cb(&a, lv_anim_path_ease_in_out); lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINIT); @@ -193,7 +193,7 @@ void lv_spinner_set_type(lv_obj_t * preload, lv_spinner_type_t type) ext->anim_type = type; lv_anim_t a; lv_anim_init(&a); - lv_anim_set_var(&a, preload); + lv_anim_set_var(&a, spinner); lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)lv_spinner_anim_cb); lv_anim_set_time(&a, ext->time); lv_anim_set_path_cb(&a, (LV_SPINNER_TYPE_CONSTANT_ARC == type ? lv_anim_path_linear : lv_anim_path_ease_in_out)); @@ -206,14 +206,14 @@ void lv_spinner_set_type(lv_obj_t * preload, lv_spinner_type_t type) } } -void lv_spinner_set_dir(lv_obj_t * preload, lv_spinner_dir_t dir) +void lv_spinner_set_dir(lv_obj_t * spinner, lv_spinner_dir_t dir) { - LV_ASSERT_OBJ(preload, LV_OBJX_NAME); + LV_ASSERT_OBJ(spinner, LV_OBJX_NAME); - lv_spinner_ext_t * ext = lv_obj_get_ext_attr(preload); + lv_spinner_ext_t * ext = lv_obj_get_ext_attr(spinner); ext->anim_dir = dir; - lv_spinner_set_type(preload, ext->anim_type); + lv_spinner_set_type(spinner, ext->anim_type); } /*===================== @@ -222,44 +222,44 @@ void lv_spinner_set_dir(lv_obj_t * preload, lv_spinner_dir_t dir) /** * Get the arc length [degree] of the a pre loader - * @param preload pointer to a pre loader object + * @param spinner pointer to a pre loader object */ -lv_anim_value_t lv_spinner_get_arc_length(const lv_obj_t * preload) +lv_anim_value_t lv_spinner_get_arc_length(const lv_obj_t * spinner) { - LV_ASSERT_OBJ(preload, LV_OBJX_NAME); + LV_ASSERT_OBJ(spinner, LV_OBJX_NAME); - lv_spinner_ext_t * ext = lv_obj_get_ext_attr(preload); + lv_spinner_ext_t * ext = lv_obj_get_ext_attr(spinner); return ext->arc_length; } /** * Get the spin time of the arc - * @param preload pointer to a pre loader object [milliseconds] + * @param spinner pointer to a pre loader object [milliseconds] */ -uint16_t lv_spinner_get_spin_time(const lv_obj_t * preload) +uint16_t lv_spinner_get_spin_time(const lv_obj_t * spinner) { - LV_ASSERT_OBJ(preload, LV_OBJX_NAME); + LV_ASSERT_OBJ(spinner, LV_OBJX_NAME); - lv_spinner_ext_t * ext = lv_obj_get_ext_attr(preload); + lv_spinner_ext_t * ext = lv_obj_get_ext_attr(spinner); return ext->time; } /** - * Get the animation type of a preloadeer. - * @param preload pointer to pre loader object + * Get the animation type of a spinnereer. + * @param spinner pointer to pre loader object * @return animation type * */ -lv_spinner_type_t lv_spinner_get_type(lv_obj_t * preload) +lv_spinner_type_t lv_spinner_get_type(lv_obj_t * spinner) { - LV_ASSERT_OBJ(preload, LV_OBJX_NAME); + LV_ASSERT_OBJ(spinner, LV_OBJX_NAME); - lv_spinner_ext_t * ext = lv_obj_get_ext_attr(preload); + lv_spinner_ext_t * ext = lv_obj_get_ext_attr(spinner); return ext->anim_type; } -lv_spinner_dir_t lv_spinner_get_dir(lv_obj_t * preload) +lv_spinner_dir_t lv_spinner_get_dir(lv_obj_t * spinner) { - lv_spinner_ext_t * ext = lv_obj_get_ext_attr(preload); + lv_spinner_ext_t * ext = lv_obj_get_ext_attr(spinner); return ext->anim_dir; } @@ -274,8 +274,8 @@ lv_spinner_dir_t lv_spinner_get_dir(lv_obj_t * preload) */ void lv_spinner_anim_cb(void * ptr, lv_anim_value_t val) { - lv_obj_t * preload = ptr; - lv_spinner_ext_t * ext = lv_obj_get_ext_attr(preload); + lv_obj_t * spinner = ptr; + lv_spinner_ext_t * ext = lv_obj_get_ext_attr(spinner); int16_t angle_start = val - ext->arc_length / 2 - 90; if(angle_start < 0) angle_start += 360; @@ -284,7 +284,7 @@ void lv_spinner_anim_cb(void * ptr, lv_anim_value_t val) angle_start = angle_start % 360; angle_end = angle_end % 360; - lv_arc_set_angles(preload, angle_start, angle_end); + lv_arc_set_angles(spinner, angle_start, angle_end); } /********************** @@ -293,17 +293,17 @@ void lv_spinner_anim_cb(void * ptr, lv_anim_value_t val) /** * Signal function of the pre loader - * @param preload pointer to a pre loader object + * @param spinner pointer to a pre loader object * @param sign a signal type from lv_signal_t enum * @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_spinner_signal(lv_obj_t * preload, lv_signal_t sign, void * param) +static lv_res_t lv_spinner_signal(lv_obj_t * spinner, lv_signal_t sign, void * param) { lv_res_t res; /* Include the ancient signal function */ - res = ancestor_signal(preload, sign, param); + res = ancestor_signal(spinner, 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); diff --git a/src/lv_widgets/lv_spinner.h b/src/lv_widgets/lv_spinner.h index daa3361fb..5ee51f1ee 100644 --- a/src/lv_widgets/lv_spinner.h +++ b/src/lv_widgets/lv_spinner.h @@ -70,7 +70,7 @@ typedef struct { /*Parts of the spinner*/ enum { LV_SPINNER_PART_BG = LV_ARC_PART_BG, - LV_SPINNER_PART_ARC = LV_ARC_PART_INDIC, + LV_SPINNER_PART_INDIC = LV_ARC_PART_INDIC, _LV_SPINNER_PART_VIRTUAL_LAST, _LV_SPINNER_PART_REAL_LAST = _LV_ARC_PART_REAL_LAST, diff --git a/src/lv_widgets/lv_switch.c b/src/lv_widgets/lv_switch.c index 50fdfa61d..997f3c011 100644 --- a/src/lv_widgets/lv_switch.c +++ b/src/lv_widgets/lv_switch.c @@ -99,7 +99,7 @@ lv_obj_t * lv_switch_create(lv_obj_t * par, const lv_obj_t * copy) lv_switch_ext_t * copy_ext = lv_obj_get_ext_attr(copy); lv_style_list_copy(&ext->style_knob, ©_ext->style_knob); - lv_obj_refresh_style(sw); + lv_obj_refresh_style(sw, LV_STYLE_PROP_ALL); } /*Refresh the style with new signal function*/ diff --git a/src/lv_widgets/lv_table.c b/src/lv_widgets/lv_table.c index 41e8ff899..41ee3bffd 100644 --- a/src/lv_widgets/lv_table.c +++ b/src/lv_widgets/lv_table.c @@ -108,7 +108,7 @@ lv_obj_t * lv_table_create(lv_obj_t * par, const lv_obj_t * copy) } /*Refresh the style with new signal function*/ - lv_obj_refresh_style(table); + lv_obj_refresh_style(table, LV_STYLE_PROP_ALL); } LV_LOG_INFO("table created"); @@ -162,6 +162,8 @@ void lv_table_set_cell_value(lv_obj_t * table, uint16_t row, uint16_t col, const } ext->cell_data[cell] = lv_mem_realloc(ext->cell_data[cell], strlen(txt) + 2); /*+1: trailing '\0; +1: format byte*/ + LV_ASSERT_MEM(ext->cell_data[cell]); + if(ext->cell_data[cell] == NULL) return; strcpy(ext->cell_data[cell] + 1, txt); /*+1 to skip the format byte*/ ext->cell_data[cell][0] = format.format_byte; @@ -742,7 +744,6 @@ static lv_design_res_t lv_table_design(lv_obj_t * table, const lv_area_t * clip_ lv_point_t p2; p1.x = cell_area.x1; p2.x = cell_area.x2; - uint16_t i; for(i = 1; ext->cell_data[cell][i] != '\0'; i++) { if(ext->cell_data[cell][i] == '\n') { ext->cell_data[cell][i] = '\0'; diff --git a/src/lv_widgets/lv_tabview.c b/src/lv_widgets/lv_tabview.c index 93b04aa7d..e506017d3 100644 --- a/src/lv_widgets/lv_tabview.c +++ b/src/lv_widgets/lv_tabview.c @@ -95,7 +95,7 @@ lv_obj_t * lv_tabview_create(lv_obj_t * par, const lv_obj_t * copy) ext->content = NULL; ext->indic = NULL; ext->btns = NULL; - ext->btns_pos = LV_TABVIEW_BTNS_POS_TOP; + ext->btns_pos = LV_TABVIEW_TAB_POS_TOP; #if LV_USE_ANIMATION ext->anim_time = LV_TABVIEW_DEF_ANIM_TIME; #endif @@ -140,7 +140,7 @@ lv_obj_t * lv_tabview_create(lv_obj_t * par, const lv_obj_t * copy) lv_page_set_scrl_fit2(ext->content, LV_FIT_TIGHT, LV_FIT_PARENT); lv_page_set_scrl_layout(ext->content, LV_LAYOUT_ROW_TOP); - lv_page_set_sb_mode(ext->content, LV_SB_MODE_OFF); + lv_page_set_scrlbar_mode(ext->content, LV_SCRLBAR_MODE_OFF); lv_obj_clean_style_list(ext->content, LV_PAGE_PART_BG); @@ -180,11 +180,11 @@ lv_obj_t * lv_tabview_create(lv_obj_t * par, const lv_obj_t * copy) LV_PAGE_PART_SCRL)); lv_style_list_copy(lv_obj_get_style_list(new_tab, LV_PAGE_PART_SCRLBAR), lv_obj_get_style_list(copy_tab, LV_PAGE_PART_SCRLBAR)); - lv_obj_refresh_style(new_tab); + lv_obj_refresh_style(new_tab, LV_STYLE_PROP_ALL); } /*Refresh the style with new signal function*/ - lv_obj_refresh_style(tabview); + lv_obj_refresh_style(tabview, LV_STYLE_PROP_ALL); } tabview_realign(tabview); @@ -226,7 +226,7 @@ lv_obj_t * lv_tabview_add_tab(lv_obj_t * tabview, const char * name) /*Create the container page*/ lv_obj_t * h = lv_page_create(ext->content, NULL); lv_obj_set_size(h, lv_obj_get_width(tabview), lv_obj_get_height(ext->content)); - lv_page_set_sb_mode(h, LV_SB_MODE_AUTO); + lv_page_set_scrlbar_mode(h, LV_SCRLBAR_MODE_AUTO); lv_page_set_scroll_propagation(h, true); lv_theme_apply(h, LV_THEME_TABVIEW_PAGE); @@ -242,12 +242,12 @@ lv_obj_t * lv_tabview_add_tab(lv_obj_t * tabview, const char * name) ext->tab_cnt++; switch(ext->btns_pos) { - case LV_TABVIEW_BTNS_POS_TOP: - case LV_TABVIEW_BTNS_POS_BOTTOM: + case LV_TABVIEW_TAB_POS_TOP: + case LV_TABVIEW_TAB_POS_BOTTOM: ext->tab_name_ptr = lv_mem_realloc((void *)ext->tab_name_ptr, sizeof(char *) * (ext->tab_cnt + 1)); break; - case LV_TABVIEW_BTNS_POS_LEFT: - case LV_TABVIEW_BTNS_POS_RIGHT: + case LV_TABVIEW_TAB_POS_LEFT: + case LV_TABVIEW_TAB_POS_RIGHT: ext->tab_name_ptr = lv_mem_realloc((void *)ext->tab_name_ptr, sizeof(char *) * (ext->tab_cnt * 2)); break; } @@ -261,9 +261,9 @@ lv_obj_t * lv_tabview_add_tab(lv_obj_t * tabview, const char * name) */ switch(ext->btns_pos) { default: /*default case is prevented in lv_tabview_set_btns_pos(), but here for safety*/ - case LV_TABVIEW_BTNS_POS_NONE: - case LV_TABVIEW_BTNS_POS_TOP: - case LV_TABVIEW_BTNS_POS_BOTTOM: + case LV_TABVIEW_TAB_POS_NONE: + case LV_TABVIEW_TAB_POS_TOP: + case LV_TABVIEW_TAB_POS_BOTTOM: ext->tab_name_ptr = lv_mem_realloc(ext->tab_name_ptr, sizeof(char *) * (ext->tab_cnt + 1)); LV_ASSERT_MEM(ext->tab_name_ptr); @@ -273,8 +273,8 @@ lv_obj_t * lv_tabview_add_tab(lv_obj_t * tabview, const char * name) ext->tab_name_ptr[ext->tab_cnt] = ""; break; - case LV_TABVIEW_BTNS_POS_LEFT: - case LV_TABVIEW_BTNS_POS_RIGHT: + case LV_TABVIEW_TAB_POS_LEFT: + case LV_TABVIEW_TAB_POS_RIGHT: ext->tab_name_ptr = lv_mem_realloc(ext->tab_name_ptr, sizeof(char *) * (ext->tab_cnt * 2)); LV_ASSERT_MEM(ext->tab_name_ptr); @@ -345,13 +345,13 @@ void lv_tabview_set_tab_act(lv_obj_t * tabview, uint16_t id, lv_anim_enable_t an switch(ext->btns_pos) { default: /*default case is prevented in lv_tabview_set_btns_pos(), but here for safety*/ - case LV_TABVIEW_BTNS_POS_NONE: - case LV_TABVIEW_BTNS_POS_TOP: - case LV_TABVIEW_BTNS_POS_BOTTOM: + case LV_TABVIEW_TAB_POS_NONE: + case LV_TABVIEW_TAB_POS_TOP: + case LV_TABVIEW_TAB_POS_BOTTOM: cont_x = -(lv_obj_get_width(tabview) * id + scrl_inner * id + scrl_left); break; - case LV_TABVIEW_BTNS_POS_LEFT: - case LV_TABVIEW_BTNS_POS_RIGHT: + case LV_TABVIEW_TAB_POS_LEFT: + case LV_TABVIEW_TAB_POS_RIGHT: cont_x = -((lv_obj_get_width(tabview) - lv_obj_get_width(ext->btns)) * id + scrl_inner * id + scrl_left); break; } @@ -375,21 +375,25 @@ void lv_tabview_set_tab_act(lv_obj_t * tabview, uint16_t id, lv_anim_enable_t an lv_coord_t indic_size; lv_coord_t indic_pos = 0; /*silence uninitialized variable warning*/; - lv_style_int_t btns_bg_inner = lv_obj_get_style_pad_inner(tabview, LV_TABVIEW_PART_TAB_BG); - lv_style_int_t btns_bg_left = lv_obj_get_style_pad_left(tabview, LV_TABVIEW_PART_TAB_BG); - lv_style_int_t btns_bg_top = lv_obj_get_style_pad_top(tabview, LV_TABVIEW_PART_TAB_BG); + lv_style_int_t btns_bg_inner = 0; + lv_style_int_t btns_bg_left = 0; + lv_style_int_t btns_bg_top = 0; switch(ext->btns_pos) { default: /*default case is prevented in lv_tabview_set_btns_pos(), but here for safety*/ - case LV_TABVIEW_BTNS_POS_NONE: + case LV_TABVIEW_TAB_POS_NONE: break; - case LV_TABVIEW_BTNS_POS_TOP: - case LV_TABVIEW_BTNS_POS_BOTTOM: + case LV_TABVIEW_TAB_POS_TOP: + case LV_TABVIEW_TAB_POS_BOTTOM: + btns_bg_inner = lv_obj_get_style_pad_inner(tabview, LV_TABVIEW_PART_TAB_BG); + btns_bg_left = lv_obj_get_style_pad_left(tabview, LV_TABVIEW_PART_TAB_BG); indic_size = lv_obj_get_width(ext->indic); indic_pos = indic_size * id + btns_bg_inner * id + btns_bg_left; break; - case LV_TABVIEW_BTNS_POS_LEFT: - case LV_TABVIEW_BTNS_POS_RIGHT: + case LV_TABVIEW_TAB_POS_LEFT: + case LV_TABVIEW_TAB_POS_RIGHT: + btns_bg_inner = lv_obj_get_style_pad_inner(tabview, LV_TABVIEW_PART_TAB_BG); + btns_bg_top = lv_obj_get_style_pad_top(tabview, LV_TABVIEW_PART_TAB_BG); indic_size = lv_obj_get_height(ext->indic); indic_pos = btns_bg_top + id * (indic_size + btns_bg_inner); break; @@ -401,14 +405,14 @@ void lv_tabview_set_tab_act(lv_obj_t * tabview, uint16_t id, lv_anim_enable_t an { switch(ext->btns_pos) { default: /*default case is prevented in lv_tabview_set_btns_pos(), but here for safety*/ - case LV_TABVIEW_BTNS_POS_NONE: + case LV_TABVIEW_TAB_POS_NONE: break; - case LV_TABVIEW_BTNS_POS_TOP: - case LV_TABVIEW_BTNS_POS_BOTTOM: + case LV_TABVIEW_TAB_POS_TOP: + case LV_TABVIEW_TAB_POS_BOTTOM: lv_obj_set_x(ext->indic, indic_pos); break; - case LV_TABVIEW_BTNS_POS_LEFT: - case LV_TABVIEW_BTNS_POS_RIGHT: + case LV_TABVIEW_TAB_POS_LEFT: + case LV_TABVIEW_TAB_POS_RIGHT: lv_obj_set_y(ext->indic, indic_pos); break; } @@ -422,15 +426,15 @@ void lv_tabview_set_tab_act(lv_obj_t * tabview, uint16_t id, lv_anim_enable_t an switch(ext->btns_pos) { default: /*default case is prevented in lv_tabview_set_btns_pos(), but here for safety*/ - case LV_TABVIEW_BTNS_POS_NONE: + case LV_TABVIEW_TAB_POS_NONE: break; - case LV_TABVIEW_BTNS_POS_TOP: - case LV_TABVIEW_BTNS_POS_BOTTOM: + case LV_TABVIEW_TAB_POS_TOP: + case LV_TABVIEW_TAB_POS_BOTTOM: lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)lv_obj_set_x); lv_anim_set_values(&a, lv_obj_get_x(ext->indic), indic_pos); break; - case LV_TABVIEW_BTNS_POS_LEFT: - case LV_TABVIEW_BTNS_POS_RIGHT: + case LV_TABVIEW_TAB_POS_LEFT: + case LV_TABVIEW_TAB_POS_RIGHT: lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)lv_obj_set_y); lv_anim_set_values(&a, lv_obj_get_y(ext->indic), indic_pos); break; @@ -468,11 +472,11 @@ void lv_tabview_set_anim_time(lv_obj_t * tabview, uint16_t anim_time) */ void lv_tabview_set_btns_pos(lv_obj_t * tabview, lv_tabview_btns_pos_t btns_pos) { - if(btns_pos != LV_TABVIEW_BTNS_POS_NONE && - btns_pos != LV_TABVIEW_BTNS_POS_TOP && - btns_pos != LV_TABVIEW_BTNS_POS_BOTTOM && - btns_pos != LV_TABVIEW_BTNS_POS_LEFT && - btns_pos != LV_TABVIEW_BTNS_POS_RIGHT) { + if(btns_pos != LV_TABVIEW_TAB_POS_NONE && + btns_pos != LV_TABVIEW_TAB_POS_TOP && + btns_pos != LV_TABVIEW_TAB_POS_BOTTOM && + btns_pos != LV_TABVIEW_TAB_POS_LEFT && + btns_pos != LV_TABVIEW_TAB_POS_RIGHT) { LV_LOG_WARN("lv_tabview_set_btns_pos: unexpected button position"); return; } @@ -645,10 +649,16 @@ static lv_res_t lv_tabview_signal(lv_obj_t * tabview, lv_signal_t sign, void * p if(sign == LV_SIGNAL_FOCUS || sign == LV_SIGNAL_DEFOCUS || sign == LV_SIGNAL_CONTROL || sign == LV_SIGNAL_PRESSED || sign == LV_SIGNAL_RELEASED) { + /* The button matrix is not in a group (the tab view is in it) but it should handle the * group signals. So propagate the related signals to the button matrix manually*/ if(ext->btns) { ext->btns->signal_cb(ext->btns, sign, param); + + /*Make the active tab's button focused*/ + if(sign == LV_SIGNAL_FOCUS) { + lv_btnmatrix_set_focused_btn(ext->btns, ext->tab_cur); + } } } @@ -716,7 +726,7 @@ static lv_res_t tabview_scrl_signal(lv_obj_t * tabview_scrl, lv_signal_t sign, v lv_tabview_set_tab_act(tabview, tab_cur, LV_ANIM_ON); uint32_t id_new = lv_tabview_get_tab_act(tabview); - if(id_prev != id_new) res = lv_event_send(tabview, LV_EVENT_VALUE_CHANGED, &id_new); + if(id_prev != id_new) res = lv_event_send(tabview, LV_EVENT_VALUE_CHANGED, &id_prev); if(res != LV_RES_OK) return res; } @@ -804,8 +814,6 @@ static void tabview_realign(lv_obj_t * tabview) lv_tabview_set_tab_act(tabview, ext->tab_cur, LV_ANIM_OFF); } - - static void refr_indic_size(lv_obj_t * tabview) { lv_tabview_ext_t * ext = lv_obj_get_ext_attr(tabview); @@ -819,13 +827,13 @@ static void refr_indic_size(lv_obj_t * tabview) switch(ext->btns_pos) { default: /*default case is prevented in lv_tabview_set_btns_pos(), but here for safety*/ - case LV_TABVIEW_BTNS_POS_NONE: + case LV_TABVIEW_TAB_POS_NONE: lv_obj_set_hidden(ext->indic, true); indic_w = 0; indic_h = 0; break; - case LV_TABVIEW_BTNS_POS_TOP: - case LV_TABVIEW_BTNS_POS_BOTTOM: + case LV_TABVIEW_TAB_POS_TOP: + case LV_TABVIEW_TAB_POS_BOTTOM: lv_obj_set_hidden(ext->indic, false); if(ext->tab_cnt) { indic_h = indic_size; @@ -836,8 +844,8 @@ static void refr_indic_size(lv_obj_t * tabview) indic_h = 0; } break; - case LV_TABVIEW_BTNS_POS_LEFT: - case LV_TABVIEW_BTNS_POS_RIGHT: + case LV_TABVIEW_TAB_POS_LEFT: + case LV_TABVIEW_TAB_POS_RIGHT: lv_obj_set_hidden(ext->indic, false); if(ext->tab_cnt) { indic_w = indic_size; @@ -877,20 +885,20 @@ static void refr_btns_size(lv_obj_t * tabview) switch(ext->btns_pos) { default: /*default case is prevented in lv_tabview_set_btns_pos(), but here for safety*/ - case LV_TABVIEW_BTNS_POS_NONE: + case LV_TABVIEW_TAB_POS_NONE: btns_w = 0; btns_h = 0; lv_obj_set_hidden(ext->btns, true); break; - case LV_TABVIEW_BTNS_POS_TOP: - case LV_TABVIEW_BTNS_POS_BOTTOM: + case LV_TABVIEW_TAB_POS_TOP: + case LV_TABVIEW_TAB_POS_BOTTOM: lv_obj_set_hidden(ext->btns, false); btns_h = lv_font_get_line_height(font) + tab_top + tab_bottom + tab_bg_top + tab_bg_bottom; btns_w = lv_obj_get_width(tabview); break; - case LV_TABVIEW_BTNS_POS_LEFT: - case LV_TABVIEW_BTNS_POS_RIGHT: + case LV_TABVIEW_TAB_POS_LEFT: + case LV_TABVIEW_TAB_POS_RIGHT: lv_obj_set_hidden(ext->btns, false); btns_w = lv_font_get_glyph_width(font, 'A', '\0') + tab_left + tab_right + tab_bg_left + tab_bg_right; @@ -909,17 +917,17 @@ static void refr_content_size(lv_obj_t * tabview) switch(ext->btns_pos) { default: /*default case is prevented in lv_tabview_set_btns_pos(), but here for safety*/ - case LV_TABVIEW_BTNS_POS_NONE: + case LV_TABVIEW_TAB_POS_NONE: cont_w = lv_obj_get_width(tabview); cont_h = lv_obj_get_height(tabview); break; - case LV_TABVIEW_BTNS_POS_TOP: - case LV_TABVIEW_BTNS_POS_BOTTOM: + case LV_TABVIEW_TAB_POS_TOP: + case LV_TABVIEW_TAB_POS_BOTTOM: cont_w = lv_obj_get_width(tabview); cont_h = lv_obj_get_height(tabview) - lv_obj_get_height(ext->btns); break; - case LV_TABVIEW_BTNS_POS_LEFT: - case LV_TABVIEW_BTNS_POS_RIGHT: + case LV_TABVIEW_TAB_POS_LEFT: + case LV_TABVIEW_TAB_POS_RIGHT: cont_w = lv_obj_get_width(tabview) - lv_obj_get_width(ext->btns); cont_h = lv_obj_get_height(tabview); break; @@ -948,25 +956,25 @@ static void refr_align(lv_obj_t * tabview) switch(ext->btns_pos) { default: /*default case is prevented in lv_tabview_set_btns_pos(), but here for safety*/ - case LV_TABVIEW_BTNS_POS_NONE: + case LV_TABVIEW_TAB_POS_NONE: lv_obj_align(ext->content, NULL, LV_ALIGN_IN_TOP_LEFT, 0, 0); break; - case LV_TABVIEW_BTNS_POS_TOP: + case LV_TABVIEW_TAB_POS_TOP: lv_obj_align(ext->btns, NULL, LV_ALIGN_IN_TOP_LEFT, 0, 0); lv_obj_align(ext->content, ext->btns, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 0); lv_obj_align(ext->indic, ext->btns, LV_ALIGN_IN_BOTTOM_LEFT, 0, 0); break; - case LV_TABVIEW_BTNS_POS_BOTTOM: + case LV_TABVIEW_TAB_POS_BOTTOM: lv_obj_align(ext->content, NULL, LV_ALIGN_IN_TOP_LEFT, 0, 0); lv_obj_align(ext->btns, ext->content, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 0); lv_obj_align(ext->indic, ext->btns, LV_ALIGN_IN_TOP_LEFT, 0, 0); break; - case LV_TABVIEW_BTNS_POS_LEFT: + case LV_TABVIEW_TAB_POS_LEFT: lv_obj_align(ext->btns, NULL, LV_ALIGN_IN_TOP_LEFT, 0, 0); lv_obj_align(ext->content, tabview, LV_ALIGN_IN_TOP_LEFT, lv_obj_get_width(ext->btns), 0); lv_obj_align(ext->indic, ext->btns, LV_ALIGN_IN_TOP_RIGHT, 0, 0); break; - case LV_TABVIEW_BTNS_POS_RIGHT: + case LV_TABVIEW_TAB_POS_RIGHT: lv_obj_align(ext->btns, NULL, LV_ALIGN_IN_TOP_RIGHT, 0, 0); lv_obj_align(ext->content, tabview, LV_ALIGN_IN_TOP_LEFT, 0, 0); lv_obj_align(ext->indic, ext->btns, LV_ALIGN_IN_TOP_LEFT, 0, 0); diff --git a/src/lv_widgets/lv_tabview.h b/src/lv_widgets/lv_tabview.h index f966096c3..fc6bc85a4 100644 --- a/src/lv_widgets/lv_tabview.h +++ b/src/lv_widgets/lv_tabview.h @@ -40,11 +40,11 @@ extern "C" { /** Position of tabview buttons. */ enum { - LV_TABVIEW_BTNS_POS_NONE, - LV_TABVIEW_BTNS_POS_TOP, - LV_TABVIEW_BTNS_POS_BOTTOM, - LV_TABVIEW_BTNS_POS_LEFT, - LV_TABVIEW_BTNS_POS_RIGHT + LV_TABVIEW_TAB_POS_NONE, + LV_TABVIEW_TAB_POS_TOP, + LV_TABVIEW_TAB_POS_BOTTOM, + LV_TABVIEW_TAB_POS_LEFT, + LV_TABVIEW_TAB_POS_RIGHT }; typedef uint8_t lv_tabview_btns_pos_t; @@ -70,8 +70,8 @@ enum { _LV_TABVIEW_PART_VIRTUAL_LAST = _LV_OBJ_PART_VIRTUAL_LAST, LV_TABVIEW_PART_BG_SCRL = _LV_OBJ_PART_REAL_LAST, - LV_TABVIEW_PART_TAB_BTN, LV_TABVIEW_PART_TAB_BG, + LV_TABVIEW_PART_TAB_BTN, LV_TABVIEW_PART_INDIC, _LV_TABVIEW_PART_REAL_LAST, }; diff --git a/src/lv_widgets/lv_textarea.c b/src/lv_widgets/lv_textarea.c index 78cf2ce71..5315190b8 100644 --- a/src/lv_widgets/lv_textarea.c +++ b/src/lv_widgets/lv_textarea.c @@ -149,7 +149,7 @@ lv_obj_t * lv_textarea_create(lv_obj_t * par, const lv_obj_t * copy) lv_label_set_text(ext->label, "Text area"); lv_obj_set_click(ext->label, false); lv_obj_set_size(ta, LV_TEXTAREA_DEF_WIDTH, LV_TEXTAREA_DEF_HEIGHT); - lv_textarea_set_sb_mode(ta, LV_SB_MODE_DRAG); + lv_textarea_set_sb_mode(ta, LV_SCRLBAR_MODE_DRAG); lv_obj_reset_style_list(ta, LV_PAGE_PART_SCRL); lv_theme_apply(ta, LV_THEME_TEXTAREA); @@ -188,7 +188,7 @@ lv_obj_t * lv_textarea_create(lv_obj_t * par, const lv_obj_t * copy) if(copy_ext->one_line) lv_textarea_set_one_line(ta, true); /*Refresh the style with new signal function*/ - lv_obj_refresh_style(ta); + lv_obj_refresh_style(ta, LV_STYLE_PROP_ALL); } #if LV_USE_ANIMATION @@ -348,8 +348,8 @@ void lv_textarea_add_text(lv_obj_t * ta, const char * txt) /*If the textarea is empty, invalidate it to hide the placeholder*/ if(ext->placeholder_txt) { - const char * txt = lv_label_get_text(ext->label); - if(txt[0] == '\0') lv_obj_invalidate(ta); + const char * txt_act = lv_label_get_text(ext->label); + if(txt_act[0] == '\0') lv_obj_invalidate(ta); } /*Insert the text*/ @@ -504,8 +504,8 @@ void lv_textarea_set_text(lv_obj_t * ta, const char * txt) /*If the textarea is empty, invalidate it to hide the placeholder*/ if(ext->placeholder_txt) { - const char * txt = lv_label_get_text(ext->label); - if(txt[0] == '\0') lv_obj_invalidate(ta); + const char * txt_act = lv_label_get_text(ext->label); + if(txt_act[0] == '\0') lv_obj_invalidate(ta); } /*Don't let 'width == 0' because the cursor will not be visible*/ @@ -1467,29 +1467,6 @@ static lv_res_t lv_textarea_signal(lv_obj_t * ta, lv_signal_t sign, void * param bool * editable = (bool *)param; *editable = true; } - else if(sign == LV_SIGNAL_DEFOCUS) { -#if LV_USE_GROUP - if(lv_obj_get_group(ta)) { - lv_textarea_set_cursor_hidden(ta, true); - } -#endif - } - else if(sign == LV_SIGNAL_FOCUS) { -#if LV_USE_GROUP - lv_group_t * g = lv_obj_get_group(ta); - bool editing = lv_group_get_editing(g); - lv_indev_type_t indev_type = lv_indev_get_type(lv_indev_get_act()); - - /*Encoders need special handling*/ - if(indev_type == LV_INDEV_TYPE_ENCODER) { - if(editing) lv_textarea_set_cursor_hidden(ta, false); - else lv_textarea_set_cursor_hidden(ta, true); - } - else { - lv_textarea_set_cursor_hidden(ta, false); - } -#endif - } else if(sign == LV_SIGNAL_PRESSED || sign == LV_SIGNAL_PRESSING || sign == LV_SIGNAL_PRESS_LOST || sign == LV_SIGNAL_RELEASED) { update_cursor_position_on_click(ta, sign, (lv_indev_t *)param); diff --git a/src/lv_widgets/lv_textarea.h b/src/lv_widgets/lv_textarea.h index 0febaa444..4b14c6f75 100644 --- a/src/lv_widgets/lv_textarea.h +++ b/src/lv_widgets/lv_textarea.h @@ -224,9 +224,9 @@ void lv_textarea_set_insert_replace(lv_obj_t * ta, const char * txt); * @param ta pointer to a text area object * @param sb_mode the new mode from 'lv_page_sb_mode_t' enum */ -static inline void lv_textarea_set_sb_mode(lv_obj_t * ta, lv_sb_mode_t mode) +static inline void lv_textarea_set_sb_mode(lv_obj_t * ta, lv_scrlbar_mode_t mode) { - lv_page_set_sb_mode(ta, mode); + lv_page_set_scrlbar_mode(ta, mode); } /** @@ -350,7 +350,7 @@ uint16_t lv_textarea_get_max_length(lv_obj_t * ta); * @param ta pointer to a text area object * @return scrollbar mode from 'lv_page_sb_mode_t' enum */ -static inline lv_sb_mode_t lv_textarea_get_sb_mode(const lv_obj_t * ta) +static inline lv_scrlbar_mode_t lv_textarea_get_sb_mode(const lv_obj_t * ta) { return lv_page_get_sb_mode(ta); } diff --git a/src/lv_widgets/lv_tileview.c b/src/lv_widgets/lv_tileview.c index 2365550bf..0a8da77db 100644 --- a/src/lv_widgets/lv_tileview.c +++ b/src/lv_widgets/lv_tileview.c @@ -133,7 +133,7 @@ lv_obj_t * lv_tileview_create(lv_obj_t * par, const lv_obj_t * copy) #endif /*Refresh the style with new signal function*/ - lv_obj_refresh_style(new_tileview); + lv_obj_refresh_style(new_tileview, LV_STYLE_PROP_ALL); } LV_LOG_INFO("tileview created"); diff --git a/src/lv_widgets/lv_win.c b/src/lv_widgets/lv_win.c index 81a018499..7ef93926d 100644 --- a/src/lv_widgets/lv_win.c +++ b/src/lv_widgets/lv_win.c @@ -95,7 +95,7 @@ lv_obj_t * lv_win_create(lv_obj_t * par, const lv_obj_t * copy) ext->page = lv_page_create(new_win, NULL); lv_obj_add_protect(ext->page, LV_PROTECT_PARENT); - lv_page_set_sb_mode(ext->page, LV_SB_MODE_AUTO); + lv_page_set_scrlbar_mode(ext->page, LV_SCRLBAR_MODE_AUTO); lv_obj_clean_style_list(ext->page, LV_PAGE_PART_BG); /*Create a holder for the header*/ @@ -134,7 +134,7 @@ lv_obj_t * lv_win_create(lv_obj_t * par, const lv_obj_t * copy) } /*Refresh the style with new signal function*/ - lv_obj_refresh_style(new_win); + lv_obj_refresh_style(new_win, LV_STYLE_PROP_ALL); lv_win_realign(new_win); @@ -219,6 +219,9 @@ void lv_win_set_title(lv_obj_t * win, const char * title) lv_win_ext_t * ext = lv_obj_get_ext_attr(win); ext->title_txt = lv_mem_realloc(ext->title_txt, strlen(title) + 1); + LV_ASSERT_MEM(ext->title_txt); + if(ext->title_txt == NULL) return; + strcpy(ext->title_txt, title); lv_obj_invalidate(ext->header); } @@ -238,8 +241,23 @@ void lv_win_set_header_height(lv_obj_t * win, lv_coord_t height) lv_win_realign(win); } +/** + * Set the width of the control buttons on the header + * @param win pointer to a window object + * @param width width of the control button. 0: to make them square automatically. + */ +void lv_win_set_btn_width(lv_obj_t * win, lv_coord_t width) +{ + LV_ASSERT_OBJ(win, LV_OBJX_NAME); + + lv_win_ext_t * ext = lv_obj_get_ext_attr(win); + ext->btn_w = width; + lv_win_realign(win); +} + /** * Set the size of the content area. + * It's the effective area where object can be placed. * @param win pointer to a window object * @param w width * @param h height (the window will be higher with the height of the header) @@ -272,12 +290,12 @@ void lv_win_set_layout(lv_obj_t * win, lv_layout_t layout) * @param win pointer to a window object * @param sb_mode the new scroll bar mode from 'lv_sb_mode_t' */ -void lv_win_set_sb_mode(lv_obj_t * win, lv_sb_mode_t sb_mode) +void lv_win_set_scrlbar_mode(lv_obj_t * win, lv_scrlbar_mode_t sb_mode) { LV_ASSERT_OBJ(win, LV_OBJX_NAME); lv_win_ext_t * ext = lv_obj_get_ext_attr(win); - lv_page_set_sb_mode(ext->page, sb_mode); + lv_page_set_scrlbar_mode(ext->page, sb_mode); } /** * Set focus animation duration on `lv_win_focus()` @@ -349,6 +367,20 @@ lv_coord_t lv_win_get_header_height(const lv_obj_t * win) return lv_obj_get_height(ext->header); } +/** + * Get the width of the control buttons on the header + * @param win pointer to a window object + * @return width of the control button. 0: square. + */ +lv_coord_t lv_win_get_btn_width(lv_obj_t * win) +{ + LV_ASSERT_OBJ(win, LV_OBJX_NAME); + + lv_win_ext_t * ext = lv_obj_get_ext_attr(win); + return ext->btn_w; + +} + /** * Get the pointer of a widow from one of its control button. * It is useful in the action of the control buttons where only button is known. @@ -383,7 +415,7 @@ lv_layout_t lv_win_get_layout(lv_obj_t * win) * @param win pointer to a window object * @return the scroll bar mode of the window (from 'lv_sb_mode_t') */ -lv_sb_mode_t lv_win_get_sb_mode(lv_obj_t * win) +lv_scrlbar_mode_t lv_win_get_sb_mode(lv_obj_t * win) { LV_ASSERT_OBJ(win, LV_OBJX_NAME); @@ -610,13 +642,14 @@ static void lv_win_realign(lv_obj_t * win) lv_obj_t * btn; lv_obj_t * btn_prev = NULL; - lv_coord_t btn_size = lv_obj_get_height_fit(ext->header); + lv_coord_t btn_h = lv_obj_get_height_fit(ext->header); + lv_coord_t btn_w = ext->btn_w != 0 ? ext->btn_w : btn_h; lv_style_int_t header_inner = lv_obj_get_style_pad_inner(win, LV_WIN_PART_HEADER); lv_style_int_t header_right = lv_obj_get_style_pad_right(win, LV_WIN_PART_HEADER); /*Refresh the size of all control buttons*/ btn = lv_obj_get_child_back(ext->header, NULL); while(btn != NULL) { - lv_obj_set_size(btn, btn_size, btn_size); + lv_obj_set_size(btn, btn_h, btn_w); if(btn_prev == NULL) { lv_obj_align(btn, ext->header, LV_ALIGN_IN_RIGHT_MID, -header_right, 0); } diff --git a/src/lv_widgets/lv_win.h b/src/lv_widgets/lv_win.h index 124f2b1f6..96923af64 100644 --- a/src/lv_widgets/lv_win.h +++ b/src/lv_widgets/lv_win.h @@ -56,6 +56,7 @@ typedef struct { lv_obj_t * page; /*Pointer to a page which holds the content*/ lv_obj_t * header; /*Pointer to the header container of the window*/ char * title_txt; /*Pointer to the title label of the window*/ + lv_coord_t btn_w; /*Width of the control buttons*/ } lv_win_ext_t; /** Window parts. */ @@ -123,6 +124,13 @@ void lv_win_set_title(lv_obj_t * win, const char * title); */ void lv_win_set_header_height(lv_obj_t * win, lv_coord_t size); +/** + * Set the width of the control buttons on the header + * @param win pointer to a window object + * @param width width of the control button. 0: to make them square automatically. + */ +void lv_win_set_btn_width(lv_obj_t * win, lv_coord_t width); + /** * Set the size of the content area. * @param win pointer to a window object @@ -143,7 +151,7 @@ void lv_win_set_layout(lv_obj_t * win, lv_layout_t layout); * @param win pointer to a window object * @param sb_mode the new scroll bar mode from 'lv_sb_mode_t' */ -void lv_win_set_sb_mode(lv_obj_t * win, lv_sb_mode_t sb_mode); +void lv_win_set_scrlbar_mode(lv_obj_t * win, lv_scrlbar_mode_t sb_mode); /** * Set focus animation duration on `lv_win_focus()` @@ -191,6 +199,14 @@ lv_coord_t lv_win_get_btn_size(const lv_obj_t * win); */ lv_coord_t lv_win_get_header_height(const lv_obj_t * win); + +/** + * Get the width of the control buttons on the header + * @param win pointer to a window object + * @return width of the control button. 0: square. + */ +lv_coord_t lv_win_get_btn_width(lv_obj_t * win); + /** * Get the pointer of a widow from one of its control button. * It is useful in the action of the control buttons where only button is known. @@ -211,7 +227,7 @@ lv_layout_t lv_win_get_layout(lv_obj_t * win); * @param win pointer to a window object * @return the scroll bar mode of the window (from 'lv_sb_mode_t') */ -lv_sb_mode_t lv_win_get_sb_mode(lv_obj_t * win); +lv_scrlbar_mode_t lv_win_get_sb_mode(lv_obj_t * win); /** * Get focus animation duration diff --git a/tests/Makefile b/tests/Makefile index d0c84cee5..418c40928 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -5,7 +5,7 @@ CC ?= gcc LVGL_DIR ?= ${shell pwd}/../.. LVGL_DIR_NAME ?= lvgl -WARNINGS ?= -Wall -Wextra +WARNINGS ?= -Werror -Wall -Wextra -Wshadow -Wundef -Wmaybe-uninitialized -Wmissing-prototypes -Wno-discarded-qualifiers -Wall -Wextra -Wno-unused-function -Wundef -Wno-error=strict-prototypes -Wpointer-arith -fno-strict-aliasing -Wno-error=cpp -Wuninitialized -Wmaybe-uninitialized -Wno-unused-parameter -Wno-missing-field-initializers -Wtype-limits -Wsizeof-pointer-memaccess -Wno-format-nonliteral -Wno-cast-qual -Wunreachable-code -Wno-switch-default -Wno-switch-enum -Wreturn-type -Wmultichar -Wformat-security -Wno-ignored-qualifiers -Wno-error=pedantic -Wno-sign-compare -Wno-error=missing-prototypes -Wdouble-promotion -Wclobbered -Wdeprecated -Wempty-body -Wtype-limits -Wshift-negative-value -Wstack-usage=1024 -Wno-unused-value -Wno-unused-parameter -Wno-missing-field-initializers -Wuninitialized -Wmaybe-uninitialized -Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wtype-limits -Wsizeof-pointer-memaccess -Wno-format-nonliteral -Wpointer-arith -Wno-cast-qual -Wmissing-prototypes -Wunreachable-code -Wno-switch-default -Wswitch-enum -Wreturn-type -Wmultichar -Wno-discarded-qualifiers -Wformat-security -Wno-ignored-qualifiers -Wno-sign-compare OPTIMIZATION ?= -O3 -g0 diff --git a/tests/build.py b/tests/build.py index 43577543f..297e59c4a 100755 --- a/tests/build.py +++ b/tests/build.py @@ -6,7 +6,6 @@ lvgldirname = os.path.abspath('..') lvgldirname = os.path.basename(lvgldirname) lvgldirname = '"' + lvgldirname + '"' -warnings = '"-Wall -Werror"' base_defines = '"-DLV_CONF_PATH=' + lvgldirname +'/tests/lv_test_conf.h -DLV_BUILD_TEST"' optimization = '"-O3 -g0"' @@ -24,7 +23,7 @@ def build(name, defines): d_all += " -D" + d + "=" + str(defines[d]) d_all += '"' - cmd = "make -j8 BIN=test.bin LVGL_DIR_NAME=" + lvgldirname + " DEFINES=" + d_all + " WARNINGS=" + warnings + " OPTIMIZATION=" + optimization + cmd = "make -j8 BIN=test.bin LVGL_DIR_NAME=" + lvgldirname + " DEFINES=" + d_all + " OPTIMIZATION=" + optimization print("---------------------------") print("Clean") @@ -64,8 +63,9 @@ minimal_monochrome = { "LV_GPU":0, "LV_USE_FILESYSTEM":0, "LV_USE_USER_DATA":0, + "LV_USE_USER_DATA_FREE":0, "LV_USE_LOG":0, - "LV_USE_THEME_MATERIAL":1, + "LV_USE_THEME_EMPTY":1, "LV_THEME_DEFAULT_INIT": "\\\"lv_theme_material_init\\\"", "LV_THEME_DEFAULT_COLOR_PRIMARY": "\\\"LV_COLOR_RED\\\"", "LV_THEME_DEFAULT_COLOR_SECONDARY": "\\\"LV_COLOR_BLUE\\\"", @@ -74,7 +74,13 @@ minimal_monochrome = { "LV_THEME_DEFAULT_FONT_NORMAL" : "\\\"&lv_font_unscii_8\\\"", "LV_THEME_DEFAULT_FONT_SUBTITLE" : "\\\"&lv_font_unscii_8\\\"", "LV_THEME_DEFAULT_FONT_TITLE" : "\\\"&lv_font_unscii_8\\\"", + "LV_LOG_PRINTF":0, "LV_USE_DEBUG":0, + "LV_USE_ASSERT_NULL":0, + "LV_USE_ASSERT_MEM":0, + "LV_USE_ASSERT_STR":0, + "LV_USE_ASSERT_OBJ":0, + "LV_USE_ASSERT_STYLE":0, "LV_FONT_ROBOTO_12":0, "LV_FONT_ROBOTO_16":0, "LV_FONT_ROBOTO_22":0, @@ -131,6 +137,7 @@ all_obj_minimal_features = { "LV_GPU":0, "LV_USE_FILESYSTEM":0, "LV_USE_USER_DATA":0, + "LV_USE_USER_DATA_FREE":0, "LV_USE_LOG":0, "LV_USE_THEME_MATERIAL":1, "LV_THEME_DEFAULT_INIT": "\\\"lv_theme_material_init\\\"", @@ -142,6 +149,11 @@ all_obj_minimal_features = { "LV_THEME_DEFAULT_FONT_SUBTITLE" : "\\\"&lv_font_roboto_16\\\"", "LV_THEME_DEFAULT_FONT_TITLE" : "\\\"&lv_font_roboto_16\\\"", "LV_USE_DEBUG":0, + "LV_USE_ASSERT_NULL":0, + "LV_USE_ASSERT_MEM":0, + "LV_USE_ASSERT_STR":0, + "LV_USE_ASSERT_OBJ":0, + "LV_USE_ASSERT_STYLE":0, "LV_FONT_ROBOTO_12":0, "LV_FONT_ROBOTO_16":1, "LV_FONT_ROBOTO_22":0, @@ -199,8 +211,11 @@ all_obj_all_features = { "LV_GPU":1, "LV_USE_FILESYSTEM":1, "LV_USE_USER_DATA":1, + "LV_USE_USER_DATA_FREE":0, "LV_USE_LOG":1, "LV_USE_THEME_MATERIAL":1, + "LV_USE_THEME_EMPTY":1, + "LV_USE_THEME_TEMPLATE":1, "LV_THEME_DEFAULT_INIT": "\\\"lv_theme_material_init\\\"", "LV_THEME_DEFAULT_COLOR_PRIMARY": "\\\"LV_COLOR_RED\\\"", "LV_THEME_DEFAULT_COLOR_SECONDARY": "\\\"LV_COLOR_BLUE\\\"", @@ -208,7 +223,14 @@ all_obj_all_features = { "LV_THEME_DEFAULT_FONT_SMALL" : "\\\"&lv_font_roboto_12\\\"", "LV_THEME_DEFAULT_FONT_NORMAL" : "\\\"&lv_font_roboto_16\\\"", "LV_THEME_DEFAULT_FONT_SUBTITLE" : "\\\"&lv_font_roboto_22\\\"", - "LV_THEME_DEFAULT_FONT_TITLE" : "\\\"&lv_font_roboto_28\\\"", + "LV_THEME_DEFAULT_FONT_TITLE" : "\\\"&lv_font_roboto_28\\\"", + "LV_LOG_PRINTF":0, + "LV_USE_DEBUG":0, + "LV_USE_ASSERT_NULL":0, + "LV_USE_ASSERT_MEM":0, + "LV_USE_ASSERT_STR":0, + "LV_USE_ASSERT_OBJ":0, + "LV_USE_ASSERT_STYLE":0, "LV_FONT_ROBOTO_12":1, "LV_FONT_ROBOTO_16":1, "LV_FONT_ROBOTO_22":1, @@ -266,9 +288,14 @@ advanced_features = { "LV_GPU":1, "LV_USE_FILESYSTEM":1, "LV_USE_USER_DATA":1, + "LV_USE_USER_DATA_FREE":1, + "LV_USER_DATA_FREE_INCLUDE":"\\\"\\\"", + "LV_USER_DATA_FREE": "\\\"free\\\"", "LV_IMG_CACHE_DEF_SIZE":32, "LV_USE_LOG":1, "LV_USE_THEME_MATERIAL":1, + "LV_USE_THEME_EMPTY":1, + "LV_USE_THEME_TEMPLATE":1, "LV_THEME_DEFAULT_INIT": "\\\"lv_theme_material_init\\\"", "LV_THEME_DEFAULT_COLOR_PRIMARY": "\\\"LV_COLOR_RED\\\"", "LV_THEME_DEFAULT_COLOR_SECONDARY": "\\\"LV_COLOR_BLUE\\\"", @@ -284,7 +311,6 @@ advanced_features = { "LV_USE_ASSERT_STR":1, "LV_USE_ASSERT_OBJ":1, "LV_USE_ASSERT_STYLE":1, - "LV_USE_THEME_MATERIAL":1, "LV_FONT_ROBOTO_12":1, "LV_FONT_ROBOTO_16":1, "LV_FONT_ROBOTO_22":1, diff --git a/tests/lv_test_assert.c b/tests/lv_test_assert.c index b59e06432..9b2e69a14 100644 --- a/tests/lv_test_assert.c +++ b/tests/lv_test_assert.c @@ -47,9 +47,10 @@ typedef struct { /********************** * STATIC PROTOTYPES **********************/ -void read_png_file(png_img_t * p, const char* file_name); -void write_png_file(png_img_t * p, const char* file_name); -void png_release(png_img_t * p); +static void read_png_file(png_img_t * p, const char* file_name); +static void write_png_file(png_img_t * p, const char* file_name); +static void png_release(png_img_t * p); +static void process_file(png_img_t * p); /********************** * STATIC VARIABLES @@ -200,7 +201,7 @@ void lv_test_assert_img_eq(const char * fn_ref, const char * s) * STATIC FUNCTIONS **********************/ -void read_png_file(png_img_t * p, const char* file_name) +static void read_png_file(png_img_t * p, const char* file_name) { char header[8]; // 8 is the maximum size that can be checked @@ -255,7 +256,7 @@ void read_png_file(png_img_t * p, const char* file_name) } -void write_png_file(png_img_t * p, const char* file_name) +static void write_png_file(png_img_t * p, const char* file_name) { /* create file */ FILE *fp = fopen(file_name, "wb"); @@ -306,7 +307,7 @@ void write_png_file(png_img_t * p, const char* file_name) fclose(fp); } -void png_release(png_img_t * p) +static void png_release(png_img_t * p) { int y; for (y=0; yheight; y++) @@ -314,7 +315,7 @@ void png_release(png_img_t * p) free(p->row_pointers); } -void process_file(png_img_t * p) +static void process_file(png_img_t * p) { if (png_get_color_type(p->png_ptr, p->info_ptr) == PNG_COLOR_TYPE_RGB) lv_test_exit("[process_file] input file is PNG_COLOR_TYPE_RGB but must be PNG_COLOR_TYPE_RGBA " diff --git a/tests/lv_test_core/lv_test_core.c b/tests/lv_test_core/lv_test_core.c index da4e75c43..f74f81611 100644 --- a/tests/lv_test_core/lv_test_core.c +++ b/tests/lv_test_core/lv_test_core.c @@ -9,7 +9,7 @@ #include "../lv_test_assert.h" #if LV_BUILD_TEST - +#include "lv_test_core.h" #include "lv_test_obj.h" #include "lv_test_style.h" diff --git a/tests/lv_test_core/lv_test_obj.c b/tests/lv_test_core/lv_test_obj.c index 8c5b1d8fa..455646823 100644 --- a/tests/lv_test_core/lv_test_obj.c +++ b/tests/lv_test_core/lv_test_obj.c @@ -8,6 +8,7 @@ *********************/ #include "../../lvgl.h" #include "../lv_test_assert.h" +#include "lv_test_obj.h" #if LV_BUILD_TEST diff --git a/tests/lv_test_core/lv_test_style.c b/tests/lv_test_core/lv_test_style.c index f524802af..61c9346f0 100644 --- a/tests/lv_test_core/lv_test_style.c +++ b/tests/lv_test_core/lv_test_style.c @@ -8,6 +8,7 @@ *********************/ #include "../../lvgl.h" #include "../lv_test_assert.h" +#include "lv_test_style.h" #if LV_BUILD_TEST