xref: /OK3568_Linux_fs/app/lvgl_demo/rk_demo/setting/setting_ui.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun #include <lvgl/lvgl.h>
2*4882a593Smuzhiyun 
3*4882a593Smuzhiyun #include "about_ui.h"
4*4882a593Smuzhiyun #include "bt_ui.h"
5*4882a593Smuzhiyun #include "display_ui.h"
6*4882a593Smuzhiyun #include "home_ui.h"
7*4882a593Smuzhiyun #include "language_and_date_ui.h"
8*4882a593Smuzhiyun #include "main.h"
9*4882a593Smuzhiyun #include "volume_ui.h"
10*4882a593Smuzhiyun #include "ui_resource.h"
11*4882a593Smuzhiyun #include "wallpaper_ui.h"
12*4882a593Smuzhiyun #include "wifi_ui.h"
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun enum
15*4882a593Smuzhiyun {
16*4882a593Smuzhiyun     SUBMENU_MIN = 0,
17*4882a593Smuzhiyun     SUBMENU_WIFI = SUBMENU_MIN,
18*4882a593Smuzhiyun     SUBMENU_BT,
19*4882a593Smuzhiyun     SUBMENU_DISPLAY,
20*4882a593Smuzhiyun     SUBMENU_VOLUME,
21*4882a593Smuzhiyun     SUBMENU_WALLPAPER,
22*4882a593Smuzhiyun     SUBMENU_LANGUAGE_DATE,
23*4882a593Smuzhiyun     SUBMENU_ABOUT,
24*4882a593Smuzhiyun     SUBMENU_MAX,
25*4882a593Smuzhiyun     SUBMENU_DEFAULT = SUBMENU_BT,
26*4882a593Smuzhiyun };
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun struct submenu_s {
29*4882a593Smuzhiyun     char *name;
30*4882a593Smuzhiyun     void (*init)(void);
31*4882a593Smuzhiyun     void (*deinit)(void);
32*4882a593Smuzhiyun     lv_obj_t * menu;
33*4882a593Smuzhiyun };
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun static lv_obj_t * ui_screen;
36*4882a593Smuzhiyun static lv_obj_t * btn_return;
37*4882a593Smuzhiyun static lv_obj_t * label_menu;
38*4882a593Smuzhiyun static lv_obj_t * area_menu;
39*4882a593Smuzhiyun static lv_obj_t * area_content = NULL;
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun static lv_obj_t * wifi_saved_area;
42*4882a593Smuzhiyun static lv_obj_t * wifi_scaned;
43*4882a593Smuzhiyun static lv_obj_t * wifi_saved_area;
44*4882a593Smuzhiyun static lv_obj_t * wifi_scaned;
45*4882a593Smuzhiyun static lv_obj_t * wifi_switch;
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun static lv_style_t * style_cont;
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun static lv_obj_t * sub_menu[SUBMENU_MAX];
50*4882a593Smuzhiyun static int cur_menu = SUBMENU_DEFAULT;
51*4882a593Smuzhiyun static struct submenu_s submenu_desc[SUBMENU_MAX];
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun #define SUBMENU_COMMON_DEFINE(enum_t, name) \
54*4882a593Smuzhiyun static void submenu_##name(void)  \
55*4882a593Smuzhiyun {   \
56*4882a593Smuzhiyun     if (!submenu_desc[enum_t].menu)\
57*4882a593Smuzhiyun         submenu_desc[enum_t].menu = menu_##name##_init(area_content);\
58*4882a593Smuzhiyun }   \
59*4882a593Smuzhiyun static void submenu_##name##_destroy(void)  \
60*4882a593Smuzhiyun {   \
61*4882a593Smuzhiyun     if (submenu_desc[enum_t].menu)\
62*4882a593Smuzhiyun         menu_##name##_deinit();\
63*4882a593Smuzhiyun }
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun SUBMENU_COMMON_DEFINE(SUBMENU_WIFI, wifi)
66*4882a593Smuzhiyun SUBMENU_COMMON_DEFINE(SUBMENU_BT, bt)
67*4882a593Smuzhiyun SUBMENU_COMMON_DEFINE(SUBMENU_DISPLAY, display)
68*4882a593Smuzhiyun SUBMENU_COMMON_DEFINE(SUBMENU_VOLUME, volume)
69*4882a593Smuzhiyun SUBMENU_COMMON_DEFINE(SUBMENU_WALLPAPER, wallpaper)
70*4882a593Smuzhiyun SUBMENU_COMMON_DEFINE(SUBMENU_LANGUAGE_DATE, language)
71*4882a593Smuzhiyun SUBMENU_COMMON_DEFINE(SUBMENU_ABOUT, about)
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun static struct submenu_s submenu_desc[SUBMENU_MAX] = {
74*4882a593Smuzhiyun     {"WIFI",        submenu_wifi,    submenu_wifi_destroy, NULL},
75*4882a593Smuzhiyun     {"蓝牙",        submenu_bt,      submenu_bt_destroy,   NULL},
76*4882a593Smuzhiyun     {"显示和亮度",  submenu_display, submenu_display_destroy, NULL},
77*4882a593Smuzhiyun     {"音量",        submenu_volume,  submenu_volume_destroy, NULL},
78*4882a593Smuzhiyun     {"锁屏和壁纸",  submenu_wallpaper,  submenu_wallpaper_destroy, NULL},
79*4882a593Smuzhiyun     {"语言和日期",  submenu_language,  submenu_language_destroy, NULL},
80*4882a593Smuzhiyun     {"关于",        submenu_about,  submenu_about_destroy, NULL}
81*4882a593Smuzhiyun };
82*4882a593Smuzhiyun 
style_init(void)83*4882a593Smuzhiyun static void style_init(void)
84*4882a593Smuzhiyun {
85*4882a593Smuzhiyun     if (style_cont)
86*4882a593Smuzhiyun         return;
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun     style_cont = malloc(sizeof(style_cont));
89*4882a593Smuzhiyun     lv_style_init(style_cont);
90*4882a593Smuzhiyun     lv_style_set_text_font(style_cont, ttf_main_m.font);
91*4882a593Smuzhiyun     lv_style_set_text_color(style_cont, lv_color_black());
92*4882a593Smuzhiyun     lv_style_set_radius(style_cont, 10);
93*4882a593Smuzhiyun     lv_style_set_pad_left(style_cont, 10);
94*4882a593Smuzhiyun     lv_style_set_pad_right(style_cont, 10);
95*4882a593Smuzhiyun     lv_style_set_pad_top(style_cont, 10);
96*4882a593Smuzhiyun     lv_style_set_pad_bottom(style_cont, 10);
97*4882a593Smuzhiyun }
98*4882a593Smuzhiyun 
menu_switch_cb(lv_event_t * e)99*4882a593Smuzhiyun static void menu_switch_cb(lv_event_t * e)
100*4882a593Smuzhiyun {
101*4882a593Smuzhiyun     int idx = (int)lv_event_get_user_data(e);
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun     if (idx < SUBMENU_MIN || idx >= SUBMENU_MAX)
104*4882a593Smuzhiyun         return;
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun     if ((cur_menu >= SUBMENU_MIN)
107*4882a593Smuzhiyun         && (cur_menu < SUBMENU_MAX)
108*4882a593Smuzhiyun         && submenu_desc[cur_menu].menu)
109*4882a593Smuzhiyun     {
110*4882a593Smuzhiyun         lv_obj_add_flag(submenu_desc[cur_menu].menu,
111*4882a593Smuzhiyun                         LV_OBJ_FLAG_HIDDEN);
112*4882a593Smuzhiyun     }
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun     if (submenu_desc[idx].init)
115*4882a593Smuzhiyun         submenu_desc[idx].init();
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun     cur_menu = idx;
118*4882a593Smuzhiyun     if (submenu_desc[cur_menu].menu)
119*4882a593Smuzhiyun     {
120*4882a593Smuzhiyun         lv_obj_clear_flag(submenu_desc[cur_menu].menu,
121*4882a593Smuzhiyun                           LV_OBJ_FLAG_HIDDEN);
122*4882a593Smuzhiyun     }
123*4882a593Smuzhiyun }
124*4882a593Smuzhiyun 
btn_drawed_cb(lv_event_t * e)125*4882a593Smuzhiyun static void btn_drawed_cb(lv_event_t * e)
126*4882a593Smuzhiyun {
127*4882a593Smuzhiyun     switch (e->code) {
128*4882a593Smuzhiyun     case LV_EVENT_CLICKED:
129*4882a593Smuzhiyun         home_ui_init();
130*4882a593Smuzhiyun         for (int i = SUBMENU_MIN; i < SUBMENU_MAX; i++)
131*4882a593Smuzhiyun         {
132*4882a593Smuzhiyun             if (submenu_desc[i].deinit)
133*4882a593Smuzhiyun                 submenu_desc[i].deinit();
134*4882a593Smuzhiyun         }
135*4882a593Smuzhiyun         lv_obj_del(ui_screen);
136*4882a593Smuzhiyun         ui_screen = NULL;
137*4882a593Smuzhiyun         area_content = NULL;
138*4882a593Smuzhiyun         label_menu = NULL;
139*4882a593Smuzhiyun         break;
140*4882a593Smuzhiyun     case LV_EVENT_DRAW_POST_END:
141*4882a593Smuzhiyun         if (!label_menu)
142*4882a593Smuzhiyun             return;
143*4882a593Smuzhiyun         lv_obj_align_to(label_menu, btn_return,
144*4882a593Smuzhiyun                         LV_ALIGN_OUT_RIGHT_MID,
145*4882a593Smuzhiyun                         5, 0);
146*4882a593Smuzhiyun         break;
147*4882a593Smuzhiyun     default:
148*4882a593Smuzhiyun         break;
149*4882a593Smuzhiyun     }
150*4882a593Smuzhiyun }
151*4882a593Smuzhiyun 
setting_ui_init(void)152*4882a593Smuzhiyun void setting_ui_init(void)
153*4882a593Smuzhiyun {
154*4882a593Smuzhiyun     style_init();
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun     if (ui_screen)
157*4882a593Smuzhiyun         goto load;
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun     ui_screen = lv_obj_create(NULL);
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun     lv_obj_clear_flag(ui_screen, LV_OBJ_FLAG_SCROLLABLE);
162*4882a593Smuzhiyun     lv_obj_set_style_bg_img_opa(ui_screen, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
163*4882a593Smuzhiyun 
164*4882a593Smuzhiyun     btn_return = lv_img_create(ui_screen);
165*4882a593Smuzhiyun     lv_obj_set_pos(btn_return, 10, 10);
166*4882a593Smuzhiyun     lv_img_set_src(btn_return, IMG_RETURN_BTN);
167*4882a593Smuzhiyun     lv_obj_add_flag(btn_return, LV_OBJ_FLAG_CLICKABLE);
168*4882a593Smuzhiyun     lv_obj_add_event_cb(btn_return, btn_drawed_cb, LV_EVENT_CLICKED, NULL);
169*4882a593Smuzhiyun     lv_obj_add_event_cb(btn_return, btn_drawed_cb, LV_EVENT_DRAW_POST_END, NULL);
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun     label_menu = lv_label_create(ui_screen);
172*4882a593Smuzhiyun     lv_label_set_text(label_menu, "系统设置");
173*4882a593Smuzhiyun     lv_obj_add_style(label_menu, &style_txt_m, LV_PART_MAIN);
174*4882a593Smuzhiyun     lv_obj_align_to(label_menu, btn_return,
175*4882a593Smuzhiyun                     LV_ALIGN_OUT_RIGHT_MID,
176*4882a593Smuzhiyun                     5, 0);
177*4882a593Smuzhiyun 
178*4882a593Smuzhiyun     area_menu = lv_list_create(ui_screen);
179*4882a593Smuzhiyun     lv_obj_set_size(area_menu, lv_pct(30), LV_SIZE_CONTENT);
180*4882a593Smuzhiyun     lv_obj_set_pos(area_menu, lv_pct(5), lv_pct(5));
181*4882a593Smuzhiyun     lv_obj_add_style(area_menu, style_cont, LV_PART_MAIN);
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun     area_content = lv_obj_create(ui_screen);
184*4882a593Smuzhiyun     lv_obj_remove_style_all(area_content);
185*4882a593Smuzhiyun     lv_obj_set_size(area_content, lv_pct(55), lv_pct(95));
186*4882a593Smuzhiyun     lv_obj_set_pos(area_content, lv_pct(40), lv_pct(5));
187*4882a593Smuzhiyun     lv_obj_set_flex_flow(area_content, LV_FLEX_FLOW_COLUMN);
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun     for (int i = SUBMENU_MIN; i < SUBMENU_MAX; i++)
190*4882a593Smuzhiyun     {
191*4882a593Smuzhiyun         sub_menu[i] = lv_list_add_btn(area_menu, NULL, submenu_desc[i].name);
192*4882a593Smuzhiyun         lv_obj_add_event_cb(sub_menu[i], menu_switch_cb, LV_EVENT_CLICKED, (void *)i);
193*4882a593Smuzhiyun         submenu_desc[i].menu = NULL;
194*4882a593Smuzhiyun     }
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun load:
197*4882a593Smuzhiyun     submenu_desc[SUBMENU_DEFAULT].init();
198*4882a593Smuzhiyun     lv_disp_load_scr(ui_screen);
199*4882a593Smuzhiyun }
200*4882a593Smuzhiyun 
201