1 /**
2 * @file lv_flex.h
3 *
4 */
5
6 #ifndef LV_FLEX_H
7 #define LV_FLEX_H
8
9 #ifdef __cplusplus
10 extern "C" {
11 #endif
12
13 /*********************
14 * INCLUDES
15 *********************/
16 #include "../../../core/lv_obj.h"
17 #if LV_USE_FLEX
18
19 /*********************
20 * DEFINES
21 *********************/
22
23 #define LV_OBJ_FLAG_FLEX_IN_NEW_TRACK LV_OBJ_FLAG_LAYOUT_1
24 LV_EXPORT_CONST_INT(LV_OBJ_FLAG_FLEX_IN_NEW_TRACK);
25
26 #define _LV_FLEX_COLUMN (1 << 0)
27 #define _LV_FLEX_WRAP (1 << 2)
28 #define _LV_FLEX_REVERSE (1 << 3)
29
30 /**********************
31 * TYPEDEFS
32 **********************/
33
34 /*Can't include lv_obj.h because it includes this header file*/
35 struct _lv_obj_t;
36
37 typedef enum {
38 LV_FLEX_ALIGN_START,
39 LV_FLEX_ALIGN_END,
40 LV_FLEX_ALIGN_CENTER,
41 LV_FLEX_ALIGN_SPACE_EVENLY,
42 LV_FLEX_ALIGN_SPACE_AROUND,
43 LV_FLEX_ALIGN_SPACE_BETWEEN,
44 } lv_flex_align_t;
45
46 typedef enum {
47 LV_FLEX_FLOW_ROW = 0x00,
48 LV_FLEX_FLOW_COLUMN = _LV_FLEX_COLUMN,
49 LV_FLEX_FLOW_ROW_WRAP = LV_FLEX_FLOW_ROW | _LV_FLEX_WRAP,
50 LV_FLEX_FLOW_ROW_REVERSE = LV_FLEX_FLOW_ROW | _LV_FLEX_REVERSE,
51 LV_FLEX_FLOW_ROW_WRAP_REVERSE = LV_FLEX_FLOW_ROW | _LV_FLEX_WRAP | _LV_FLEX_REVERSE,
52 LV_FLEX_FLOW_COLUMN_WRAP = LV_FLEX_FLOW_COLUMN | _LV_FLEX_WRAP,
53 LV_FLEX_FLOW_COLUMN_REVERSE = LV_FLEX_FLOW_COLUMN | _LV_FLEX_REVERSE,
54 LV_FLEX_FLOW_COLUMN_WRAP_REVERSE = LV_FLEX_FLOW_COLUMN | _LV_FLEX_WRAP | _LV_FLEX_REVERSE,
55 } lv_flex_flow_t;
56
57 /**********************
58 * GLOBAL VARIABLES
59 **********************/
60 extern uint16_t LV_LAYOUT_FLEX;
61 extern lv_style_prop_t LV_STYLE_FLEX_FLOW;
62 extern lv_style_prop_t LV_STYLE_FLEX_MAIN_PLACE;
63 extern lv_style_prop_t LV_STYLE_FLEX_CROSS_PLACE;
64 extern lv_style_prop_t LV_STYLE_FLEX_TRACK_PLACE;
65 extern lv_style_prop_t LV_STYLE_FLEX_GROW;
66
67 /**********************
68 * GLOBAL PROTOTYPES
69 **********************/
70
71 /**
72 * Initialize a flex layout the default values
73 * @param flex pointer to a flex layout descriptor
74 */
75 void lv_flex_init(void);
76
77 /**
78 * Set hot the item should flow
79 * @param flex pointer to a flex layout descriptor
80 * @param flow an element of `lv_flex_flow_t`.
81 */
82 void lv_obj_set_flex_flow(lv_obj_t * obj, lv_flex_flow_t flow);
83
84 /**
85 * Set how to place (where to align) the items and tracks
86 * @param flex pointer: to a flex layout descriptor
87 * @param main_place where to place the items on main axis (in their track). Any value of `lv_flex_align_t`.
88 * @param cross_place where to place the item in their track on the cross axis. `LV_FLEX_ALIGN_START/END/CENTER`
89 * @param track_place where to place the tracks in the cross direction. Any value of `lv_flex_align_t`.
90 */
91 void lv_obj_set_flex_align(lv_obj_t * obj, lv_flex_align_t main_place, lv_flex_align_t cross_place,
92 lv_flex_align_t track_cross_place);
93
94 /**
95 * Sets the width or height (on main axis) to grow the object in order fill the free space
96 * @param obj pointer to an object. The parent must have flex layout else nothing will happen.
97 * @param grow a value to set how much free space to take proportionally to other growing items.
98 */
99 void lv_obj_set_flex_grow(lv_obj_t * obj, uint8_t grow);
100
101 void lv_style_set_flex_flow(lv_style_t * style, lv_flex_flow_t value);
102 void lv_style_set_flex_main_place(lv_style_t * style, lv_flex_align_t value);
103 void lv_style_set_flex_cross_place(lv_style_t * style, lv_flex_align_t value);
104 void lv_style_set_flex_track_place(lv_style_t * style, lv_flex_align_t value);
105 void lv_style_set_flex_grow(lv_style_t * style, uint8_t value);
106 void lv_obj_set_style_flex_flow(lv_obj_t * obj, lv_flex_flow_t value, lv_style_selector_t selector);
107 void lv_obj_set_style_flex_main_place(lv_obj_t * obj, lv_flex_align_t value, lv_style_selector_t selector);
108 void lv_obj_set_style_flex_cross_place(lv_obj_t * obj, lv_flex_align_t value, lv_style_selector_t selector);
109 void lv_obj_set_style_flex_track_place(lv_obj_t * obj, lv_flex_align_t value, lv_style_selector_t selector);
110 void lv_obj_set_style_flex_grow(lv_obj_t * obj, uint8_t value, lv_style_selector_t selector);
111
lv_obj_get_style_flex_flow(const lv_obj_t * obj,uint32_t part)112 static inline lv_flex_flow_t lv_obj_get_style_flex_flow(const lv_obj_t * obj, uint32_t part)
113 {
114 lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_FLEX_FLOW);
115 return (lv_flex_flow_t)v.num;
116 }
117
lv_obj_get_style_flex_main_place(const lv_obj_t * obj,uint32_t part)118 static inline lv_flex_align_t lv_obj_get_style_flex_main_place(const lv_obj_t * obj, uint32_t part)
119 {
120 lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_FLEX_MAIN_PLACE);
121 return (lv_flex_align_t)v.num;
122 }
123
lv_obj_get_style_flex_cross_place(const lv_obj_t * obj,uint32_t part)124 static inline lv_flex_align_t lv_obj_get_style_flex_cross_place(const lv_obj_t * obj, uint32_t part)
125 {
126 lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_FLEX_CROSS_PLACE);
127 return (lv_flex_align_t)v.num;
128 }
129
lv_obj_get_style_flex_track_place(const lv_obj_t * obj,uint32_t part)130 static inline lv_flex_align_t lv_obj_get_style_flex_track_place(const lv_obj_t * obj, uint32_t part)
131 {
132 lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_FLEX_TRACK_PLACE);
133 return (lv_flex_align_t)v.num;
134 }
135
lv_obj_get_style_flex_grow(const lv_obj_t * obj,uint32_t part)136 static inline uint8_t lv_obj_get_style_flex_grow(const lv_obj_t * obj, uint32_t part)
137 {
138 lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_FLEX_GROW);
139 return (uint8_t)v.num;
140 }
141
142 /**********************
143 * MACROS
144 **********************/
145
146 #endif /*LV_USE_FLEX*/
147
148 #ifdef __cplusplus
149 } /*extern "C"*/
150 #endif
151
152 #endif /*LV_FLEX_H*/
153