201 lines
5.6 KiB
C
201 lines
5.6 KiB
C
#include <lvgl/lvgl.h>
|
|
|
|
#include "about_ui.h"
|
|
#include "bt_ui.h"
|
|
#include "display_ui.h"
|
|
#include "home_ui.h"
|
|
#include "language_and_date_ui.h"
|
|
#include "main.h"
|
|
#include "volume_ui.h"
|
|
#include "ui_resource.h"
|
|
#include "wallpaper_ui.h"
|
|
#include "wifi_ui.h"
|
|
|
|
enum
|
|
{
|
|
SUBMENU_MIN = 0,
|
|
SUBMENU_WIFI = SUBMENU_MIN,
|
|
SUBMENU_BT,
|
|
SUBMENU_DISPLAY,
|
|
SUBMENU_VOLUME,
|
|
SUBMENU_WALLPAPER,
|
|
SUBMENU_LANGUAGE_DATE,
|
|
SUBMENU_ABOUT,
|
|
SUBMENU_MAX,
|
|
SUBMENU_DEFAULT = SUBMENU_BT,
|
|
};
|
|
|
|
struct submenu_s {
|
|
char *name;
|
|
void (*init)(void);
|
|
void (*deinit)(void);
|
|
lv_obj_t * menu;
|
|
};
|
|
|
|
static lv_obj_t * ui_screen;
|
|
static lv_obj_t * btn_return;
|
|
static lv_obj_t * label_menu;
|
|
static lv_obj_t * area_menu;
|
|
static lv_obj_t * area_content = NULL;
|
|
|
|
static lv_obj_t * wifi_saved_area;
|
|
static lv_obj_t * wifi_scaned;
|
|
static lv_obj_t * wifi_saved_area;
|
|
static lv_obj_t * wifi_scaned;
|
|
static lv_obj_t * wifi_switch;
|
|
|
|
static lv_style_t * style_cont;
|
|
|
|
static lv_obj_t * sub_menu[SUBMENU_MAX];
|
|
static int cur_menu = SUBMENU_DEFAULT;
|
|
static struct submenu_s submenu_desc[SUBMENU_MAX];
|
|
|
|
#define SUBMENU_COMMON_DEFINE(enum_t, name) \
|
|
static void submenu_##name(void) \
|
|
{ \
|
|
if (!submenu_desc[enum_t].menu)\
|
|
submenu_desc[enum_t].menu = menu_##name##_init(area_content);\
|
|
} \
|
|
static void submenu_##name##_destroy(void) \
|
|
{ \
|
|
if (submenu_desc[enum_t].menu)\
|
|
menu_##name##_deinit();\
|
|
}
|
|
|
|
SUBMENU_COMMON_DEFINE(SUBMENU_WIFI, wifi)
|
|
SUBMENU_COMMON_DEFINE(SUBMENU_BT, bt)
|
|
SUBMENU_COMMON_DEFINE(SUBMENU_DISPLAY, display)
|
|
SUBMENU_COMMON_DEFINE(SUBMENU_VOLUME, volume)
|
|
SUBMENU_COMMON_DEFINE(SUBMENU_WALLPAPER, wallpaper)
|
|
SUBMENU_COMMON_DEFINE(SUBMENU_LANGUAGE_DATE, language)
|
|
SUBMENU_COMMON_DEFINE(SUBMENU_ABOUT, about)
|
|
|
|
static struct submenu_s submenu_desc[SUBMENU_MAX] = {
|
|
{"WIFI", submenu_wifi, submenu_wifi_destroy, NULL},
|
|
{"蓝牙", submenu_bt, submenu_bt_destroy, NULL},
|
|
{"显示和亮度", submenu_display, submenu_display_destroy, NULL},
|
|
{"音量", submenu_volume, submenu_volume_destroy, NULL},
|
|
{"锁屏和壁纸", submenu_wallpaper, submenu_wallpaper_destroy, NULL},
|
|
{"语言和日期", submenu_language, submenu_language_destroy, NULL},
|
|
{"关于", submenu_about, submenu_about_destroy, NULL}
|
|
};
|
|
|
|
static void style_init(void)
|
|
{
|
|
if (style_cont)
|
|
return;
|
|
|
|
style_cont = malloc(sizeof(style_cont));
|
|
lv_style_init(style_cont);
|
|
lv_style_set_text_font(style_cont, ttf_main_m.font);
|
|
lv_style_set_text_color(style_cont, lv_color_black());
|
|
lv_style_set_radius(style_cont, 10);
|
|
lv_style_set_pad_left(style_cont, 10);
|
|
lv_style_set_pad_right(style_cont, 10);
|
|
lv_style_set_pad_top(style_cont, 10);
|
|
lv_style_set_pad_bottom(style_cont, 10);
|
|
}
|
|
|
|
static void menu_switch_cb(lv_event_t * e)
|
|
{
|
|
int idx = (int)lv_event_get_user_data(e);
|
|
|
|
if (idx < SUBMENU_MIN || idx >= SUBMENU_MAX)
|
|
return;
|
|
|
|
if ((cur_menu >= SUBMENU_MIN)
|
|
&& (cur_menu < SUBMENU_MAX)
|
|
&& submenu_desc[cur_menu].menu)
|
|
{
|
|
lv_obj_add_flag(submenu_desc[cur_menu].menu,
|
|
LV_OBJ_FLAG_HIDDEN);
|
|
}
|
|
|
|
if (submenu_desc[idx].init)
|
|
submenu_desc[idx].init();
|
|
|
|
cur_menu = idx;
|
|
if (submenu_desc[cur_menu].menu)
|
|
{
|
|
lv_obj_clear_flag(submenu_desc[cur_menu].menu,
|
|
LV_OBJ_FLAG_HIDDEN);
|
|
}
|
|
}
|
|
|
|
static void btn_drawed_cb(lv_event_t * e)
|
|
{
|
|
switch (e->code) {
|
|
case LV_EVENT_CLICKED:
|
|
home_ui_init();
|
|
for (int i = SUBMENU_MIN; i < SUBMENU_MAX; i++)
|
|
{
|
|
if (submenu_desc[i].deinit)
|
|
submenu_desc[i].deinit();
|
|
}
|
|
lv_obj_del(ui_screen);
|
|
ui_screen = NULL;
|
|
area_content = NULL;
|
|
label_menu = NULL;
|
|
break;
|
|
case LV_EVENT_DRAW_POST_END:
|
|
if (!label_menu)
|
|
return;
|
|
lv_obj_align_to(label_menu, btn_return,
|
|
LV_ALIGN_OUT_RIGHT_MID,
|
|
5, 0);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void setting_ui_init(void)
|
|
{
|
|
style_init();
|
|
|
|
if (ui_screen)
|
|
goto load;
|
|
|
|
ui_screen = lv_obj_create(NULL);
|
|
|
|
lv_obj_clear_flag(ui_screen, LV_OBJ_FLAG_SCROLLABLE);
|
|
lv_obj_set_style_bg_img_opa(ui_screen, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
|
|
|
|
btn_return = lv_img_create(ui_screen);
|
|
lv_obj_set_pos(btn_return, 10, 10);
|
|
lv_img_set_src(btn_return, IMG_RETURN_BTN);
|
|
lv_obj_add_flag(btn_return, LV_OBJ_FLAG_CLICKABLE);
|
|
lv_obj_add_event_cb(btn_return, btn_drawed_cb, LV_EVENT_CLICKED, NULL);
|
|
lv_obj_add_event_cb(btn_return, btn_drawed_cb, LV_EVENT_DRAW_POST_END, NULL);
|
|
|
|
label_menu = lv_label_create(ui_screen);
|
|
lv_label_set_text(label_menu, "系统设置");
|
|
lv_obj_add_style(label_menu, &style_txt_m, LV_PART_MAIN);
|
|
lv_obj_align_to(label_menu, btn_return,
|
|
LV_ALIGN_OUT_RIGHT_MID,
|
|
5, 0);
|
|
|
|
area_menu = lv_list_create(ui_screen);
|
|
lv_obj_set_size(area_menu, lv_pct(30), LV_SIZE_CONTENT);
|
|
lv_obj_set_pos(area_menu, lv_pct(5), lv_pct(5));
|
|
lv_obj_add_style(area_menu, style_cont, LV_PART_MAIN);
|
|
|
|
area_content = lv_obj_create(ui_screen);
|
|
lv_obj_remove_style_all(area_content);
|
|
lv_obj_set_size(area_content, lv_pct(55), lv_pct(95));
|
|
lv_obj_set_pos(area_content, lv_pct(40), lv_pct(5));
|
|
lv_obj_set_flex_flow(area_content, LV_FLEX_FLOW_COLUMN);
|
|
|
|
for (int i = SUBMENU_MIN; i < SUBMENU_MAX; i++)
|
|
{
|
|
sub_menu[i] = lv_list_add_btn(area_menu, NULL, submenu_desc[i].name);
|
|
lv_obj_add_event_cb(sub_menu[i], menu_switch_cb, LV_EVENT_CLICKED, (void *)i);
|
|
submenu_desc[i].menu = NULL;
|
|
}
|
|
|
|
load:
|
|
submenu_desc[SUBMENU_DEFAULT].init();
|
|
lv_disp_load_scr(ui_screen);
|
|
}
|
|
|