mirror of
https://github.com/lvgl/lvgl.git
synced 2025-01-14 06:42:58 +08:00
227 lines
6.8 KiB
C
227 lines
6.8 KiB
C
/**
|
|
* @file lv_demo_ebike.c
|
|
*
|
|
*/
|
|
|
|
/*********************
|
|
* INCLUDES
|
|
*********************/
|
|
#include "lv_demo_ebike.h"
|
|
#if LV_USE_DEMO_EBIKE
|
|
|
|
#include "lv_demo_ebike_home.h"
|
|
#include "lv_demo_ebike_settings.h"
|
|
#include "lv_demo_ebike_stats.h"
|
|
#include "lv_demo_ebike_private.h"
|
|
#include "translations/lv_i18n.h"
|
|
|
|
/*********************
|
|
* DEFINES
|
|
*********************/
|
|
|
|
/**********************
|
|
* TYPEDEFS
|
|
**********************/
|
|
|
|
/**********************
|
|
* STATIC PROTOTYPES
|
|
**********************/
|
|
static void menu_bar_create(void);
|
|
static void menu_item_click_event_cb(lv_event_t * e);
|
|
static void language_observer_cb(lv_observer_t * observer, lv_subject_t * subject);
|
|
|
|
/**********************
|
|
* STATIC VARIABLES
|
|
**********************/
|
|
static lv_obj_t * main_cont;
|
|
#if LV_USE_LOTTIE
|
|
#if LV_DEMO_EBIKE_PORTRAIT
|
|
LV_DRAW_BUF_DEFINE_STATIC(lottie_ebike_draw_buf, 120, 120, LV_COLOR_FORMAT_ARGB8888);
|
|
#else
|
|
LV_DRAW_BUF_DEFINE_STATIC(lottie_ebike_draw_buf, 100, 100, LV_COLOR_FORMAT_ARGB8888);
|
|
#endif
|
|
#endif
|
|
|
|
static lv_theme_t * theme_original;
|
|
|
|
/**********************
|
|
* GLOBAL VARIABLES
|
|
**********************/
|
|
|
|
/*The language subject is globally available*/
|
|
lv_subject_t ebike_subject_language;
|
|
|
|
/**********************
|
|
* MACROS
|
|
**********************/
|
|
|
|
/**********************
|
|
* GLOBAL FUNCTIONS
|
|
**********************/
|
|
|
|
void lv_demo_ebike(void)
|
|
{
|
|
lv_i18n_init(lv_i18n_language_pack);
|
|
|
|
#if LV_USE_LOTTIE
|
|
LV_DRAW_BUF_INIT_STATIC(lottie_ebike_draw_buf);
|
|
#endif
|
|
|
|
lv_subject_init_int(&ebike_subject_language, 0);
|
|
lv_subject_add_observer_obj(&ebike_subject_language, language_observer_cb, lv_screen_active(), NULL);
|
|
lv_demo_ebike_home_init();
|
|
lv_demo_ebike_stats_init();
|
|
|
|
/*Use the simple the to make styling simpler*/
|
|
lv_display_t * display = lv_display_get_default();
|
|
theme_original = lv_display_get_theme(display);
|
|
lv_theme_t * theme = lv_theme_simple_init(display);
|
|
lv_display_set_theme(display, theme);
|
|
|
|
lv_obj_set_flex_flow(lv_screen_active(), LV_DEMO_EBIKE_PORTRAIT ? LV_FLEX_FLOW_COLUMN : LV_FLEX_FLOW_ROW);
|
|
lv_obj_remove_flag(lv_screen_active(), LV_OBJ_FLAG_SCROLLABLE);
|
|
lv_obj_set_style_text_color(lv_screen_active(), lv_color_white(), 0);
|
|
|
|
lv_obj_t * bg = lv_image_create(lv_screen_active());
|
|
#if LV_DEMO_EBIKE_PORTRAIT
|
|
LV_IMAGE_DECLARE(img_ebike_bg_large);
|
|
lv_image_set_src(bg, &img_ebike_bg_large);
|
|
#else
|
|
LV_IMAGE_DECLARE(img_ebike_bg);
|
|
lv_image_set_src(bg, &img_ebike_bg);
|
|
#endif
|
|
|
|
lv_obj_align(bg, LV_ALIGN_CENTER, 0, 0);
|
|
lv_obj_add_flag(bg, LV_OBJ_FLAG_IGNORE_LAYOUT);
|
|
lv_obj_set_style_bg_color(lv_screen_active(), lv_color_hex(0xffeeaa), 0);
|
|
|
|
/*Create a container for the main content*/
|
|
main_cont = lv_obj_create(lv_screen_active());
|
|
lv_obj_set_size(main_cont, lv_pct(100), lv_pct(100));
|
|
lv_obj_set_flex_grow(main_cont, 1);
|
|
lv_obj_set_style_bg_opa(main_cont, 0, 0);
|
|
|
|
lv_demo_ebike_home_create(main_cont);
|
|
|
|
menu_bar_create();
|
|
}
|
|
|
|
#if LV_USE_LOTTIE
|
|
lv_draw_buf_t * lv_demo_ebike_get_lottie_draw_buf(void)
|
|
{
|
|
return &lottie_ebike_draw_buf;
|
|
}
|
|
#endif
|
|
|
|
/**********************
|
|
* STATIC FUNCTIONS
|
|
**********************/
|
|
|
|
static void menu_delete_event_cb(lv_event_t * e)
|
|
{
|
|
LV_UNUSED(e);
|
|
lv_subject_deinit(&ebike_subject_language);
|
|
lv_demo_ebike_home_deinit();
|
|
lv_demo_ebike_stats_deinit();
|
|
|
|
lv_display_set_theme(lv_display_get_default(), theme_original);
|
|
}
|
|
|
|
static void menu_bar_create(void)
|
|
{
|
|
lv_obj_t * menu_cont = lv_obj_create(lv_screen_active());
|
|
lv_obj_set_style_bg_color(menu_cont, lv_color_black(), 0);
|
|
lv_obj_set_flex_flow(menu_cont, LV_DEMO_EBIKE_PORTRAIT ? LV_FLEX_FLOW_ROW : LV_FLEX_FLOW_COLUMN);
|
|
lv_obj_set_flex_align(menu_cont, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
|
|
#if LV_DEMO_EBIKE_PORTRAIT
|
|
lv_obj_set_size(menu_cont, lv_pct(100), 64);
|
|
lv_obj_set_style_pad_gap(menu_cont, 32, 0);
|
|
#else
|
|
lv_obj_set_size(menu_cont, 44, lv_pct(100));
|
|
lv_obj_set_style_pad_gap(menu_cont, 16, 0);
|
|
#endif
|
|
/*The menu always exists. If it's deleted, the demo was deleted, so clean up*/
|
|
lv_obj_add_event_cb(menu_cont, menu_delete_event_cb, LV_EVENT_DELETE, NULL);
|
|
|
|
|
|
LV_IMAGE_DECLARE(img_ebike_settings);
|
|
lv_obj_t * icon1 = lv_image_create(menu_cont);
|
|
lv_image_set_src(icon1, &img_ebike_settings);
|
|
lv_obj_add_event_cb(icon1, menu_item_click_event_cb, LV_EVENT_CLICKED, NULL);
|
|
lv_obj_set_size(icon1, 44, 44);
|
|
lv_obj_set_ext_click_area(icon1, 8);
|
|
lv_obj_add_flag(icon1, LV_OBJ_FLAG_CLICKABLE);
|
|
lv_obj_set_style_image_opa(icon1, LV_OPA_50, 0);
|
|
|
|
LV_IMAGE_DECLARE(img_ebike_stats);
|
|
lv_obj_t * icon2 = lv_image_create(menu_cont);
|
|
lv_image_set_src(icon2, &img_ebike_stats);
|
|
lv_obj_add_event_cb(icon2, menu_item_click_event_cb, LV_EVENT_CLICKED, NULL);
|
|
lv_obj_set_size(icon2, 44, 44);
|
|
lv_obj_set_ext_click_area(icon2, 8);
|
|
lv_obj_add_flag(icon2, LV_OBJ_FLAG_CLICKABLE);
|
|
lv_obj_set_style_image_opa(icon2, LV_OPA_50, 0);
|
|
|
|
LV_IMAGE_DECLARE(img_ebike_home);
|
|
lv_obj_t * icon3 = lv_image_create(menu_cont);
|
|
lv_image_set_src(icon3, &img_ebike_home);
|
|
lv_obj_add_event_cb(icon3, menu_item_click_event_cb, LV_EVENT_CLICKED, NULL);
|
|
lv_obj_set_size(icon3, 44, 44);
|
|
lv_obj_set_ext_click_area(icon3, 8);
|
|
lv_obj_add_flag(icon3, LV_OBJ_FLAG_CLICKABLE);
|
|
}
|
|
|
|
static void menu_item_click_event_cb(lv_event_t * e)
|
|
{
|
|
lv_obj_clean(main_cont);
|
|
|
|
lv_obj_t * icon = lv_event_get_target(e);
|
|
lv_obj_t * menu_cont = lv_obj_get_parent(icon);
|
|
uint32_t idx = lv_obj_get_index(icon);
|
|
|
|
lv_obj_set_style_image_opa(lv_obj_get_child(menu_cont, 0), LV_OPA_50, 0);
|
|
lv_obj_set_style_image_opa(lv_obj_get_child(menu_cont, 1), LV_OPA_50, 0);
|
|
lv_obj_set_style_image_opa(lv_obj_get_child(menu_cont, 2), LV_OPA_50, 0);
|
|
|
|
lv_obj_set_style_image_opa(lv_obj_get_child(menu_cont, idx), LV_OPA_100, 0);
|
|
switch(idx) {
|
|
case 0:
|
|
lv_demo_ebike_settings_create(main_cont);
|
|
break;
|
|
case 1:
|
|
lv_demo_ebike_stats_create(main_cont);
|
|
break;
|
|
case 2:
|
|
lv_demo_ebike_home_create(main_cont);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void language_observer_cb(lv_observer_t * observer, lv_subject_t * subject)
|
|
{
|
|
LV_UNUSED(observer);
|
|
|
|
static uint32_t lang_current = 0;
|
|
uint32_t lang_new = lv_subject_get_int(subject);
|
|
if(lang_new != lang_current) {
|
|
lang_current = lang_new;
|
|
switch(lang_current) {
|
|
case 0:
|
|
lv_i18n_set_locale("en");
|
|
break;
|
|
case 1:
|
|
lv_i18n_set_locale("zh");
|
|
break;
|
|
case 2:
|
|
lv_i18n_set_locale("ar");
|
|
break;
|
|
}
|
|
lv_obj_clean(main_cont);
|
|
lv_demo_ebike_settings_create(main_cont);
|
|
}
|
|
}
|
|
|
|
#endif /*LV_USE_DEMO_EBIKE*/
|