1 /**
2 * @file lv_demo_flex_layout_view_ctrl_pad.c
3 *
4 */
5
6 /*********************
7 * INCLUDES
8 *********************/
9
10 #include "lv_demo_flex_layout_main.h"
11
12 #if LV_USE_DEMO_FLEX_LAYOUT
13
14 /*********************
15 * DEFINES
16 *********************/
17
18 #define DDLIST_ALIGN_CREATE_DEF(item) \
19 do { \
20 ui->ctrl_pad.tab.align.ddlist_align_##item = \
21 ddlist_create(tab, \
22 "Align "#item" place", \
23 "start\n" \
24 "end\n" \
25 "center\n" \
26 "space evenly\n" \
27 "space around\n" \
28 "space between"); \
29 } while(0)
30
31 /**********************
32 * TYPEDEFS
33 **********************/
34
35 /**********************
36 * STATIC PROTOTYPES
37 **********************/
38
39 static void tab_flex_create(lv_obj_t * tab, view_t * ui);
40 static void tab_align_create(lv_obj_t * tab, view_t * ui);
41 static void tab_layout_create(lv_obj_t * tab, view_t * ui);
42
43 /**********************
44 * STATIC VARIABLES
45 **********************/
46
47 /**********************
48 * MACROS
49 **********************/
50
51 /**********************
52 * GLOBAL FUNCTIONS
53 **********************/
54
view_ctrl_pad_create(lv_obj_t * par,view_t * ui)55 void view_ctrl_pad_create(lv_obj_t * par, view_t * ui)
56 {
57 lv_obj_t * tv = lv_tabview_create(par);
58 lv_tabview_set_tab_bar_size(tv, 50);
59 lv_obj_set_width(tv, lv_pct(100));
60 lv_obj_set_flex_grow(tv, 1);
61 lv_obj_set_style_radius(tv, 0, 0);
62 lv_obj_set_style_bg_color(tv, lv_color_hex(0xffffff), 0);
63
64 lv_obj_t * buttons = lv_tabview_get_tab_bar(tv);
65 lv_obj_set_style_outline_width(buttons, 0, LV_PART_ITEMS | LV_STATE_FOCUS_KEY);
66 lv_obj_set_style_outline_width(buttons, 0, LV_STATE_FOCUS_KEY);
67 lv_obj_set_style_bg_color(buttons, lv_color_white(), LV_PART_ITEMS | LV_STATE_CHECKED);
68 lv_obj_set_height(buttons, 40);
69
70 ui->ctrl_pad.tab.view = tv;
71
72 ui->ctrl_pad.tab.flex.tab = lv_tabview_add_tab(tv, "Flex");
73 ui->ctrl_pad.tab.align.tab = lv_tabview_add_tab(tv, "Align");
74 ui->ctrl_pad.tab.layout.tab = lv_tabview_add_tab(tv, "Layout");
75
76 tab_flex_create(ui->ctrl_pad.tab.flex.tab, ui);
77 tab_align_create(ui->ctrl_pad.tab.align.tab, ui);
78 tab_layout_create(ui->ctrl_pad.tab.layout.tab, ui);
79 }
80
81 /**********************
82 * STATIC FUNCTIONS
83 **********************/
84
ddlist_create(lv_obj_t * par,const char * name,const char * options)85 static lv_obj_t * ddlist_create(lv_obj_t * par, const char * name, const char * options)
86 {
87 lv_obj_t * cont = lv_obj_create(par);
88 lv_obj_remove_style_all(cont);
89 lv_obj_set_size(cont, lv_pct(80), LV_SIZE_CONTENT);
90 lv_obj_set_flex_flow(cont, LV_FLEX_FLOW_COLUMN);
91
92 lv_obj_t * label = lv_label_create(cont);
93 lv_label_set_text(label, name);
94
95 lv_obj_t * ddlist = lv_dropdown_create(cont);
96 lv_obj_set_width(ddlist, lv_pct(100));
97 lv_dropdown_set_options_static(ddlist, options);
98 return ddlist;
99 }
100
tab_flex_create(lv_obj_t * tab,view_t * ui)101 static void tab_flex_create(lv_obj_t * tab, view_t * ui)
102 {
103 lv_obj_set_flex_flow(tab, LV_FLEX_FLOW_COLUMN);
104 lv_obj_set_flex_align(
105 tab,
106 LV_FLEX_ALIGN_START,
107 LV_FLEX_ALIGN_CENTER,
108 LV_FLEX_ALIGN_CENTER
109 );
110
111 ui->ctrl_pad.tab.flex.ddlist_flow = ddlist_create(
112 tab,
113 "Flow",
114 "Row\n"
115 "Column\n"
116 "Row wrap\n"
117 "Row reverse\n"
118 "Row wrap reverse\n"
119 "Column wrap\n"
120 "Column reverse\n"
121 "Column wrap reverse"
122 );
123
124 lv_obj_t * cb = lv_checkbox_create(tab);
125 lv_checkbox_set_text(cb, "Scrollable");
126 ui->ctrl_pad.tab.flex.checkbox_scrl = cb;
127 }
128
tab_align_create(lv_obj_t * tab,view_t * ui)129 static void tab_align_create(lv_obj_t * tab, view_t * ui)
130 {
131 lv_obj_set_flex_flow(tab, LV_FLEX_FLOW_COLUMN);
132 lv_obj_set_flex_align(
133 tab,
134 LV_FLEX_ALIGN_START,
135 LV_FLEX_ALIGN_CENTER,
136 LV_FLEX_ALIGN_CENTER
137 );
138
139 DDLIST_ALIGN_CREATE_DEF(main);
140 DDLIST_ALIGN_CREATE_DEF(cross);
141 DDLIST_ALIGN_CREATE_DEF(track);
142 }
143
btn_inc_event_handler(lv_event_t * e)144 static void btn_inc_event_handler(lv_event_t * e)
145 {
146 lv_obj_t * spinbox = lv_event_get_user_data(e);
147 lv_event_code_t code = lv_event_get_code(e);
148 if(code == LV_EVENT_SHORT_CLICKED || code == LV_EVENT_LONG_PRESSED_REPEAT) {
149 lv_spinbox_increment(spinbox);
150 }
151 }
152
btn_dec_event_handler(lv_event_t * e)153 static void btn_dec_event_handler(lv_event_t * e)
154 {
155 lv_obj_t * spinbox = lv_event_get_user_data(e);
156 lv_event_code_t code = lv_event_get_code(e);
157 if(code == LV_EVENT_SHORT_CLICKED || code == LV_EVENT_LONG_PRESSED_REPEAT) {
158 lv_spinbox_decrement(spinbox);
159 }
160 }
161
spinbox_ctrl_create(lv_obj_t * par,lv_style_prop_t prop,lv_obj_t ** cont_)162 static lv_obj_t * spinbox_ctrl_create(lv_obj_t * par, lv_style_prop_t prop, lv_obj_t ** cont_)
163 {
164 lv_obj_t * cont_main = par;
165 lv_obj_t * label;
166
167 lv_obj_t * cont_spinbox = lv_obj_create(cont_main);
168 if(cont_) *cont_ = cont_spinbox;
169 lv_obj_remove_style_all(cont_spinbox);
170 lv_obj_set_height(cont_spinbox, LV_SIZE_CONTENT);
171 lv_obj_set_flex_grow(cont_spinbox, 1);
172 lv_obj_set_style_radius(cont_spinbox, 5, LV_PART_MAIN);
173 lv_obj_set_style_clip_corner(cont_spinbox, true, LV_PART_MAIN);
174 lv_obj_set_style_outline_width(cont_spinbox, 2, LV_PART_MAIN);
175 lv_obj_set_style_outline_color(cont_spinbox, lv_color_hex3(0xddd), LV_PART_MAIN);
176
177 lv_obj_set_flex_flow(cont_spinbox, LV_FLEX_FLOW_ROW);
178 lv_obj_set_style_flex_main_place(cont_spinbox, LV_FLEX_ALIGN_CENTER, LV_PART_MAIN);
179
180 static lv_style_t btn_style;
181 if(btn_style.prop_cnt < 1) {
182 lv_style_init(&btn_style);
183 lv_style_set_radius(&btn_style, 0);
184 lv_style_set_outline_width(&btn_style, 1);
185 lv_style_set_outline_pad(&btn_style, 1);
186 lv_style_set_outline_color(&btn_style, lv_color_hex3(0xddd));
187 lv_style_set_shadow_width(&btn_style, 0);
188 lv_style_set_bg_color(&btn_style, lv_color_white());
189 lv_style_set_text_color(&btn_style, lv_theme_get_color_primary(par));
190 }
191
192 lv_obj_t * btn_dec = lv_button_create(cont_spinbox);
193 lv_obj_set_width(btn_dec, 30);
194 lv_obj_add_style(btn_dec, &btn_style, LV_PART_MAIN);
195 label = lv_label_create(btn_dec);
196 lv_label_set_text(label, "-");
197 lv_obj_center(label);
198
199 lv_obj_t * spinbox = lv_spinbox_create(cont_spinbox);
200 lv_obj_set_flex_grow(spinbox, 1);
201 lv_obj_set_style_shadow_width(spinbox, 0, LV_PART_MAIN);
202 lv_obj_set_style_border_width(spinbox, 0, LV_PART_MAIN);
203 lv_obj_set_style_outline_width(spinbox, 1, LV_PART_MAIN);
204 lv_obj_set_style_outline_pad(spinbox, 1, LV_PART_MAIN);
205 lv_obj_set_style_outline_color(spinbox, lv_color_hex3(0xddd), LV_PART_MAIN);
206 lv_obj_set_style_radius(spinbox, 0, LV_PART_MAIN);
207 lv_obj_set_user_data(spinbox, (void *)(lv_uintptr_t)prop);
208 lv_spinbox_set_range(spinbox, LV_COORD_MIN, LV_COORD_MAX);
209 lv_spinbox_set_digit_format(spinbox, 3, 0);
210 lv_spinbox_step_prev(spinbox);
211
212 lv_obj_t * btn_inc = lv_button_create(cont_spinbox);
213 lv_obj_set_width(btn_inc, 30);
214 lv_obj_add_style(btn_inc, &btn_style, LV_PART_MAIN);
215 label = lv_label_create(btn_inc);
216 lv_label_set_text(label, "+");
217 lv_obj_center(label);
218
219 lv_obj_add_event_cb(btn_inc, btn_inc_event_handler, LV_EVENT_ALL, spinbox);
220 lv_obj_add_event_cb(btn_dec, btn_dec_event_handler, LV_EVENT_ALL, spinbox);
221
222 return spinbox;
223 }
224
tab_layout_create(lv_obj_t * tab,view_t * ui)225 static void tab_layout_create(lv_obj_t * tab, view_t * ui)
226 {
227 lv_obj_set_flex_flow(tab, LV_FLEX_FLOW_COLUMN);
228 lv_obj_set_style_pad_gap(tab, 5, LV_PART_MAIN);
229 lv_obj_set_flex_align(
230 tab,
231 LV_FLEX_ALIGN_START,
232 LV_FLEX_ALIGN_CENTER,
233 LV_FLEX_ALIGN_CENTER
234 );
235
236 static lv_style_t group_style;
237 lv_style_init(&group_style);
238 lv_style_set_pad_all(&group_style, 2);
239 lv_style_set_border_width(&group_style, 0);
240 lv_style_set_width(&group_style, LV_PCT(100));
241 lv_style_set_height(&group_style, LV_SIZE_CONTENT);
242
243 lv_obj_t * label = lv_label_create(tab);
244 lv_obj_set_style_pad_top(label, 10, LV_PART_MAIN);
245 lv_checkbox_set_text(label, "WIDTH x HEIGHT");
246
247 lv_obj_t * temp_group = lv_obj_create(tab);
248 ui->ctrl_pad.tab.layout.group_width_and_height = temp_group;
249 lv_obj_add_style(temp_group, &group_style, LV_PART_MAIN);
250 lv_obj_set_flex_flow(temp_group, LV_FLEX_FLOW_ROW);
251 lv_obj_set_flex_align(temp_group, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
252 ui->ctrl_pad.tab.layout.spinbox_width = spinbox_ctrl_create(temp_group, LV_STYLE_WIDTH, NULL);
253 ui->ctrl_pad.tab.layout.spinbox_height = spinbox_ctrl_create(temp_group, LV_STYLE_HEIGHT, NULL);
254
255 label = lv_label_create(tab);
256 lv_obj_set_style_pad_top(label, 10, LV_PART_MAIN);
257 lv_checkbox_set_text(label, "MIN-WIDTH x MIN-HEIGHT");
258
259 temp_group = lv_obj_create(tab);
260 ui->ctrl_pad.tab.layout.group_width_and_height_min = temp_group;
261 lv_obj_add_style(temp_group, &group_style, LV_PART_MAIN);
262 lv_obj_set_flex_flow(temp_group, LV_FLEX_FLOW_ROW);
263 lv_obj_set_flex_align(temp_group, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
264 ui->ctrl_pad.tab.layout.spinbox_min_width = spinbox_ctrl_create(temp_group, LV_STYLE_MIN_WIDTH, NULL);
265 ui->ctrl_pad.tab.layout.spinbox_min_height = spinbox_ctrl_create(temp_group, LV_STYLE_MIN_HEIGHT, NULL);
266
267 label = lv_label_create(tab);
268 lv_obj_set_style_pad_top(label, 10, LV_PART_MAIN);
269 lv_checkbox_set_text(label, "MAX-WIDTH x MAX-HEIGHT");
270
271 temp_group = lv_obj_create(tab);
272 ui->ctrl_pad.tab.layout.group_width_and_height_max = temp_group;
273 lv_obj_add_style(temp_group, &group_style, LV_PART_MAIN);
274 lv_obj_set_flex_flow(temp_group, LV_FLEX_FLOW_ROW);
275 lv_obj_set_flex_align(temp_group, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
276 ui->ctrl_pad.tab.layout.spinbox_max_width = spinbox_ctrl_create(temp_group, LV_STYLE_MAX_WIDTH, NULL);
277 ui->ctrl_pad.tab.layout.spinbox_max_height = spinbox_ctrl_create(temp_group, LV_STYLE_MAX_HEIGHT, NULL);
278
279 temp_group = lv_obj_create(tab);
280 ui->ctrl_pad.tab.layout.group_width_and_height_max = temp_group;
281 lv_obj_add_style(temp_group, &group_style, LV_PART_MAIN);
282 lv_obj_set_style_pad_top(temp_group, 20, LV_PART_MAIN);
283 lv_obj_set_flex_flow(temp_group, LV_FLEX_FLOW_ROW_WRAP);
284 lv_obj_set_flex_align(temp_group, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
285
286 lv_obj_t * temp_cont;
287 ui->ctrl_pad.tab.layout.spinbox_pad_top = spinbox_ctrl_create(temp_group, LV_STYLE_PAD_TOP, &temp_cont);
288 lv_obj_set_style_width(ui->ctrl_pad.tab.layout.spinbox_pad_top, 30, LV_PART_MAIN);
289 lv_obj_set_flex_grow(temp_cont, 0);
290 ui->ctrl_pad.tab.layout.spinbox_pad_left = spinbox_ctrl_create(temp_group, LV_STYLE_PAD_LEFT, &temp_cont);
291 lv_obj_add_flag(temp_cont, LV_OBJ_FLAG_FLEX_IN_NEW_TRACK);
292 label = lv_label_create(temp_group);
293 lv_checkbox_set_text(label, "PADDING");
294 ui->ctrl_pad.tab.layout.spinbox_pad_right = spinbox_ctrl_create(temp_group, LV_STYLE_PAD_RIGHT, NULL);
295 ui->ctrl_pad.tab.layout.spinbox_pad_bottom = spinbox_ctrl_create(temp_group, LV_STYLE_PAD_BOTTOM, &temp_cont);
296 lv_obj_set_flex_grow(temp_cont, 0);
297 lv_obj_add_flag(temp_cont, LV_OBJ_FLAG_FLEX_IN_NEW_TRACK);
298
299 label = lv_label_create(tab);
300 lv_obj_set_style_pad_top(label, 20, LV_PART_MAIN);
301 lv_checkbox_set_text(label, "PAD: COL x ROW x GROW");
302
303 temp_group = lv_obj_create(tab);
304 ui->ctrl_pad.tab.layout.group_width_and_height_max = temp_group;
305 lv_obj_add_style(temp_group, &group_style, LV_PART_MAIN);
306 lv_obj_set_flex_flow(temp_group, LV_FLEX_FLOW_COLUMN);
307 lv_obj_set_flex_align(temp_group, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
308 ui->ctrl_pad.tab.layout.spinbox_pad_column = spinbox_ctrl_create(temp_group, LV_STYLE_PAD_COLUMN, NULL);
309 ui->ctrl_pad.tab.layout.spinbox_pad_row = spinbox_ctrl_create(temp_group, LV_STYLE_PAD_ROW, NULL);
310 ui->ctrl_pad.tab.layout.spinbox_flex_grow = spinbox_ctrl_create(temp_group, LV_STYLE_FLEX_GROW, NULL);
311 }
312
313 #endif
314