1 /**
2 * @file lv_obj_pos.h
3 *
4 */
5
6 #ifndef LV_OBJ_POS_H
7 #define LV_OBJ_POS_H
8
9 #ifdef __cplusplus
10 extern "C" {
11 #endif
12
13 /*********************
14 * INCLUDES
15 *********************/
16 #include "../misc/lv_area.h"
17
18 /*********************
19 * DEFINES
20 *********************/
21
22 /**********************
23 * TYPEDEFS
24 **********************/
25 struct _lv_obj_t;
26
27 typedef void (*lv_layout_update_cb_t)(struct _lv_obj_t *, void * user_data);
28 typedef struct {
29 lv_layout_update_cb_t cb;
30 void * user_data;
31 } lv_layout_dsc_t;
32
33 /**********************
34 * GLOBAL PROTOTYPES
35 **********************/
36
37 /**
38 * Set the position of an object relative to the set alignment.
39 * @param obj pointer to an object
40 * @param x new x coordinate
41 * @param y new y coordinate
42 * @note With default alignment it's the distance from the top left corner
43 * @note E.g. LV_ALIGN_CENTER alignment it's the offset from the center of the parent
44 * @note The position is interpreted on the content area of the parent
45 * @note The values can be set in pixel or in percentage of parent size with `lv_pct(v)`
46 */
47 void lv_obj_set_pos(struct _lv_obj_t * obj, lv_coord_t x, lv_coord_t y);
48
49 /**
50 * Set the x coordinate of an object
51 * @param obj pointer to an object
52 * @param x new x coordinate
53 * @note With default alignment it's the distance from the top left corner
54 * @note E.g. LV_ALIGN_CENTER alignment it's the offset from the center of the parent
55 * @note The position is interpreted on the content area of the parent
56 * @note The values can be set in pixel or in percentage of parent size with `lv_pct(v)`
57 */
58 void lv_obj_set_x(struct _lv_obj_t * obj, lv_coord_t x);
59
60 /**
61 * Set the y coordinate of an object
62 * @param obj pointer to an object
63 * @param y new y coordinate
64 * @note With default alignment it's the distance from the top left corner
65 * @note E.g. LV_ALIGN_CENTER alignment it's the offset from the center of the parent
66 * @note The position is interpreted on the content area of the parent
67 * @note The values can be set in pixel or in percentage of parent size with `lv_pct(v)`
68 */
69 void lv_obj_set_y(struct _lv_obj_t * obj, lv_coord_t y);
70
71 /**
72 * Set the size of an object.
73 * @param obj pointer to an object
74 * @param w the new width
75 * @param h the new height
76 * @note possible values are:
77 * pixel simple set the size accordingly
78 * LV_SIZE_CONTENT set the size to involve all children in the given direction
79 * LV_SIZE_PCT(x) to set size in percentage of the parent's content area size (the size without paddings).
80 * x should be in [0..1000]% range
81 */
82 void lv_obj_set_size(struct _lv_obj_t * obj, lv_coord_t w, lv_coord_t h);
83
84 /**
85 * Recalculate the size of the object
86 * @param obj pointer to an object
87 * @return true: the size has been changed
88 */
89 bool lv_obj_refr_size(struct _lv_obj_t * obj);
90
91 /**
92 * Set the width of an object
93 * @param obj pointer to an object
94 * @param w the new width
95 * @note possible values are:
96 * pixel simple set the size accordingly
97 * LV_SIZE_CONTENT set the size to involve all children in the given direction
98 * lv_pct(x) to set size in percentage of the parent's content area size (the size without paddings).
99 * x should be in [0..1000]% range
100 */
101 void lv_obj_set_width(struct _lv_obj_t * obj, lv_coord_t w);
102
103 /**
104 * Set the height of an object
105 * @param obj pointer to an object
106 * @param h the new height
107 * @note possible values are:
108 * pixel simple set the size accordingly
109 * LV_SIZE_CONTENT set the size to involve all children in the given direction
110 * lv_pct(x) to set size in percentage of the parent's content area size (the size without paddings).
111 * x should be in [0..1000]% range
112 */
113 void lv_obj_set_height(struct _lv_obj_t * obj, lv_coord_t h);
114
115 /**
116 * Set the width reduced by the left and right padding and the border width.
117 * @param obj pointer to an object
118 * @param w the width without paddings in pixels
119 */
120 void lv_obj_set_content_width(struct _lv_obj_t * obj, lv_coord_t w);
121
122 /**
123 * Set the height reduced by the top and bottom padding and the border width.
124 * @param obj pointer to an object
125 * @param h the height without paddings in pixels
126 */
127 void lv_obj_set_content_height(struct _lv_obj_t * obj, lv_coord_t h);
128
129 /**
130 * Set a layout for an object
131 * @param obj pointer to an object
132 * @param layout pointer to a layout descriptor to set
133 */
134 void lv_obj_set_layout(struct _lv_obj_t * obj, uint32_t layout);
135
136 /**
137 * Test whether the and object is positioned by a layout or not
138 * @param obj pointer to an object to test
139 * @return true: positioned by a layout; false: not positioned by a layout
140 */
141 bool lv_obj_is_layout_positioned(const struct _lv_obj_t * obj);
142
143 /**
144 * Mark the object for layout update.
145 * @param obj pointer to an object whose children needs to be updated
146 */
147 void lv_obj_mark_layout_as_dirty(struct _lv_obj_t * obj);
148
149 /**
150 * Update the layout of an object.
151 * @param obj pointer to an object whose children needs to be updated
152 */
153 void lv_obj_update_layout(const struct _lv_obj_t * obj);
154
155 /**
156 * Register a new layout
157 * @param cb the layout update callback
158 * @param user_data custom data that will be passed to `cb`
159 * @return the ID of the new layout
160 */
161 uint32_t lv_layout_register(lv_layout_update_cb_t cb, void * user_data);
162
163 /**
164 * Change the alignment of an object.
165 * @param obj pointer to an object to align
166 * @param align type of alignment (see 'lv_align_t' enum) `LV_ALIGN_OUT_...` can't be used.
167 */
168 void lv_obj_set_align(struct _lv_obj_t * obj, lv_align_t align);
169
170 /**
171 * Change the alignment of an object and set new coordinates.
172 * Equivalent to:
173 * lv_obj_set_align(obj, align);
174 * lv_obj_set_pos(obj, x_ofs, y_ofs);
175 * @param obj pointer to an object to align
176 * @param align type of alignment (see 'lv_align_t' enum) `LV_ALIGN_OUT_...` can't be used.
177 * @param x_ofs x coordinate offset after alignment
178 * @param y_ofs y coordinate offset after alignment
179 */
180 void lv_obj_align(struct _lv_obj_t * obj, lv_align_t align, lv_coord_t x_ofs, lv_coord_t y_ofs);
181
182 /**
183 * Align an object to an other object.
184 * @param obj pointer to an object to align
185 * @param base pointer to an other object (if NULL `obj`s parent is used). 'obj' will be aligned to it.
186 * @param align type of alignment (see 'lv_align_t' enum)
187 * @param x_ofs x coordinate offset after alignment
188 * @param y_ofs y coordinate offset after alignment
189 * @note if the position or size of `base` changes `obj` needs to be aligned manually again
190 */
191 void lv_obj_align_to(struct _lv_obj_t * obj, const struct _lv_obj_t * base, lv_align_t align, lv_coord_t x_ofs,
192 lv_coord_t y_ofs);
193
194 /**
195 * Align an object to the center on its parent.
196 * @param obj pointer to an object to align
197 * @note if the parent size changes `obj` needs to be aligned manually again
198 */
lv_obj_center(struct _lv_obj_t * obj)199 static inline void lv_obj_center(struct _lv_obj_t * obj)
200 {
201 lv_obj_align(obj, LV_ALIGN_CENTER, 0, 0);
202 }
203
204
205 /**
206 * Copy the coordinates of an object to an area
207 * @param obj pointer to an object
208 * @param coords pointer to an area to store the coordinates
209 */
210 void lv_obj_get_coords(const struct _lv_obj_t * obj, lv_area_t * coords);
211
212 /**
213 * Get the x coordinate of object.
214 * @param obj pointer to an object
215 * @return distance of `obj` from the left side of its parent plus the parent's left padding
216 * @note The position of the object is recalculated only on the next redraw. To force coordinate recalculation
217 * call `lv_obj_update_layout(obj)`.
218 * @note Zero return value means the object is on the left padding of the parent, and not on the left edge.
219 * @note Scrolling of the parent doesn't change the returned value.
220 * @note The returned value is always the distance from the parent even if `obj` is positioned by a layout.
221 */
222 lv_coord_t lv_obj_get_x(const struct _lv_obj_t * obj);
223
224 /**
225 * Get the x2 coordinate of object.
226 * @param obj pointer to an object
227 * @return distance of `obj` from the right side of its parent plus the parent's right padding
228 * @note The position of the object is recalculated only on the next redraw. To force coordinate recalculation
229 * call `lv_obj_update_layout(obj)`.
230 * @note Zero return value means the object is on the right padding of the parent, and not on the right edge.
231 * @note Scrolling of the parent doesn't change the returned value.
232 * @note The returned value is always the distance from the parent even if `obj` is positioned by a layout.
233 */
234 lv_coord_t lv_obj_get_x2(const struct _lv_obj_t * obj);
235
236 /**
237 * Get the y coordinate of object.
238 * @param obj pointer to an object
239 * @return distance of `obj` from the top side of its parent plus the parent's top padding
240 * @note The position of the object is recalculated only on the next redraw. To force coordinate recalculation
241 * call `lv_obj_update_layout(obj)`.
242 * @note Zero return value means the object is on the top padding of the parent, and not on the top edge.
243 * @note Scrolling of the parent doesn't change the returned value.
244 * @note The returned value is always the distance from the parent even if `obj` is positioned by a layout.
245 */
246 lv_coord_t lv_obj_get_y(const struct _lv_obj_t * obj);
247
248 /**
249 * Get the y2 coordinate of object.
250 * @param obj pointer to an object
251 * @return distance of `obj` from the bottom side of its parent plus the parent's bottom padding
252 * @note The position of the object is recalculated only on the next redraw. To force coordinate recalculation
253 * call `lv_obj_update_layout(obj)`.
254 * @note Zero return value means the object is on the bottom padding of the parent, and not on the bottom edge.
255 * @note Scrolling of the parent doesn't change the returned value.
256 * @note The returned value is always the distance from the parent even if `obj` is positioned by a layout.
257 */
258 lv_coord_t lv_obj_get_y2(const struct _lv_obj_t * obj);
259
260 /**
261 * Get the actually set x coordinate of object, i.e. the offset form the set alignment
262 * @param obj pointer to an object
263 * @return the set x coordinate
264 */
265 lv_coord_t lv_obj_get_x_aligned(const struct _lv_obj_t * obj);
266
267 /**
268 * Get the actually set y coordinate of object, i.e. the offset form the set alignment
269 * @param obj pointer to an object
270 * @return the set y coordinate
271 */
272 lv_coord_t lv_obj_get_y_aligned(const struct _lv_obj_t * obj);
273
274 /**
275 * Get the width of an object
276 * @param obj pointer to an object
277 * @note The position of the object is recalculated only on the next redraw. To force coordinate recalculation
278 * call `lv_obj_update_layout(obj)`.
279 * @return the width in pixels
280 */
281 lv_coord_t lv_obj_get_width(const struct _lv_obj_t * obj);
282
283 /**
284 * Get the height of an object
285 * @param obj pointer to an object
286 * @note The position of the object is recalculated only on the next redraw. To force coordinate recalculation
287 * call `lv_obj_update_layout(obj)`.
288 * @return the height in pixels
289 */
290 lv_coord_t lv_obj_get_height(const struct _lv_obj_t * obj);
291
292 /**
293 * Get the width reduced by the left and right padding and the border width.
294 * @param obj pointer to an object
295 * @note The position of the object is recalculated only on the next redraw. To force coordinate recalculation
296 * call `lv_obj_update_layout(obj)`.
297 * @return the width which still fits into its parent without causing overflow (making the parent scrollable)
298 */
299 lv_coord_t lv_obj_get_content_width(const struct _lv_obj_t * obj);
300
301 /**
302 * Get the height reduced by the top and bottom padding and the border width.
303 * @param obj pointer to an object
304 * @note The position of the object is recalculated only on the next redraw. To force coordinate recalculation
305 * call `lv_obj_update_layout(obj)`.
306 * @return the height which still fits into the parent without causing overflow (making the parent scrollable)
307 */
308 lv_coord_t lv_obj_get_content_height(const struct _lv_obj_t * obj);
309
310 /**
311 * Get the area reduced by the paddings and the border width.
312 * @param obj pointer to an object
313 * @note The position of the object is recalculated only on the next redraw. To force coordinate recalculation
314 * call `lv_obj_update_layout(obj)`.
315 * @param area the area which still fits into the parent without causing overflow (making the parent scrollable)
316 */
317 void lv_obj_get_content_coords(const struct _lv_obj_t * obj, lv_area_t * area);
318
319 /**
320 * Get the width occupied by the "parts" of the widget. E.g. the width of all columns of a table.
321 * @param obj pointer to an objects
322 * @return the width of the virtually drawn content
323 * @note This size independent from the real size of the widget.
324 * It just tells how large the internal ("virtual") content is.
325 */
326 lv_coord_t lv_obj_get_self_width(const struct _lv_obj_t * obj);
327
328 /**
329 * Get the height occupied by the "parts" of the widget. E.g. the height of all rows of a table.
330 * @param obj pointer to an objects
331 * @return the width of the virtually drawn content
332 * @note This size independent from the real size of the widget.
333 * It just tells how large the internal ("virtual") content is.
334 */
335 lv_coord_t lv_obj_get_self_height(const struct _lv_obj_t * obj);
336
337 /**
338 * Handle if the size of the internal ("virtual") content of an object has changed.
339 * @param obj pointer to an object
340 * @return false: nothing happened; true: refresh happened
341 */
342 bool lv_obj_refresh_self_size(struct _lv_obj_t * obj);
343
344 void lv_obj_refr_pos(struct _lv_obj_t * obj);
345
346 void lv_obj_move_to(struct _lv_obj_t * obj, lv_coord_t x, lv_coord_t y);
347
348
349 void lv_obj_move_children_by(struct _lv_obj_t * obj, lv_coord_t x_diff, lv_coord_t y_diff, bool ignore_floating);
350
351 /**
352 * Transform a point using the angle and zoom style properties of an object
353 * @param obj pointer to an object whose style properties should be used
354 * @param p a point to transform, the result will be written back here too
355 * @param recursive consider the transformation properties of the parents too
356 * @param inv do the inverse of the transformation (-angle and 1/zoom)
357 */
358 void lv_obj_transform_point(const struct _lv_obj_t * obj, lv_point_t * p, bool recursive, bool inv);
359
360 /**
361 * Transform an area using the angle and zoom style properties of an object
362 * @param obj pointer to an object whose style properties should be used
363 * @param area an area to transform, the result will be written back here too
364 * @param recursive consider the transformation properties of the parents too
365 * @param inv do the inverse of the transformation (-angle and 1/zoom)
366 */
367 void lv_obj_get_transformed_area(const struct _lv_obj_t * obj, lv_area_t * area, bool recursive, bool inv);
368
369 /**
370 * Mark an area of an object as invalid.
371 * The area will be truncated to the object's area and marked for redraw.
372 * @param obj pointer to an object
373 * @param area the area to redraw
374 */
375 void lv_obj_invalidate_area(const struct _lv_obj_t * obj, const lv_area_t * area);
376
377 /**
378 * Mark the object as invalid to redrawn its area
379 * @param obj pointer to an object
380 */
381 void lv_obj_invalidate(const struct _lv_obj_t * obj);
382
383 /**
384 * Tell whether an area of an object is visible (even partially) now or not
385 * @param obj pointer to an object
386 * @param area the are to check. The visible part of the area will be written back here.
387 * @return true visible; false not visible (hidden, out of parent, on other screen, etc)
388 */
389 bool lv_obj_area_is_visible(const struct _lv_obj_t * obj, lv_area_t * area);
390
391 /**
392 * Tell whether an object is visible (even partially) now or not
393 * @param obj pointer to an object
394 * @return true: visible; false not visible (hidden, out of parent, on other screen, etc)
395 */
396 bool lv_obj_is_visible(const struct _lv_obj_t * obj);
397
398 /**
399 * Set the size of an extended clickable area
400 * @param obj pointer to an object
401 * @param size extended clickable area in all 4 directions [px]
402 */
403 void lv_obj_set_ext_click_area(struct _lv_obj_t * obj, lv_coord_t size);
404
405 /**
406 * Get the an area where to object can be clicked.
407 * It's the object's normal area plus the extended click area.
408 * @param obj pointer to an object
409 * @param area store the result area here
410 */
411 void lv_obj_get_click_area(const struct _lv_obj_t * obj, lv_area_t * area);
412
413 /**
414 * Hit-test an object given a particular point in screen space.
415 * @param obj object to hit-test
416 * @param point screen-space point (absolute coordinate)
417 * @return true: if the object is considered under the point
418 */
419 bool lv_obj_hit_test(struct _lv_obj_t * obj, const lv_point_t * point);
420
421 /**
422 * Clamp a width between min and max width. If the min/max width is in percentage value use the ref_width
423 * @param width width to clamp
424 * @param min_width the minimal width
425 * @param max_width the maximal width
426 * @param ref_width the reference width used when min/max width is in percentage
427 * @return the clamped width
428 */
429 lv_coord_t lv_clamp_width(lv_coord_t width, lv_coord_t min_width, lv_coord_t max_width, lv_coord_t ref_width);
430
431 /**
432 * Clamp a height between min and max height. If the min/max height is in percentage value use the ref_height
433 * @param height height to clamp
434 * @param min_height the minimal height
435 * @param max_height the maximal height
436 * @param ref_height the reference height used when min/max height is in percentage
437 * @return the clamped height
438 */
439 lv_coord_t lv_clamp_height(lv_coord_t height, lv_coord_t min_height, lv_coord_t max_height, lv_coord_t ref_height);
440
441 /**********************
442 * MACROS
443 **********************/
444
445 #ifdef __cplusplus
446 } /*extern "C"*/
447 #endif
448
449 #endif /*LV_OBJ_POS_H*/
450