diff --git a/scripts/style_api_gen.py b/scripts/style_api_gen.py index 3cf878509..6576d6ddc 100755 --- a/scripts/style_api_gen.py +++ b/scripts/style_api_gen.py @@ -49,7 +49,11 @@ props = [ {'name': 'ANIM_TIME', 'style_type': 'num', 'var_type': 'uint32_t' , 'default':0, 'inherited': 0, 'layout': 0, 'ext_draw': 0, - 'dsc': "The animation time in milliseconds. It's meaning is widget specific. E.g. blink time of the cursor on the text area or scroll speed of a roller. See the widgets' documentation to learn more."}, + 'dsc': "The animation time in milliseconds. It's meaning is widget specific. E.g. blink time of the cursor on the text area or scroll time of a roller. See the widgets' documentation to learn more."}, + +{'name': 'ANIM_SPEED', + 'style_type': 'num', 'var_type': 'uint32_t' , 'default':0, 'inherited': 0, 'layout': 0, 'ext_draw': 0, + 'dsc': "The animation speed in pixel/sec. It's meaning is widget specific. E.g. scroll speed of label. See the widgets' documentation to learn more."}, {'name': 'TRANSITION', 'style_type': 'ptr', 'var_type': 'const lv_style_transition_dsc_t *' , 'default':0, 'inherited': 0, 'layout': 0, 'ext_draw': 0, diff --git a/src/core/lv_obj_style_gen.h b/src/core/lv_obj_style_gen.h index c4f603600..bf4838ddd 100644 --- a/src/core/lv_obj_style_gen.h +++ b/src/core/lv_obj_style_gen.h @@ -70,6 +70,12 @@ static inline uint32_t lv_obj_get_style_anim_time(const struct _lv_obj_t * obj, return (uint32_t)v.num; } +static inline uint32_t lv_obj_get_style_anim_speed(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_ANIM_SPEED); + return (uint32_t)v.num; +} + static inline const lv_style_transition_dsc_t * lv_obj_get_style_transition(const struct _lv_obj_t * obj, uint32_t part) { lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSITION); @@ -616,6 +622,14 @@ static inline void lv_obj_set_style_anim_time(struct _lv_obj_t * obj, uint32_t v lv_obj_set_local_style_prop(obj, LV_STYLE_ANIM_TIME, v, selector); } +static inline void lv_obj_set_style_anim_speed(struct _lv_obj_t * obj, uint32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_ANIM_SPEED, v, selector); +} + static inline void lv_obj_set_style_transition(struct _lv_obj_t * obj, const lv_style_transition_dsc_t * value, lv_style_selector_t selector) { lv_style_value_t v = { diff --git a/src/misc/lv_style.c b/src/misc/lv_style.c index 246d9ea28..fd7075fed 100644 --- a/src/misc/lv_style.c +++ b/src/misc/lv_style.c @@ -49,6 +49,10 @@ void lv_style_init(lv_style_t * style) #if LV_USE_ASSERT_STYLE style->sentinel = LV_STYLE_SENTINEL_VALUE; #endif + + static int cnt = 0; + cnt++; + printf("%d\n", cnt); } void lv_style_reset(lv_style_t * style) diff --git a/src/misc/lv_style.h b/src/misc/lv_style.h index a24113181..3d69c1024 100644 --- a/src/misc/lv_style.h +++ b/src/misc/lv_style.h @@ -125,7 +125,8 @@ typedef enum { LV_STYLE_COLOR_FILTER_DSC = 10, LV_STYLE_COLOR_FILTER_OPA = 11, LV_STYLE_ANIM_TIME = 12, - LV_STYLE_TRANSITION = 13, + LV_STYLE_ANIM_SPEED = 12, + LV_STYLE_TRANSITION = 14, LV_STYLE_BLEND_MODE = 15, /*Group 1*/ diff --git a/src/misc/lv_style_gen.h b/src/misc/lv_style_gen.h index 97bc126ef..ff78a282f 100644 --- a/src/misc/lv_style_gen.h +++ b/src/misc/lv_style_gen.h @@ -94,6 +94,14 @@ static inline void lv_style_set_anim_time(lv_style_t * style, uint32_t value) lv_style_set_prop(style, LV_STYLE_ANIM_TIME, v); } +static inline void lv_style_set_anim_speed(lv_style_t * style, uint32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_ANIM_SPEED, v); +} + static inline void lv_style_set_transition(lv_style_t * style, const lv_style_transition_dsc_t * value) { lv_style_value_t v = { diff --git a/src/widgets/lv_label.c b/src/widgets/lv_label.c index 05d5795e1..094bfc948 100644 --- a/src/widgets/lv_label.c +++ b/src/widgets/lv_label.c @@ -23,7 +23,8 @@ *********************/ #define MY_CLASS &lv_label_class -#define LV_LABEL_DEF_SCROLL_SPEED 25 +#define LV_LABEL_DEF_SCROLL_SPEED (lv_disp_get_dpi(lv_obj_get_disp(obj)) / 3) +#define LV_LABEL_SCROLL_DELAY 300 #define LV_LABEL_DOT_END_INV 0xFFFFFFFF #define LV_LABEL_HINT_HEIGHT_LIMIT 1024 /*Enable "hint" to buffer info about labels larger than this. (Speed up drawing)*/ @@ -56,6 +57,8 @@ const lv_obj_class_t lv_label_class = { .constructor_cb = lv_label_constructor, .destructor_cb = lv_label_destructor, .event_cb = lv_label_event, + .width_def = LV_SIZE_CONTENT, + .height_def = LV_SIZE_CONTENT, .instance_size = sizeof(lv_label_t), .base_class = &lv_obj_class }; @@ -319,7 +322,7 @@ void lv_label_get_letter_pos(const lv_obj_t * obj, uint32_t char_id, lv_point_t if(label->recolor != 0) flag |= LV_TEXT_FLAG_RECOLOR; if(label->expand != 0) flag |= LV_TEXT_FLAG_EXPAND; - if(label->long_mode == LV_LABEL_LONG_EXPAND) flag |= LV_TEXT_FLAG_FIT; + if(label->long_mode == LV_LABEL_LONG_WRAP) flag |= LV_TEXT_FLAG_FIT; uint32_t byte_id = _lv_txt_encoded_get_byte_id(txt, char_id); @@ -417,7 +420,6 @@ uint32_t lv_label_get_letter_on(const lv_obj_t * obj, lv_point_t * pos_in) if(label->recolor != 0) flag |= LV_TEXT_FLAG_RECOLOR; if(label->expand != 0) flag |= LV_TEXT_FLAG_EXPAND; - if(label->long_mode == LV_LABEL_LONG_EXPAND) flag |= LV_TEXT_FLAG_FIT; lv_text_align_t align = lv_obj_get_style_text_align(obj, LV_PART_MAIN); @@ -536,7 +538,6 @@ bool lv_label_is_char_under_pos(const lv_obj_t * obj, lv_point_t * pos) if(label->recolor != 0) flag |= LV_TEXT_FLAG_RECOLOR; if(label->expand != 0) flag |= LV_TEXT_FLAG_EXPAND; - if(label->long_mode == LV_LABEL_LONG_EXPAND) flag |= LV_TEXT_FLAG_FIT; /*Search the line of the index letter*/; while(txt[line_start] != '\0') { @@ -703,7 +704,7 @@ static void lv_label_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) label->static_txt = 0; label->recolor = 0; label->dot_end = LV_LABEL_DOT_END_INV; - label->long_mode = LV_LABEL_LONG_EXPAND; + label->long_mode = LV_LABEL_LONG_WRAP; label->offset.x = 0; label->offset.y = 0; @@ -721,7 +722,7 @@ static void lv_label_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) label->dot_tmp_alloc = 0; lv_obj_clear_flag(obj, LV_OBJ_FLAG_CLICKABLE); - lv_label_set_long_mode(obj, LV_LABEL_LONG_EXPAND); + lv_label_set_long_mode(obj, LV_LABEL_LONG_WRAP); lv_label_set_text(obj, "Text"); @@ -760,6 +761,25 @@ static void lv_label_event(const lv_obj_class_t * class_p, lv_event_t * e) lv_label_revert_dots(obj); lv_label_refr_text(obj); } + else if(code == LV_EVENT_GET_SELF_SIZE) { + lv_point_t size; + lv_label_t * label = (lv_label_t *)obj; + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + lv_coord_t letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_MAIN); + lv_coord_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + lv_text_flag_t flag = LV_TEXT_FLAG_NONE; + if(label->recolor != 0) flag |= LV_TEXT_FLAG_RECOLOR; + if(label->expand != 0) flag |= LV_TEXT_FLAG_EXPAND; + + lv_coord_t w = lv_obj_get_style_width(obj, LV_PART_MAIN); + if(w == LV_SIZE_CONTENT) w = LV_COORD_MAX; + + lv_txt_get_size(&size, label->text, font, letter_space, line_space, w, flag); + + lv_point_t * self_size = lv_event_get_param(e); + self_size->x = LV_MAX(self_size->x, size.x); + self_size->y = LV_MAX(self_size->y, size.y); + } else if(code == LV_EVENT_BASE_DIR_CHANGED) { #if LV_USE_BIDI lv_label_t * label = (lv_label_t *)obj; @@ -789,7 +809,6 @@ static void draw_main(lv_event_t * e) lv_text_flag_t flag = LV_TEXT_FLAG_NONE; if(label->recolor != 0) flag |= LV_TEXT_FLAG_RECOLOR; if(label->expand != 0) flag |= LV_TEXT_FLAG_EXPAND; - if(label->long_mode == LV_LABEL_LONG_EXPAND) flag |= LV_TEXT_FLAG_FIT; lv_draw_label_dsc_t label_draw_dsc; lv_draw_label_dsc_init(&label_draw_dsc); @@ -877,26 +896,19 @@ static void lv_label_refr_text(lv_obj_t * obj) lv_text_flag_t flag = LV_TEXT_FLAG_NONE; if(label->recolor != 0) flag |= LV_TEXT_FLAG_RECOLOR; if(label->expand != 0) flag |= LV_TEXT_FLAG_EXPAND; - if(label->long_mode == LV_LABEL_LONG_EXPAND) flag |= LV_TEXT_FLAG_FIT; lv_txt_get_size(&size, label->text, font, letter_space, line_space, max_w, flag); - /*Set the full size in expand mode*/ - if(label->long_mode == LV_LABEL_LONG_EXPAND) { - size.x += lv_obj_get_style_pad_left(obj, LV_PART_MAIN) + lv_obj_get_style_pad_right(obj, LV_PART_MAIN); - size.y += lv_obj_get_style_pad_top(obj, LV_PART_MAIN) + lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); - lv_obj_set_size(obj, size.x, size.y); - } - /*In roll mode keep the size but start offset animations*/ - else if(label->long_mode == LV_LABEL_LONG_SCROLL) { - uint16_t anim_speed = lv_obj_get_style_anim_time(obj, LV_PART_MAIN); + lv_obj_handle_self_size_chg(obj) + ; + /*In scroll mode start an offset animations*/ + if(label->long_mode == LV_LABEL_LONG_SCROLL) { + uint16_t anim_speed = lv_obj_get_style_anim_speed(obj, LV_PART_MAIN); if(anim_speed == 0) anim_speed = LV_LABEL_DEF_SCROLL_SPEED; lv_anim_t a; lv_anim_init(&a); lv_anim_set_var(&a, obj); lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE); - lv_anim_set_playback_delay(&a, (((lv_font_get_glyph_width(font, ' ', ' ') + letter_space) * 1000) / - anim_speed) * - LV_LABEL_WAIT_CHAR_COUNT); + lv_anim_set_playback_delay(&a, LV_LABEL_SCROLL_DELAY); lv_anim_set_repeat_delay(&a, a.playback_delay); bool hor_anim = false; @@ -921,7 +933,6 @@ static void lv_label_refr_text(lv_obj_t * obj) #else lv_anim_set_values(&a, 0, lv_area_get_width(&txt_coords) - size.x); lv_anim_set_exec_cb(&a, set_ofs_x_anim); - lv_anim_set_time(&a, lv_anim_speed_to_time(anim_speed, a.start_value, a.end_value)); #endif lv_anim_set_exec_cb(&a, set_ofs_x_anim); @@ -945,6 +956,8 @@ static void lv_label_refr_text(lv_obj_t * obj) } } + lv_anim_set_time(&a, lv_anim_speed_to_time(anim_speed, a.start_value, a.end_value)); + lv_anim_set_playback_time(&a, a.time); lv_anim_start(&a); hor_anim = true; } @@ -957,8 +970,6 @@ static void lv_label_refr_text(lv_obj_t * obj) if(size.y > lv_area_get_height(&txt_coords) && hor_anim == false) { lv_anim_set_values(&a, 0, lv_area_get_height(&txt_coords) - size.y - (lv_font_get_line_height(font))); lv_anim_set_exec_cb(&a, set_ofs_y_anim); - lv_anim_set_time(&a, lv_anim_speed_to_time(anim_speed, a.start_value, a.end_value)); - lv_anim_set_playback_time(&a, a.time); lv_anim_t * anim_cur = lv_anim_get(obj, set_ofs_y_anim); int32_t act_time = 0; @@ -980,6 +991,8 @@ static void lv_label_refr_text(lv_obj_t * obj) } } + lv_anim_set_time(&a, lv_anim_speed_to_time(anim_speed, a.start_value, a.end_value)); + lv_anim_set_playback_time(&a, a.time); lv_anim_start(&a); } else { @@ -990,7 +1003,7 @@ static void lv_label_refr_text(lv_obj_t * obj) } /*In roll inf. mode keep the size but start offset animations*/ else if(label->long_mode == LV_LABEL_LONG_SCROLL_CIRCULAR) { - uint16_t anim_speed = lv_obj_get_style_anim_time(obj, LV_PART_MAIN); + uint16_t anim_speed = lv_obj_get_style_anim_speed(obj, LV_PART_MAIN); if(anim_speed == 0) anim_speed = LV_LABEL_DEF_SCROLL_SPEED; lv_anim_t a; lv_anim_init(&a); @@ -1018,9 +1031,9 @@ static void lv_label_refr_text(lv_obj_t * obj) lv_anim_set_values(&a, start, end); #else lv_anim_set_values(&a, 0, -size.x - lv_font_get_glyph_width(font, ' ', ' ') * LV_LABEL_WAIT_CHAR_COUNT); +#endif lv_anim_set_exec_cb(&a, set_ofs_x_anim); lv_anim_set_time(&a, lv_anim_speed_to_time(anim_speed, a.start_value, a.end_value)); -#endif lv_anim_t * anim_cur = lv_anim_get(obj, set_ofs_x_anim); int32_t act_time = anim_cur ? anim_cur->act_time : 0; @@ -1059,6 +1072,7 @@ static void lv_label_refr_text(lv_obj_t * obj) } } else if(label->long_mode == LV_LABEL_LONG_DOT) { + lv_obj_handle_self_size_chg(obj); if(size.y <= lv_area_get_height(&txt_coords)) { /*No dots are required, the text is short enough*/ label->dot_end = LV_LABEL_DOT_END_INV; } @@ -1111,12 +1125,6 @@ static void lv_label_refr_text(lv_obj_t * obj) } } } - /*In break mode only the height can change*/ - else if(label->long_mode == LV_LABEL_LONG_WRAP) { - size.y += lv_obj_get_style_pad_top(obj, LV_PART_MAIN) + lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); - lv_obj_set_height(obj, size.y); - } - /*Do not set the size in Clip mode*/ else if(label->long_mode == LV_LABEL_LONG_CLIP) { /*Do nothing*/ } diff --git a/src/widgets/lv_label.h b/src/widgets/lv_label.h index 605c5c7be..57c881e63 100644 --- a/src/widgets/lv_label.h +++ b/src/widgets/lv_label.h @@ -42,7 +42,6 @@ LV_EXPORT_CONST_INT(LV_LABEL_TEXT_SEL_OFF); /** Long mode behaviors. Used in 'lv_label_ext_t'*/ enum { - LV_LABEL_LONG_EXPAND, /**< Expand the object size to the text size*/ LV_LABEL_LONG_WRAP, /**< Keep the object width, wrap the too long lines and expand the object height*/ LV_LABEL_LONG_DOT, /**< Keep the size and write dots at the end if the text is too long*/ LV_LABEL_LONG_SCROLL, /**< Keep the size and roll the text back and forth*/ diff --git a/src/widgets/lv_textarea.c b/src/widgets/lv_textarea.c index 3698251a7..6a5451832 100644 --- a/src/widgets/lv_textarea.c +++ b/src/widgets/lv_textarea.c @@ -478,7 +478,7 @@ void lv_textarea_set_one_line(lv_obj_t * obj, bool en) ta->one_line = 1; lv_obj_set_content_height(obj, font_h); - lv_label_set_long_mode(ta->label, LV_LABEL_LONG_EXPAND); + lv_label_set_long_mode(ta->label, LV_LABEL_LONG_WRAP); lv_obj_scroll_to(obj, 0, 0, LV_ANIM_OFF); } else {