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