1 #include <lvgl/lvgl.h>
2
3 #include "control_ui.h"
4 #include "home_ui.h"
5 #include "info_ui.h"
6 #include "main.h"
7 #include "music_ui.h"
8 #include "ui_resource.h"
9
10 enum
11 {
12 SUBMENU_MIN = 0,
13 SUBMENU_INFO = SUBMENU_MIN,
14 SUBMENU_CONTROL,
15 SUBMENU_MUSIC,
16 SUBMENU_MAX,
17 SUBMENU_DEFAULT = SUBMENU_INFO,
18 };
19
20 struct submenu_s {
21 char *name;
22 void (*init)(lv_obj_t * parent);
23 void (*deinit)(void);
24 lv_obj_t * menu;
25 };
26
27 static lv_obj_t * ui_screen;
28 static lv_obj_t * bg_pic;
29 static lv_obj_t * btn_return;
30 static lv_obj_t * label_menu;
31 static lv_obj_t * area_submenu;
32
33 static lv_img_dsc_t * bg_snapshot;
34
35 static lv_style_t * style_cont;
36
37 static lv_obj_t * sub_menu[SUBMENU_MAX];
38 static struct submenu_s submenu_desc[SUBMENU_MAX];
39
40 #define SUBMENU_COMMON_DEFINE(enum_t, name) \
41 static void submenu_##name(lv_obj_t * parent) \
42 { \
43 if (!submenu_desc[enum_t].menu)\
44 submenu_desc[enum_t].menu = menu_##name##_init(parent);\
45 } \
46 static void submenu_##name##_destroy(void) \
47 { \
48 if (submenu_desc[enum_t].menu)\
49 menu_##name##_deinit();\
50 }
51
52 SUBMENU_COMMON_DEFINE(SUBMENU_INFO, info)
53 SUBMENU_COMMON_DEFINE(SUBMENU_CONTROL, control)
54 SUBMENU_COMMON_DEFINE(SUBMENU_MUSIC, music)
55
56 static struct submenu_s submenu_desc[SUBMENU_MAX] = {
57 {"首页", submenu_info, submenu_info_destroy, NULL},
58 {"控制", submenu_control, submenu_control_destroy, NULL},
59 {"播放器", submenu_music, submenu_music_destroy, NULL}
60 };
61
bg_pic_snapshot_blur(void)62 static void bg_pic_snapshot_blur(void)
63 {
64 lv_draw_rect_dsc_t dsc;
65
66 bg_snapshot = lv_snapshot_take(bg_pic, LV_IMG_CF_TRUE_COLOR);
67
68 lv_obj_t * canvas = lv_canvas_create(NULL);
69 lv_area_t area;
70 lv_canvas_set_buffer(canvas, bg_snapshot->data,
71 bg_snapshot->header.w,
72 bg_snapshot->header.h,
73 bg_snapshot->header.cf);
74 area.x1 = 0;
75 area.y1 = 0;
76 area.x2 = bg_snapshot->header.w - 1;
77 area.y2 = bg_snapshot->header.h - 1;
78 lv_canvas_blur_ver(canvas, &area, 100);
79 lv_canvas_blur_hor(canvas, &area, 100);
80 lv_draw_rect_dsc_init(&dsc);
81 dsc.bg_opa = 70;
82 dsc.bg_color = lv_color_black();
83 lv_canvas_draw_rect(canvas, 0, 0,
84 bg_snapshot->header.w,
85 bg_snapshot->header.h, &dsc);
86 lv_obj_del(canvas);
87 }
88
style_init(void)89 static void style_init(void)
90 {
91 if (style_cont)
92 return;
93
94 style_cont = malloc(sizeof(style_cont));
95 lv_style_init(style_cont);
96 lv_style_set_text_font(style_cont, ttf_main_m.font);
97 lv_style_set_text_color(style_cont, lv_color_black());
98 lv_style_set_radius(style_cont, 10);
99 lv_style_set_pad_left(style_cont, 10);
100 lv_style_set_pad_right(style_cont, 10);
101 lv_style_set_pad_top(style_cont, 10);
102 lv_style_set_pad_bottom(style_cont, 10);
103 }
104
btn_drawed_cb(lv_event_t * e)105 static void btn_drawed_cb(lv_event_t * e)
106 {
107 switch (e->code) {
108 case LV_EVENT_CLICKED:
109 home_ui_init();
110 for (int i = SUBMENU_MIN; i < SUBMENU_MAX; i++)
111 {
112 if (submenu_desc[i].deinit)
113 submenu_desc[i].deinit();
114 submenu_desc[i].menu = NULL;
115 }
116 lv_obj_del(ui_screen);
117 ui_screen = NULL;
118 label_menu = NULL;
119 lv_snapshot_free(bg_snapshot);
120 break;
121 case LV_EVENT_DRAW_POST_END:
122 if (!label_menu)
123 return;
124 lv_obj_align_to(label_menu, btn_return,
125 LV_ALIGN_OUT_RIGHT_MID,
126 5, 0);
127 break;
128 default:
129 break;
130 }
131 }
132
smart_home_ui_bg_blur(void)133 lv_img_dsc_t * smart_home_ui_bg_blur(void)
134 {
135 return bg_snapshot;
136 }
137
smart_home_ui_init(void)138 void smart_home_ui_init(void)
139 {
140 lv_obj_t * obj;
141
142 style_init();
143
144 if (ui_screen)
145 goto load;
146
147 ui_screen = lv_obj_create(NULL);
148
149 lv_obj_clear_flag(ui_screen, LV_OBJ_FLAG_SCROLLABLE);
150 lv_obj_set_style_bg_img_opa(ui_screen, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
151
152 bg_pic = lv_img_create(ui_screen);
153 lv_obj_set_pos(bg_pic, 0, 0);
154 lv_img_set_src(bg_pic, BG_PIC_0);
155 bg_pic_snapshot_blur();
156
157 btn_return = lv_img_create(ui_screen);
158 lv_obj_set_pos(btn_return, 10, 10);
159 lv_img_set_src(btn_return, IMG_RETURN_BTN);
160 lv_obj_add_flag(btn_return, LV_OBJ_FLAG_CLICKABLE);
161 lv_obj_add_event_cb(btn_return, btn_drawed_cb, LV_EVENT_CLICKED, NULL);
162 lv_obj_add_event_cb(btn_return, btn_drawed_cb, LV_EVENT_DRAW_POST_END, NULL);
163
164 label_menu = lv_label_create(ui_screen);
165 lv_label_set_text(label_menu, "智能家居");
166 lv_obj_set_style_text_color(label_menu, lv_color_white(), LV_PART_MAIN);
167 lv_obj_add_style(label_menu, &style_txt_m, LV_PART_MAIN);
168 lv_obj_align_to(label_menu, btn_return,
169 LV_ALIGN_OUT_RIGHT_MID,
170 5, 0);
171
172 area_submenu = lv_tileview_create(ui_screen);
173 lv_obj_remove_style_all(area_submenu);
174 lv_obj_set_size(area_submenu, lv_pct(100), lv_pct(90));
175 lv_obj_set_pos(area_submenu, 0, lv_pct(10));
176 for (int i = SUBMENU_MIN; i < SUBMENU_MAX; i++)
177 {
178 obj = lv_tileview_add_tile(area_submenu, i, 0, LV_DIR_LEFT | LV_DIR_RIGHT);
179 submenu_desc[i].init(obj);
180 }
181
182 load:
183 lv_disp_load_scr(ui_screen);
184 }
185
186