429 lines
13 KiB
C
429 lines
13 KiB
C
/**
|
|
* @file lv_theme_basic.c
|
|
*
|
|
*/
|
|
|
|
/*********************
|
|
* INCLUDES
|
|
*********************/
|
|
#include "../../../../lvgl/lvgl.h" /*To see all the widgets*/
|
|
|
|
#if LV_USE_THEME_BASIC
|
|
|
|
#include "lv_theme_basic.h"
|
|
#include "../../../misc/lv_gc.h"
|
|
|
|
/*********************
|
|
* DEFINES
|
|
*********************/
|
|
#define COLOR_SCR lv_palette_lighten(LV_PALETTE_GREY, 4)
|
|
#define COLOR_WHITE lv_color_white()
|
|
#define COLOR_LIGHT lv_palette_lighten(LV_PALETTE_GREY, 2)
|
|
#define COLOR_DARK lv_palette_main(LV_PALETTE_GREY)
|
|
#define COLOR_DIM lv_palette_darken(LV_PALETTE_GREY, 2)
|
|
#define SCROLLBAR_WIDTH 2
|
|
|
|
/**********************
|
|
* TYPEDEFS
|
|
**********************/
|
|
typedef struct {
|
|
lv_style_t scr;
|
|
lv_style_t transp;
|
|
lv_style_t white;
|
|
lv_style_t light;
|
|
lv_style_t dark;
|
|
lv_style_t dim;
|
|
lv_style_t scrollbar;
|
|
#if LV_USE_ARC || LV_USE_COLORWHEEL
|
|
lv_style_t arc_line;
|
|
lv_style_t arc_knob;
|
|
#endif
|
|
#if LV_USE_TEXTAREA
|
|
lv_style_t ta_cursor;
|
|
#endif
|
|
} my_theme_styles_t;
|
|
|
|
|
|
/**********************
|
|
* STATIC PROTOTYPES
|
|
**********************/
|
|
static void style_init_reset(lv_style_t * style);
|
|
static void theme_apply(lv_theme_t * th, lv_obj_t * obj);
|
|
|
|
/**********************
|
|
* STATIC VARIABLES
|
|
**********************/
|
|
static my_theme_styles_t * styles;
|
|
static lv_theme_t theme;
|
|
static bool inited;
|
|
|
|
/**********************
|
|
* MACROS
|
|
**********************/
|
|
|
|
/**********************
|
|
* STATIC FUNCTIONS
|
|
**********************/
|
|
|
|
static void style_init(void)
|
|
{
|
|
style_init_reset(&styles->scrollbar);
|
|
lv_style_set_bg_opa(&styles->scrollbar, LV_OPA_COVER);
|
|
lv_style_set_bg_color(&styles->scrollbar, COLOR_DARK);
|
|
lv_style_set_width(&styles->scrollbar, SCROLLBAR_WIDTH);
|
|
|
|
style_init_reset(&styles->scr);
|
|
lv_style_set_bg_opa(&styles->scr, LV_OPA_COVER);
|
|
lv_style_set_bg_color(&styles->scr, COLOR_SCR);
|
|
lv_style_set_text_color(&styles->scr, COLOR_DIM);
|
|
|
|
|
|
style_init_reset(&styles->transp);
|
|
lv_style_set_bg_opa(&styles->transp, LV_OPA_TRANSP);
|
|
|
|
style_init_reset(&styles->white);
|
|
lv_style_set_bg_opa(&styles->white, LV_OPA_COVER);
|
|
lv_style_set_bg_color(&styles->white, COLOR_WHITE);
|
|
lv_style_set_line_width(&styles->white, 1);
|
|
lv_style_set_line_color(&styles->white, COLOR_WHITE);
|
|
lv_style_set_arc_width(&styles->white, 2);
|
|
lv_style_set_arc_color(&styles->white, COLOR_WHITE);
|
|
|
|
style_init_reset(&styles->light);
|
|
lv_style_set_bg_opa(&styles->light, LV_OPA_COVER);
|
|
lv_style_set_bg_color(&styles->light, COLOR_LIGHT);
|
|
lv_style_set_line_width(&styles->light, 1);
|
|
lv_style_set_line_color(&styles->light, COLOR_LIGHT);
|
|
lv_style_set_arc_width(&styles->light, 2);
|
|
lv_style_set_arc_color(&styles->light, COLOR_LIGHT);
|
|
|
|
style_init_reset(&styles->dark);
|
|
lv_style_set_bg_opa(&styles->dark, LV_OPA_COVER);
|
|
lv_style_set_bg_color(&styles->dark, COLOR_DARK);
|
|
lv_style_set_line_width(&styles->dark, 1);
|
|
lv_style_set_line_color(&styles->dark, COLOR_DARK);
|
|
lv_style_set_arc_width(&styles->dark, 2);
|
|
lv_style_set_arc_color(&styles->dark, COLOR_DARK);
|
|
|
|
style_init_reset(&styles->dim);
|
|
lv_style_set_bg_opa(&styles->dim, LV_OPA_COVER);
|
|
lv_style_set_bg_color(&styles->dim, COLOR_DIM);
|
|
lv_style_set_line_width(&styles->dim, 1);
|
|
lv_style_set_line_color(&styles->dim, COLOR_DIM);
|
|
lv_style_set_arc_width(&styles->dim, 2);
|
|
lv_style_set_arc_color(&styles->dim, COLOR_DIM);
|
|
|
|
#if LV_USE_ARC || LV_USE_COLORWHEEL
|
|
style_init_reset(&styles->arc_line);
|
|
lv_style_set_arc_width(&styles->arc_line, 6);
|
|
style_init_reset(&styles->arc_knob);
|
|
lv_style_set_pad_all(&styles->arc_knob, 5);
|
|
#endif
|
|
|
|
#if LV_USE_TEXTAREA
|
|
style_init_reset(&styles->ta_cursor);
|
|
lv_style_set_border_side(&styles->ta_cursor, LV_BORDER_SIDE_LEFT);
|
|
lv_style_set_border_color(&styles->ta_cursor, COLOR_DIM);
|
|
lv_style_set_border_width(&styles->ta_cursor, 2);
|
|
lv_style_set_bg_opa(&styles->ta_cursor, LV_OPA_TRANSP);
|
|
lv_style_set_anim_time(&styles->ta_cursor, 500);
|
|
#endif
|
|
}
|
|
|
|
|
|
/**********************
|
|
* GLOBAL FUNCTIONS
|
|
**********************/
|
|
|
|
bool lv_theme_basic_is_inited(void)
|
|
{
|
|
return LV_GC_ROOT(_lv_theme_basic_styles) == NULL ? false : true;
|
|
}
|
|
|
|
lv_theme_t * lv_theme_basic_init(lv_disp_t * disp)
|
|
{
|
|
|
|
/*This trick is required only to avoid the garbage collection of
|
|
*styles' data if LVGL is used in a binding (e.g. Micropython)
|
|
*In a general case styles could be in simple `static lv_style_t my_style...` variables*/
|
|
if(!lv_theme_basic_is_inited()) {
|
|
inited = false;
|
|
LV_GC_ROOT(_lv_theme_basic_styles) = lv_mem_alloc(sizeof(my_theme_styles_t));
|
|
styles = (my_theme_styles_t *)LV_GC_ROOT(_lv_theme_basic_styles);
|
|
}
|
|
|
|
theme.disp = disp;
|
|
theme.font_small = LV_FONT_DEFAULT;
|
|
theme.font_normal = LV_FONT_DEFAULT;
|
|
theme.font_large = LV_FONT_DEFAULT;
|
|
theme.apply_cb = theme_apply;
|
|
|
|
style_init();
|
|
|
|
if(disp == NULL || lv_disp_get_theme(disp) == &theme) {
|
|
lv_obj_report_style_change(NULL);
|
|
}
|
|
|
|
inited = true;
|
|
|
|
return (lv_theme_t *)&theme;
|
|
}
|
|
|
|
|
|
static void theme_apply(lv_theme_t * th, lv_obj_t * obj)
|
|
{
|
|
LV_UNUSED(th);
|
|
|
|
if(lv_obj_get_parent(obj) == NULL) {
|
|
lv_obj_add_style(obj, &styles->scr, 0);
|
|
lv_obj_add_style(obj, &styles->scrollbar, LV_PART_SCROLLBAR);
|
|
return;
|
|
}
|
|
|
|
if(lv_obj_check_type(obj, &lv_obj_class)) {
|
|
#if LV_USE_TABVIEW
|
|
lv_obj_t * parent = lv_obj_get_parent(obj);
|
|
/*Tabview content area*/
|
|
if(lv_obj_check_type(parent, &lv_tabview_class)) {
|
|
lv_obj_add_style(obj, &styles->scr, 0);
|
|
return;
|
|
}
|
|
/*Tabview pages*/
|
|
else if(lv_obj_check_type(lv_obj_get_parent(parent), &lv_tabview_class)) {
|
|
lv_obj_add_style(obj, &styles->scr, 0);
|
|
lv_obj_add_style(obj, &styles->scrollbar, LV_PART_SCROLLBAR);
|
|
return;
|
|
}
|
|
#endif
|
|
|
|
#if LV_USE_WIN
|
|
/*Header*/
|
|
if(lv_obj_get_index(obj) == 0 && lv_obj_check_type(lv_obj_get_parent(obj), &lv_win_class)) {
|
|
lv_obj_add_style(obj, &styles->light, 0);
|
|
return;
|
|
}
|
|
/*Content*/
|
|
else if(lv_obj_get_index(obj) == 1 && lv_obj_check_type(lv_obj_get_parent(obj), &lv_win_class)) {
|
|
lv_obj_add_style(obj, &styles->light, 0);
|
|
lv_obj_add_style(obj, &styles->scrollbar, LV_PART_SCROLLBAR);
|
|
return;
|
|
}
|
|
#endif
|
|
lv_obj_add_style(obj, &styles->white, 0);
|
|
lv_obj_add_style(obj, &styles->scrollbar, LV_PART_SCROLLBAR);
|
|
}
|
|
#if LV_USE_BTN
|
|
else if(lv_obj_check_type(obj, &lv_btn_class)) {
|
|
lv_obj_add_style(obj, &styles->dark, 0);
|
|
}
|
|
#endif
|
|
|
|
#if LV_USE_BTNMATRIX
|
|
else if(lv_obj_check_type(obj, &lv_btnmatrix_class)) {
|
|
#if LV_USE_MSGBOX
|
|
if(lv_obj_check_type(lv_obj_get_parent(obj), &lv_msgbox_class)) {
|
|
lv_obj_add_style(obj, &styles->light, LV_PART_ITEMS);
|
|
return;
|
|
}
|
|
#endif
|
|
#if LV_USE_TABVIEW
|
|
if(lv_obj_check_type(lv_obj_get_parent(obj), &lv_tabview_class)) {
|
|
lv_obj_add_style(obj, &styles->light, LV_PART_ITEMS);
|
|
return;
|
|
}
|
|
#endif
|
|
lv_obj_add_style(obj, &styles->white, 0);
|
|
lv_obj_add_style(obj, &styles->light, LV_PART_ITEMS);
|
|
}
|
|
#endif
|
|
|
|
#if LV_USE_BAR
|
|
else if(lv_obj_check_type(obj, &lv_bar_class)) {
|
|
lv_obj_add_style(obj, &styles->light, 0);
|
|
lv_obj_add_style(obj, &styles->dark, LV_PART_INDICATOR);
|
|
}
|
|
#endif
|
|
|
|
#if LV_USE_SLIDER
|
|
else if(lv_obj_check_type(obj, &lv_slider_class)) {
|
|
lv_obj_add_style(obj, &styles->light, 0);
|
|
lv_obj_add_style(obj, &styles->dark, LV_PART_INDICATOR);
|
|
lv_obj_add_style(obj, &styles->dim, LV_PART_KNOB);
|
|
}
|
|
#endif
|
|
|
|
#if LV_USE_TABLE
|
|
else if(lv_obj_check_type(obj, &lv_table_class)) {
|
|
lv_obj_add_style(obj, &styles->scrollbar, LV_PART_SCROLLBAR);
|
|
lv_obj_add_style(obj, &styles->light, LV_PART_ITEMS);
|
|
}
|
|
#endif
|
|
|
|
#if LV_USE_CHECKBOX
|
|
else if(lv_obj_check_type(obj, &lv_checkbox_class)) {
|
|
lv_obj_add_style(obj, &styles->light, LV_PART_INDICATOR);
|
|
lv_obj_add_style(obj, &styles->dark, LV_PART_INDICATOR | LV_STATE_CHECKED);
|
|
}
|
|
#endif
|
|
|
|
#if LV_USE_SWITCH
|
|
else if(lv_obj_check_type(obj, &lv_switch_class)) {
|
|
lv_obj_add_style(obj, &styles->light, 0);
|
|
lv_obj_add_style(obj, &styles->dim, LV_PART_KNOB);
|
|
}
|
|
#endif
|
|
|
|
#if LV_USE_CHART
|
|
else if(lv_obj_check_type(obj, &lv_chart_class)) {
|
|
lv_obj_add_style(obj, &styles->white, 0);
|
|
lv_obj_add_style(obj, &styles->scrollbar, LV_PART_SCROLLBAR);
|
|
lv_obj_add_style(obj, &styles->light, LV_PART_ITEMS);
|
|
lv_obj_add_style(obj, &styles->dark, LV_PART_TICKS);
|
|
lv_obj_add_style(obj, &styles->dark, LV_PART_CURSOR);
|
|
}
|
|
#endif
|
|
|
|
#if LV_USE_ROLLER
|
|
else if(lv_obj_check_type(obj, &lv_roller_class)) {
|
|
lv_obj_add_style(obj, &styles->light, 0);
|
|
lv_obj_add_style(obj, &styles->dark, LV_PART_SELECTED);
|
|
}
|
|
#endif
|
|
|
|
#if LV_USE_DROPDOWN
|
|
else if(lv_obj_check_type(obj, &lv_dropdown_class)) {
|
|
lv_obj_add_style(obj, &styles->white, 0);
|
|
}
|
|
else if(lv_obj_check_type(obj, &lv_dropdownlist_class)) {
|
|
lv_obj_add_style(obj, &styles->white, 0);
|
|
lv_obj_add_style(obj, &styles->scrollbar, LV_PART_SCROLLBAR);
|
|
lv_obj_add_style(obj, &styles->light, LV_PART_SELECTED);
|
|
lv_obj_add_style(obj, &styles->dark, LV_PART_SELECTED | LV_STATE_CHECKED);
|
|
}
|
|
#endif
|
|
|
|
#if LV_USE_ARC
|
|
else if(lv_obj_check_type(obj, &lv_arc_class)) {
|
|
lv_obj_add_style(obj, &styles->light, 0);
|
|
lv_obj_add_style(obj, &styles->transp, 0);
|
|
lv_obj_add_style(obj, &styles->arc_line, 0);
|
|
lv_obj_add_style(obj, &styles->dark, LV_PART_INDICATOR);
|
|
lv_obj_add_style(obj, &styles->arc_line, LV_PART_INDICATOR);
|
|
lv_obj_add_style(obj, &styles->dim, LV_PART_KNOB);
|
|
lv_obj_add_style(obj, &styles->arc_knob, LV_PART_KNOB);
|
|
}
|
|
#endif
|
|
|
|
#if LV_USE_SPINNER
|
|
else if(lv_obj_check_type(obj, &lv_spinner_class)) {
|
|
lv_obj_add_style(obj, &styles->light, 0);
|
|
lv_obj_add_style(obj, &styles->transp, 0);
|
|
lv_obj_add_style(obj, &styles->arc_line, 0);
|
|
lv_obj_add_style(obj, &styles->dark, LV_PART_INDICATOR);
|
|
lv_obj_add_style(obj, &styles->arc_line, LV_PART_INDICATOR);
|
|
}
|
|
#endif
|
|
|
|
#if LV_USE_COLORWHEEL
|
|
else if(lv_obj_check_type(obj, &lv_colorwheel_class)) {
|
|
lv_obj_add_style(obj, &styles->light, 0);
|
|
lv_obj_add_style(obj, &styles->transp, 0);
|
|
lv_obj_add_style(obj, &styles->arc_line, 0);
|
|
lv_obj_add_style(obj, &styles->dim, LV_PART_KNOB);
|
|
lv_obj_add_style(obj, &styles->arc_knob, LV_PART_KNOB);
|
|
}
|
|
#endif
|
|
|
|
#if LV_USE_METER
|
|
else if(lv_obj_check_type(obj, &lv_meter_class)) {
|
|
lv_obj_add_style(obj, &styles->light, 0);
|
|
}
|
|
#endif
|
|
|
|
#if LV_USE_TEXTAREA
|
|
else if(lv_obj_check_type(obj, &lv_textarea_class)) {
|
|
lv_obj_add_style(obj, &styles->white, 0);
|
|
lv_obj_add_style(obj, &styles->scrollbar, LV_PART_SCROLLBAR);
|
|
lv_obj_add_style(obj, &styles->ta_cursor, LV_PART_CURSOR | LV_STATE_FOCUSED);
|
|
}
|
|
#endif
|
|
|
|
#if LV_USE_CALENDAR
|
|
else if(lv_obj_check_type(obj, &lv_calendar_class)) {
|
|
lv_obj_add_style(obj, &styles->light, 0);
|
|
}
|
|
#endif
|
|
|
|
#if LV_USE_KEYBOARD
|
|
else if(lv_obj_check_type(obj, &lv_keyboard_class)) {
|
|
lv_obj_add_style(obj, &styles->scr, 0);
|
|
lv_obj_add_style(obj, &styles->white, LV_PART_ITEMS);
|
|
lv_obj_add_style(obj, &styles->light, LV_PART_ITEMS | LV_STATE_CHECKED);
|
|
}
|
|
#endif
|
|
#if LV_USE_LIST
|
|
else if(lv_obj_check_type(obj, &lv_list_class)) {
|
|
lv_obj_add_style(obj, &styles->light, 0);
|
|
lv_obj_add_style(obj, &styles->scrollbar, LV_PART_SCROLLBAR);
|
|
return;
|
|
}
|
|
else if(lv_obj_check_type(obj, &lv_list_text_class)) {
|
|
|
|
}
|
|
else if(lv_obj_check_type(obj, &lv_list_btn_class)) {
|
|
lv_obj_add_style(obj, &styles->dark, 0);
|
|
|
|
}
|
|
#endif
|
|
#if LV_USE_MSGBOX
|
|
else if(lv_obj_check_type(obj, &lv_msgbox_class)) {
|
|
lv_obj_add_style(obj, &styles->light, 0);
|
|
return;
|
|
}
|
|
#endif
|
|
#if LV_USE_SPINBOX
|
|
else if(lv_obj_check_type(obj, &lv_spinbox_class)) {
|
|
lv_obj_add_style(obj, &styles->light, 0);
|
|
lv_obj_add_style(obj, &styles->dark, LV_PART_CURSOR);
|
|
}
|
|
#endif
|
|
#if LV_USE_TILEVIEW
|
|
else if(lv_obj_check_type(obj, &lv_tileview_class)) {
|
|
lv_obj_add_style(obj, &styles->scr, 0);
|
|
lv_obj_add_style(obj, &styles->scrollbar, LV_PART_SCROLLBAR);
|
|
}
|
|
else if(lv_obj_check_type(obj, &lv_tileview_tile_class)) {
|
|
lv_obj_add_style(obj, &styles->scrollbar, LV_PART_SCROLLBAR);
|
|
}
|
|
#endif
|
|
|
|
#if LV_USE_COLORWHEEL
|
|
else if(lv_obj_check_type(obj, &lv_colorwheel_class)) {
|
|
lv_obj_add_style(obj, &styles->light, 0);
|
|
lv_obj_add_style(obj, &styles->light, LV_PART_KNOB);
|
|
}
|
|
#endif
|
|
|
|
#if LV_USE_LED
|
|
else if(lv_obj_check_type(obj, &lv_led_class)) {
|
|
lv_obj_add_style(obj, &styles->light, 0);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
/**********************
|
|
* STATIC FUNCTIONS
|
|
**********************/
|
|
|
|
static void style_init_reset(lv_style_t * style)
|
|
{
|
|
if(inited) {
|
|
lv_style_reset(style);
|
|
}
|
|
else {
|
|
lv_style_init(style);
|
|
}
|
|
}
|
|
|
|
#endif
|