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