1 /**
2 * @file lv_demo_ebike.c
3 *
4 */
5
6 /*********************
7 * INCLUDES
8 *********************/
9 #include "lv_demo_ebike.h"
10 #if LV_USE_DEMO_EBIKE
11
12 #include "lv_demo_ebike_home.h"
13 #include "lv_demo_ebike_settings.h"
14 #include "lv_demo_ebike_stats.h"
15 #include "lv_demo_ebike_private.h"
16 #include "translations/lv_i18n.h"
17
18 /*********************
19 * DEFINES
20 *********************/
21
22 /**********************
23 * TYPEDEFS
24 **********************/
25
26 /**********************
27 * STATIC PROTOTYPES
28 **********************/
29 static void menu_bar_create(void);
30 static void menu_item_click_event_cb(lv_event_t * e);
31 static void language_observer_cb(lv_observer_t * observer, lv_subject_t * subject);
32
33 /**********************
34 * STATIC VARIABLES
35 **********************/
36 static lv_obj_t * main_cont;
37 #if LV_USE_LOTTIE
38 #if LV_DEMO_EBIKE_PORTRAIT
39 LV_DRAW_BUF_DEFINE_STATIC(lottie_ebike_draw_buf, 120, 120, LV_COLOR_FORMAT_ARGB8888);
40 #else
41 LV_DRAW_BUF_DEFINE_STATIC(lottie_ebike_draw_buf, 100, 100, LV_COLOR_FORMAT_ARGB8888);
42 #endif
43 #endif
44
45 static lv_theme_t * theme_original;
46
47 /**********************
48 * GLOBAL VARIABLES
49 **********************/
50
51 /*The language subject is globally available*/
52 lv_subject_t ebike_subject_language;
53
54 /**********************
55 * MACROS
56 **********************/
57
58 /**********************
59 * GLOBAL FUNCTIONS
60 **********************/
61
lv_demo_ebike(void)62 void lv_demo_ebike(void)
63 {
64 lv_i18n_init(lv_i18n_language_pack);
65
66 #if LV_USE_LOTTIE
67 LV_DRAW_BUF_INIT_STATIC(lottie_ebike_draw_buf);
68 #endif
69
70 lv_subject_init_int(&ebike_subject_language, 0);
71 lv_subject_add_observer_obj(&ebike_subject_language, language_observer_cb, lv_screen_active(), NULL);
72 lv_demo_ebike_home_init();
73 lv_demo_ebike_stats_init();
74
75 /*Use the simple the to make styling simpler*/
76 lv_display_t * display = lv_display_get_default();
77 theme_original = lv_display_get_theme(display);
78 lv_theme_t * theme = lv_theme_simple_init(display);
79 lv_display_set_theme(display, theme);
80
81 lv_obj_set_flex_flow(lv_screen_active(), LV_DEMO_EBIKE_PORTRAIT ? LV_FLEX_FLOW_COLUMN : LV_FLEX_FLOW_ROW);
82 lv_obj_remove_flag(lv_screen_active(), LV_OBJ_FLAG_SCROLLABLE);
83 lv_obj_set_style_text_color(lv_screen_active(), lv_color_white(), 0);
84
85 lv_obj_t * bg = lv_image_create(lv_screen_active());
86 #if LV_DEMO_EBIKE_PORTRAIT
87 LV_IMAGE_DECLARE(img_ebike_bg_large);
88 lv_image_set_src(bg, &img_ebike_bg_large);
89 #else
90 LV_IMAGE_DECLARE(img_ebike_bg);
91 lv_image_set_src(bg, &img_ebike_bg);
92 #endif
93
94 lv_obj_align(bg, LV_ALIGN_CENTER, 0, 0);
95 lv_obj_add_flag(bg, LV_OBJ_FLAG_IGNORE_LAYOUT);
96 lv_obj_set_style_bg_color(lv_screen_active(), lv_color_hex(0xffeeaa), 0);
97
98 /*Create a container for the main content*/
99 main_cont = lv_obj_create(lv_screen_active());
100 lv_obj_set_size(main_cont, lv_pct(100), lv_pct(100));
101 lv_obj_set_flex_grow(main_cont, 1);
102 lv_obj_set_style_bg_opa(main_cont, 0, 0);
103
104 lv_demo_ebike_home_create(main_cont);
105
106 menu_bar_create();
107 }
108
109 #if LV_USE_LOTTIE
lv_demo_ebike_get_lottie_draw_buf(void)110 lv_draw_buf_t * lv_demo_ebike_get_lottie_draw_buf(void)
111 {
112 return &lottie_ebike_draw_buf;
113 }
114 #endif
115
116 /**********************
117 * STATIC FUNCTIONS
118 **********************/
119
menu_delete_event_cb(lv_event_t * e)120 static void menu_delete_event_cb(lv_event_t * e)
121 {
122 LV_UNUSED(e);
123 lv_subject_deinit(&ebike_subject_language);
124 lv_demo_ebike_home_deinit();
125 lv_demo_ebike_stats_deinit();
126
127 lv_display_set_theme(lv_display_get_default(), theme_original);
128 }
129
menu_bar_create(void)130 static void menu_bar_create(void)
131 {
132 lv_obj_t * menu_cont = lv_obj_create(lv_screen_active());
133 lv_obj_set_style_bg_color(menu_cont, lv_color_black(), 0);
134 lv_obj_set_flex_flow(menu_cont, LV_DEMO_EBIKE_PORTRAIT ? LV_FLEX_FLOW_ROW : LV_FLEX_FLOW_COLUMN);
135 lv_obj_set_flex_align(menu_cont, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
136 #if LV_DEMO_EBIKE_PORTRAIT
137 lv_obj_set_size(menu_cont, lv_pct(100), 64);
138 lv_obj_set_style_pad_gap(menu_cont, 32, 0);
139 #else
140 lv_obj_set_size(menu_cont, 44, lv_pct(100));
141 lv_obj_set_style_pad_gap(menu_cont, 16, 0);
142 #endif
143 /*The menu always exists. If it's deleted, the demo was deleted, so clean up*/
144 lv_obj_add_event_cb(menu_cont, menu_delete_event_cb, LV_EVENT_DELETE, NULL);
145
146
147 LV_IMAGE_DECLARE(img_ebike_settings);
148 lv_obj_t * icon1 = lv_image_create(menu_cont);
149 lv_image_set_src(icon1, &img_ebike_settings);
150 lv_obj_add_event_cb(icon1, menu_item_click_event_cb, LV_EVENT_CLICKED, NULL);
151 lv_obj_set_size(icon1, 44, 44);
152 lv_obj_set_ext_click_area(icon1, 8);
153 lv_obj_add_flag(icon1, LV_OBJ_FLAG_CLICKABLE);
154 lv_obj_set_style_image_opa(icon1, LV_OPA_50, 0);
155
156 LV_IMAGE_DECLARE(img_ebike_stats);
157 lv_obj_t * icon2 = lv_image_create(menu_cont);
158 lv_image_set_src(icon2, &img_ebike_stats);
159 lv_obj_add_event_cb(icon2, menu_item_click_event_cb, LV_EVENT_CLICKED, NULL);
160 lv_obj_set_size(icon2, 44, 44);
161 lv_obj_set_ext_click_area(icon2, 8);
162 lv_obj_add_flag(icon2, LV_OBJ_FLAG_CLICKABLE);
163 lv_obj_set_style_image_opa(icon2, LV_OPA_50, 0);
164
165 LV_IMAGE_DECLARE(img_ebike_home);
166 lv_obj_t * icon3 = lv_image_create(menu_cont);
167 lv_image_set_src(icon3, &img_ebike_home);
168 lv_obj_add_event_cb(icon3, menu_item_click_event_cb, LV_EVENT_CLICKED, NULL);
169 lv_obj_set_size(icon3, 44, 44);
170 lv_obj_set_ext_click_area(icon3, 8);
171 lv_obj_add_flag(icon3, LV_OBJ_FLAG_CLICKABLE);
172 }
173
menu_item_click_event_cb(lv_event_t * e)174 static void menu_item_click_event_cb(lv_event_t * e)
175 {
176 lv_obj_clean(main_cont);
177
178 lv_obj_t * icon = lv_event_get_target(e);
179 lv_obj_t * menu_cont = lv_obj_get_parent(icon);
180 uint32_t idx = lv_obj_get_index(icon);
181
182 lv_obj_set_style_image_opa(lv_obj_get_child(menu_cont, 0), LV_OPA_50, 0);
183 lv_obj_set_style_image_opa(lv_obj_get_child(menu_cont, 1), LV_OPA_50, 0);
184 lv_obj_set_style_image_opa(lv_obj_get_child(menu_cont, 2), LV_OPA_50, 0);
185
186 lv_obj_set_style_image_opa(lv_obj_get_child(menu_cont, idx), LV_OPA_100, 0);
187 switch(idx) {
188 case 0:
189 lv_demo_ebike_settings_create(main_cont);
190 break;
191 case 1:
192 lv_demo_ebike_stats_create(main_cont);
193 break;
194 case 2:
195 lv_demo_ebike_home_create(main_cont);
196 break;
197 default:
198 break;
199 }
200 }
201
language_observer_cb(lv_observer_t * observer,lv_subject_t * subject)202 static void language_observer_cb(lv_observer_t * observer, lv_subject_t * subject)
203 {
204 LV_UNUSED(observer);
205
206 static uint32_t lang_current = 0;
207 uint32_t lang_new = lv_subject_get_int(subject);
208 if(lang_new != lang_current) {
209 lang_current = lang_new;
210 switch(lang_current) {
211 case 0:
212 lv_i18n_set_locale("en");
213 break;
214 case 1:
215 lv_i18n_set_locale("zh");
216 break;
217 case 2:
218 lv_i18n_set_locale("ar");
219 break;
220 }
221 lv_obj_clean(main_cont);
222 lv_demo_ebike_settings_create(main_cont);
223 }
224 }
225
226 #endif /*LV_USE_DEMO_EBIKE*/
227