1
0
mirror of https://github.com/lvgl/lvgl.git synced 2025-01-14 06:42:58 +08:00
lvgl/demos/flex_layout/lv_demo_flex_layout_flex_loader.c
2023-11-28 15:36:51 +01:00

144 lines
4.7 KiB
C

/**
* @file lv_demo_flex_layout_flex_loader.c
*
*/
/*********************
* INCLUDES
*********************/
#include "lv_demo_flex_layout_main.h"
#if LV_USE_DEMO_FLEX_LAYOUT
/*********************
* DEFINES
*********************/
#define FLEX_ALIGN_EVENT_DEF(item) \
static void flex_align_##item##_event_handler(lv_event_t* e) \
{ \
view_t* ui = lv_event_get_user_data(e); \
lv_obj_t* ddlist = lv_event_get_target(e); \
uint16_t selected = lv_dropdown_get_selected(ddlist); \
if (ui->obj_cur) { \
lv_obj_set_style_flex_##item##_place(ui->obj_cur, \
flex_align_map[selected], 0); \
} \
}
#define FLEX_ALIGN_DDLIST_UPDATE_DEF(item) \
do { \
lv_flex_align_t flex_align = lv_obj_get_style_flex_##item##_place(obj, 0); \
for (i = 0; i < ARRAY_SIZE(flex_align_map); i++) { \
if (flex_align == flex_align_map[i]) { \
lv_dropdown_set_selected(ui->ctrl_pad.tab.align.ddlist_align_##item, \
i); \
break; \
} \
} \
} while(0)
#define FLEX_ALIGN_EVENT_ATTACH(item) \
do { \
lv_obj_add_event_cb(ui->ctrl_pad.tab.align.ddlist_align_##item, \
flex_align_##item##_event_handler, \
LV_EVENT_VALUE_CHANGED, \
ui \
); \
} while(0)
/**********************
* TYPEDEFS
**********************/
/**********************
* STATIC PROTOTYPES
**********************/
static void flex_flow_event_handler(lv_event_t * e);
/**********************
* STATIC VARIABLES
**********************/
static const lv_flex_flow_t flex_flow_map[] = {
LV_FLEX_FLOW_ROW,
LV_FLEX_FLOW_COLUMN,
LV_FLEX_FLOW_ROW_WRAP,
LV_FLEX_FLOW_ROW_REVERSE,
LV_FLEX_FLOW_ROW_WRAP_REVERSE,
LV_FLEX_FLOW_COLUMN_WRAP,
LV_FLEX_FLOW_COLUMN_REVERSE,
LV_FLEX_FLOW_COLUMN_WRAP_REVERSE
};
static const lv_flex_align_t flex_align_map[] = {
LV_FLEX_ALIGN_START,
LV_FLEX_ALIGN_END,
LV_FLEX_ALIGN_CENTER,
LV_FLEX_ALIGN_SPACE_EVENLY,
LV_FLEX_ALIGN_SPACE_AROUND,
LV_FLEX_ALIGN_SPACE_BETWEEN,
};
/**********************
* MACROS
**********************/
FLEX_ALIGN_EVENT_DEF(main)
FLEX_ALIGN_EVENT_DEF(cross)
FLEX_ALIGN_EVENT_DEF(track)
/**********************
* GLOBAL FUNCTIONS
**********************/
void flex_loader_attach(view_t * ui)
{
lv_obj_add_event_cb(
ui->ctrl_pad.tab.flex.ddlist_flow,
flex_flow_event_handler,
LV_EVENT_VALUE_CHANGED,
ui
);
FLEX_ALIGN_EVENT_ATTACH(main);
FLEX_ALIGN_EVENT_ATTACH(cross);
FLEX_ALIGN_EVENT_ATTACH(track);
}
void flex_loader_obj_update(lv_obj_t * obj, view_t * ui)
{
lv_flex_flow_t flex_flow = lv_obj_get_style_flex_flow(obj, 0);
uint32_t i;
for(i = 0; i < ARRAY_SIZE(flex_flow_map); i++) {
if(flex_flow == flex_flow_map[i]) {
lv_dropdown_set_selected(ui->ctrl_pad.tab.flex.ddlist_flow, i);
break;
}
}
FLEX_ALIGN_DDLIST_UPDATE_DEF(main);
FLEX_ALIGN_DDLIST_UPDATE_DEF(cross);
FLEX_ALIGN_DDLIST_UPDATE_DEF(track);
}
/**********************
* STATIC FUNCTIONS
**********************/
static void flex_flow_event_handler(lv_event_t * e)
{
view_t * ui = lv_event_get_user_data(e);
lv_obj_t * ddlist = lv_event_get_target(e);
uint16_t selected = lv_dropdown_get_selected(ddlist);
if(ui->obj_cur) {
lv_obj_set_flex_flow(ui->obj_cur, flex_flow_map[selected]);
lv_obj_scroll_to(ui->obj_cur, 0, 0, LV_ANIM_ON);
}
}
#endif