1 /**
2  * @file lv_demo_flex_layout_ctrl_pad.h
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 SPINBOX_UPDATE_STYLE_VALUE(item)                                \
19     do {                                                                \
20         lv_obj_t* sbox = ui->ctrl_pad.tab.layout.spinbox_##item;        \
21         int32_t val = lv_obj_get_style_##item(obj, LV_PART_MAIN);    \
22         lv_spinbox_set_value(sbox, val);                                \
23     } while(0)
24 
25 #define SPINBOX_EVENT_ATTACH(item)  \
26     lv_obj_add_event_cb(ui->ctrl_pad.tab.layout.spinbox_##item, ctrl_pad_spinbox_event_handler, LV_EVENT_VALUE_CHANGED, ui);
27 
28 /**********************
29  *      TYPEDEFS
30  **********************/
31 
32 /**********************
33  *  STATIC PROTOTYPES
34  **********************/
35 
36 static void ctrl_pad_spinbox_event_handler(lv_event_t * e);
37 static void ctrl_pad_checkbox_event_handler(lv_event_t * e);
38 static void ctrl_pad_btn_event_attach(view_t * ui);
39 
40 /**********************
41  *  STATIC VARIABLES
42  **********************/
43 
44 /**********************
45  *      MACROS
46  **********************/
47 
48 /**********************
49  *   GLOBAL FUNCTIONS
50  **********************/
51 
ctrl_pad_attach(view_t * ui)52 void ctrl_pad_attach(view_t * ui)
53 {
54     ctrl_pad_btn_event_attach(ui);
55     flex_loader_attach(ui);
56 
57     SPINBOX_EVENT_ATTACH(width);
58     SPINBOX_EVENT_ATTACH(height);
59     SPINBOX_EVENT_ATTACH(pad_top);
60     SPINBOX_EVENT_ATTACH(pad_bottom);
61     SPINBOX_EVENT_ATTACH(pad_left);
62     SPINBOX_EVENT_ATTACH(pad_right);
63     SPINBOX_EVENT_ATTACH(pad_column);
64     SPINBOX_EVENT_ATTACH(pad_row);
65     SPINBOX_EVENT_ATTACH(flex_grow);
66 
67     lv_obj_add_event_cb(
68         ui->ctrl_pad.tab.flex.checkbox_scrl,
69         ctrl_pad_checkbox_event_handler,
70         LV_EVENT_VALUE_CHANGED,
71         ui
72     );
73 }
74 
75 /**********************
76  *   STATIC FUNCTIONS
77  **********************/
78 
ctrl_pad_btn_remove_event_handler(lv_event_t * e)79 static void ctrl_pad_btn_remove_event_handler(lv_event_t * e)
80 {
81     view_t * ui = lv_event_get_user_data(e);
82     if(ui->obj_cur) {
83         if(ui->obj_cur == ui->root) {
84             lv_obj_clean(ui->root);
85         }
86         else {
87             lv_obj_delete(ui->obj_cur);
88             ui->obj_cur = NULL;
89         }
90     }
91 }
92 
ctrl_pad_obj_update(lv_obj_t * obj,view_t * ui)93 void ctrl_pad_obj_update(lv_obj_t * obj, view_t * ui)
94 {
95     lv_obj_t * spinbox = ui->ctrl_pad.tab.layout.spinbox_width;
96     int32_t value = lv_obj_get_width(obj);
97     lv_spinbox_set_value(spinbox, value);
98 
99     spinbox = ui->ctrl_pad.tab.layout.spinbox_height;
100     value = lv_obj_get_height(obj);
101     lv_spinbox_set_value(spinbox, value);
102 
103     SPINBOX_UPDATE_STYLE_VALUE(pad_top);
104     SPINBOX_UPDATE_STYLE_VALUE(pad_bottom);
105     SPINBOX_UPDATE_STYLE_VALUE(pad_left);
106     SPINBOX_UPDATE_STYLE_VALUE(pad_right);
107     SPINBOX_UPDATE_STYLE_VALUE(pad_column);
108     SPINBOX_UPDATE_STYLE_VALUE(pad_row);
109     SPINBOX_UPDATE_STYLE_VALUE(flex_grow);
110 
111     lv_obj_t * checkbox = ui->ctrl_pad.tab.flex.checkbox_scrl;
112     if(lv_obj_has_flag(obj, LV_OBJ_FLAG_SCROLLABLE)) {
113         lv_obj_add_state(checkbox, LV_STATE_CHECKED);
114     }
115     else {
116         lv_obj_remove_state(checkbox, LV_STATE_CHECKED);
117     }
118 }
119 
ctrl_pad_spinbox_event_handler(lv_event_t * e)120 static void ctrl_pad_spinbox_event_handler(lv_event_t * e)
121 {
122     view_t * ui = lv_event_get_user_data(e);
123     lv_obj_t * spinbox = lv_event_get_target(e);
124     lv_style_prop_t prop = (lv_style_prop_t)(lv_uintptr_t)lv_obj_get_user_data(spinbox);
125 
126     lv_style_value_t v = {
127         .num = (int32_t)lv_spinbox_get_value(spinbox)
128     };
129 
130     if(ui->obj_cur) {
131         lv_obj_set_local_style_prop(ui->obj_cur, prop, v, LV_PART_MAIN);
132     }
133 }
134 
ctrl_pad_btn_add_event_handler(lv_event_t * e)135 static void ctrl_pad_btn_add_event_handler(lv_event_t * e)
136 {
137     view_t * ui = lv_event_get_user_data(e);
138     obj_child_node_create(ui->obj_cur, ui);
139 }
140 
ctrl_pad_checkbox_event_handler(lv_event_t * e)141 static void ctrl_pad_checkbox_event_handler(lv_event_t * e)
142 {
143     view_t * ui = lv_event_get_user_data(e);
144     if(ui->obj_cur) {
145         bool checked = lv_obj_has_state(lv_event_get_target(e), LV_STATE_CHECKED);
146         checked ? lv_obj_add_flag(ui->obj_cur, LV_OBJ_FLAG_SCROLLABLE) : lv_obj_remove_flag(ui->obj_cur,
147                                                                                             LV_OBJ_FLAG_SCROLLABLE);
148     }
149 }
150 
ctrl_pad_btn_event_attach(view_t * ui)151 static void ctrl_pad_btn_event_attach(view_t * ui)
152 {
153     lv_obj_add_event_cb(
154         ui->ctrl_pad.btn.add,
155         ctrl_pad_btn_add_event_handler,
156         LV_EVENT_CLICKED,
157         ui
158     );
159 
160     lv_obj_add_event_cb(
161         ui->ctrl_pad.btn.remove,
162         ctrl_pad_btn_remove_event_handler,
163         LV_EVENT_CLICKED,
164         ui
165     );
166 }
167 
168 #endif
169