diff --git a/lv_draw/lv_draw.c b/lv_draw/lv_draw.c index 71942f1de..8910edcdf 100644 --- a/lv_draw/lv_draw.c +++ b/lv_draw/lv_draw.c @@ -60,8 +60,7 @@ static lv_rects_t lv_img_no_pic_rects = { static lv_labels_t lv_img_no_pic_labels = { .font = LV_FONT_DEFAULT, .color = COLOR_WHITE, .letter_space = 1 * LV_STYLE_MULT, .line_space = 1 * LV_STYLE_MULT, - .mid = 1, .auto_break = 1 - + .mid = 1, }; /********************** @@ -113,16 +112,11 @@ void lv_draw_label(const area_t * cords_p,const area_t * mask_p, const font_t * font_p = font_get(labels_p->font); cord_t w = area_get_width(cords_p); - cord_t max_w = w; - /*If the auto-break is not enabled the set the max length to very big */ - if(labels_p->auto_break == 0) { - max_w = LV_CORD_MAX; - } /*Init variables for the first line*/ cord_t line_length = 0; uint32_t line_start = 0; - uint32_t line_end = txt_get_next_line(txt, font_p, labels_p->letter_space, max_w); + uint32_t line_end = txt_get_next_line(txt, font_p, labels_p->letter_space, w); point_t pos; pos.x = cords_p->x1; @@ -146,7 +140,7 @@ void lv_draw_label(const area_t * cords_p,const area_t * mask_p, } /*Go to next line*/ line_start = line_end; - line_end += txt_get_next_line(&txt[line_start], font_p, labels_p->letter_space, max_w); + line_end += txt_get_next_line(&txt[line_start], font_p, labels_p->letter_space, w); pos.x = cords_p->x1; /*Align to middle*/ diff --git a/lv_misc/text.c b/lv_misc/text.c index 7e9930eeb..babc61cfc 100644 --- a/lv_misc/text.c +++ b/lv_misc/text.c @@ -62,7 +62,7 @@ uint16_t txt_get_next_line(const char * txt, const font_t * font_p, act_l += font_get_width(font_p, txt[i]); /*If the txt is too long then finish, this is the line end*/ - if(act_l >= max_l) { + if(act_l > max_l) { /*If already a break character is found, then break there*/ if(last_break != TXT_NO_BREAK_FOUND) { i = last_break; diff --git a/lv_objx/lv_label.c b/lv_objx/lv_label.c index 635893f56..6fdc8a488 100644 --- a/lv_objx/lv_label.c +++ b/lv_objx/lv_label.c @@ -33,26 +33,26 @@ static bool lv_label_design(lv_obj_t* obj_dp, const area_t * mask_p, lv_design_m **********************/ static lv_labels_t lv_labels_def = { .font = LV_FONT_DEFAULT, .color = COLOR_MAKE(0x10, 0x18, 0x20), - .letter_space = 3 * LV_STYLE_MULT, .line_space = 3 * LV_STYLE_MULT, - .mid = 1, .auto_break = 0 + .letter_space = 2 * LV_STYLE_MULT, .line_space = 2 * LV_STYLE_MULT, + .mid = 1 }; static lv_labels_t lv_labels_btn = { .font = LV_FONT_DEFAULT, .color = COLOR_MAKE(0xd0, 0xe0, 0xf0), .letter_space = 2 * LV_STYLE_MULT, .line_space = 2 * LV_STYLE_MULT, - .mid = 1, .auto_break = 0 + .mid = 1, }; static lv_labels_t lv_labels_title = { .font = LV_FONT_DEFAULT, .color = COLOR_MAKE(0x10, 0x20, 0x30), .letter_space = 4 * LV_STYLE_MULT, .line_space = 4 * LV_STYLE_MULT, - .mid = 0, .auto_break = 1 + .mid = 0, }; static lv_labels_t lv_labels_txt = { .font = LV_FONT_DEFAULT, .color = COLOR_MAKE(0x16, 0x23, 0x34), .letter_space = 1 * LV_STYLE_MULT, .line_space = 2 * LV_STYLE_MULT, - .mid = 0, .auto_break = 1 + .mid = 0, }; @@ -81,7 +81,7 @@ lv_obj_t* lv_label_create(lv_obj_t* par_dp, lv_obj_t * ori_dp) lv_obj_alloc_ext(new_obj, sizeof(lv_label_ext_t)); lv_label_ext_t * label_p = lv_obj_get_ext(new_obj); - label_p->txt = NULL; + label_p->txt_dp = NULL; lv_obj_set_design_f(new_obj, lv_label_design); lv_obj_set_signal_f(new_obj, lv_label_signal); @@ -124,8 +124,8 @@ bool lv_label_signal(lv_obj_t* obj_dp, lv_signal_t sign, void * param) /*No signal handling*/ switch(sign) { case LV_SIGNAL_CLEANUP: - dm_free(label_p->txt); - label_p->txt = NULL; + dm_free(label_p->txt_dp); + label_p->txt_dp = NULL; break; case LV_SIGNAL_STYLE_CHG: lv_label_set_text(obj_dp, lv_label_get_text(obj_dp)); @@ -145,7 +145,7 @@ bool lv_label_signal(lv_obj_t* obj_dp, lv_signal_t sign, void * param) /** * Set a new text for a label * @param obj_dp pointer to a label object - * @param text '\0' terminated chacter string + * @param text '\0' terminated character string */ void lv_label_set_text(lv_obj_t * obj_dp, const char * text) { @@ -153,15 +153,15 @@ void lv_label_set_text(lv_obj_t * obj_dp, const char * text) lv_obj_inv(obj_dp); - lv_label_ext_t * label_p = lv_obj_get_ext(obj_dp); + lv_label_ext_t * ext_p = lv_obj_get_ext(obj_dp); uint32_t len = strlen(text) + 1; - if(label_p->txt != NULL && text != label_p->txt) { - dm_free(label_p->txt); + if(ext_p->txt_dp != NULL && text != ext_p->txt_dp) { + dm_free(ext_p->txt_dp); } - label_p->txt = dm_alloc(len); - strcpy(label_p->txt, text); + ext_p->txt_dp = dm_alloc(len); + strcpy(ext_p->txt_dp, text); uint32_t line_start = 0; uint32_t new_line_start = 0; @@ -173,8 +173,8 @@ void lv_label_set_text(lv_obj_t * obj_dp, const char * text) cord_t longest_line = 0; cord_t act_line_length; - /*If the auto-break is not enabled the set the max length to very big */ - if(labels_p->auto_break == 0) { + /*If the fix width is not enabled the set the max length to very big */ + if(ext_p->fixw == 0) { max_length = LV_CORD_MAX; } @@ -185,8 +185,8 @@ void lv_label_set_text(lv_obj_t * obj_dp, const char * text) new_height += letter_height; new_height += labels_p->line_space; - /*If no auto break then calc. the longest line */ - if(labels_p->auto_break == false) { + /*If no fix width then calc. the longest line */ + if(ext_p->fixw == false) { act_line_length = txt_get_length(&text[line_start], new_line_start - line_start, font_p, labels_p->letter_space); if(act_line_length > longest_line) { @@ -202,8 +202,8 @@ void lv_label_set_text(lv_obj_t * obj_dp, const char * text) lv_obj_set_height(obj_dp, new_height); - /*Refresh the length if no autobreak*/ - if(labels_p->auto_break == 0) { + /*Refresh the length if no fix width*/ + if(ext_p->fixw == 0) { lv_obj_set_width(obj_dp, longest_line); } @@ -213,6 +213,17 @@ void lv_label_set_text(lv_obj_t * obj_dp, const char * text) lv_obj_inv(obj_dp); } +/** + * Set the fix width attribute + * @param obj_dp pointer to a label object + * @param fixw true: enable fix width for the label + */ +void lv_label_set_fixw(lv_obj_t * obj_dp, bool fixw) +{ + lv_label_ext_t * ext_p = lv_obj_get_ext(obj_dp); + ext_p->fixw = fixw == false ? 0 : 1; +} + /*===================== * Getter functions *====================*/ @@ -226,7 +237,18 @@ const char * lv_label_get_text(lv_obj_t* obj_dp) { lv_label_ext_t * label_p = lv_obj_get_ext(obj_dp); - return label_p->txt; + return label_p->txt_dp; +} + +/** + * Get the fix width attribute of a label + * @param obj_dp pointer to a label object + * @return true: fix width is enabled + */ +bool lv_label_get_fixw(lv_obj_t * obj_dp) +{ + lv_label_ext_t * ext_p = lv_obj_get_ext(obj_dp); + return ext_p->fixw == 0 ? false: true; } /** diff --git a/lv_objx/lv_label.h b/lv_objx/lv_label.h index 651559e47..d66f30039 100644 --- a/lv_objx/lv_label.h +++ b/lv_objx/lv_label.h @@ -30,12 +30,12 @@ typedef struct uint16_t letter_space; uint16_t line_space; uint8_t mid :1; - uint8_t auto_break :1; }lv_labels_t; typedef struct { - char* txt; + char * txt_dp; + uint8_t fixw :1; }lv_label_ext_t; typedef enum @@ -54,11 +54,13 @@ lv_obj_t* lv_label_create(lv_obj_t* par_dp, lv_obj_t * ori_dp); bool lv_label_signal(lv_obj_t* obj_dp, lv_signal_t sign, void * param); -lv_labels_t * lv_labels_get(lv_labels_builtin_t style, lv_labels_t * copy_p); void lv_label_set_text(lv_obj_t* obj_dp, const char * text); - +void lv_label_set_fixw(lv_obj_t * obj_dp, bool fixw); const char * lv_label_get_text(lv_obj_t* obj_dp); +bool lv_label_get_fixw(lv_obj_t * obj_dp); + +lv_labels_t * lv_labels_get(lv_labels_builtin_t style, lv_labels_t * copy_p); /********************** * MACROS