1 /**
2  * @file lv_demo_flex_layout_flex_loader.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 FLEX_ALIGN_EVENT_DEF(item)                                              \
19     static void flex_align_##item##_event_handler(lv_event_t* e)                \
20     {                                                                           \
21         view_t* ui = lv_event_get_user_data(e);                                 \
22         lv_obj_t* ddlist = lv_event_get_target(e);                              \
23         uint16_t selected = lv_dropdown_get_selected(ddlist);                   \
24         if (ui->obj_cur) {                                                      \
25             lv_obj_set_style_flex_##item##_place(ui->obj_cur,                   \
26                                                  flex_align_map[selected], 0);  \
27         }                                                                       \
28     }
29 
30 #define FLEX_ALIGN_DDLIST_UPDATE_DEF(item)                                            \
31     do {                                                                              \
32         lv_flex_align_t flex_align = lv_obj_get_style_flex_##item##_place(obj, 0);    \
33         for (i = 0; i < ARRAY_SIZE(flex_align_map); i++) {                            \
34             if (flex_align == flex_align_map[i]) {                                    \
35                 lv_dropdown_set_selected(ui->ctrl_pad.tab.align.ddlist_align_##item,  \
36                                          i, LV_ANIM_OFF);                             \
37                 break;                                                                \
38             }                                                                         \
39         }                                                                             \
40     } while(0)
41 
42 #define FLEX_ALIGN_EVENT_ATTACH(item)                                               \
43     do {                                                                            \
44         lv_obj_add_event_cb(ui->ctrl_pad.tab.align.ddlist_align_##item,             \
45                             flex_align_##item##_event_handler,                      \
46                             LV_EVENT_VALUE_CHANGED,                                 \
47                             ui                                                      \
48                            );                                                       \
49     } while(0)
50 
51 /**********************
52  *      TYPEDEFS
53  **********************/
54 
55 /**********************
56  *  STATIC PROTOTYPES
57  **********************/
58 
59 static void flex_flow_event_handler(lv_event_t * e);
60 
61 /**********************
62  *  STATIC VARIABLES
63  **********************/
64 
65 static const lv_flex_flow_t flex_flow_map[] = {
66     LV_FLEX_FLOW_ROW,
67     LV_FLEX_FLOW_COLUMN,
68     LV_FLEX_FLOW_ROW_WRAP,
69     LV_FLEX_FLOW_ROW_REVERSE,
70     LV_FLEX_FLOW_ROW_WRAP_REVERSE,
71     LV_FLEX_FLOW_COLUMN_WRAP,
72     LV_FLEX_FLOW_COLUMN_REVERSE,
73     LV_FLEX_FLOW_COLUMN_WRAP_REVERSE
74 };
75 
76 static const lv_flex_align_t flex_align_map[] = {
77     LV_FLEX_ALIGN_START,
78     LV_FLEX_ALIGN_END,
79     LV_FLEX_ALIGN_CENTER,
80     LV_FLEX_ALIGN_SPACE_EVENLY,
81     LV_FLEX_ALIGN_SPACE_AROUND,
82     LV_FLEX_ALIGN_SPACE_BETWEEN,
83 };
84 
85 /**********************
86  *      MACROS
87  **********************/
88 
89 FLEX_ALIGN_EVENT_DEF(main)
FLEX_ALIGN_EVENT_DEF(cross)90 FLEX_ALIGN_EVENT_DEF(cross)
91 FLEX_ALIGN_EVENT_DEF(track)
92 
93 /**********************
94  *   GLOBAL FUNCTIONS
95  **********************/
96 
97 void flex_loader_attach(view_t * ui)
98 {
99     lv_obj_add_event_cb(
100         ui->ctrl_pad.tab.flex.ddlist_flow,
101         flex_flow_event_handler,
102         LV_EVENT_VALUE_CHANGED,
103         ui
104     );
105 
106     FLEX_ALIGN_EVENT_ATTACH(main);
107     FLEX_ALIGN_EVENT_ATTACH(cross);
108     FLEX_ALIGN_EVENT_ATTACH(track);
109 }
110 
flex_loader_obj_update(lv_obj_t * obj,view_t * ui)111 void flex_loader_obj_update(lv_obj_t * obj, view_t * ui)
112 {
113     lv_flex_flow_t flex_flow = lv_obj_get_style_flex_flow(obj, 0);
114     uint32_t i;
115     for(i = 0; i < ARRAY_SIZE(flex_flow_map); i++) {
116         if(flex_flow == flex_flow_map[i]) {
117             lv_dropdown_set_selected(ui->ctrl_pad.tab.flex.ddlist_flow, i, LV_ANIM_OFF);
118             break;
119         }
120     }
121 
122     FLEX_ALIGN_DDLIST_UPDATE_DEF(main);
123     FLEX_ALIGN_DDLIST_UPDATE_DEF(cross);
124     FLEX_ALIGN_DDLIST_UPDATE_DEF(track);
125 }
126 
127 /**********************
128  *   STATIC FUNCTIONS
129  **********************/
130 
flex_flow_event_handler(lv_event_t * e)131 static void flex_flow_event_handler(lv_event_t * e)
132 {
133     view_t * ui = lv_event_get_user_data(e);
134     lv_obj_t * ddlist = lv_event_get_target(e);
135     uint16_t selected = lv_dropdown_get_selected(ddlist);
136 
137     if(ui->obj_cur) {
138         lv_obj_set_flex_flow(ui->obj_cur, flex_flow_map[selected]);
139         lv_obj_scroll_to(ui->obj_cur, 0, 0, LV_ANIM_ON);
140     }
141 }
142 
143 #endif
144