1 /**
2  * @file lv_label.h
3  *
4  */
5 
6 #ifndef LV_LABEL_H
7 #define LV_LABEL_H
8 
9 #ifdef __cplusplus
10 extern "C" {
11 #endif
12 
13 /*********************
14  *      INCLUDES
15  *********************/
16 #include "../lv_conf_internal.h"
17 
18 #if LV_USE_LABEL != 0
19 
20 #include <stdarg.h>
21 #include "../core/lv_obj.h"
22 #include "../font/lv_font.h"
23 #include "../font/lv_symbol_def.h"
24 #include "../misc/lv_txt.h"
25 #include "../draw/lv_draw.h"
26 
27 /*********************
28  *      DEFINES
29  *********************/
30 #define LV_LABEL_WAIT_CHAR_COUNT        3
31 #define LV_LABEL_DOT_NUM 3
32 #define LV_LABEL_POS_LAST 0xFFFF
33 #define LV_LABEL_TEXT_SELECTION_OFF LV_DRAW_LABEL_NO_TXT_SEL
34 
35 LV_EXPORT_CONST_INT(LV_LABEL_DOT_NUM);
36 LV_EXPORT_CONST_INT(LV_LABEL_POS_LAST);
37 LV_EXPORT_CONST_INT(LV_LABEL_TEXT_SELECTION_OFF);
38 
39 /**********************
40  *      TYPEDEFS
41  **********************/
42 
43 /** Long mode behaviors. Used in 'lv_label_ext_t'*/
44 enum {
45     LV_LABEL_LONG_WRAP,             /**< Keep the object width, wrap the too long lines and expand the object height*/
46     LV_LABEL_LONG_DOT,              /**< Keep the size and write dots at the end if the text is too long*/
47     LV_LABEL_LONG_SCROLL,           /**< Keep the size and roll the text back and forth*/
48     LV_LABEL_LONG_SCROLL_CIRCULAR,  /**< Keep the size and roll the text circularly*/
49     LV_LABEL_LONG_CLIP,             /**< Keep the size and clip the text out of it*/
50 };
51 typedef uint8_t lv_label_long_mode_t;
52 
53 typedef struct {
54     lv_obj_t obj;
55     char * text;
56     union {
57         char * tmp_ptr; /*Pointer to the allocated memory containing the character replaced by dots*/
58         char tmp[LV_LABEL_DOT_NUM + 1]; /*Directly store the characters if <=4 characters*/
59     } dot;
60     uint32_t dot_end;  /*The real text length, used in dot mode*/
61 
62 #if LV_LABEL_LONG_TXT_HINT
63     lv_draw_label_hint_t hint;
64 #endif
65 
66 #if LV_LABEL_TEXT_SELECTION
67     uint32_t sel_start;
68     uint32_t sel_end;
69 #endif
70 
71     lv_point_t offset; /*Text draw position offset*/
72     lv_label_long_mode_t long_mode : 3; /*Determine what to do with the long texts*/
73     uint8_t static_txt : 1;             /*Flag to indicate the text is static*/
74     uint8_t recolor : 1;                /*Enable in-line letter re-coloring*/
75     uint8_t expand : 1;                 /*Ignore real width (used by the library with LV_LABEL_LONG_SCROLL)*/
76     uint8_t dot_tmp_alloc : 1;         /*1: dot is allocated, 0: dot directly holds up to 4 chars*/
77 } lv_label_t;
78 
79 extern const lv_obj_class_t lv_label_class;
80 
81 /**********************
82  * GLOBAL PROTOTYPES
83  **********************/
84 
85 /**
86  * Create a label object
87  * @param parent    pointer to an object, it will be the parent of the new label.
88  * @return          pointer to the created button
89  */
90 lv_obj_t * lv_label_create(lv_obj_t * parent);
91 
92 /*=====================
93  * Setter functions
94  *====================*/
95 
96 /**
97  * Set a new text for a label. Memory will be allocated to store the text by the label.
98  * @param obj           pointer to a label object
99  * @param text          '\0' terminated character string. NULL to refresh with the current text.
100  */
101 void lv_label_set_text(lv_obj_t * obj, const char * text);
102 
103 /**
104  * Set a new formatted text for a label. Memory will be allocated to store the text by the label.
105  * @param obj           pointer to a label object
106  * @param fmt           `printf`-like format
107  * @example lv_label_set_text_fmt(label1, "%d user", user_num);
108  */
109 void lv_label_set_text_fmt(lv_obj_t * obj, const char * fmt, ...) LV_FORMAT_ATTRIBUTE(2, 3);
110 
111 /**
112  * Set a static text. It will not be saved by the label so the 'text' variable
113  * has to be 'alive' while the label exists.
114  * @param obj           pointer to a label object
115  * @param text          pointer to a text. NULL to refresh with the current text.
116  */
117 void lv_label_set_text_static(lv_obj_t * obj, const char * text);
118 
119 /**
120  * Set the behavior of the label with longer text then the object size
121  * @param obj           pointer to a label object
122  * @param long_mode     the new mode from 'lv_label_long_mode' enum.
123  *                      In LV_LONG_WRAP/DOT/SCROLL/SCROLL_CIRC the size of the label should be set AFTER this function
124  */
125 void lv_label_set_long_mode(lv_obj_t * obj, lv_label_long_mode_t long_mode);
126 
127 /**
128  * Enable the recoloring by in-line commands
129  * @param obj           pointer to a label object
130  * @param en            true: enable recoloring, false: disable
131  * @example "This is a #ff0000 red# word"
132  */
133 void lv_label_set_recolor(lv_obj_t * obj, bool en);
134 
135 /**
136  * Set where text selection should start
137  * @param obj       pointer to a label object
138  * @param index     character index from where selection should start. `LV_LABEL_TEXT_SELECTION_OFF` for no selection
139  */
140 void lv_label_set_text_sel_start(lv_obj_t * obj, uint32_t index);
141 
142 /**
143  * Set where text selection should end
144  * @param obj       pointer to a label object
145  * @param index     character index where selection should end.  `LV_LABEL_TEXT_SELECTION_OFF` for no selection
146  */
147 void lv_label_set_text_sel_end(lv_obj_t * obj, uint32_t index);
148 
149 /*=====================
150  * Getter functions
151  *====================*/
152 
153 /**
154  * Get the text of a label
155  * @param obj       pointer to a label object
156  * @return          the text of the label
157  */
158 char * lv_label_get_text(const lv_obj_t * obj);
159 
160 /**
161  * Get the long mode of a label
162  * @param obj       pointer to a label object
163  * @return          the current long mode
164  */
165 lv_label_long_mode_t lv_label_get_long_mode(const lv_obj_t * obj);
166 
167 /**
168  * Get the recoloring attribute
169  * @param obj       pointer to a label object
170  * @return          true: recoloring is enabled, false: disable
171  */
172 bool lv_label_get_recolor(const lv_obj_t * obj);
173 
174 /**
175  * Get the relative x and y coordinates of a letter
176  * @param obj       pointer to a label object
177  * @param index     index of the character [0 ... text length - 1].
178  *                  Expressed in character index, not byte index (different in UTF-8)
179  * @param pos       store the result here (E.g. index = 0 gives 0;0 coordinates if the text if aligned to the left)
180  */
181 void lv_label_get_letter_pos(const lv_obj_t * obj, uint32_t char_id, lv_point_t * pos);
182 
183 /**
184  * Get the index of letter on a relative point of a label.
185  * @param obj       pointer to label object
186  * @param pos       pointer to point with coordinates on a the label
187  * @return          The index of the letter on the 'pos_p' point (E.g. on 0;0 is the 0. letter if aligned to the left)
188  *                  Expressed in character index and not byte index (different in UTF-8)
189  */
190 uint32_t lv_label_get_letter_on(const lv_obj_t * obj, lv_point_t * pos_in);
191 
192 /**
193  * Check if a character is drawn under a point.
194  * @param obj       pointer to a label object
195  * @param pos       Point to check for character under
196  * @return          whether a character is drawn under the point
197  */
198 bool lv_label_is_char_under_pos(const lv_obj_t * obj, lv_point_t * pos);
199 
200 /**
201  * @brief Get the selection start index.
202  * @param obj       pointer to a label object.
203  * @return          selection start index. `LV_LABEL_TEXT_SELECTION_OFF` if nothing is selected.
204  */
205 uint32_t lv_label_get_text_selection_start(const lv_obj_t * obj);
206 
207 /**
208  * @brief Get the selection end index.
209  * @param obj       pointer to a label object.
210  * @return          selection end index. `LV_LABEL_TXT_SEL_OFF` if nothing is selected.
211  */
212 uint32_t lv_label_get_text_selection_end(const lv_obj_t * obj);
213 
214 /*=====================
215  * Other functions
216  *====================*/
217 
218 /**
219  * Insert a text to a label. The label text can not be static.
220  * @param obj       pointer to a label object
221  * @param pos       character index to insert. Expressed in character index and not byte index.
222  *                  0: before first char. LV_LABEL_POS_LAST: after last char.
223  * @param txt       pointer to the text to insert
224  */
225 void lv_label_ins_text(lv_obj_t * obj, uint32_t pos, const char * txt);
226 
227 /**
228  * Delete characters from a label. The label text can not be static.
229  * @param obj       pointer to a label object
230  * @param pos       character index from where to cut. Expressed in character index and not byte index.
231  *                  0: start in from of the first character
232  * @param cnt       number of characters to cut
233  */
234 void lv_label_cut_text(lv_obj_t * obj, uint32_t pos, uint32_t cnt);
235 
236 /**********************
237  *      MACROS
238  **********************/
239 
240 #endif /*LV_USE_LABEL*/
241 
242 #ifdef __cplusplus
243 } /*extern "C"*/
244 #endif
245 
246 #endif /*LV_LABEL_H*/
247