1 #include "../../lv_examples.h"
2 #if LV_USE_MENU && LV_USE_MSGBOX && LV_BUILD_EXAMPLES
3 
4 typedef enum {
5     LV_MENU_ITEM_BUILDER_VARIANT_1,
6     LV_MENU_ITEM_BUILDER_VARIANT_2
7 } lv_menu_builder_variant_t;
8 
9 static void back_event_handler(lv_event_t * e);
10 static void switch_handler(lv_event_t * e);
11 lv_obj_t * root_page;
12 static lv_obj_t * create_text(lv_obj_t * parent, const char * icon, const char * txt,
13                               lv_menu_builder_variant_t builder_variant);
14 static lv_obj_t * create_slider(lv_obj_t * parent,
15                                 const char * icon, const char * txt, int32_t min, int32_t max, int32_t val);
16 static lv_obj_t * create_switch(lv_obj_t * parent,
17                                 const char * icon, const char * txt, bool chk);
18 
lv_example_menu_5(void)19 void lv_example_menu_5(void)
20 {
21     lv_obj_t * menu = lv_menu_create(lv_screen_active());
22 
23     lv_color_t bg_color = lv_obj_get_style_bg_color(menu, 0);
24     if(lv_color_brightness(bg_color) > 127) {
25         lv_obj_set_style_bg_color(menu, lv_color_darken(lv_obj_get_style_bg_color(menu, 0), 10), 0);
26     }
27     else {
28         lv_obj_set_style_bg_color(menu, lv_color_darken(lv_obj_get_style_bg_color(menu, 0), 50), 0);
29     }
30     lv_menu_set_mode_root_back_button(menu, LV_MENU_ROOT_BACK_BUTTON_ENABLED);
31     lv_obj_add_event_cb(menu, back_event_handler, LV_EVENT_CLICKED, menu);
32     lv_obj_set_size(menu, lv_display_get_horizontal_resolution(NULL), lv_display_get_vertical_resolution(NULL));
33     lv_obj_center(menu);
34 
35     lv_obj_t * cont;
36     lv_obj_t * section;
37 
38     /*Create sub pages*/
39     lv_obj_t * sub_mechanics_page = lv_menu_page_create(menu, NULL);
40     lv_obj_set_style_pad_hor(sub_mechanics_page, lv_obj_get_style_pad_left(lv_menu_get_main_header(menu), 0), 0);
41     lv_menu_separator_create(sub_mechanics_page);
42     section = lv_menu_section_create(sub_mechanics_page);
43     create_slider(section, LV_SYMBOL_SETTINGS, "Velocity", 0, 150, 120);
44     create_slider(section, LV_SYMBOL_SETTINGS, "Acceleration", 0, 150, 50);
45     create_slider(section, LV_SYMBOL_SETTINGS, "Weight limit", 0, 150, 80);
46 
47     lv_obj_t * sub_sound_page = lv_menu_page_create(menu, NULL);
48     lv_obj_set_style_pad_hor(sub_sound_page, lv_obj_get_style_pad_left(lv_menu_get_main_header(menu), 0), 0);
49     lv_menu_separator_create(sub_sound_page);
50     section = lv_menu_section_create(sub_sound_page);
51     create_switch(section, LV_SYMBOL_AUDIO, "Sound", false);
52 
53     lv_obj_t * sub_display_page = lv_menu_page_create(menu, NULL);
54     lv_obj_set_style_pad_hor(sub_display_page, lv_obj_get_style_pad_left(lv_menu_get_main_header(menu), 0), 0);
55     lv_menu_separator_create(sub_display_page);
56     section = lv_menu_section_create(sub_display_page);
57     create_slider(section, LV_SYMBOL_SETTINGS, "Brightness", 0, 150, 100);
58 
59     lv_obj_t * sub_software_info_page = lv_menu_page_create(menu, NULL);
60     lv_obj_set_style_pad_hor(sub_software_info_page, lv_obj_get_style_pad_left(lv_menu_get_main_header(menu), 0), 0);
61     section = lv_menu_section_create(sub_software_info_page);
62     create_text(section, NULL, "Version 1.0", LV_MENU_ITEM_BUILDER_VARIANT_1);
63 
64     lv_obj_t * sub_legal_info_page = lv_menu_page_create(menu, NULL);
65     lv_obj_set_style_pad_hor(sub_legal_info_page, lv_obj_get_style_pad_left(lv_menu_get_main_header(menu), 0), 0);
66     section = lv_menu_section_create(sub_legal_info_page);
67     for(uint32_t i = 0; i < 15; i++) {
68         create_text(section, NULL,
69                     "This is a long long long long long long long long long text, if it is long enough it may scroll.",
70                     LV_MENU_ITEM_BUILDER_VARIANT_1);
71     }
72 
73     lv_obj_t * sub_about_page = lv_menu_page_create(menu, NULL);
74     lv_obj_set_style_pad_hor(sub_about_page, lv_obj_get_style_pad_left(lv_menu_get_main_header(menu), 0), 0);
75     lv_menu_separator_create(sub_about_page);
76     section = lv_menu_section_create(sub_about_page);
77     cont = create_text(section, NULL, "Software information", LV_MENU_ITEM_BUILDER_VARIANT_1);
78     lv_menu_set_load_page_event(menu, cont, sub_software_info_page);
79     cont = create_text(section, NULL, "Legal information", LV_MENU_ITEM_BUILDER_VARIANT_1);
80     lv_menu_set_load_page_event(menu, cont, sub_legal_info_page);
81 
82     lv_obj_t * sub_menu_mode_page = lv_menu_page_create(menu, NULL);
83     lv_obj_set_style_pad_hor(sub_menu_mode_page, lv_obj_get_style_pad_left(lv_menu_get_main_header(menu), 0), 0);
84     lv_menu_separator_create(sub_menu_mode_page);
85     section = lv_menu_section_create(sub_menu_mode_page);
86     cont = create_switch(section, LV_SYMBOL_AUDIO, "Sidebar enable", true);
87     lv_obj_add_event_cb(lv_obj_get_child(cont, 2), switch_handler, LV_EVENT_VALUE_CHANGED, menu);
88 
89     /*Create a root page*/
90     root_page = lv_menu_page_create(menu, "Settings");
91     lv_obj_set_style_pad_hor(root_page, lv_obj_get_style_pad_left(lv_menu_get_main_header(menu), 0), 0);
92     section = lv_menu_section_create(root_page);
93     cont = create_text(section, LV_SYMBOL_SETTINGS, "Mechanics", LV_MENU_ITEM_BUILDER_VARIANT_1);
94     lv_menu_set_load_page_event(menu, cont, sub_mechanics_page);
95     cont = create_text(section, LV_SYMBOL_AUDIO, "Sound", LV_MENU_ITEM_BUILDER_VARIANT_1);
96     lv_menu_set_load_page_event(menu, cont, sub_sound_page);
97     cont = create_text(section, LV_SYMBOL_SETTINGS, "Display", LV_MENU_ITEM_BUILDER_VARIANT_1);
98     lv_menu_set_load_page_event(menu, cont, sub_display_page);
99 
100     create_text(root_page, NULL, "Others", LV_MENU_ITEM_BUILDER_VARIANT_1);
101     section = lv_menu_section_create(root_page);
102     cont = create_text(section, NULL, "About", LV_MENU_ITEM_BUILDER_VARIANT_1);
103     lv_menu_set_load_page_event(menu, cont, sub_about_page);
104     cont = create_text(section, LV_SYMBOL_SETTINGS, "Menu mode", LV_MENU_ITEM_BUILDER_VARIANT_1);
105     lv_menu_set_load_page_event(menu, cont, sub_menu_mode_page);
106 
107     lv_menu_set_sidebar_page(menu, root_page);
108 
109     lv_obj_send_event(lv_obj_get_child(lv_obj_get_child(lv_menu_get_cur_sidebar_page(menu), 0), 0), LV_EVENT_CLICKED,
110                       NULL);
111 }
112 
back_event_handler(lv_event_t * e)113 static void back_event_handler(lv_event_t * e)
114 {
115     lv_obj_t * obj = lv_event_get_target(e);
116     lv_obj_t * menu = lv_event_get_user_data(e);
117 
118     if(lv_menu_back_button_is_root(menu, obj)) {
119         lv_obj_t * mbox1 = lv_msgbox_create(NULL);
120         lv_msgbox_add_title(mbox1, "Hello");
121         lv_msgbox_add_text(mbox1, "Root back btn click.");
122         lv_msgbox_add_close_button(mbox1);
123     }
124 }
125 
switch_handler(lv_event_t * e)126 static void switch_handler(lv_event_t * e)
127 {
128     lv_event_code_t code = lv_event_get_code(e);
129     lv_obj_t * menu = lv_event_get_user_data(e);
130     lv_obj_t * obj = lv_event_get_target(e);
131     if(code == LV_EVENT_VALUE_CHANGED) {
132         if(lv_obj_has_state(obj, LV_STATE_CHECKED)) {
133             lv_menu_set_page(menu, NULL);
134             lv_menu_set_sidebar_page(menu, root_page);
135             lv_obj_send_event(lv_obj_get_child(lv_obj_get_child(lv_menu_get_cur_sidebar_page(menu), 0), 0), LV_EVENT_CLICKED,
136                               NULL);
137         }
138         else {
139             lv_menu_set_sidebar_page(menu, NULL);
140             lv_menu_clear_history(menu); /* Clear history because we will be showing the root page later */
141             lv_menu_set_page(menu, root_page);
142         }
143     }
144 }
145 
create_text(lv_obj_t * parent,const char * icon,const char * txt,lv_menu_builder_variant_t builder_variant)146 static lv_obj_t * create_text(lv_obj_t * parent, const char * icon, const char * txt,
147                               lv_menu_builder_variant_t builder_variant)
148 {
149     lv_obj_t * obj = lv_menu_cont_create(parent);
150 
151     lv_obj_t * img = NULL;
152     lv_obj_t * label = NULL;
153 
154     if(icon) {
155         img = lv_image_create(obj);
156         lv_image_set_src(img, icon);
157     }
158 
159     if(txt) {
160         label = lv_label_create(obj);
161         lv_label_set_text(label, txt);
162         lv_label_set_long_mode(label, LV_LABEL_LONG_MODE_SCROLL_CIRCULAR);
163         lv_obj_set_flex_grow(label, 1);
164     }
165 
166     if(builder_variant == LV_MENU_ITEM_BUILDER_VARIANT_2 && icon && txt) {
167         lv_obj_add_flag(img, LV_OBJ_FLAG_FLEX_IN_NEW_TRACK);
168         lv_obj_swap(img, label);
169     }
170 
171     return obj;
172 }
173 
create_slider(lv_obj_t * parent,const char * icon,const char * txt,int32_t min,int32_t max,int32_t val)174 static lv_obj_t * create_slider(lv_obj_t * parent, const char * icon, const char * txt, int32_t min, int32_t max,
175                                 int32_t val)
176 {
177     lv_obj_t * obj = create_text(parent, icon, txt, LV_MENU_ITEM_BUILDER_VARIANT_2);
178 
179     lv_obj_t * slider = lv_slider_create(obj);
180     lv_obj_set_flex_grow(slider, 1);
181     lv_slider_set_range(slider, min, max);
182     lv_slider_set_value(slider, val, LV_ANIM_OFF);
183 
184     if(icon == NULL) {
185         lv_obj_add_flag(slider, LV_OBJ_FLAG_FLEX_IN_NEW_TRACK);
186     }
187 
188     return obj;
189 }
190 
create_switch(lv_obj_t * parent,const char * icon,const char * txt,bool chk)191 static lv_obj_t * create_switch(lv_obj_t * parent, const char * icon, const char * txt, bool chk)
192 {
193     lv_obj_t * obj = create_text(parent, icon, txt, LV_MENU_ITEM_BUILDER_VARIANT_1);
194 
195     lv_obj_t * sw = lv_switch_create(obj);
196     lv_obj_add_state(sw, chk ? LV_STATE_CHECKED : 0);
197 
198     return obj;
199 }
200 
201 #endif
202