diff --git a/demos/widgets/assets/font/montserrat-12.fnt b/demos/widgets/assets/font/montserrat-12.fnt new file mode 100644 index 000000000..c2656f1b1 Binary files /dev/null and b/demos/widgets/assets/font/montserrat-12.fnt differ diff --git a/demos/widgets/assets/font/montserrat-14.fnt b/demos/widgets/assets/font/montserrat-14.fnt new file mode 100644 index 000000000..1c362fb0c Binary files /dev/null and b/demos/widgets/assets/font/montserrat-14.fnt differ diff --git a/demos/widgets/assets/font/montserrat-16.fnt b/demos/widgets/assets/font/montserrat-16.fnt new file mode 100644 index 000000000..f5635065c Binary files /dev/null and b/demos/widgets/assets/font/montserrat-16.fnt differ diff --git a/demos/widgets/assets/font/montserrat-18.fnt b/demos/widgets/assets/font/montserrat-18.fnt new file mode 100644 index 000000000..f483f470e Binary files /dev/null and b/demos/widgets/assets/font/montserrat-18.fnt differ diff --git a/demos/widgets/assets/font/montserrat-20.fnt b/demos/widgets/assets/font/montserrat-20.fnt new file mode 100644 index 000000000..3e03de827 Binary files /dev/null and b/demos/widgets/assets/font/montserrat-20.fnt differ diff --git a/demos/widgets/assets/font/montserrat-24.fnt b/demos/widgets/assets/font/montserrat-24.fnt new file mode 100644 index 000000000..b8fa8e2b0 Binary files /dev/null and b/demos/widgets/assets/font/montserrat-24.fnt differ diff --git a/demos/widgets/lv_demo_widgets.py b/demos/widgets/lv_demo_widgets.py index ed2e05904..2f5873b99 100755 --- a/demos/widgets/lv_demo_widgets.py +++ b/demos/widgets/lv_demo_widgets.py @@ -1,572 +1,1474 @@ -#!/opt/bin/lv_micropython +#!/opt/bin/lv_micropython -i import lvgl as lv -import time -import SDL -lv.init() +import display_driver_utils +import fs_driver +import time,os,sys -LV_DEMO_WIDGETS_SLIDESHOW = 0 -LV_THEME_DEFAULT_COLOR_PRIMARY=lv.color_hex(0x01a2b1) -LV_THEME_DEFAULT_COLOR_SECONDARY=lv.color_hex(0x44d1b6) +SCREEN_SIZE_SMALL = (320,240) +SCREEN_SIZE_MEDIUM = (480,320) +SCREEN_SIZE_LARGE = (800,600) +SCREEN_SIZE = SCREEN_SIZE_MEDIUM -LV_LED_BRIGHT_MIN = 120 -LV_LED_BRIGHT_MAX = 255 +LV_THEME_DEFAULT_DARK = 0 +LV_OBJ_FLAG_FLEX_IN_NEW_TRACK = 1<<23 +LV_USE_DRAW_MASKS = True -SDL.init(w=480,h=320) +global session_desktop,session_tablet,session_mobile +global down1,down2,down2 +global calendar +calendar = None -LV_DPI =130 -LV_ANIM_REPEAT_INFINITE = -1 +session_desktop = 1000 +session_tablet = 1000 +session_mobile = 1000 -# Register SDL display driver. +down1 = False +down2 = False +down3 = False -disp_buf1 = lv.disp_buf_t() -buf1_1 = bytes(480 * 10) -disp_buf1.init(buf1_1, None, len(buf1_1)//4) -disp_drv = lv.disp_drv_t() -disp_drv.init() -disp_drv.buffer = disp_buf1 -disp_drv.flush_cb = SDL.monitor_flush -disp_drv.hor_res = 480 -disp_drv.ver_res = 320 -disp_drv.register() -# Register SDL mouse driver +def LV_GRID_FR(x): + return lv.COORD.MAX -100 +x -indev_drv = lv.indev_drv_t() -indev_drv.init() -indev_drv.type = lv.INDEV_TYPE.POINTER -indev_drv.read_cb = SDL.mouse_read -indev_drv.register() -# print("Running the Unix version") +def profile_create(parent): + panel1 = lv.obj(parent) + panel1.set_height(lv.SIZE_CONTENT) + panel1.set_width(lv.SIZE_CONTENT) + # Create an image from the png file + try: + if osVersion == "esp32": + with open('images/avatar.png','rb') as f: + png_data = f.read() + else: + with open(script_path + '/assets/avatar.png','rb') as f: + png_data = f.read() + except: + print("Could not find avatar.png") + sys.exit() + + avatar_argb = lv.img_dsc_t({ + 'data_size': len(png_data), + 'data': png_data + }) + + avatar = lv.img(panel1) + avatar.set_src(avatar_argb) + + name = lv.label(panel1) + name.set_text("Elena Smith") + name.add_style(style_title, 0) + + dsc = lv.label(panel1) + dsc.add_style(style_text_muted, 0) + dsc.set_text("This is a short description of me.\nTake a look at my profile!" ) + dsc.set_long_mode(lv.label.LONG.WRAP) + + email_icn = lv.label(panel1) + email_icn.add_style(style_icon, 0) + email_icn.set_text(lv.SYMBOL.KEYBOARD) + + email_label = lv.label(panel1) + email_label.set_text("elena@smith.com") + + call_icn = lv.label(panel1) + call_icn.add_style(style_icon, 0) + call_icn.set_text(lv.SYMBOL.CALL) + + call_label = lv.label(panel1) + call_label.set_text("+79 246 123 4567") + + log_out_btn = lv.btn(panel1) + log_out_btn.set_height(lv.SIZE_CONTENT) + + label = lv.label(log_out_btn) + label.set_text("Log out") + label.center() + + invite_btn = lv.btn(panel1) + invite_btn.add_state(lv.STATE.DISABLED) + invite_btn.set_height(lv.SIZE_CONTENT) + + label = lv.label(invite_btn) + label.set_text("Invite") + label.center() + + # Create a keyboard + + kb = lv.keyboard(lv.scr_act()) + kb.add_flag(lv.obj.FLAG.HIDDEN) + + # Create the second panel + panel2 = lv.obj(parent) + panel2.set_height(lv.SIZE_CONTENT) + + panel2_title = lv.label(panel2) + panel2_title.set_text("Your profile") + panel2_title.add_style(style_title, 0) + + user_name_label = lv.label(panel2) + user_name_label.set_text("User name") + user_name_label.add_style(style_text_muted, 0) + + user_name = lv.textarea(panel2) + user_name.set_one_line(True) + user_name.set_placeholder_text("Your name") + user_name.add_event_cb(lambda e: ta_event_cb(e,kb,tv),lv.EVENT.ALL,None) + + password_label = lv.label(panel2) + password_label.set_text("Password") + password_label.add_style(style_text_muted, 0) + + password = lv.textarea(panel2) + password.set_one_line(True) + password.set_password_mode(True) + password.set_placeholder_text("Min. 8 chars.") + password.add_event_cb(lambda e: ta_event_cb(e,kb,tv),lv.EVENT.ALL,None) + + gender_label = lv.label(panel2) + gender_label.set_text("Gender") + gender_label.add_style(style_text_muted, 0) + + gender = lv.dropdown(panel2) + gender.set_options_static("Male\nFemale\nOther") + + birthday_label = lv.label(panel2) + birthday_label.set_text("Birthday") + birthday_label.add_style(style_text_muted, 0) + + birthdate = lv.textarea(panel2) + birthdate.set_one_line(True) + birthdate.add_event_cb(birthday_event_cb, lv.EVENT.ALL, None) + + # Create the third panel + panel3 = lv.obj(parent) + panel3_title = lv.label(panel3) + panel3_title.set_text("Your skills") + panel3_title.add_style(style_title, 0) + + experience_label = lv.label(panel3) + experience_label.set_text("Experience") + experience_label.add_style(style_text_muted, 0) + + slider1 = lv.slider(panel3) + slider1.set_width(lv.pct(95)) + # slider1.add_event_cb(slider_event_cb, lv.event.ALL, None) + slider1.refresh_ext_draw_size() + + team_player_label = lv.label(panel3) + team_player_label.set_text("Team player") + team_player_label.add_style(style_text_muted, 0) + + sw1 = lv.switch(panel3) + + hard_working_label = lv.label(panel3) + hard_working_label.set_text("Hard-working") + hard_working_label.add_style(style_text_muted, 0) + + sw2 = lv.switch(panel3) + + if disp_size == DISP_LARGE: + grid_main_col_dsc = [LV_GRID_FR(1), LV_GRID_FR(1), lv.GRID_TEMPLATE_LAST] + grid_main_row_dsc = [lv.GRID_CONTENT, lv.GRID_CONTENT, lv.GRID_TEMPLATE_LAST] + + # Create the top panel + grid_1_col_dsc = [lv.GRID_CONTENT, 5, lv.GRID_CONTENT, LV_GRID_FR(2), LV_GRID_FR(1), LV_GRID_FR(1), lv.GRID_TEMPLATE_LAST] + grid_1_row_dsc = [lv.GRID_CONTENT, lv.GRID_CONTENT, 10, lv.GRID_CONTENT, lv.GRID_CONTENT, lv.GRID_TEMPLATE_LAST] + + grid_2_col_dsc = [LV_GRID_FR(1), LV_GRID_FR(1), lv.GRID_TEMPLATE_LAST] + grid_2_row_dsc = [ + lv.GRID_CONTENT, # Title + 5, # Separator + lv.GRID_CONTENT, # Box title + 30, # Boxes + 5, # Separator + lv.GRID_CONTENT, # Box title + 30, # Boxes + lv.GRID_TEMPLATE_LAST] + + + parent.set_grid_dsc_array(grid_main_col_dsc, grid_main_row_dsc) + + panel1.set_grid_cell(lv.GRID_ALIGN.STRETCH, 0, 2, lv.GRID_ALIGN.CENTER, 0, 1) + + panel1.set_grid_dsc_array(grid_1_col_dsc, grid_1_row_dsc) + avatar.set_grid_cell(lv.GRID_ALIGN.CENTER, 0, 1, lv.GRID_ALIGN.CENTER, 0, 5) + name.set_grid_cell(lv.GRID_ALIGN.START, 2, 2, lv.GRID_ALIGN.CENTER, 0, 1) + dsc.set_grid_cell(lv.GRID_ALIGN.STRETCH, 2, 4, lv.GRID_ALIGN.START, 1, 1) + email_icn.set_grid_cell(lv.GRID_ALIGN.CENTER, 2, 1, lv.GRID_ALIGN.CENTER, 3, 1) + email_label.set_grid_cell(lv.GRID_ALIGN.START, 3, 1, lv.GRID_ALIGN.CENTER, 3, 1) + call_icn.set_grid_cell(lv.GRID_ALIGN.CENTER, 2, 1, lv.GRID_ALIGN.CENTER, 4, 1) + call_label.set_grid_cell(lv.GRID_ALIGN.START, 3, 1, lv.GRID_ALIGN.CENTER, 4, 1) + log_out_btn.set_grid_cell(lv.GRID_ALIGN.STRETCH, 4, 1, lv.GRID_ALIGN.CENTER, 3, 2) + invite_btn.set_grid_cell(lv.GRID_ALIGN.STRETCH, 5, 1, lv.GRID_ALIGN.CENTER, 3, 2) + + panel2.set_grid_cell(lv.GRID_ALIGN.STRETCH, 0, 1, lv.GRID_ALIGN.START, 1, 1) + panel2.set_grid_dsc_array(grid_2_col_dsc, grid_2_row_dsc) + panel2_title.set_grid_cell(lv.GRID_ALIGN.START, 0, 2, lv.GRID_ALIGN.CENTER, 0, 1) + user_name.set_grid_cell(lv.GRID_ALIGN.STRETCH, 0, 1, lv.GRID_ALIGN.CENTER, 3, 1) + user_name_label.set_grid_cell(lv.GRID_ALIGN.START, 0, 1, lv.GRID_ALIGN.START, 2, 1) + password.set_grid_cell(lv.GRID_ALIGN.STRETCH, 1, 1, lv.GRID_ALIGN.CENTER, 3, 1) + password_label.set_grid_cell(lv.GRID_ALIGN.START, 1, 1, lv.GRID_ALIGN.START, 2, 1) + birthdate.set_grid_cell(lv.GRID_ALIGN.STRETCH, 1, 1, lv.GRID_ALIGN.CENTER, 6, 1) + birthday_label.set_grid_cell(lv.GRID_ALIGN.START, 1, 1, lv.GRID_ALIGN.START, 5, 1) + gender.set_grid_cell(lv.GRID_ALIGN.STRETCH, 0, 1, lv.GRID_ALIGN.CENTER, 6, 1) + gender_label.set_grid_cell(lv.GRID_ALIGN.START, 0, 1, lv.GRID_ALIGN.START, 5, 1) + + panel3.set_grid_cell(lv.GRID_ALIGN.STRETCH, 1, 1, lv.GRID_ALIGN.STRETCH, 1, 1) + panel3.set_grid_dsc_array(grid_2_col_dsc, grid_2_row_dsc) + panel3_title.set_grid_cell(lv.GRID_ALIGN.START, 0, 2, lv.GRID_ALIGN.CENTER, 0, 1) + slider1.set_grid_cell(lv.GRID_ALIGN.CENTER, 0, 2, lv.GRID_ALIGN.CENTER, 3, 1) + experience_label.set_grid_cell(lv.GRID_ALIGN.START, 0, 1, lv.GRID_ALIGN.START, 2, 1) + sw2.set_grid_cell(lv.GRID_ALIGN.START, 1, 1, lv.GRID_ALIGN.CENTER, 6, 1) + hard_working_label.set_grid_cell(lv.GRID_ALIGN.START, 0, 1, lv.GRID_ALIGN.START, 5, 1) + sw1.set_grid_cell(lv.GRID_ALIGN.START, 0, 1, lv.GRID_ALIGN.CENTER, 6, 1) + team_player_label.set_grid_cell(lv.GRID_ALIGN.START, 1, 1, lv.GRID_ALIGN.START, 5, 1) + + elif disp_size == DISP_MEDIUM : + grid_main_col_dsc = [LV_GRID_FR(1), LV_GRID_FR(1), lv.GRID_TEMPLATE_LAST] + grid_main_row_dsc = [lv.GRID_CONTENT, lv.GRID_CONTENT, lv.GRID_TEMPLATE_LAST] + + + # Create the top panel + grid_1_col_dsc = [lv.GRID_CONTENT, 1, lv.GRID_CONTENT, LV_GRID_FR(1), lv.GRID_TEMPLATE_LAST] + grid_1_row_dsc = [ + lv.GRID_CONTENT, # Name + lv.GRID_CONTENT, # Description + lv.GRID_CONTENT, # Email + -20, + lv.GRID_CONTENT, # Phone + lv.GRID_CONTENT, # Buttons + lv.GRID_TEMPLATE_LAST] + + grid_2_col_dsc= [LV_GRID_FR(1), LV_GRID_FR(1), lv.GRID_TEMPLATE_LAST] + grid_2_row_dsc = [ + lv.GRID_CONTENT, # Title + 5, # Separator + lv.GRID_CONTENT, # Box title + 40, # Box + lv.GRID_CONTENT, # Box title + 40, # Box + lv.GRID_CONTENT, # Box title + 40, # Box + lv.GRID_CONTENT, # Box title + 40, # Box + lv.GRID_TEMPLATE_LAST] + + + parent.set_grid_dsc_array(grid_main_col_dsc, grid_main_row_dsc) + panel1.set_grid_cell(lv.GRID_ALIGN.STRETCH, 0, 2, lv.GRID_ALIGN.CENTER, 0, 1) + + log_out_btn.set_width(120) + invite_btn.set_width(120) + + panel1.set_grid_dsc_array(grid_1_col_dsc, grid_1_row_dsc) + avatar.set_grid_cell(lv.GRID_ALIGN.CENTER, 0, 1, lv.GRID_ALIGN.START, 0, 4) + name.set_grid_cell(lv.GRID_ALIGN.START, 2, 2, lv.GRID_ALIGN.CENTER, 0, 1) + dsc.set_grid_cell(lv.GRID_ALIGN.STRETCH, 2, 2, lv.GRID_ALIGN.START, 1, 1) + email_label.set_grid_cell(lv.GRID_ALIGN.START, 3, 1, lv.GRID_ALIGN.CENTER, 2, 1) + email_icn.set_grid_cell(lv.GRID_ALIGN.CENTER, 2, 1, lv.GRID_ALIGN.CENTER, 2, 1) + call_icn.set_grid_cell(lv.GRID_ALIGN.CENTER, 2, 1, lv.GRID_ALIGN.CENTER, 4, 1) + call_label.set_grid_cell(lv.GRID_ALIGN.START, 3, 1, lv.GRID_ALIGN.CENTER, 4, 1) + log_out_btn.set_grid_cell(lv.GRID_ALIGN.START, 1, 1, lv.GRID_ALIGN.CENTER, 5, 1) + invite_btn.set_grid_cell(lv.GRID_ALIGN.END, 3, 1, lv.GRID_ALIGN.CENTER, 5, 1) + + panel2.set_grid_cell(lv.GRID_ALIGN.STRETCH, 0, 1, lv.GRID_ALIGN.START, 1, 1) + panel2.set_grid_dsc_array(grid_2_col_dsc, grid_2_row_dsc) + panel2_title.set_grid_cell(lv.GRID_ALIGN.START, 0, 2, lv.GRID_ALIGN.CENTER, 0, 1) + user_name_label.set_grid_cell(lv.GRID_ALIGN.START, 0, 2, lv.GRID_ALIGN.START, 2, 1) + user_name.set_grid_cell(lv.GRID_ALIGN.STRETCH, 0, 2, lv.GRID_ALIGN.START, 3, 1) + password_label.set_grid_cell(lv.GRID_ALIGN.START, 0, 2, lv.GRID_ALIGN.START, 4, 1) + password.set_grid_cell(lv.GRID_ALIGN.STRETCH, 0, 2, lv.GRID_ALIGN.START, 5, 1) + birthday_label.set_grid_cell(lv.GRID_ALIGN.START, 0, 2, lv.GRID_ALIGN.START, 6, 1) + birthdate.set_grid_cell(lv.GRID_ALIGN.STRETCH, 0, 2, lv.GRID_ALIGN.START, 7, 1) + gender_label.set_grid_cell(lv.GRID_ALIGN.START, 0, 2, lv.GRID_ALIGN.START, 8, 1) + gender.set_grid_cell(lv.GRID_ALIGN.STRETCH, 0, 2, lv.GRID_ALIGN.START, 9, 1) + + panel3.set_grid_cell(lv.GRID_ALIGN.STRETCH, 1, 1, lv.GRID_ALIGN.STRETCH, 1, 1) + panel3.set_grid_dsc_array(grid_2_col_dsc, grid_2_row_dsc) + panel3_title.set_grid_cell(lv.GRID_ALIGN.START, 0, 2, lv.GRID_ALIGN.CENTER, 0, 1) + slider1.set_grid_cell(lv.GRID_ALIGN.CENTER, 0, 2, lv.GRID_ALIGN.CENTER, 3, 1) + experience_label.set_grid_cell(lv.GRID_ALIGN.START, 0, 1, lv.GRID_ALIGN.START, 2, 1) + hard_working_label.set_grid_cell(lv.GRID_ALIGN.START, 0, 1, lv.GRID_ALIGN.START, 4, 1) + sw2.set_grid_cell(lv.GRID_ALIGN.START, 0, 1, lv.GRID_ALIGN.START, 5, 1) + team_player_label.set_grid_cell(lv.GRID_ALIGN.START, 0, 1, lv.GRID_ALIGN.START, 6, 1) + sw1.set_grid_cell(lv.GRID_ALIGN.START, 0, 1, lv.GRID_ALIGN.START, 7, 1) + + else : + grid_main_col_dsc = [LV_GRID_FR(1), lv.GRID_TEMPLATE_LAST] + grid_main_row_dsc = [lv.GRID_CONTENT, lv.GRID_CONTENT, lv.GRID_CONTENT, lv.GRID_TEMPLATE_LAST] + parent.set_grid_dsc_array(grid_main_col_dsc, grid_main_row_dsc) + + # Create the top panel + grid_1_col_dsc = [lv.GRID_CONTENT, LV_GRID_FR(1), lv.GRID_TEMPLATE_LAST] + grid_1_row_dsc = [lv.GRID_CONTENT, # Avatar + lv.GRID_CONTENT, # Name + lv.GRID_CONTENT, # Description + lv.GRID_CONTENT, # Email + lv.GRID_CONTENT, # Phone number + lv.GRID_CONTENT, # Button1 + lv.GRID_CONTENT, # Button2 + lv.GRID_TEMPLATE_LAST] + + panel1.set_grid_dsc_array(grid_1_col_dsc, grid_1_row_dsc) + + + grid_2_col_dsc = [LV_GRID_FR(1), LV_GRID_FR(1), lv.GRID_TEMPLATE_LAST] + grid_2_row_dsc = [ + lv.GRID_CONTENT, # Title + 5, # Separator + lv.GRID_CONTENT, # Box title + 40, # Box + lv.GRID_CONTENT, # Box title + 40, # Box + lv.GRID_CONTENT, # Box title + 40, # Box + lv.GRID_CONTENT, # Box title + 40, lv.GRID_TEMPLATE_LAST ] # Box + + + panel2.set_grid_dsc_array(grid_2_col_dsc, grid_2_row_dsc) + panel3.set_grid_dsc_array(grid_2_col_dsc, grid_2_row_dsc) + + panel1.set_grid_cell(lv.GRID_ALIGN.STRETCH, 0, 1, lv.GRID_ALIGN.CENTER, 0, 1) + + dsc.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) + + avatar.set_grid_cell(lv.GRID_ALIGN.CENTER, 0, 2, lv.GRID_ALIGN.CENTER, 0, 1) + name.set_grid_cell(lv.GRID_ALIGN.CENTER, 0, 2, lv.GRID_ALIGN.CENTER, 1, 1) + dsc.set_grid_cell(lv.GRID_ALIGN.STRETCH, 0, 2, lv.GRID_ALIGN.START, 2, 1) + email_icn.set_grid_cell(lv.GRID_ALIGN.CENTER, 0, 1, lv.GRID_ALIGN.CENTER, 3, 1) + email_label.set_grid_cell(lv.GRID_ALIGN.START, 1, 1, lv.GRID_ALIGN.CENTER, 3, 1) + call_icn.set_grid_cell(lv.GRID_ALIGN.CENTER, 0, 1, lv.GRID_ALIGN.CENTER, 4, 1) + call_label.set_grid_cell(lv.GRID_ALIGN.START, 1, 1, lv.GRID_ALIGN.CENTER, 4, 1) + log_out_btn.set_grid_cell(lv.GRID_ALIGN.STRETCH, 0, 2, lv.GRID_ALIGN.CENTER, 5, 1) + invite_btn.set_grid_cell(lv.GRID_ALIGN.STRETCH, 0, 2, lv.GRID_ALIGN.CENTER, 6, 1) + + panel2.set_grid_cell(lv.GRID_ALIGN.STRETCH, 0, 1, lv.GRID_ALIGN.START, 1, 1) + panel2_title.set_grid_cell(lv.GRID_ALIGN.START, 0, 2, lv.GRID_ALIGN.CENTER, 0, 1) + user_name_label.set_grid_cell(lv.GRID_ALIGN.START, 0, 2, lv.GRID_ALIGN.START, 2, 1) + user_name.set_grid_cell(lv.GRID_ALIGN.STRETCH, 0, 2, lv.GRID_ALIGN.START, 3, 1) + password_label.set_grid_cell(lv.GRID_ALIGN.START, 0, 2, lv.GRID_ALIGN.START, 4, 1) + password.set_grid_cell(lv.GRID_ALIGN.STRETCH, 0, 2, lv.GRID_ALIGN.START, 5, 1) + birthday_label.set_grid_cell(lv.GRID_ALIGN.START, 0, 2, lv.GRID_ALIGN.START, 6, 1) + birthdate.set_grid_cell(lv.GRID_ALIGN.STRETCH, 0, 2, lv.GRID_ALIGN.START, 7, 1) + gender_label.set_grid_cell(lv.GRID_ALIGN.START, 0, 2, lv.GRID_ALIGN.START, 8, 1) + gender.set_grid_cell(lv.GRID_ALIGN.STRETCH, 0, 2, lv.GRID_ALIGN.START, 9, 1) + + panel3.set_height(lv.SIZE_CONTENT) + panel3.set_grid_cell(lv.GRID_ALIGN.STRETCH, 0, 1, lv.GRID_ALIGN.START, 2, 1) + panel3_title.set_grid_cell(lv.GRID_ALIGN.START, 0, 2, lv.GRID_ALIGN.CENTER, 0, 1) + experience_label.set_grid_cell(lv.GRID_ALIGN.START, 0, 1, lv.GRID_ALIGN.START, 2, 1) + slider1.set_grid_cell(lv.GRID_ALIGN.CENTER, 0, 2, lv.GRID_ALIGN.CENTER, 3, 1) + hard_working_label.set_grid_cell(lv.GRID_ALIGN.START, 0, 1, lv.GRID_ALIGN.START, 4, 1) + sw1.set_grid_cell(lv.GRID_ALIGN.START, 0, 1, lv.GRID_ALIGN.START, 5, 1) + team_player_label.set_grid_cell(lv.GRID_ALIGN.START, 1, 1, lv.GRID_ALIGN.START, 4, 1) + sw2.set_grid_cell(lv.GRID_ALIGN.START, 1, 1, lv.GRID_ALIGN.START, 5, 1) + +def analytics_create(parent): + parent.set_flex_flow(lv.FLEX_FLOW.ROW_WRAP) + + grid_chart_row_dsc = [lv.GRID_CONTENT, LV_GRID_FR(1), 10, lv.GRID_TEMPLATE_LAST] + grid_chart_col_dsc = [20, LV_GRID_FR(1), lv.GRID_TEMPLATE_LAST] + + chart1_cont = lv.obj(parent) + chart1_cont.set_flex_grow(1) + chart1_cont.set_grid_dsc_array(grid_chart_col_dsc, grid_chart_row_dsc) + + chart1_cont.set_height(lv.pct(100)) + chart1_cont.set_style_max_height(300, 0) + + title = lv.label(chart1_cont) + title.set_text("Unique visitors") + title.add_style(style_title, 0) + title.set_grid_cell(lv.GRID_ALIGN.START, 0, 2, lv.GRID_ALIGN.START, 0, 1) + + chart1 = lv.chart(chart1_cont) + lv.group_get_default().add_obj(chart1) + chart1.add_flag(lv.obj.FLAG.SCROLL_ON_FOCUS) + chart1.set_grid_cell(lv.GRID_ALIGN.STRETCH, 1, 1, lv.GRID_ALIGN.STRETCH, 1, 1) + chart1.set_axis_tick(lv.chart.AXIS.PRIMARY_Y, 0, 0, 5, 1, True, 80) + chart1.set_axis_tick(lv.chart.AXIS.PRIMARY_X, 0, 0, 12, 1, True, 50) + chart1.set_div_line_count(0, 12) + chart1.set_point_count(12) + chart1.add_event_cb(chart_event_cb, lv.EVENT.ALL, None) + if disp_size == DISP_SMALL: + chart1.set_zoom_x(256 * 3) + elif disp_size == DISP_MEDIUM: + chart1.set_zoom_x(256 * 2) + + chart1.set_style_border_side(lv.BORDER_SIDE.LEFT | lv.BORDER_SIDE.BOTTOM, 0) + chart1.set_style_radius(0, 0) + + ser1 = chart1.add_series(lv.theme_get_color_primary(chart1), lv.chart.AXIS.PRIMARY_Y) + chart1.set_next_value(ser1, lv.rand(10, 80)) + chart1.set_next_value(ser1, lv.rand(10, 80)) + chart1.set_next_value(ser1, lv.rand(10, 80)) + chart1.set_next_value(ser1, lv.rand(10, 80)) + chart1.set_next_value(ser1, lv.rand(10, 80)) + chart1.set_next_value(ser1, lv.rand(10, 80)) + chart1.set_next_value(ser1, lv.rand(10, 80)) + chart1.set_next_value(ser1, lv.rand(10, 80)) + chart1.set_next_value(ser1, lv.rand(10, 80)) + chart1.set_next_value(ser1, lv.rand(10, 80)) + chart1.set_next_value(ser1, lv.rand(10, 80)) + chart1.set_next_value(ser1, lv.rand(10, 80)) + chart1.set_next_value(ser1, lv.rand(10, 80)) + + chart2_cont = lv.obj(parent) + chart2_cont.add_flag(LV_OBJ_FLAG_FLEX_IN_NEW_TRACK) + chart2_cont.set_flex_grow(1) + + chart2_cont.set_height(lv.pct(100)) + chart2_cont.set_style_max_height(300, 0) + + chart2_cont.set_grid_dsc_array(grid_chart_col_dsc, grid_chart_row_dsc) + + title = lv.label(chart2_cont) + title.set_text("Monthly revenue") + title.add_style(style_title, 0) + title.set_grid_cell(lv.GRID_ALIGN.START, 0, 2, lv.GRID_ALIGN.START, 0, 1) + + chart2 = lv.chart(chart2_cont) + lv.group_get_default().add_obj(chart2) + chart2.add_flag(lv.obj.FLAG.SCROLL_ON_FOCUS) + + chart2.set_grid_cell(lv.GRID_ALIGN.STRETCH, 1, 1, lv.GRID_ALIGN.STRETCH, 1, 1) + chart2.set_axis_tick(lv.chart.AXIS.PRIMARY_Y, 0, 0, 5, 1, True, 80) + chart2.set_axis_tick(lv.chart.AXIS.PRIMARY_X, 0, 0, 12, 1, True, 50) + chart2.set_size(lv.pct(100), lv.pct(100)) + chart2.set_type(lv.chart.TYPE.BAR) + chart2.set_div_line_count(6, 0) + chart2.set_point_count(12) + chart2.add_event_cb(chart_event_cb, lv.EVENT.ALL, None) + chart2.set_zoom_x(256 * 2) + chart2.set_style_border_side(lv.BORDER_SIDE.LEFT | lv.BORDER_SIDE.BOTTOM, 0) + chart2.set_style_radius(0, 0) + + if disp_size == DISP_SMALL: + chart2.set_style_pad_gap(0, lv.PART.ITEMS) + chart2.set_style_pad_gap(2, lv.PART.MAIN) + + elif disp_size == DISP_LARGE: + chart2.set_style_pad_gap(16, 0) + + ser2 = chart2.add_series(lv.palette_lighten(lv.PALETTE.GREY, 1), lv.chart.AXIS.PRIMARY_Y) + chart2.set_next_value(ser2, lv.rand(10, 80)) + chart2.set_next_value(ser2, lv.rand(10, 80)) + chart2.set_next_value(ser2, lv.rand(10, 80)) + chart2.set_next_value(ser2, lv.rand(10, 80)) + chart2.set_next_value(ser2, lv.rand(10, 80)) + chart2.set_next_value(ser2, lv.rand(10, 80)) + chart2.set_next_value(ser2, lv.rand(10, 80)) + chart2.set_next_value(ser2, lv.rand(10, 80)) + chart2.set_next_value(ser2, lv.rand(10, 80)) + chart2.set_next_value(ser2, lv.rand(10, 80)) + chart2.set_next_value(ser2, lv.rand(10, 80)) + chart2.set_next_value(ser2, lv.rand(10, 80)) + chart2.set_next_value(ser2, lv.rand(10, 80)) + + ser3 = chart2.add_series(lv.theme_get_color_primary(chart1), lv.chart.AXIS.PRIMARY_Y) + chart2.set_next_value(ser3, lv.rand(10, 80)) + chart2.set_next_value(ser3, lv.rand(10, 80)) + chart2.set_next_value(ser3, lv.rand(10, 80)) + chart2.set_next_value(ser3, lv.rand(10, 80)) + chart2.set_next_value(ser3, lv.rand(10, 80)) + chart2.set_next_value(ser3, lv.rand(10, 80)) + chart2.set_next_value(ser3, lv.rand(10, 80)) + chart2.set_next_value(ser3, lv.rand(10, 80)) + chart2.set_next_value(ser3, lv.rand(10, 80)) + chart2.set_next_value(ser3, lv.rand(10, 80)) + chart2.set_next_value(ser3, lv.rand(10, 80)) + chart2.set_next_value(ser3, lv.rand(10, 80)) + chart2.set_next_value(ser3, lv.rand(10, 80)) + + meter1 = create_meter_box(parent, "Monthly Target", "Revenue: 63%", "Sales: 44%", "Costs: 58%") + lv.obj.get_parent(lv.obj.__cast__(meter1)).add_flag(LV_OBJ_FLAG_FLEX_IN_NEW_TRACK) + scale = meter1.add_scale() + meter1.set_scale_range(scale, 0, 100, 270, 90) + meter1.set_scale_ticks(scale, 0, 0, 0, lv.color_black()) + indic1 = meter1.add_arc(scale, 15, lv.palette_main(lv.PALETTE.BLUE), 0) + indic2 = meter1.add_arc(scale, 15, lv.palette_main(lv.PALETTE.RED), -20) + indic3 = meter1.add_arc(scale, 15, lv.palette_main(lv.PALETTE.GREEN), -40) + + a1 = lv.anim_t() + a1.init() + a1.set_values(20, 100) + a1.set_repeat_count(lv.ANIM_REPEAT_INFINITE) + a1.set_time(4100) + a1.set_var(indic1) + a1.set_playback_time(2700) + a1.set_custom_exec_cb(lambda a1,val: meter1_indic1_anim_cb(meter1,indic1,val)) + lv.anim_t.start(a1) + + a2 = lv.anim_t() + a2.init() + a2.set_values(20, 100) + a2.set_repeat_count(lv.ANIM_REPEAT_INFINITE) + a2.set_var(indic2) + a2.set_time(2600) + a2.set_playback_time(3200) + a2.set_custom_exec_cb(lambda a2,val: meter1_indic2_anim_cb(meter1,indic2,val)) + lv.anim_t.start(a2) + + a3 = lv.anim_t() + a3.init() + a3.set_values(20, 100) + a3.set_repeat_count(lv.ANIM_REPEAT_INFINITE) + a3.set_var(indic3) + a3.set_time(2800) + a3.set_playback_time(1800) + a3.set_custom_exec_cb(lambda a3,val: meter1_indic3_anim_cb(meter1,indic3,val)) + lv.anim_t.start(a3) + + meter2 = create_meter_box(parent, "Sessions", "Desktop: ", "Tablet: ", "Mobile: ") + if disp_size < DISP_LARGE: + lv.obj.get_parent(lv.obj.__cast__(meter2)).add_flag(LV_OBJ_FLAG_FLEX_IN_NEW_TRACK) + + scale = meter2.add_scale() + meter2.set_scale_range(scale, 0, 100, 360, 90) + meter2.set_scale_ticks(scale, 0, 0, 0, lv.color_black()) + + meter2_indic= [None]*3 + meter2_indic[0] = meter2.add_arc(scale, 20, lv.palette_main(lv.PALETTE.RED), -10) + meter2.set_indicator_start_value(meter2_indic[0], 0) + meter2.set_indicator_end_value(meter2_indic[0], 39) + + meter2_indic[1] = meter2.add_arc(scale, 30, lv.palette_main(lv.PALETTE.BLUE), 0) + meter2.set_indicator_start_value(meter2_indic[1], 40) + meter2.set_indicator_end_value(meter2_indic[1], 69) + + meter2_indic[2] = meter2.add_arc(scale, 10, lv.palette_main(lv.PALETTE.GREEN), -20) + meter2.set_indicator_start_value(meter2_indic[2], 70) + meter2.set_indicator_end_value(meter2_indic[2], 99) + + lv.timer_create(lambda t: meter2_timer_cb(t,meter2,meter2_indic), 100, None) + + meter3 = create_meter_box(parent, "Network Speed", "Low speed", "Normal Speed", "High Speed") + if disp_size < DISP_LARGE: + lv.obj.get_parent(lv.obj.__cast__(meter3)).add_flag(LV_OBJ_FLAG_FLEX_IN_NEW_TRACK) + + # Add a special circle to the needle's pivot + meter3.set_style_pad_hor(10, 0) + meter3.set_style_size(10, 10, lv.PART.INDICATOR) + meter3.set_style_radius(lv.RADIUS_CIRCLE, lv.PART.INDICATOR) + meter3.set_style_bg_opa(lv.OPA.COVER, lv.PART.INDICATOR) + meter3.set_style_bg_color(lv.palette_darken(lv.PALETTE.GREY, 4), lv.PART.INDICATOR) + meter3.set_style_outline_color(lv.color_white(), lv.PART.INDICATOR) + meter3.set_style_outline_width(3, lv.PART.INDICATOR) + meter3.set_style_text_color(lv.palette_darken(lv.PALETTE.GREY, 1), lv.PART.TICKS) + + scale = meter3.add_scale() + meter2.set_scale_range(scale, 10, 60, 220, 360 - 220) + meter3.set_scale_ticks(scale, 21, 3, 17, lv.color_white()) + meter3.set_scale_major_ticks(scale, 4, 4, 22, lv.color_white(), 15) + + indic4 = meter3.add_arc(scale, 10, lv.palette_main(lv.PALETTE.RED), 0) + meter3.set_indicator_start_value(indic4, 0) + meter3.set_indicator_end_value(indic4, 20) + + indic5 = meter3.add_scale_lines(scale, lv.palette_darken(lv.PALETTE.RED, 3), lv.palette_darken(lv.PALETTE.RED, 3), True, 0) + meter3.set_indicator_start_value(indic5, 0) + meter3.set_indicator_end_value(indic5, 20) + + indic6 = meter3.add_arc(scale, 12, lv.palette_main(lv.PALETTE.BLUE), 0) + meter3.set_indicator_start_value(indic6, 20) + meter3.set_indicator_end_value(indic6, 40) + + indic7 = meter3.add_scale_lines(scale, lv.palette_darken(lv.PALETTE.BLUE, 3), lv.palette_darken(lv.PALETTE.BLUE, 3), True, 0) + meter3.set_indicator_start_value(indic7, 20) + meter3.set_indicator_end_value(indic7, 40) + + indic8 = meter3.add_arc(scale, 10, lv.palette_main(lv.PALETTE.GREEN), 0) + meter3.set_indicator_start_value(indic8, 40) + meter3.set_indicator_end_value(indic8, 60) + + indic9 = meter3.add_scale_lines(scale, lv.palette_darken(lv.PALETTE.GREEN, 3), lv.palette_darken(lv.PALETTE.GREEN, 3), True, 0) + meter3.set_indicator_start_value(indic9, 40) + meter3.set_indicator_end_value(indic9, 60) + + indic10 = meter3.add_needle_line(scale, 4, lv.palette_darken(lv.PALETTE.GREY, 4), -25) + + mbps_label = lv.label(meter3) + mbps_label.set_text("-- Mbps") + mbps_label.add_style(style_title, 0) + + # mbps_unit_label = lv.label(meter3) + # mbps_unit_label.set_text("Mbps") + + a4= lv.anim_t() + a4.init() + a4.set_values(10, 60) + a4.set_repeat_count(lv.ANIM_REPEAT_INFINITE) + a4.set_var(indic10) + a4.set_time(4100) + a4.set_playback_time(800) + a4.set_custom_exec_cb(lambda a4,val: meter3_anim_cb(meter3,indic10,mbps_label,val)) + lv.anim_t.start(a4) + + parent.update_layout() + if disp_size == DISP_MEDIUM: + meter1.set_size(200, 200) + meter2.set_size(200, 200) + meter3.set_size(200, 200) + else : + meter_w = meter1.get_width() + meter1.set_height(meter_w) + meter2.set_height(meter_w) + meter3.set_height(meter_w) + + mbps_label.align(lv.ALIGN.TOP_MID, 10, lv.pct(55)) + # mbps_unit_label.align_to(mbps_label, lv.ALIGN.OUT_RIGHT_BOTTOM, 10, 0) + +def create_meter_box(parent, title, text1, text2, text3): + + cont = lv.obj(parent) + cont.set_height(lv.SIZE_CONTENT) + cont.set_flex_grow(1) + + title_label = lv.label(cont) + title_label.set_text(title) + title_label.add_style(style_title, 0) + + meter = lv.meter(cont) + meter.remove_style(None, lv.PART.MAIN) + meter.remove_style(None, lv.PART.INDICATOR) + meter.set_width(lv.pct(100)) + + bullet1 = lv.obj(cont) + bullet1.set_size(13, 13) + bullet1.remove_style(None, lv.PART.SCROLLBAR) + bullet1.add_style(style_bullet, 0) + bullet1.set_style_bg_color(lv.palette_main(lv.PALETTE.RED), 0) + label1 = lv.label(cont) + label1.set_text(text1) + + bullet2 = lv.obj(cont) + bullet2.set_size(13, 13) + bullet2.remove_style(None, lv.PART.SCROLLBAR) + bullet2.add_style(style_bullet, 0) + bullet2.set_style_bg_color(lv.palette_main(lv.PALETTE.BLUE), 0) + label2 = lv.label(cont) + label2.set_text(text2) + + bullet3 = lv.obj(cont) + bullet3.set_size(13, 13) + bullet3.remove_style(None, lv.PART.SCROLLBAR) + bullet3.add_style(style_bullet, 0) + bullet3.set_style_bg_color(lv.palette_main(lv.PALETTE.GREEN), 0) + label3 = lv.label(cont) + label3.set_text(text3) + + if disp_size == DISP_MEDIUM: + grid_col_dsc = [lv.GRID_CONTENT, LV_GRID_FR(1), lv.GRID_CONTENT,LV_GRID_FR(8), lv.GRID_TEMPLATE_LAST] + grid_row_dsc = [lv.GRID_CONTENT, LV_GRID_FR(1), lv.GRID_CONTENT, lv.GRID_CONTENT, lv.GRID_CONTENT, LV_GRID_FR(1), lv.GRID_TEMPLATE_LAST] + + cont.set_grid_dsc_array(grid_col_dsc, grid_row_dsc) + title_label.set_grid_cell(lv.GRID_ALIGN.START, 0, 4, lv.GRID_ALIGN.START, 0, 1) + meter.set_grid_cell(lv.GRID_ALIGN.START, 0, 1, lv.GRID_ALIGN.START, 1, 3) + bullet1.set_grid_cell(lv.GRID_ALIGN.START, 2, 1, lv.GRID_ALIGN.CENTER, 2, 1) + bullet2.set_grid_cell(lv.GRID_ALIGN.START, 2, 1, lv.GRID_ALIGN.CENTER, 3, 1) + bullet3.set_grid_cell(lv.GRID_ALIGN.START, 2, 1, lv.GRID_ALIGN.CENTER, 4, 1) + label1.set_grid_cell(lv.GRID_ALIGN.STRETCH, 3, 1, lv.GRID_ALIGN.CENTER, 2, 1) + label2.set_grid_cell(lv.GRID_ALIGN.STRETCH, 3, 1, lv.GRID_ALIGN.CENTER, 3, 1) + label3.set_grid_cell(lv.GRID_ALIGN.STRETCH, 3, 1, lv.GRID_ALIGN.CENTER, 4, 1) + + else: + grid_col_dsc = [lv.GRID_CONTENT, LV_GRID_FR(1), lv.GRID_TEMPLATE_LAST] + grid_row_dsc = [lv.GRID_CONTENT, lv.GRID_CONTENT, lv.GRID_CONTENT, lv.GRID_CONTENT, lv.GRID_CONTENT, lv.GRID_TEMPLATE_LAST] + cont.set_grid_dsc_array(grid_col_dsc, grid_row_dsc) + title_label.set_grid_cell(lv.GRID_ALIGN.START, 0, 2, lv.GRID_ALIGN.START, 0, 1) + meter.set_grid_cell(lv.GRID_ALIGN.START, 0, 2, lv.GRID_ALIGN.START, 1, 1) + bullet1.set_grid_cell(lv.GRID_ALIGN.START, 0, 1, lv.GRID_ALIGN.START, 2, 1) + bullet2.set_grid_cell(lv.GRID_ALIGN.START, 0, 1, lv.GRID_ALIGN.START, 3, 1) + bullet3.set_grid_cell(lv.GRID_ALIGN.START, 0, 1, lv.GRID_ALIGN.START, 4, 1) + label1.set_grid_cell(lv.GRID_ALIGN.STRETCH, 1, 1, lv.GRID_ALIGN.START, 2, 1) + label2.set_grid_cell(lv.GRID_ALIGN.STRETCH, 1, 1, lv.GRID_ALIGN.START, 3, 1) + label3.set_grid_cell(lv.GRID_ALIGN.STRETCH, 1, 1, lv.GRID_ALIGN.START, 4, 1) + + return meter + +def shop_create(parent): + parent.set_flex_flow(lv.FLEX_FLOW.ROW_WRAP) + + panel1 = lv.obj(parent) + panel1.set_size(lv.pct(100), lv.SIZE_CONTENT) + panel1.set_style_pad_bottom(30, 0) + + title = lv.label(panel1) + title.set_text("Monthly Summary") + title.add_style(style_title, 0) + + date = lv.label(panel1) + date.set_text("8-15 July, 2021") + date.add_style(style_text_muted, 0) + + amount = lv.label(panel1) + amount.set_text("$27,123.25") + amount.add_style(style_title, 0) + + hint = lv.label(panel1) + hint.set_text(lv.SYMBOL.UP + " 17% growth this week") + hint.set_style_text_color(lv.palette_main(lv.PALETTE.GREEN), 0) + + chart3 = lv.chart(panel1) + chart3.set_axis_tick(lv.chart.AXIS.PRIMARY_Y, 0, 0, 6, 1, True, 80) + chart3.set_axis_tick(lv.chart.AXIS.PRIMARY_X, 0, 0, 7, 1, True, 50) + chart3.set_type(lv.chart.TYPE.BAR) + chart3.set_div_line_count(6, 0) + chart3.set_point_count(7) + chart3.add_event_cb(shop_chart_event_cb, lv.EVENT.ALL, None) + + ser4 = chart3.add_series(lv.theme_get_color_primary(chart3), lv.chart.AXIS.PRIMARY_Y) + chart3.set_next_value(ser4, lv.rand(60, 90)) + chart3.set_next_value(ser4, lv.rand(60, 90)) + chart3.set_next_value(ser4, lv.rand(60, 90)) + chart3.set_next_value(ser4, lv.rand(60, 90)) + chart3.set_next_value(ser4, lv.rand(60, 90)) + chart3.set_next_value(ser4, lv.rand(60, 90)) + chart3.set_next_value(ser4, lv.rand(60, 90)) + chart3.set_next_value(ser4, lv.rand(60, 90)) + chart3.set_next_value(ser4, lv.rand(60, 90)) + chart3.set_next_value(ser4, lv.rand(60, 90)) + chart3.set_next_value(ser4, lv.rand(60, 90)) + chart3.set_next_value(ser4, lv.rand(60, 90)) + + if disp_size == DISP_LARGE: + grid1_col_dsc = [LV_GRID_FR(1), LV_GRID_FR(1), lv.GRID_TEMPLATE_LAST] + grid1_row_dsc = [ + lv.GRID_CONTENT, # Title + lv.GRID_CONTENT, # Sub title + 20, # Spacer + lv.GRID_CONTENT, # Amount + lv.GRID_CONTENT, # Hint + lv.GRID_TEMPLATE_LAST] + + chart3.set_size(lv.pct(100), lv.pct(100)) + chart3.set_style_pad_column(lv.dpx(30), 0) + + panel1.set_grid_dsc_array(grid1_col_dsc, grid1_row_dsc) + title.set_grid_cell(lv.GRID_ALIGN.START, 0, 1, lv.GRID_ALIGN.START, 0, 1) + date.set_grid_cell(lv.GRID_ALIGN.START, 0, 1, lv.GRID_ALIGN.START, 1, 1) + amount.set_grid_cell(lv.GRID_ALIGN.START, 0, 1, lv.GRID_ALIGN.START, 3, 1) + hint.set_grid_cell(lv.GRID_ALIGN.START, 0, 1, lv.GRID_ALIGN.START, 4, 1) + chart3.set_grid_cell(lv.GRID_ALIGN.STRETCH, 1, 1, lv.GRID_ALIGN.STRETCH, 0, 5) + + elif disp_size == DISP_MEDIUM : + grid1_col_dsc = [LV_GRID_FR(1), LV_GRID_FR(1), lv.GRID_TEMPLATE_LAST] + grid1_row_dsc = [ + lv.GRID_CONTENT, # Title + Date + lv.GRID_CONTENT, # Amount + Hint + 200, # Chart + lv.GRID_TEMPLATE_LAST ] + + panel1.update_layout() + chart3.set_width(lv.obj.get_content_width(panel1) - 20) + chart3.set_style_pad_column(lv.dpx(30), 0) + + panel1.set_grid_dsc_array(grid1_col_dsc, grid1_row_dsc) + title.set_grid_cell(lv.GRID_ALIGN.START, 0, 1, lv.GRID_ALIGN.CENTER, 0, 1) + date.set_grid_cell(lv.GRID_ALIGN.START, 1, 1, lv.GRID_ALIGN.CENTER, 0, 1) + amount.set_grid_cell(lv.GRID_ALIGN.START, 0, 1, lv.GRID_ALIGN.CENTER, 1, 1) + hint.set_grid_cell(lv.GRID_ALIGN.START, 1, 1, lv.GRID_ALIGN.CENTER, 1, 1) + chart3.set_grid_cell(lv.GRID_ALIGN.END, 0, 2, lv.GRID_ALIGN.STRETCH, 2, 1) + else: + grid1_col_dsc = [LV_GRID_FR(1), lv.GRID_TEMPLATE_LAST] + grid1_row_dsc = [ + lv.GRID_CONTENT, # Title + lv.GRID_CONTENT, # Date + lv.GRID_CONTENT, # Amount + lv.GRID_CONTENT, # Hint + lv.GRID_CONTENT, # Chart + lv.GRID_TEMPLATE_LAST] + + chart3.set_width(lv.pct(95)) + chart3.set_height(LV_VER_RES - 70) + chart3.set_style_max_height(300, 0) + chart3.set_zoom_x(512) + + panel1.set_grid_dsc_array(grid1_col_dsc, grid1_row_dsc) + title.set_grid_cell(lv.GRID_ALIGN.START, 0, 1, lv.GRID_ALIGN.START, 0, 1) + date.set_grid_cell(lv.GRID_ALIGN.START, 0, 1, lv.GRID_ALIGN.START, 1, 1) + amount.set_grid_cell(lv.GRID_ALIGN.START, 0, 1, lv.GRID_ALIGN.START, 2, 1) + hint.set_grid_cell(lv.GRID_ALIGN.START, 0, 1, lv.GRID_ALIGN.START, 3, 1) + chart3.set_grid_cell(lv.GRID_ALIGN.END, 0, 1, lv.GRID_ALIGN.START, 4, 1) + + list = lv.obj(parent) + if disp_size == DISP_SMALL: + list.add_flag(LV_OBJ_FLAG_FLEX_IN_NEW_TRACK) + list.set_height(lv.pct(100)) + else: + list.set_height(lv.pct(100)) + list.set_style_max_height(300, 0) + + list.set_flex_flow(lv.FLEX_FLOW.COLUMN) + list.set_flex_grow(1) + list.add_flag(LV_OBJ_FLAG_FLEX_IN_NEW_TRACK) + + title = lv.label(list) + title.set_text("Top products") + title.add_style(style_title, 0) + + # Create an image from the png file + try: + if osVersion == "esp32": + with open('images/clothes.png','rb') as f: + png_data = f.read() + else: + with open(script_path + '/assets/clothes.png','rb') as f: + png_data = f.read() + except: + print("Could not find clothes.png") + sys.exit() + + clothes_argb = lv.img_dsc_t({ + 'data_size': len(png_data), + 'data': png_data + }) + + create_shop_item(list, clothes_argb, "Blue jeans", "Clothes", "$722") + create_shop_item(list, clothes_argb, "Blue jeans", "Clothes", "$917") + create_shop_item(list, clothes_argb, "Blue jeans", "Clothes", "$64") + create_shop_item(list, clothes_argb, "Blue jeans", "Clothes", "$805") + + notifications = lv.obj(parent) + if disp_size == DISP_SMALL: + notifications.set_height(lv.pct(100)) + notifications.add_flag(LV_OBJ_FLAG_FLEX_IN_NEW_TRACK) + else: + notifications.set_height(lv.pct(100)) + notifications.set_style_max_height(300, 0) + + notifications.set_flex_flow(lv.FLEX_FLOW.COLUMN) + notifications.set_flex_grow(1) + + title = lv.label(notifications) + title.set_text("Notification") + title.add_style(style_title, 0) + + cb = lv.checkbox(notifications) + cb.set_text("Item purchased") + + cb = lv.checkbox(notifications) + cb.set_text("New connection") + + cb = lv.checkbox(notifications) + cb.set_text("New subscriber") + cb.add_state(lv.STATE.CHECKED) + + cb = lv.checkbox(notifications) + cb.set_text("New message") + cb.add_state(lv.STATE.DISABLED) + + cb = lv.checkbox(notifications) + cb.set_text("Milestone reached") + cb.add_state(lv.STATE.CHECKED | lv.STATE.DISABLED) + + cb = lv.checkbox(notifications) + cb.set_text("Out of stock") + +def create_shop_item(parent, img_src, name, category, price): + grid_col_dsc = [lv.GRID_CONTENT, 5, LV_GRID_FR(1), LV_GRID_FR(1), lv.GRID_TEMPLATE_LAST] + grid_row_dsc = [LV_GRID_FR(1), LV_GRID_FR(1), lv.GRID_TEMPLATE_LAST] + + cont = lv.obj(parent) + cont.remove_style_all() + cont.set_size(lv.pct(100), lv.SIZE_CONTENT) + cont.set_grid_dsc_array(grid_col_dsc, grid_row_dsc) + + img = lv.img(cont) + img.set_src(img_src) + img.set_grid_cell(lv.GRID_ALIGN.START, 0, 1, lv.GRID_ALIGN.START, 0, 2) + + label = lv.label(cont) + label.set_text(name) + label.set_grid_cell(lv.GRID_ALIGN.START, 2, 1, lv.GRID_ALIGN.END, 0, 1) + + label = lv.label(cont) + label.set_text(category) + label.add_style(style_text_muted, 0) + label.set_grid_cell(lv.GRID_ALIGN.START, 2, 1, lv.GRID_ALIGN.START, 1, 1) + + label = lv.label(cont) + label.set_text(price) + label.set_grid_cell(lv.GRID_ALIGN.END, 3, 1, lv.GRID_ALIGN.END, 0, 1) + + return cont + + + +# Check on which system we are running +try: + osVersion=os.uname()[0] +except: + osVersion="unix" + +print("System name: ",osVersion) + +# get the directory in which the script is running +try: + script_path = __file__[:__file__.rfind('/')] if __file__.find('/') >= 0 else '.' +except NameError: + script_path = '' + +# Initialize the display driver +driver = display_driver_utils.driver(width=SCREEN_SIZE[0],height=SCREEN_SIZE[1],orientation=display_driver_utils.ORIENT_LANDSCAPE) + # Create a screen and load it scr=lv.obj() lv.scr_load(scr) -def LV_DPX(n): - if n == 0: - return n - scr=lv.scr_act() - display = scr.get_disp() - dpi = display.get_dpi() - # print("dpi: ",dpi) - tmp = (dpi*n+80)//160 - # print("tmp: ",tmp) - if tmp > 1: - return tmp - else: - return 1 +# needed for dynamic font loading +fs_drv = lv.fs_drv_t() +fs_driver.fs_register(fs_drv, 'S') -def color_chg_event_cb(sw, e): - if e == lv.EVENT.VALUE_CHANGED: - flag = lv.THEME_MATERIAL_FLAG.LIGHT - if sw.get_state(): - flag=lv.THEME_MATERIAL_FLAG.DARK - theme = lv.theme_material_init(LV_THEME_DEFAULT_COLOR_PRIMARY,LV_THEME_DEFAULT_COLOR_SECONDARY,flag, - lv.theme_get_font_small(), lv.theme_get_font_normal(), lv.theme_get_font_subtitle(), - lv.theme_get_font_title()) -def slider_event_cb(slider, e): - if e == lv.EVENT.VALUE_CHANGED: - if slider.get_type() == lv.slider.TYPE.NORMAL: - slider_value = slider.get_value() - slider.set_style_local_value_str(lv.slider.PART.KNOB, lv.STATE.DEFAULT, str(slider_value)) +# get the display size +LV_HOR_RES = lv.scr_act().get_disp().driver.hor_res +LV_VER_RES = lv.scr_act().get_disp().driver.ver_res + +print("Screen resolution: {:d}x{:d}".format(LV_HOR_RES,LV_VER_RES)) + +DISP_SMALL = 0 +DISP_MEDIUM = 1 +DISP_LARGE = 2 + +if LV_HOR_RES <= 320: + disp_size = DISP_SMALL +elif LV_HOR_RES < 720: + disp_size = DISP_MEDIUM +else: + disp_size = DISP_LARGE + +if disp_size == DISP_LARGE: + tab_h = 70 + try: + font_large = lv.font_montserrat_24 + except: + print("Dynamically loading font_montserrat_24") + if osVersion == "esp32": + font_large = lv.font_load("S:font/montserrat-24.fnt") else: - slider_left=slider.get_left_value() - slider_right=slider.get_value() - slider_string = str(slider_left) + '-' + str(slider_right) - # print("slider left value: %d, slider right value: %d"%(slider_left,slider_right)) - slider.set_style_local_value_str(lv.slider.PART.INDIC, lv.STATE.DEFAULT, slider_string) + font_large = lv.font_load("S:" + script_path + "/assets/font/montserrat-24.fnt") + + try: + font_normal = lv.font_montserrat_16 + except: + print("Dynamically loading font_montserrat_16") + if osVersion == "esp32": + font_normal = lv.font_load("S:/font/montserrat-16.fnt") + else : + font_normal = lv.font_load("S:" + script_path + "/assets/font/montserrat-16.fnt") -def linemeter_anim(a,lmeter, value): - lmeter.set_value(value) - label = lmeter.get_child(None) - label.set_text(str(value)) - label.align(lmeter, lv.ALIGN.CENTER, 0, 0) +elif disp_size == DISP_MEDIUM: + tab_h = 45 + try: + font_large = lv.font_montserrat_20 + except: + print("Dynamically loading font_montserrat_20") + if osVersion == "esp32": + font_large = lv.font_load("S:/font/montserrat-20.fnt") + else: + font_large = lv.font_load("S:" + script_path + "/assets/font/montserrat-20.fnt") + + try: + font_normal = lv.font_montserrat_14 + except: + print("Dynamically loading font_montserrat_14") + if osVersion == "esp32": + font_normal = lv.font_load("S:/font/montserrat-14.fnt") + else: + font_normal = lv.font_load("S:" + script_path + "/assets/font/montserrat-14.fnt") -def gauge_anim(a,gauge,val): - gauge.set_value(0,val) - label=gauge.get_child(None) - label.set_text(str(val)) - label.align(gauge, lv.ALIGN.CENTER, 0, 0) +else: # disp_size == DISP_SMALL + tab_h = 45 + try: + font_large = lv.font_montserrat_18 + except: + print("Dynamically loading font_montserrat_18") + if osVersion == "esp32": + font_large = lv.font_load("S:/font/montserrat-18.fnt") + else: + font_large = lv.font_load("S:" + script_path + "/assets/font/montserrat-18.fnt") + + try: + font_normal = lv.font_montserrat_12 + except: + print("Dynamically loading font_montserrat_12") + if osVersion == "esp32": + font_normal = lv.font_load("S:/font/montserrat-12.fnt") + else: + font_normal = lv.font_load("S:" + script_path + "/assets/font/montserrat-12.fnt") -def bar_anim(task,bar): - val = bar.get_value() - # print("bar value: ",val) - max_value = bar.get_max_value() - val += 1 - if val > max_value: - val=0 - bar.set_value(val,lv.ANIM.OFF) - cpy_string = "Copying %d/%d"% (val, max_value) - # print(cpy_string) - bar.set_style_local_value_str(lv.bar.PART.BG, lv.STATE.DEFAULT, cpy_string) +if not font_large or not font_normal: + print("font loading failed") + +lv.theme_default_init(None,lv.palette_main(lv.PALETTE.BLUE),lv.palette_main(lv.PALETTE.RED), + LV_THEME_DEFAULT_DARK,font_normal) -def arc_phase1_ready_cb(a,arc): - a_arc=lv.anim_t() - a_arc.init() - a_arc.set_custom_exec_cb(lambda a_arc, val: anim_phase2(a_arc,arc,val)) - a_arc.set_values(360, 0) - a_arc.set_time(1000) - a_arc.set_ready_cb(lambda a: arc_phase2_ready_cb(a,arc)) - lv.anim_t.start(a_arc) +style_text_muted = lv.style_t() +style_text_muted.init() +style_text_muted.set_text_opa(lv.OPA._50) -def arc_phase2_ready_cb(a,arc): - a_arc=lv.anim_t() - a_arc.init() - a_arc.set_custom_exec_cb(lambda a_arc, val: anim_phase1(a_arc,arc,val)) - a_arc.set_time(1000) - a_arc.set_values(0, 360) - a_arc.set_ready_cb(lambda a: arc_phase1_ready_cb(a,arc)) - lv.anim_t.start(a_arc) +style_title = lv.style_t() +style_title.init() +style_title.set_text_font(font_large) -def anim_phase1(a,arc,val): - arc.set_end_angle(val) - label = arc.get_child(None) - label.set_text(str(val)) - label.align(arc, lv.ALIGN.CENTER, 0, 0) +style_icon = lv.style_t() +style_icon.init() +style_icon.set_text_color(lv.theme_get_color_primary(None)) +style_icon.set_text_font(font_large) -def anim_phase2(a,arc,val): - arc.set_end_angle(val) - label = arc.get_child(None) - label.set_text(str(val)) - label.align(arc, lv.ALIGN.CENTER, 0, 0) +style_bullet = lv.style_t() +style_bullet.init() +style_bullet.set_border_width(0) +style_bullet.set_radius(lv.RADIUS_CIRCLE) -def controls_create(parent): - lv.page.set_scrl_layout(lv.page.__cast__(parent), lv.LAYOUT.PRETTY_TOP) - if LV_DEMO_WIDGETS_SLIDESHOW == 0: - btns = ["Cancel", "Ok", ""] - m = lv.msgbox(lv.scr_act(), None) - m.add_btns(btns) - btnm = lv.btnmatrix.__cast__(m.get_btnmatrix()) - # print("type(btnm): ",type(btnm)) - btnm.set_btn_ctrl(1, lv.btnmatrix.CTRL.CHECK_STATE) +tv = lv.tabview(lv.scr_act(), lv.DIR.TOP, tab_h) - h = lv.cont(parent, None) - h.set_layout(lv.LAYOUT.PRETTY_MID) - h.add_style(lv.cont.PART.MAIN, style_box) - h.set_drag_parent(True) +lv.scr_act().set_style_text_font(font_normal, 0) - h.set_style_local_value_str(lv.cont.PART.MAIN, lv.STATE.DEFAULT, "Basics") +if disp_size == DISP_LARGE: + tab_btns = tv.get_tab_btns() + tab_btns.set_style_pad_left(LV_HOR_RES // 2, 0) - disp_size = display.get_size_category() - if disp_size <= lv.DISP_SIZE.SMALL: - grid_w= lv.page.get_width_grid(lv.page.__cast__(parent),1,1) - # print("grid_w: ",grid_w) - else: - grid_w= lv.page.get_width_grid(lv.page.__cast__(parent),2,1) - # print("grid_w: ",grid_w) + # Create an image from the png file + try: + if osVersion == "esp32": + with open('images/lvgl_logo.png','rb') as f: + png_data = f.read() + else: + with open(script_path + '/assets/lvgl_logo.png','rb') as f: + png_data = f.read() + except: + print("Could not find lvgl_logo.png") + sys.exit() + + lvgl_logo_argb = lv.img_dsc_t({ + 'data_size': len(png_data), + 'data': png_data + }) - h.set_fit2(lv.FIT.NONE, lv.FIT.TIGHT) - h.set_width(grid_w) - btn = lv.btn(h,None) - btn.set_fit2(lv.FIT.NONE, lv.FIT.TIGHT) - if disp_size <= lv.DISP_SIZE.SMALL: - button_width=h.get_width_grid(1,1) - else: - button_width=h.get_width_grid(2,1) - # print("button_width: %d"%button_width) + logo = lv.img(tab_btns) - btn.set_width(button_width) - label = lv.label(btn, None) - label.set_text("Button") + logo.set_src(lvgl_logo_argb) + logo.align(lv.ALIGN.LEFT_MID, -LV_HOR_RES // 2 + 25, 0) - btn = lv.btn(h, btn) - btn.toggle() - label = lv.label(btn, None) - label.set_text("Button") + label = lv.label(tab_btns) + label.add_style(style_title, 0) + label.set_text("LVGL v8") + label.align_to(logo, lv.ALIGN.OUT_RIGHT_TOP, 10, 0) - lv.switch(h, None) + label = lv.label(tab_btns) + label.set_text("Widgets demo") + label.add_style(style_text_muted, 0) + label.align_to(logo, lv.ALIGN.OUT_RIGHT_BOTTOM, 10, 0) + +def color_changer_create(parent): + palette = [ + lv.PALETTE.BLUE, lv.PALETTE.GREEN, lv.PALETTE.BLUE_GREY, lv.PALETTE.ORANGE, + lv.PALETTE.RED, lv.PALETTE.PURPLE, lv.PALETTE.TEAL] - lv.checkbox(h, None) + color_cont = lv.obj(parent) + color_cont.remove_style_all() + color_cont.set_flex_flow(lv.FLEX_FLOW.ROW) + color_cont.set_flex_align(lv.FLEX_ALIGN.SPACE_EVENLY, lv.FLEX_ALIGN.CENTER, lv.FLEX_ALIGN.CENTER) + color_cont.add_flag(lv.obj.FLAG.FLOATING) - fit_w = h.get_width_fit() - - slider = lv.slider(h, None) - slider.set_value(40, lv.ANIM.OFF) - slider.set_event_cb(slider_event_cb) - slider.set_width_margin(fit_w); - - # Use the knobs style value the display the current value in focused state - slider.set_style_local_margin_top(lv.slider.PART.BG, lv.STATE.DEFAULT, LV_DPX(25)) - slider.set_style_local_value_font(lv.slider.PART.KNOB, lv.STATE.DEFAULT, lv.theme_get_font_small()) - slider.set_style_local_value_ofs_y(lv.slider.PART.KNOB, lv.STATE.FOCUSED, - LV_DPX(25)) - slider.set_style_local_value_opa(lv.slider.PART.KNOB, lv.STATE.DEFAULT, lv.OPA.TRANSP) - slider.set_style_local_value_opa(lv.slider.PART.KNOB, lv.STATE.FOCUSED, lv.OPA.COVER) - slider.set_style_local_transition_time(lv.slider.PART.KNOB, lv.STATE.DEFAULT, 300) - slider.set_style_local_transition_prop_5(lv.slider.PART.KNOB, lv.STATE.DEFAULT, lv.STYLE.VALUE_OFS_Y) - slider.set_style_local_transition_prop_6(lv.slider.PART.KNOB, lv.STATE.DEFAULT, lv.STYLE.VALUE_OPA) - - slider = lv.slider(h, None) - slider.set_type(lv.slider.TYPE.RANGE) - slider.set_value(70, lv.ANIM.OFF) - slider.set_left_value(30, lv.ANIM.OFF) - slider.set_style_local_value_ofs_y(lv.slider.PART.INDIC, lv.STATE.DEFAULT, - LV_DPX(25)) - slider.set_style_local_value_font(lv.slider.PART.INDIC, lv.STATE.DEFAULT, lv.theme_get_font_small()) - slider.set_style_local_value_opa(lv.slider.PART.INDIC, lv.STATE.DEFAULT, lv.OPA.COVER) - slider.set_event_cb(slider_event_cb) - lv.event_send(slider,lv.EVENT.VALUE_CHANGED, None) # To refresh the text - if slider.get_width() > fit_w: - slider.set_width(fit_w) - - h = lv.cont(parent, h) - h.set_fit(lv.FIT.NONE) - h.set_style_local_value_str(lv.cont.PART.MAIN, lv.STATE.DEFAULT, "Text input") - - ta = lv.textarea(h, None) - lv.cont.set_fit2(h,lv.FIT.PARENT, lv.FIT.NONE) - ta.set_text("") - ta.set_placeholder_text("E-mail address") - ta.set_one_line(True) - ta.set_cursor_hidden(True) - #lv_obj_set_event_cb(ta, ta_event_cb); - - ta = lv.textarea(h, ta) - ta.set_pwd_mode(True) - ta.set_placeholder_text("Password") - - ta = lv.textarea(h, None) - lv.cont.set_fit2(h,lv.FIT.PARENT, lv.FIT.NONE) - ta.set_text("") - ta.set_placeholder_text("Message") - ta.set_cursor_hidden(True) - #lv_obj_set_event_cb(ta, ta_event_cb); - lv.cont.set_fit4(h, lv.FIT.PARENT, lv.FIT.PARENT, lv.FIT.NONE, lv.FIT.PARENT) - -# if LV_DEMO_WIDGETS_SLIDESHOW: -# tab_content_anim_create(parent) - -def visuals_create(parent): - page = lv.page.__cast__(parent) - lv.page.set_scrl_layout(page, lv.LAYOUT.PRETTY_TOP) - - disp_size = display.get_size_category() - - grid_h_chart = lv.page.get_height_grid(page,1,1) - if disp_size <= lv.DISP_SIZE.LARGE: - grid_w_chart=lv.page.get_width_grid(page,1,1) - else: - grid_w_chart=lv.page.get_width_grid(page,1,2) - - chart = lv.chart(parent, None) - chart.add_style(lv.chart.PART.BG, style_box) - if disp_size <= lv.DISP_SIZE.SMALL: - chart.set_style_local_text_font(lv.chart.PART.SERIES_BG, lv.STATE.DEFAULT, lv.theme_get_font_small()) - - chart.set_drag_parent(True) - chart.set_style_local_value_str(lv.cont.PART.MAIN, lv.STATE.DEFAULT, "Line chart") - chart.set_width_margin(grid_w_chart) - chart.set_height_margin(grid_h_chart) - chart.set_div_line_count(3, 0) - chart.set_point_count(8) - chart.set_type(lv.chart.TYPE.LINE) - - if disp_size > lv.DISP_SIZE.SMALL: - chart.set_style_local_pad_left(lv.chart.PART.BG, lv.STATE.DEFAULT, 4 * (LV_DPI // 10)) - chart.set_style_local_pad_bottom(lv.chart.PART.BG, lv.STATE.DEFAULT, 3 * (LV_DPI // 10)) - chart.set_style_local_pad_right(lv.chart.PART.BG, lv.STATE.DEFAULT, 2 * (LV_DPI // 10)) - chart.set_style_local_pad_top(lv.chart.PART.BG, lv.STATE.DEFAULT, 2 * (LV_DPI // 10)) - chart.set_y_tick_length(0, 0) - chart.set_x_tick_length(0, 0) - chart.set_y_tick_texts("600\n500\n400\n300\n200", 0, lv.chart.AXIS.DRAW_LAST_TICK) - chart.set_x_tick_texts("Jan\nFeb\nMar\nApr\nMay\nJun\nJul\nAug", 0, lv.chart.AXIS.DRAW_LAST_TICK) - - s1 = chart.add_series(LV_THEME_DEFAULT_COLOR_PRIMARY) - s2 = chart.add_series(LV_THEME_DEFAULT_COLOR_SECONDARY) - - chart.set_next(s1, 10) - chart.set_next(s1, 90) - chart.set_next(s1, 30) - chart.set_next(s1, 60) - chart.set_next(s1, 10) - chart.set_next(s1, 90) - chart.set_next(s1, 30) - chart.set_next(s1, 60) - chart.set_next(s1, 10) - chart.set_next(s1, 90) - - chart.set_next(s2, 32) - chart.set_next(s2, 66) - chart.set_next(s2, 5) - chart.set_next(s2, 47) - chart.set_next(s2, 32) - chart.set_next(s2, 32) - chart.set_next(s2, 66) - chart.set_next(s2, 5) - chart.set_next(s2, 47) - chart.set_next(s2, 66) - chart.set_next(s2, 5) - chart.set_next(s2, 47) - - chart2 = lv.chart(parent, chart) - chart2.set_type(lv.chart.TYPE.COLUMN) - chart2.set_style_local_value_str(lv.cont.PART.MAIN, lv.STATE.DEFAULT, "Column chart") - - s1 = chart2.add_series(LV_THEME_DEFAULT_COLOR_PRIMARY) - s2 = chart2.add_series(LV_THEME_DEFAULT_COLOR_SECONDARY) - - chart2.set_next(s1, 10) - chart2.set_next(s1, 90) - chart2.set_next(s1, 30) - chart2.set_next(s1, 60) - chart2.set_next(s1, 10) - chart2.set_next(s1, 90) - chart2.set_next(s1, 30) - chart2.set_next(s1, 60) - chart2.set_next(s1, 10) - chart2.set_next(s1, 90) - - chart2.set_next(s2, 32) - chart2.set_next(s2, 66) - chart2.set_next(s2, 5) - chart2.set_next(s2, 47) - chart2.set_next(s2, 32) - chart2.set_next(s2, 32) - chart2.set_next(s2, 66) - chart2.set_next(s2, 5) - chart2.set_next(s2, 47) - chart2.set_next(s2, 66) - chart2.set_next(s2, 5) - chart2.set_next(s2, 47) - - if disp_size <= lv.DISP_SIZE.SMALL: - grid_w_meter = lv.page.get_width_grid(page, 1, 1) - elif disp_size <= lv.DISP_SIZE.MEDIUM : - grid_w_meter = lv.page.get_width_grid(page, 2, 1) - else: - grid_w_meter = lv.page.get_width_grid(page, 3, 1) - - meter_h = lv.page.get_height_fit(page) - if grid_w_meter < meter_h: - meter_size = grid_w_meter - else: - meter_size = meter_h - - lmeter = lv.linemeter(parent, None) - lmeter.set_drag_parent(True) - lmeter.set_value(50) - lmeter.set_size(meter_size, meter_size) - lmeter.add_style(lv.linemeter.PART.MAIN, style_box) - lmeter.set_style_local_value_str(lv.linemeter.PART.MAIN, lv.STATE.DEFAULT, "Line meter") - - label = lv.label(lmeter, None) - label.align(lmeter, lv.ALIGN.CENTER, 0, 0) - label.set_style_local_text_font(lv.label.PART.MAIN, lv.STATE.DEFAULT, lv.theme_get_font_title()); - - a_lm=lv.anim_t() - a_lm.init() - a_lm.set_custom_exec_cb(lambda a, val: linemeter_anim(a,lmeter,val)) - a_lm.set_values(0, 100) - a_lm.set_time(4000) - a_lm.set_playback_time(1000) - a_lm.set_repeat_count(LV_ANIM_REPEAT_INFINITE) - lv.anim_t.start(a_lm) - - gauge = lv.gauge(parent, None) - gauge.set_drag_parent(True) - gauge.set_size(meter_size, meter_size) - gauge.add_style(lv.gauge.PART.MAIN, style_box) - gauge.set_style_local_value_str(lv.gauge.PART.MAIN, lv.STATE.DEFAULT, "Gauge") - - label = lv.label(gauge, label) - label.align(gauge, lv.ALIGN.CENTER, 0, grid_w_meter // 3) - - a_ga=lv.anim_t() - a_ga.init() - a_ga.set_custom_exec_cb(lambda a, val: linemeter_anim(a,lmeter,val)) - a_ga.set_values(0, 100) - a_ga.set_time(4000) - a_ga.set_playback_time(1000) - a_ga.set_repeat_count(LV_ANIM_REPEAT_INFINITE) - a_ga.set_custom_exec_cb(lambda a, val: gauge_anim(a,gauge,val)) - lv.anim_t.start(a_ga) - - arc = lv.arc(parent,None) - arc.set_drag_parent(True) - arc.set_bg_angles(0, 360) - arc.set_rotation(270) - arc.set_angles(0, 0) - arc.set_size(meter_size, meter_size) - arc.add_style(lv.arc.PART.BG, style_box) - arc.set_style_local_value_str(lv.arc.PART.BG, lv.STATE.DEFAULT, "Arc"); - - label = lv.label(arc) - label.align(arc, lv.ALIGN.CENTER, 0, 0) - - a_arc=lv.anim_t() - a_arc.init() - a_arc.set_custom_exec_cb(lambda a_arc, val: anim_phase1(a_arc,arc,val)) - a_arc.set_values(0, 360) - a_arc.set_ready_cb(lambda a: arc_phase1_ready_cb(a,arc)) - # a_arc.set_repeat_count(LV_ANIM_REPEAT_INFINITE) - a_arc.set_time(1000) - lv.anim_t.start(a_arc) - - # Create a bar and use the backgrounds value style property to display the current value - bar_h = lv.cont(parent, None) - bar_h.set_fit2(lv.FIT.NONE, lv.FIT.TIGHT) - bar_h.add_style(lv.cont.PART.MAIN, style_box); - bar_h.set_style_local_value_str(lv.cont.PART.MAIN, lv.STATE.DEFAULT, "Bar") - - if disp_size <= lv.DISP_SIZE.SMALL: - bar_h.set_width(lv.page_get_width_grid(page, 1, 1)) - elif disp_size <= lv.DISP_SIZE.MEDIUM: - bar_h.set_width(lv.page.get_width_grid(page, 2, 1)) - else: - bar_h.set_width(lv.page.get_width_grid(parent, 3, 2)) - - bar = lv.bar(bar_h,None) - bar.set_width(lv.cont.get_width_fit(bar_h)) - bar.set_style_local_value_font(lv.bar.PART.BG, lv.STATE.DEFAULT, lv.theme_get_font_small()) - bar.set_style_local_value_align(lv.bar.PART.BG, lv.STATE.DEFAULT, lv.ALIGN.OUT_BOTTOM_MID) - bar.set_style_local_value_ofs_y(lv.bar.PART.BG, lv.STATE.DEFAULT, LV_DPI // 20) - bar.set_style_local_margin_bottom(lv.bar.PART.BG, lv.STATE.DEFAULT, LV_DPI // 7) - bar.align(None, lv.ALIGN.CENTER, 0, 0) - bar.set_value(30,lv.ANIM.OFF) - - led_h = lv.cont(parent, None) - led_h.set_layout(lv.LAYOUT.PRETTY_MID) - if disp_size <= lv.DISP_SIZE.SMALL: - led_h.set_width(lv.page.get_width_grid(page, 1, 1)) - elif disp_size <= lv.DISP_SIZE.MEDIUM: - led_h.set_width(lv.page.get_width_grid(page, 2, 1)) - else: - led_h.set_width(lv.page.get_width_grid(page, 3, 1)) - - led_h.set_height(lv.obj.get_height(lv.obj.__cast__(bar_h))) - led_h.add_style(lv.cont.PART.MAIN, style_box) - led_h.set_drag_parent(True) - led_h.set_style_local_value_str(lv.cont.PART.MAIN, lv.STATE.DEFAULT, "LEDs") - - led = lv.led(led_h, None) - led_size = lv.obj.get_height_fit(lv.obj.__cast__(led_h)) - led.set_size(led_size, led_size) - led.off() - - led = lv.led(led_h, led) - led.set_bright((LV_LED_BRIGHT_MAX - LV_LED_BRIGHT_MIN) // 2 + LV_LED_BRIGHT_MIN) - - led = lv.led(led_h, led) - led.on() - - if disp_size == lv.DISP_SIZE.MEDIUM: - led_h.add_protect(lv.PROTECT.POS) - led_h.align(bar_h, lv.ALIGN.OUT_BOTTOM_MID, 0, lv.obj.get_style_margin_top(lv.obj.__cast__(led_h), lv.obj.PART.MAIN) + lv.obj.get_style_pad_inner(parent, lv.page.PART.SCROLLABLE)) - - task = lv.task_create_basic() - task.set_cb(lambda task: bar_anim(task, bar)) - task.set_period(100) - task.set_prio(lv.TASK_PRIO.LOWEST) - -def selectors_create(parent): - page = lv.page.__cast__(parent) - lv.page.set_scrl_layout(page, lv.LAYOUT.PRETTY_MID) - - grid_h = page.get_height_grid(1, 1) - - if disp_size <= lv.DISP_SIZE.SMALL: - grid_w = page.get_width_grid(1, 1) - else: - grid_w = page.get_width_grid(2, 1) - - cal = lv.calendar(parent, None) - cal.set_drag_parent(True) - if disp_size > lv.DISP_SIZE.MEDIUM: - cal.set_size(min(grid_h, grid_w), min(grid_h, grid_w)); + color_cont.set_style_bg_color(lv.color_white(), 0) + if disp_size == DISP_SMALL: + color_cont.set_style_pad_right(lv.dpx(47),0) else : - cal.set_size(grid_w, grid_w) - if disp_size <= lv.DISP_SIZE.SMALL: - cal.set_style_local_text_font(lv.calendat.PART.BG, lv.STATE.DEFAULT, lv.theme_get_font_small()) + color_cont.set_style_pad_right(lv.dpx(55), 0) + + color_cont.set_style_bg_opa(lv.OPA.COVER, 0) + color_cont.set_style_radius(lv.RADIUS_CIRCLE, 0) - hl = [{ "year":2020, "month":1, "day":5}, - {"year":2020, "month":1, "day":9}] + if disp_size == DISP_SMALL: + color_cont.set_size(lv.dpx(52), lv.dpx(52)) + else: + color_cont.set_size(lv.dpx(60), lv.dpx(60)) - h = lv.cont(parent, None) - h.set_drag_parent(True) - if disp_size <= lv.DISP_SIZE.SMALL: - h.set_fit2(lv.FIT.NONE, lv.FIT.TIGHT) - h.set_width(lv.page.get_width_fit(page)) - h.set_layout(lv.LAYOUT.COLUMN_MID) - elif disp_size <= lv.DISP_SIZE.MEDIUM: - h.set_size(lv.obj.get_width(lv.obj.__cast__(cal)), lv.obj.get_height(lv.obj.__cast__(cal))) - h.set_layout(lv.LAYOUT.PRETTY_TOP); + color_cont.align(lv.ALIGN.BOTTOM_RIGHT, - lv.dpx(10), - lv.dpx(10)) + + for i in palette: + # for(i = 0; palette[i] != _LV_PALETTE_LAST; i++) { + c = lv.btn(color_cont) + c.set_style_bg_color(lv.palette_main(i), 0) + c.set_style_radius(lv.RADIUS_CIRCLE, 0) + c.set_style_opa(lv.OPA.TRANSP, 0) + c.set_size(20, 20) + # c.add_event_cb(c, color_event_cb, LV_EVENT_ALL, &palette[i]) + c.clear_flag(lv.obj.FLAG.SCROLL_ON_FOCUS) + + btn = lv.btn(parent) + btn.add_flag(lv.obj.FLAG.FLOATING | lv.obj.FLAG.CLICKABLE) + btn.set_style_bg_color(lv.color_white(), lv.STATE.CHECKED) + btn.set_style_pad_all(10, 0) + btn.set_style_radius(lv.RADIUS_CIRCLE, 0) + # btn.add_event_cb(color_changer_event_cb, lv.EVENT-ALL, color_cont) + btn.set_style_shadow_width(0, 0) + btn.set_style_bg_img_src(lv.SYMBOL.NEW_LINE, 0) + + if disp_size == DISP_SMALL: + btn.set_size(lv.dpx(42), lv.dpx(42)) + btn.align(lv.ALIGN.BOTTOM_RIGHT, -lv.dpx(15), -lv.dpx(15)) else : - h.set_click(False) - h.set_style_local_bg_opa(lv.PART.MAIN, lv.STATE.DEFAULT, lv.OPA.TRANSP) - h.set_style_local_border_opa(lv.PART.MAIN, lv.STATE.DEFAULT, lv.OPA.TRANSP) - h.set_style_local_pad_left(lv.cont.PART.MAIN, lv.STATE.DEFAULT, 0) - h.set_style_local_pad_right(lv.cont.PART.MAIN, lv.STATE.DEFAULT, 0) - h.set_style_local_pad_top(lv.cont.PART_MAIN, LV_STATE_DEFAULT, 0); - h.set_size(min(grid_h, grid_w), min(grid_h, grid_w)) - h.set_layout(lv.LAYOUT.PRETTY_TOP) + btn.set_size(lv.dpx(50), lv.dpx(50)) + btn.align(lv.ALIGN.BOTTOM_RIGHT, -lv.dpx(15), -lv.dpx(15)) - roller = lv.roller(h, None) - roller.add_style(lv.cont.PART.MAIN, style_box) - roller.set_style_local_value_str(lv.cont.PART.MAIN, lv.STATE.DEFAULT, "Roller") - roller.set_auto_fit(False) - roller.set_align(lv.label.ALIGN.CENTER) - roller.set_visible_row_count(4) - if disp_size <= lv.DISP_SIZE.SMALL: - roller.set_width(lv.cont.get_width_grid(h, 1 , 1)) - else: - roller.set_width(lv.cont.get_width_grid(h, 2 , 1)) +def shop_chart_event_cb(e) : + + code = e.get_code() + if code == lv.EVENT.DRAW_PART_BEGIN : + dsc = lv.obj_draw_part_dsc_t.__cast__(e.get_param()) + # Set the markers' text + if dsc.part == lv.PART.TICKS and dsc.id == lv.chart.AXIS.PRIMARY_X : + month = ["Jan", "Febr", "March", "Apr", "May", "Jun", "July", "Aug", "Sept", "Oct", "Nov", "Dec"] + dsc.text = month[dsc.value] + + if dsc.part == lv.PART.ITEMS: + dsc.rect_dsc.bg_opa = lv.OPA.TRANSP # We will draw it later + + if code == lv.EVENT.DRAW_PART_END : + dsc = lv.obj_draw_part_dsc_t.__cast__(e.get_param()) + # Add the faded area before the lines are drawn + if dsc.part == lv.PART.ITEMS : + devices = [32, 43, 21, 56, 29, 36, 19, 25, 62, 35] + clothes = [12, 19, 23, 31, 27, 32, 32, 11, 21, 32] + services = [56, 38, 56, 13, 44, 32, 49, 64, 17, 33] + + draw_rect_dsc = lv.draw_rect_dsc_t() + draw_rect_dsc.init() + + h = dsc.draw_area.get_height() + + a = lv.area_t() + a.x1 = dsc.draw_area.x1 + a.x2 = dsc.draw_area.x2 + + a.y1 = dsc.draw_area.y1 + a.y2 = a.y1 + 4 + (devices[dsc.id] * h) // 100 # +4 to overlap the radius + draw_rect_dsc.bg_color = lv.palette_main(lv.PALETTE.RED) + draw_rect_dsc.radius = 4 + dsc.draw_ctx.rect(draw_rect_dsc,a) + # lv_draw_rect(dsc->draw_ctx, &draw_rect_dsc, &a); + + a.y1 = a.y2 - 4 # -4 to overlap the radius + a.y2 = a.y1 + (clothes[dsc.id] * h) // 100 + draw_rect_dsc.bg_color = lv.palette_main(lv.PALETTE.BLUE) + draw_rect_dsc.radius = 0 + dsc.draw_ctx.rect(draw_rect_dsc,a) + # lv_draw_rect(dsc->draw_ctx, &draw_rect_dsc, &a); + + a.y1 = a.y2 + a.y2 = a.y1 + (services[dsc.id] * h) // 100 + draw_rect_dsc.bg_color = lv.palette_main(lv.PALETTE.GREEN) + dsc.draw_ctx.rect(draw_rect_dsc,a) + # lv_draw_rect(dsc->draw_ctx, &draw_rect_dsc, &a); + +def meter1_indic1_anim_cb(meter,indic,val): + + meter.set_indicator_end_value(indic, val) + + card = lv.obj.get_parent(lv.obj.__cast__(meter)) + label = lv.obj.get_child(lv.obj.__cast__(card), -5) + label.set_text("Revenue : {:d}%".format(val)) + +def meter1_indic2_anim_cb(meter,indic,val) : + + meter.set_indicator_end_value(indic, val) + + card = lv.obj.get_parent(lv.obj.__cast__(meter)) + label = lv.obj.get_child(lv.obj.__cast__(card), -3) + label.set_text("Sales : {:d}%".format(val)) + +def meter1_indic3_anim_cb(meter, indic, val) : + + meter.set_indicator_end_value(indic, val) + + card = lv.obj.get_parent(lv.obj.__cast__(meter)) + label = lv.obj.get_child(lv.obj.__cast__(card), -1) + label.set_text("Cost : {:d}%".format(val)) - dd = lv.dropdown(h, None) - dd.add_style(lv.cont.PART.MAIN, style_box) - dd.set_style_local_value_str(lv.cont.PART.MAIN, lv.STATE.DEFAULT, "Dropdown") - if disp_size <= lv.DISP_SIZE.SMALL: - dd.set_width(lv.cont.get_width_grid(h, 1 , 1)) - else: - dd.set_width(lv.cont.get_width_grid(h, 2 , 1)) +def meter2_timer_cb(timer,meter,indics) : - dd.set_options("Alpha\nBravo\nCharlie\nDelta\nEcho\nFoxtrot\nGolf\nHotel\nIndia\nJuliette\nKilo\nLima\nMike\nNovember\n" - "Oscar\nPapa\nQuebec\nRomeo\nSierra\nTango\nUniform\nVictor\nWhiskey\nXray\nYankee\nZulu") + global session_desktop,session_tablet,session_mobile + global down1,down2,down3 + + if down1 : + session_desktop -= 137 + if session_desktop < 1400: + down1 = False + else : + session_desktop += 116 + if session_desktop > 4500: + down1 = True - list = lv.list(parent, None) - list.set_scroll_propagation(True) - list.set_size(grid_w, grid_h) + if down2: + session_tablet -= 3 + if session_tablet < 1400 : + down2 = False + else : + session_tablet += 9 + if session_tablet > 450: + down2 = True - txts = [lv.SYMBOL.SAVE, "Save", lv.SYMBOL.CUT, "Cut", lv.SYMBOL.COPY, "Copy", - lv.SYMBOL.OK, "This is a quite long text to scroll on the list", lv.SYMBOL.EDIT, "Edit", lv.SYMBOL.WIFI, "Wifi", - lv.SYMBOL.BLUETOOTH, "Bluetooth", lv.SYMBOL.GPS, "GPS", lv.SYMBOL.USB, "USB", - lv.SYMBOL.SD_CARD, "SD card", lv.SYMBOL.CLOSE, "Close"] + if down3 : + session_mobile -= 57 + if session_mobile < 1400 : + down3 = False + else : + session_mobile += 76 + if session_mobile > 4500: + down3 = True + + all = session_desktop + session_tablet + session_mobile + pct1 = (session_desktop * 97) // all + pct2 = (session_tablet * 97) // all + + meter.set_indicator_start_value(indics[0], 0) + meter.set_indicator_end_value(indics[0], pct1) + + meter.set_indicator_start_value(indics[1], pct1 + 1) + meter.set_indicator_end_value(indics[1], pct1 + 1 + pct2) + + meter.set_indicator_start_value(indics[2], pct1 + 1 + pct2 + 1) + meter.set_indicator_end_value(indics[2], 99) + + card = lv.obj.get_parent(lv.obj.__cast__(meter)) + + label = lv.obj.get_child(lv.obj.__cast__(card), -5) + label.set_text("Desktop : {:d}".format(session_desktop)) + # lv_label_set_text_fmt(label, "Desktop: %"LV_PRIu32, session_desktop); + + label = lv.obj.get_child(lv.obj.__cast__(card), -3) + label.set_text("Tablet : {:d}".format(session_desktop)) + # lv_label_set_text_fmt(label, "Tablet: %"LV_PRIu32, session_tablet); + + label = lv.obj.get_child(lv.obj.__cast__(card), -1) + label.set_text("Tablet : {:d}".format(session_desktop)) + #lv_label_set_text_fmt(label, "Mobile: %"LV_PRIu32, session_mobile); - for i in range(0,len(txts)//2,2): - btn = list.add_btn(txts[i], txts[i + 1]); - lv.btn.set_checkable(lv.btn.__cast__(btn),True) +def meter3_anim_cb(meter,indic, label, val) : - # Make a button disabled - if i == 4: - btn.set_state(lv.btn.STATE.DISABLED) + meter.set_indicator_value(indic, val) - cal.set_highlighted_dates(hl, 2) + # label = lv.obj.get_child(lv.obj.__cast__(meter), -0) + label.set_text(" "+str(val) + "Mbps") -tv = lv.tabview(lv.scr_act(), None) -display = scr.get_disp() -disp_size = display.get_size_category() -tv.set_style_local_pad_left(lv.tabview.PART.TAB_BG, lv.STATE.DEFAULT, disp_drv.hor_res // 2) +def ta_event_cb(e,kb,tv) : -sw = lv.switch(lv.scr_act(), None) -if lv.theme_get_flags() & lv.THEME_MATERIAL_FLAG.DARK: - sw.on(LV_ANIM_OFF) -sw.set_event_cb(color_chg_event_cb) -sw.set_pos(LV_DPX(10), LV_DPX(10)) -sw.set_style_local_value_str(lv.switch.PART.BG, lv.STATE.DEFAULT, "Dark") -sw.set_style_local_value_align(lv.switch.PART.BG, lv.STATE.DEFAULT, lv.ALIGN.OUT_RIGHT_MID) -sw.set_style_local_value_ofs_x(lv.switch.PART.BG, lv.STATE.DEFAULT, LV_DPI//35) + code = e.get_code() + ta = e.get_target() + # lv_obj_t * kb = lv_event_get_user_data(e); + + indev = lv.indev_get_act() + if code == lv.EVENT.FOCUSED : + if (not indev) or indev.get_type() != lv.INDEV_TYPE.KEYPAD : + kb.set_textarea(ta) + kb.set_style_max_height(LV_HOR_RES * 2 // 3, 0) + tv.update_layout() # Be sure the sizes are recalculated + tv.set_height(LV_VER_RES - kb.get_height()) + kb.clear_flag(lv.obj.FLAG.HIDDEN) + ta.scroll_to_view_recursive(lv.ANIM.OFF) + + elif code == lv.EVENT.DEFOCUSED : + kb.set_textarea(None) + tv.set_height(LV_VER_RES) + kb.add_flag(lv.obj.FLAG.HIDDEN) + if (indev) : + indev.reset(None) -t1 = tv.add_tab("Controls") -t2 = tv.add_tab("Visuals") -t3 = tv.add_tab("Selectors") + elif code == lv.EVENT.READY or code == lv.EVENT.CANCEL: + tv.set_height(LV_VER_RES) + kb.add_flag(lv.obj.FLAG.HIDDEN) + ta.clear_state(lv.STATE.FOCUSED) + if (indev) : + indev.reset(None) # To forget the last clicked object to make it focusable again -style_box = lv.style_t() -style_box.init() -# print("LV_DPX(10): %d, LV_DPX(10): %d"%(LV_DPX(10),LV_DPX(30))) -style_box.set_value_align(lv.STATE.DEFAULT, lv.ALIGN.OUT_TOP_LEFT) -style_box.set_value_ofs_y(lv.STATE.DEFAULT, - LV_DPX(10)) -style_box.set_margin_top(lv.STATE.DEFAULT, LV_DPX(30)) +def birthday_event_cb(e): + global calendar + code = e.get_code() + ta = e.get_target() -controls_create(t1) -visuals_create(t2) -selectors_create(t3) + if code == lv.EVENT.FOCUSED : + indev = lv.indev_get_act() + if (not indev) or indev.get_type() == lv.INDEV_TYPE.POINTER: + if calendar == None: + top_layer = lv.layer_top() + top_layer.add_flag(lv.obj.FLAG.CLICKABLE) + calendar = lv.calendar(top_layer) + top_layer.set_style_bg_opa(lv.OPA._50, 0) + top_layer.set_style_bg_color(lv.palette_main(lv.PALETTE.GREY), 0) + if disp_size == DISP_SMALL: + calendar.set_size(180, 200) + elif disp_size == DISP_MEDIUM: + calendar.set_size(200, 220) + else : + calendar.set_size(300, 330) + calendar.set_showed_date(1990, 01) + calendar.align(lv.ALIGN.CENTER, 0, 30) + # password.add_event_cb(lambda e: ta_event_cb(e,kb,tv),lv.EVENT.ALL,None) + + calendar.add_event_cb(lambda e: calendar_event_cb(e,ta), lv.EVENT.ALL, None) + header = lv.calendar_header_dropdown(calendar) + +def calendar_event_cb(e,ta) : + global calendar + code = e.get_code() + obj = lv.calendar.__cast__(e.get_current_target()) + if code == lv.EVENT.VALUE_CHANGED: + d = lv.calendar_date_t() + obj.get_pressed_date(d) + ta.set_text("{:02d}.{:02d}.{:d}".format(d.day,d.month,d.year)) + + calendar.delete() + calendar = None + lv.layer_top().clear_flag(lv.obj.FLAG.CLICKABLE) + lv.layer_top().set_style_bg_opa(lv.OPA.TRANSP, 0) + +def _lv_area_intersect(a1_p, a2_p) : + + # Get the smaller area from 'a1_p' and 'a2_p' + res_p = lv.area_t() + + res_p.x1 = max(a1_p.x1, a2_p.x1) + res_p.y1 = max(a1_p.y1, a2_p.y1) + res_p.x2 = min(a1_p.x2, a2_p.x2) + res_p.y2 = min(a1_p.y2, a2_p.y2) + + # If x1 or y1 greater than x2 or y2 then the areas union is empty + + if res_p.x1 > res_p.x2 or res_p.y1 > res_p.y2: + return None + + return res_p + +def chart_event_cb(e): + + code = e.get_code() + obj = e.get_target() + dsc = lv.obj_draw_part_dsc_t.__cast__(e.get_param()) + + if code == lv.EVENT.PRESSED or code == lv.EVENT.RELEASED : + obj.invalidate() #To make the value boxes visible + + elif code == lv.EVENT.DRAW_PART_BEGIN: + # Set the markers' text + if dsc.part == lv.PART.TICKS and dsc.id == lv.chart.AXIS.PRIMARY_X: + if obj.get_type() == lv.chart.TYPE.BAR: + month = ["I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X", "XI", "XII"] + dsc.text = month[dsc.value] + else : + month = ["Jan", "Febr", "March", "Apr", "May", "Jun", "July", "Aug", "Sept", "Oct", "Nov", "Dec"] + dsc.text = month[dsc.value] + + # Add the faded area before the lines are drawn + + elif dsc.part == lv.PART.ITEMS: + if LV_USE_DRAW_MASKS: + # Add a line mask that keeps the area below the line + if dsc.p1 and dsc.p2: + line_mask_param = lv.draw_mask_line_param_t() + line_mask_param.points_init(dsc.p1.x, dsc.p1.y, dsc.p2.x, dsc.p2.y, lv.DRAW_MASK_LINE_SIDE.BOTTOM) + + line_mask_id = lv.draw_mask_add(line_mask_param, None) + # Add a fade effect: transparent bottom covering top + h = obj.get_height() + coords = lv.area_t() + obj.get_coords(coords) + + fade_mask_param = lv.draw_mask_fade_param_t() + fade_mask_param.init(coords, lv.OPA.COVER, coords.y1 + h // 8, lv.OPA.TRANSP,coords.y2) + fade_mask_id = lv.draw_mask_add(fade_mask_param,None) + + # Draw a rectangle that will be affected by the mask + draw_rect_dsc = lv.draw_rect_dsc_t() + draw_rect_dsc.init() + draw_rect_dsc.bg_opa = lv.OPA._50 + draw_rect_dsc.bg_color = dsc.line_dsc.color + # obj_clip_area = lv.area_t() + obj_clip_area = _lv_area_intersect(dsc.draw_ctx.clip_area, coords) + + clip_area_ori = dsc.draw_ctx.clip_area + dsc.draw_ctx.clip_area = obj_clip_area + + a = lv.area_t() + a.x1 = dsc.p1.x + a.x2 = dsc.p2.x - 1 + a.y1 = min(dsc.p1.y, dsc.p2.y) + a.y2 = coords.y2 + + dsc.draw_ctx.rect(draw_rect_dsc,a) + dsc.draw_ctx.clip_area = clip_area_ori + + # Remove the masks + lv.draw_mask_free_param(line_mask_param) + lv.draw_mask_remove_id(line_mask_id) + lv.draw_mask_remove_id(fade_mask_id) + + ser = lv.chart_series_t.__cast__(dsc.sub_part_ptr) + + if obj.get_pressed_point() == dsc.id : + if obj.get_type() == lv.chart.TYPE.LINE: + dsc.rect_dsc.outline_color = lv.color_white() + dsc.rect_dsc.outline_width = 2 + else : + dsc.rect_dsc.shadow_color = ser.color + dsc.rect_dsc.shadow_width = 15 + dsc.rect_dsc.shadow_spread = 0 + + buf = "{:2d}".format(dsc.value) + text_size = lv.point_t() + lv.txt_get_size(text_size, buf, font_normal, 0, 0, lv.COORD.MAX, lv.TEXT_FLAG.NONE) + + txt_area = lv.area_t() + if obj.get_type() == lv.chart.TYPE.BAR : + txt_area.y2 = dsc.draw_area.y1 - lv.dpx(15) + txt_area.y1 = txt_area.y2 - text_size.y + if ser == obj.get_series_next(None) : + txt_area.x1 = dsc.draw_area.x1 + dsc.draw_area.get_width() // 2 + txt_area.x2 = txt_area.x1 + text_size.x + else : + txt_area.x2 = dsc.draw_area.x1 + dsc.draw_area.get_width() // 2 + txt_area.x1 = txt_area.x2 - text_size.x + else : + txt_area.x1 = dsc.draw_area.x1 + dsc.draw_area.get_width() // 2 - text_size.x // 2 + txt_area.x2 = txt_area.x1 + text_size.x + txt_area.y2 = dsc.draw_area.y1 - lv.dpx(15) + txt_area.y1 = txt_area.y2 - text_size.y + + bg_area = lv.area_t() + bg_area.x1 = txt_area.x1 - lv.dpx(8) + bg_area.x2 = txt_area.x2 + lv.dpx(8) + bg_area.y1 = txt_area.y1 - lv.dpx(8) + bg_area.y2 = txt_area.y2 + lv.dpx(8) + + rect_dsc = lv.draw_rect_dsc_t() + rect_dsc.init() + rect_dsc.bg_color = ser.color + rect_dsc.radius = lv.dpx(5) + dsc.draw_ctx.rect(rect_dsc,bg_area) + + label_dsc = lv.draw_label_dsc_t() + label_dsc.init() + label_dsc.color = lv.color_white() + label_dsc.font = font_normal + dsc.draw_ctx.label(label_dsc,txt_area,buf,None) + + else : + dsc.rect_dsc.outline_width = 0 + dsc.rect_dsc.shadow_width = 0 + +t1 = tv.add_tab("Profile") +t2 = tv.add_tab("Analytics") +t3 = tv.add_tab("Shop") + +profile_create(t1) +analytics_create(t2) +shop_create(t3) + +color_changer_create(tv)