xref: /OK3568_Linux_fs/app/lvgl_demo/rk_demo/smart_home/smart_home_ui.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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