def __init__(self, manifest: DandelionAppManifest): self.manifest = manifest self.scr = lv.obj() # Top bar base self.top_bar = lv.cont(self.scr) # self.top_bar.set_style_local_bg_color(lv.cont.PART.MAIN, # lv.STATE.DEFAULT, # lv.color_hex(0x0)) self.top_bar.set_width(lv.scr_act().get_width()) self.top_bar.set_height(TOP_BAR_HEIGHT) self.top_bar.align(self.scr, lv.ALIGN.IN_TOP_MID, 0, 0) self.top_bar.set_event_cb(self.top_bar_event_cb) # Top bar content # App name (if not launcher), static, does not update if not self.manifest.launcher: self.title_label = lv.label(self.top_bar) self.title_label.set_text(self.manifest.name) self.title_label.align(self.top_bar, lv.ALIGN.CENTER, 0, 0) # Time label, value set in refresh, align based on title presence self.clock_label = lv.label(self.top_bar) # App container self.app_container = lv.cont(self.scr) self.app_container.set_width(lv.scr_act().get_width()) self.app_container.set_height(lv.scr_act().get_height() - self.top_bar.get_height()) self.app_container.align(self.top_bar, lv.ALIGN.OUT_BOTTOM_MID, 0, 0)
def __init__(self, size, *args, **kwargs): super().__init__(*args, **kwargs) self._text = "txt" self.text_prev = "txt_prev" # We have a container that parents a label (QR code) self.set_auto_realign(True) self.align_origo(None, lv.ALIGN.CENTER, 0, 0) self.set_layout(lv.LAYOUT.OFF) # label which holds the QR code self.lbl = lv.label(self) self.lbl.set_long_mode(lv.label.LONG.BREAK) self.lbl.set_align(lv.label.ALIGN.CENTER) self.size = size self.max_size = None # in case the QR is animatable our container also parents a tip label self.cont = lv.cont(self) self.lbl_indx = lv.label(self.cont) self.lbl_indx.set_text('') self.cont.set_fit(lv.FIT.TIGHT) self.set_fit(lv.FIT.TIGHT) self.isQRbig = False self.animation_tip = True QrA.init(self.next) self.set_event_cb(QrA.qr_cb)
def m2(): print("This is callback for M2") scr = lv.obj() lv.scr_load(scr) #make container con = lv.cont(scr) con.set_auto_realign(True) con.set_layout(lv.LAYOUT.CENTER) con.align(scr, lv.ALIGN.CENTER, 0, 0) con.set_fit(lv.FIT.TIGHT) #make label in container label = lv.label(con) label.set_text(""" This is the second screen""") ta = lv.textarea(con) kb = lv.keyboard(con) #kb.set_style_local_radius(0,0,0) kb.set_textarea(ta) btn = lv.btn(con) label = lv.label(btn) label.set_text("Skip la") btn.set_event_cb(lambda obj, event: m4() if event == lv.EVENT.CLICKED else None)
def add_tile(self, x, y, id): self.log.debug("add tile no %d: x: %d y: %d, id= %s" % (self.tile_entries, x, y, id)) self.tile_entries += 1 new_tile = Tile() new_tile.tile = lv.cont(self.mainbar, None) hor_res = lv.scr_act().get_disp().driver.hor_res ver_res = lv.scr_act().get_disp().driver.ver_res new_tile.tile.set_width(hor_res) new_tile.tile.set_height(ver_res) new_tile.tile.set_pos(hor_res * x, ver_res * y) new_tile.tile.add_style(lv.obj.PART.MAIN, self.mainbar_style) new_tile.x = x new_tile.y = y new_tile.id = id self.tile_table.append(new_tile) self.mainbar.add_element(new_tile.tile) new_pos = lv.point_t() new_pos.x = x new_pos.y = y self.tile_pos_table.append(new_pos) self.tile_table[self.tile_entries - 1].tile.add_style( lv.obj.PART.MAIN, self.mainbar_style) self.tile_table[self.tile_entries - 1].tile.set_pos( self.tile_pos_table[self.tile_entries - 1].x * lv.scr_act().get_disp().driver.hor_res, self.tile_pos_table[self.tile_entries - 1].y * lv.scr_act().get_disp().driver.ver_res) self.mainbar.set_valid_positions(self.tile_pos_table, self.tile_entries) return (self.tile_entries - 1)
def __init__(self, parent): self.lv_obj = lv.cont(parent) self._set_custom_style() self.lv_obj.set_auto_realign(True) self.lv_obj.set_fit(lv.FIT.FLOOD) self.lv_obj.set_layout(lv.LAYOUT.PRETTY) self.width = self.lv_obj.get_width() self.half_width = self.width // 2 - 13 self.third_width = self.width // 3 - 10
def init(parent): # global screen container = lv.obj(parent) container.set_size(parent.get_width(), parent.get_height()) container.add_style(lv.obj.PART.MAIN, background) clock = lv.cont(container) clock.set_fit(lv.FIT.PARENT) clock.set_layout(lv.LAYOUT.CENTER) clock.set_size(container.get_width(), container.get_height()) clock.add_style(lv.obj.PART.MAIN, background) batteryLabel = lv.label(container) hours = lv.label(clock) hours.set_text("00") hours.set_align(lv.label.ALIGN.CENTER) hours.add_style(lv.label.PART.MAIN, title) minutes = lv.label(clock) minutes.set_text("00") minutes.set_align(lv.label.ALIGN.CENTER) minutes.add_style(lv.label.PART.MAIN, title) date = lv.label(clock) date.set_text("1 jan. 2021") date.add_style(lv.label.PART.MAIN, subtitle) # minutes.align(hours, lv.ALIGN.OUT_BOTTOM_MID, 0, 0) batteryLabel.align(container, lv.ALIGN.IN_TOP_RIGHT, 0, 0) batteryLabel.set_align(lv.label.ALIGN.RIGHT) batteryLabel.add_style(lv.label.PART.MAIN, text) batteryLabel.set_style_local_text_color(lv.label.PART.MAIN, lv.STATE.DEFAULT, antracite_light) def update_clock(task): time = get_watch().rtc hours.set_text("{0:02n}".format(time.hours())) minutes.set_text("{0:02n}".format(time.minutes())) batteryLabel.set_text('{}%'.format( get_watch().pmu.getBattPercentage())) date.set_text("{} {} 20{}".format(time.date(), months[time.month()], time.year())) lv.task_create(update_clock, 500, lv.TASK_PRIO.HIGHEST, None) update_clock(None) return container
def m3_1(): #load values to begin and duration con2 = lv.cont(scr) con2.align(con, lv.ALIGN.OUT_BOTTOM_MID,0,0) con2.set_fit2(lv.FIT.PARENT, lv.FIT.TIGHT) con2.set_style_local_radius(0,0,0) position = drop.get_selected() con3 = lv.cont(con2) con3.align(con2, lv.ALIGN.IN_TOP_MID,0,0) con3.set_fit2(lv.FIT.PARENT,lv.FIT.TIGHT) tittle = lv.label(con3) tittle.align(con3, lv.ALIGN.CENTER,0,0) tittle.set_text("Set Begin Time") minute_btn = lv.btn(con2) minute_btn.align(con3, lv.ALIGN.OUT_BOTTOM_MID,0,0) minute_btn.set_style_local_radius(0,0,0) minute_btn.set_fit(lv.FIT.TIGHT) lbl_minute_btn = lv.label(minute_btn) lbl_minute_btn.set_text(str(trigger[position].bminute)) hour_btn = lv.btn(con2) hour_btn.align(minute_btn, lv.ALIGN.OUT_LEFT_MID,0,0) hour_btn.set_style_local_radius(0,0,0) hour_btn.set_fit(lv.FIT.TIGHT) lbl_hour_btn = lv.label(hour_btn) lbl_hour_btn.set_text(str(trigger[position].bhour)) second_btn = lv.btn(con2) second_btn.align(minute_btn, lv.ALIGN.OUT_RIGHT_MID,0,0) second_btn.set_style_local_radius(0,0,0) second_btn.set_fit(lv.FIT.TIGHT) lvl_second_btn = lv.label(second_btn) lvl_second_btn.set_text(str(trigger[position].bsecond))
def lv_line(screen): line_points = [[5,5], [70,70]] valid_pos = [lv.point_t(), lv.point_t(), lv.point_t(), lv.point_t(), lv.point_t(), lv.point_t(), lv.point_t()] valid_pos[0].x = 0 valid_pos[0].y = 0 valid_pos[1].x = 10 valid_pos[1].y = 0 valid_pos[2].x = 10 valid_pos[2].y = 10 valid_pos[3].x = 0 valid_pos[3].y = 10 valid_pos[4].x = 10 valid_pos[4].y = 10 valid_pos[5].x = 10 valid_pos[5].y = 20 valid_pos[6].x = 0 valid_pos[6].y = 20 line_style2 = lv.style_t() line_style2.init() line_style2.set_line_width(lv.STATE.DEFAULT, 8) line_style2.set_line_color(lv.STATE.DEFAULT, styles.LV_COLOR_BLUE) line_style2.set_line_rounded(lv.STATE.DEFAULT, True) cont_style = lv.style_t() cont_style.init() cont_style.set_border_opa(lv.STATE.DEFAULT, lv.OPA.TRANSP) cont_style.set_bg_opa(lv.STATE.DEFAULT, lv.OPA.TRANSP) # cont_style.set_bg_color(lv.STATE.DEFAULT, styles.LV_COLOR_WATCH) cont = lv.cont(screen) #cont.add_style(cont.PART.MAIN, cont_style) cont.set_auto_realign(True) cont.set_size(200,65) cont.set_pos(20,85) #cont.align_origo(None, lv.ALIGN.CENTER, 0, 0) cont.set_fit(lv.FIT.NONE) # cont.set_layout(lv.LAYOUT.PRETTY_MID) cont.set_layout(lv.LAYOUT.ROW_MID) line = lv.line(cont) points = styles.get_line_pts_from_num(1, size=40) line.set_points(points, len(points)) line.add_style(line.PART.MAIN, line_style2) line.align(None, lv.ALIGN.CENTER, 0, 0) line2 = lv.line(cont) points = styles.get_line_pts_from_num(2, size=40) line2.set_points(points, len(points)) line2.add_style(line2.PART.MAIN, line_style2) line2.align(None, lv.ALIGN.CENTER, 0, 0)
def temp_init(self): """ Initialize the temp display on the screen """ # Temp Label temp_label = lv.label(self.main_scr) temp_label.set_text('Temp(`C):') temp_label.align(self.timer_cont, lv.ALIGN.OUT_BOTTOM_LEFT, -2, 5) # Temp Container temp_cont = lv.cont(self.main_scr, self.profile_title_cont) temp_cont.align(temp_label, lv.ALIGN.OUT_BOTTOM_LEFT, 2, 2) # Temp Text temp_text = lv.label(temp_cont) temp_text.set_text('- - -') return temp_text
def timer_init(self): """ Initialize the timer on the screen """ # Time Label time_label = lv.label(self.main_scr) time_label.set_text('Time:') time_label.align(self.profile_title_cont, lv.ALIGN.OUT_BOTTOM_LEFT, -2, 5) # Time Container time_cont = lv.cont(self.main_scr, self.profile_title_cont) time_cont.align(time_label, lv.ALIGN.OUT_BOTTOM_LEFT, 2, 2) # Time Text time_text = lv.label(time_cont) time_text.set_text('00:00') return time_label, time_cont, time_text
def profile_title_init(self): """ Initialize reflow profile title on the screen """ # Profile Label profile_label = lv.label(self.main_scr) profile_label.set_text('Profile:') profile_label.align(self.oven_title, lv.ALIGN.OUT_BOTTOM_LEFT, -4, 3) # Profile Container profile_cont = lv.cont(self.main_scr) profile_cont.set_size(80, 28) # profile_cont.set_auto_realign(True) profile_cont.align(profile_label, lv.ALIGN.OUT_BOTTOM_LEFT, 2, 2) profile_cont.set_fit(lv.FIT.NONE) profile_cont.set_layout(lv.LAYOUT.COL_M) # Profile Text profile_text = lv.label(profile_cont) profile_text.set_text('N/A') return profile_label, profile_cont, profile_text
def stage_init(self): # Stage Container stage_cont = lv.cont(self.main_scr) stage_cont.set_size(140, 38) # stage_cont.set_auto_realign(True) stage_cont.align(self.start_btn, lv.ALIGN.OUT_BOTTOM_LEFT, 0, 5) stage_cont.set_fit(lv.FIT.NONE) stage_cont.set_layout(lv.LAYOUT.CENTER) style_stage = lv.style_t() lv.style_copy(style_stage, lv.style_plain) style_stage.text.font = lv.font_roboto_22 stage_cont.set_style(lv.label.STYLE.MAIN, style_stage) stage_label = lv.label(stage_cont) stage_label.set_style(lv.label.STYLE.MAIN, style_stage) stage_label.set_recolor(True) stage_label.set_long_mode(lv.label.LONG.SROLL) stage_label.set_width(128) stage_label.set_text('') return stage_cont, stage_label
def draw_melting_dash_line(self, y_point, melting_temp): """ Draw melting temp with dashed line over the chart """ # Container for dashed line style_cont = lv.style_t() lv.style_copy(style_cont, lv.style_transp) dashed_segments = 10 dashed_cont = lv.cont(self.chart) dashed_cont.set_style(lv.line.STYLE.MAIN, style_cont) dashed_cont.set_width(GUI.CHART_WIDTH) # Draw dashed line style_dash_line = lv.style_t() lv.style_copy(style_dash_line, lv.style_transp) style_dash_line.line.color = lv.color_make(0xFF, 0x68, 0x33) style_dash_line.line.width = 3 dash_width = int(GUI.CHART_WIDTH / (dashed_segments * 2 - 1)) dashed_points = [ {'x': 0, 'y': 0}, {'x': dash_width, 'y': 0} ] dashed_line0 = lv.line(dashed_cont) dashed_line0.set_points(dashed_points, len(dashed_points)) dashed_line0.set_style(lv.line.STYLE.MAIN, style_dash_line) dashed_line0.align(None, lv.ALIGN.IN_LEFT_MID, 0, 0) for i in range(dashed_segments - 1): dl_name = 'dashed_line' + str(i+1) parent_name = 'dashed_line' + str(i) locals()[dl_name] = lv.line(dashed_cont, dashed_line0) locals()[dl_name].align(None, lv.ALIGN.IN_LEFT_MID, dash_width * (i+1) * 2, 0) # Melting temp melt_label = lv.label(dashed_cont) melt_label.set_recolor(True) melt_label.set_text('#FF6833 ' + str(melting_temp) + '#') # Put above elements in place dashed_cont.align_origo(self.chart, lv.ALIGN.IN_BOTTOM_MID, 0, -y_point) melt_label.align(dashed_cont, lv.ALIGN.IN_TOP_LEFT, 8, 12) return dashed_cont
def m1(): scr = lv.obj() lv.scr_load(scr) #make container con = lv.cont(scr) con.set_auto_realign(True) con.set_layout(lv.LAYOUT.CENTER) con.align(scr, lv.ALIGN.CENTER, 0, 0) con.set_fit(lv.FIT.TIGHT) #make label in container label = lv.label(con) label.set_text(""" This is the first iteration of the water timer. The developer is not responsible for any damages caused by it. User is advise to proceed cautiously""") btn = lv.btn(con) label2 = lv.label(btn) label2.set_text("I Accept!") btn.set_event_cb(lambda obj, event: m2() if event == lv.EVENT.CLICKED else None)
def m6(): #wifi def btn_event(obj, event): if obj == btn2 and event == lv.EVENT.CLICKED: m5() if obj == ta and event == lv.EVENT.CLICKED: kb = lv.keyboard(scr) kb.set_textarea(ta) scr = lv.obj() lv.scr_load(scr) tab = lv.tabview(scr) tab1 = tab.add_tab("Wifi Settings") btn2 = lv.btn(tab) btn2.align(tab, lv.ALIGN.IN_TOP_LEFT, 0, 0) lbl_btn2 = lv.label(btn2) lbl_btn2.set_text(lv.SYMBOL.HOME) btn2.set_fit(lv.FIT.TIGHT) btn2.set_event_cb(btn_event) cont = lv.cont(tab1) cont.align(tab1, lv.ALIGN.IN_TOP_MID, 0, 20) cont.set_fit2(lv.FIT.TIGHT, lv.FIT.TIGHT) ta = lv.textarea(cont) ta.align(cont, lv.ALIGN.IN_TOP_MID, 0, 10) ta.set_one_line(True) ta.set_event_cb(btn_event) btn = lv.btn(cont) btn.align(ta, lv.ALIGN.OUT_BOTTOM_MID, 0, 0)
import lvgl as lv import display_driver import time def event_handler(source, evt): if evt == lv.EVENT.VALUE_CHANGED: if source.is_checked(): print("State: checked") else: print("State: unchecked") # create a container cont = lv.cont(lv.scr_act(), None) cont.set_auto_realign(True) # Auto realign when the size changes cont.align_mid(None, lv.ALIGN.CENTER, 0, 0) # This parameters will be sued when realigned cont.set_fit(lv.FIT.TIGHT) cont.set_layout(lv.LAYOUT.COLUMN_MID) label = lv.label(cont) label.set_text("Short text") # Refresh and pause here for a while to see how `fit` works time.sleep(1) label = lv.label(cont) label.set_text("It is a long text") # Wait here too
def m4(): scr = lv.obj() lv.scr_load(scr) #container for drop and switch cont = lv.cont(scr) cont.set_auto_realign(True) cont.set_fit2(lv.FIT.PARENT, lv.FIT.TIGHT) cont.set_layout(lv.LAYOUT.PRETTY_MID) cont.align(scr, lv.ALIGN.IN_TOP_MID, 0, 0) #dropdown drop = lv.dropdown(cont) drop.set_style_local_border_post(lv.BORDER_SIDE.NONE, lv.BORDER_SIDE.NONE, lv.BORDER_SIDE.NONE) drop.set_options( "Trigger 1\nTrigger 2\nTrigger 3\nTrigger 4\nTrigger 5\nTrigger 6\nTrigger 7\nTrigger 8\nTrigger 9\n Trigger 10" ) #label lbl1 = lv.label(cont) lbl1.set_text("Arm?") #switch switch = lv.switch(cont) #tabview tab = lv.tabview(scr) tab.align(cont, lv.ALIGN.OUT_BOTTOM_MID, 0, 0) tab1 = tab.add_tab("Time") tab2 = tab.add_tab("Auto") tab3 = tab.add_tab("Switches") #tab1 lbl2 = lv.label(tab1) lbl2.set_text("Start time [h][m][s]") lbl2.align(tab1, lv.ALIGN.IN_TOP_MID, 0, 0) trig_btn = lv.btnmatrix(tab1) trig_btn.set_height(200) trig_btn.align(lbl2, lv.ALIGN.OUT_BOTTOM_MID, 0, 0) def remap(): btn_map = [ lv.SYMBOL.UP, lv.SYMBOL.UP, lv.SYMBOL.UP, "\n", str(trigger[0].bhour), str(trigger[0].bminute), str(trigger[0].bsecond), "\n", lv.SYMBOL.DOWN, lv.SYMBOL.DOWN, lv.SYMBOL.DOWN, "\n", lv.SYMBOL.SAVE, "", "" ] print('remapped called') return btn_map trig_btn.set_map(remap()) #trig_btn.set_style def event_handler(obj, event): if event == lv.EVENT.VALUE_CHANGED: txt = obj.get_active_btn() print("{} was pressed".format(txt)) if (txt == 0): trigger[0].bhour += 1 if (txt == 1): trigger[0].bminute += 1 if (txt == 2): trigger[0].bsecond += 1 if (txt == 6): trigger[0].bhour -= 1 if (txt == 7): trigger[0].bminute -= 1 if (txt == 8): trigger[0].bsecond -= 1 trig_btn.set_map(remap()) trig_btn.set_event_cb(event_handler) #label set duration lbl3 = lv.label(tab1) lbl3.align(trig_btn, lv.ALIGN.OUT_BOTTOM_MID, -100, 0) lbl3.set_text("Set trigger duration [h][m][s]") roller = lv.roller(tab1)
def m3(): global trigger print("This is callback for M3") scr = lv.obj() lv.scr_load(scr) #make container con = lv.cont(scr) con.set_auto_realign(True) #con.set_layout(lv.LAYOUT.PRETTY_TOP) con.align(scr, lv.ALIGN.IN_TOP_MID, 0, 0) con.set_fit2(lv.FIT.PARENT, lv.FIT.TIGHT) con.set_style_local_radius(0, 0, 0) #label = lv.label(con) #label.set_text("Trigger No:") #label.align(con, lv.ALIGN.IN_TOP_LEFT,10,10) drop = lv.dropdown(con) drop.align(con, lv.ALIGN.IN_LEFT_MID, 10, 0) drop.set_drag(False) drop.set_options( "trigger 1\ntrigger 2\ntrigger 3\ntrigger 4\ntrigger 5\ntrigger 6\ntrigger 7\n" ) drop.set_event_cb(lambda obj, event: m3_1() if event == lv.EVENT.VALUE_CHANGED else None) btn = lv.btn(con) label_btn = lv.label(btn) btn.set_height(drop.get_height()) label_btn.set_text("New") btn.align(con, lv.ALIGN.IN_RIGHT_MID, -10, 0) def m3_1(): #load values to begin and duration con2 = lv.cont(scr) con2.align(con, lv.ALIGN.OUT_BOTTOM_MID, 0, 0) con2.set_fit2(lv.FIT.PARENT, lv.FIT.TIGHT) con2.set_style_local_radius(0, 0, 0) position = drop.get_selected() con3 = lv.cont(con2) con3.align(con2, lv.ALIGN.IN_TOP_MID, 0, 0) con3.set_fit2(lv.FIT.PARENT, lv.FIT.TIGHT) tittle = lv.label(con3) tittle.align(con3, lv.ALIGN.CENTER, 0, 0) tittle.set_text("Set Begin Time") minute_btn = lv.btn(con2) minute_btn.align(con3, lv.ALIGN.OUT_BOTTOM_MID, 0, 0) minute_btn.set_style_local_radius(0, 0, 0) minute_btn.set_fit(lv.FIT.TIGHT) lbl_minute_btn = lv.label(minute_btn) lbl_minute_btn.set_text(str(trigger[position].bminute)) hour_btn = lv.btn(con2) hour_btn.align(minute_btn, lv.ALIGN.OUT_LEFT_MID, 0, 0) hour_btn.set_style_local_radius(0, 0, 0) hour_btn.set_fit(lv.FIT.TIGHT) lbl_hour_btn = lv.label(hour_btn) lbl_hour_btn.set_text(str(trigger[position].bhour)) second_btn = lv.btn(con2) second_btn.align(minute_btn, lv.ALIGN.OUT_RIGHT_MID, 0, 0) second_btn.set_style_local_radius(0, 0, 0) second_btn.set_fit(lv.FIT.TIGHT) lvl_second_btn = lv.label(second_btn) lvl_second_btn.set_text(str(trigger[position].bsecond)) m3_1()
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)) 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()) hl = [{ "year": 2020, "month": 1, "day": 5 }, { "year": 2020, "month": 1, "day": 9 }] 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) 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) 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)) 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)) 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" ) list = lv.list(parent, None) list.set_scroll_propagation(True) list.set_size(grid_w, grid_h) 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" ] 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) # Make a button disabled if i == 4: btn.set_state(lv.btn.STATE.DISABLED) cal.set_highlighted_dates(hl, 2)
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 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) 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) h.set_style_local_value_str(lv.cont.PART.MAIN, lv.STATE.DEFAULT, "Basics") 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) 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) btn.set_width(button_width) label = lv.label(btn, None) label.set_text("Button") btn = lv.btn(h, btn) btn.toggle() label = lv.label(btn, None) label.set_text("Button") lv.switch(h, None) lv.checkbox(h, None) 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)
def __init__(self, parent, x_pos, y_pos, gui_ctrl): super().__init__(parent) self._gui_ctrl = gui_ctrl btn_style = self.get_style(lv.tabview.STYLE.BTN_REL) btn_style_or = lv.style_t() lv.style_copy(btn_style_or, btn_style) btn_style.body.padding.left = (parent.get_width() - x_pos) // 5 // 2 btn_style.body.padding.right = (parent.get_width() - x_pos) // 5 // 2 self.set_style(lv.tabview.STYLE.BTN_REL, btn_style) self.set_size(parent.get_width() - x_pos, parent.get_height() - y_pos) self.set_pos(x_pos, y_pos) self.set_anim_time(0) self.set_sliding(False) self.set_btns_pos(lv.tabview.BTNS_POS.LEFT) self.set_event_cb(self._tab_change_handler) self._t_start = self.add_tab("New Session") self._t_cal = self.add_tab("Calibration") self._t_other = self.add_tab("Other") self._t_done = self.add_tab("Done") self.set_tab_act(3, lv.ANIM.OFF) # Session screen # Stat new session self._new_sess = lv.cont(self._t_start) self._new_sess.set_fit(lv.FIT.FLOOD) self._new_sess.set_layout(lv.LAYOUT.PRETTY) self._new_session_label = RealignLabel( self._new_sess, "Set info, and start a new measuring session!", False) self._material_sel = lv.roller(self._new_sess) self._material_sel.set_options( "\n".join(material for material in MATERIAL_TYPE), lv.roller.MODE.INIFINITE) self._thickness_sel = lv.roller(self._new_sess) self._thickness_sel.set_options( "\n".join(thickness for thickness in THICKNESS_TYPE), lv.roller.MODE.INIFINITE) self._start_btn = TextBtn(self._new_sess, "Start", self._new_sess_cb) self._start_btn.set_style(lv.btn.STYLE.REL, btn_style_or) # Measuring Screen self._session = lv.cont(self._t_start) self._session.set_fit(lv.FIT.FLOOD) self._session.set_layout(lv.LAYOUT.PRETTY) self._session_label = RealignLabel(self._session, "\n\n\n", True) self._start_measure_btn = TextBtn(self._session, "New Panel", self._start_measure_cb) self._start_measure_btn.set_style(lv.btn.STYLE.REL, btn_style_or) self._done_measure_btn = TextBtn(self._session, "Finish", self._done_measure_cb) self._done_measure_btn.set_style(lv.btn.STYLE.REL, btn_style_or) self._re_measure_btn = TextBtn(self._session, "Re-measure", self._re_measure_cb) self._re_measure_btn.set_style(lv.btn.STYLE.REL, btn_style_or) self._chart = lv.chart(self._session) self._chart.set_height(90) self._chart.set_point_count(700) self._chart.set_range(11000, 13000) self._ser1 = self._chart.add_series(lv.color_hex(0x0000b3)) self._ser2 = self._chart.add_series(lv.color_hex(0xe60000)) self._ser3 = self._chart.add_series(lv.color_hex(0x00e600)) self._ser4 = self._chart.add_series(lv.color_hex(0xffffff)) self._session.set_hidden(True) lv.page.glue_obj(self._new_sess, True) lv.page.glue_obj(self._session, True) self._preload_cont = lv.cont(self._t_start) self._preload_cont.set_fit(lv.FIT.FLOOD) self._preload_cont.set_layout(lv.LAYOUT.CENTER) self._preload = lv.preload(self._preload_cont) self._preload_cont.set_hidden(True) # Calibration Screen self._cal_label = RealignLabel(self._t_cal, "Output: \n", False) self._cal_num_input = NumTextArea(self._t_cal, self.ta_test) self._cal_num_input.set_auto_realign(True) self._cal_num_input.align(self._cal_label, lv.ALIGN.OUT_BOTTOM_LEFT, 0, 0) self._set_cal_1 = TextBtn(self._t_cal, "Set Amp 1", self._set_amp_1_cb) self._set_cal_1.set_style(lv.btn.STYLE.REL, btn_style_or) self._set_cal_1.align(self._cal_num_input, lv.ALIGN.OUT_RIGHT_MID, 0, 0) self._set_cal_2 = TextBtn(self._t_cal, "Set Amp 2", self._set_amp_2_cb) self._set_cal_2.set_style(lv.btn.STYLE.REL, btn_style_or) self._set_cal_2.align(self._set_cal_1, lv.ALIGN.OUT_RIGHT_MID, 0, 0) self._kb = lv.kb(self._t_cal) self._kb.set_map(["1", "2", "3","\n","4","5", "6",\ "\n","7", "8", "9","\n","0",".","Bksp",""]) self._kb.set_height(180) self._kb.set_y(85) self._kb.set_ta(self._cal_num_input) # Laser Off Screen self._text = RealignLabel(self._t_done, "Laser Off", False) # Other Screen self._cal = lv.calendar(self._t_other) return
def __init__(self, x=None, y=None, min_value=0, max_value=100, value=50, divisions=5, legend=None, label_text=None, value_text_format=None, bar_color=lv_colors.BLUE, legend_color=lv_colors.YELLOW, value_color=lv_colors.WHITE, bg_color=lv_colors.BLACK): self.x = x self.y = y self.min_value = min_value self.max_value = max_value self.value = value self.width = 40 self.height = 104 self.label_text = label_text self.value_text_format = value_text_format self.bg_color = bg_color self.bar_color = bar_color self.value_color = value_color self.legend_color = legend_color self.base = 102 if legend: self.divisions = len(legend) - 1 else: self.divisions = divisions scr_style = lv.style_t() scr_style.set_bg_color(lv.STATE.DEFAULT, self.bg_color) lv.scr_act().add_style(lv.obj.PART.MAIN, scr_style) # create a container self.container = lv.cont(lv.scr_act(), None) self.container.set_fit(lv.FIT.TIGHT) self.container.align(None, lv.ALIGN.CENTER, 0, 0) if self.x: self.container.set_x(self.x) if self.y: self.container.set_y(self.y) self.container.add_style(lv.obj.PART.MAIN, scr_style) cbuf = bytearray(self.width * self.height * 4) # create a canvas self.canvas = lv.canvas(self.container, None) self.canvas.set_buffer(cbuf, self.width, self.height, lv.img.CF.TRUE_COLOR) self.canvas.align(self.container, lv.ALIGN.CENTER, 0, -50) text_style = lv.style_t() text_style.init() text_style.set_text_color(lv.STATE.DEFAULT, self.legend_color) if self.value_text_format: value_text_style = lv.style_t() value_text_style.init() value_text_style.set_text_color(lv.STATE.DEFAULT, self.value_color) self.value_label = lv.label(self.container) self.value_label.add_style(lv.label.PART.MAIN, value_text_style) value_text = self.value_text_format.format(self.value) self.value_label.set_text(value_text) if self.label_text: self.label = lv.label(self.container) self.label.set_text(label_text) self.label.align(self.canvas, lv.ALIGN.OUT_BOTTOM_MID, 0, 10) self.label.add_style(lv.label.PART.MAIN, text_style) if self.value_text_format: self.value_label.align(self.label, lv.ALIGN.OUT_BOTTOM_MID, 0, 0) else: self.value_label.align(self.canvas, lv.ALIGN.OUT_BOTTOM_MID, 0, 10) #bar = lv_bar(container) p1 = lv.point_t() p2 = lv.point_t() point_array = [p1, p2] # style for horizontal lines self.hline_dsc = lv.draw_line_dsc_t() self.hline_dsc.init() self.hline_dsc.color = self.legend_color self.hline_dsc.opa = lv.OPA.COVER rect_dsc = lv.draw_rect_dsc_t() rect_dsc.init() rect_dsc.bg_opa = lv.OPA.TRANSP rect_dsc.border_color = self.legend_color rect_dsc.bg_color = lv_colors.BLACK rect_dsc.border_width = 1 # draw the outline, tock marks, legend and value text self.canvas.draw_rect(0, 0, self.width, self.height, rect_dsc) if self.divisions > 0: dy = (self.height - 4) / self.divisions # Tick marks # print("dy: ",dy) for tick in range(self.divisions + 1): ypos = int(dy * tick) p1.x = self.width // 5 p1.y = ypos + 2 p2.x = p1.x + self.width - 2 * self.width // 5 p2.y = p1.y self.canvas.draw_line(point_array, 2, self.hline_dsc) # print("tick: %d, pos: %d"%(tick,p1.y)) if legend: label = lv.label(self.container) label.align(self.canvas, lv.ALIGN.OUT_RIGHT_TOP, 5, ypos - 5) label.set_text(legend[self.divisions - tick]) label.add_style(lv.label.PART.MAIN, text_style) self.base = p1.y # draw the value rectangle # print("max: ",self.max_value) value_y = round( (self.height - 4) / (self.max_value - self.min_value) * self.value) rect_dsc.bg_color = self.bar_color rect_dsc.bg_opa = lv.OPA.COVER rect_dsc.border_width = 0 # print("Pos of last tick: ",p1.y) # print("bar height: ",value_y) self.canvas.draw_rect(self.width // 5 + 5, self.base - value_y, 2 * self.width // 5, value_y, rect_dsc)
def main_page(self, tile_num): # create the GUI self.weather_app_tile = self.mainbar.get_tile_obj(tile_num) weather_style = lv.style_t() weather_style.copy(self.mainbar.get_style()) weather_cont = lv.obj(self.weather_app_tile, None) weather_cont.set_size(lv.scr_act().get_disp().driver.hor_res, 30) weather_cont.add_style(lv.cont.PART.MAIN, weather_style) # create date label and left right buttons btn_style = lv.style_t() btn_style.copy(weather_style) btn_style.set_radius(lv.btn.STATE.RELEASED, 2) self.left_button = lv.btn(weather_cont, None) self.left_button.set_size(25, 25) self.left_button.add_style(lv.btn.PART.MAIN, btn_style) left_label = lv.label(self.left_button, None) left_label.set_text(lv.SYMBOL.LEFT) self.left_button.align(weather_cont, lv.ALIGN.IN_LEFT_MID, 5, 0) self.left_button.set_hidden(True) self.left_button.set_event_cb(self.decrement_day) self.date_label = lv.label(weather_cont, None) self.date_label.set_text(self.date[self.day_index]) self.date_label.align(weather_cont, lv.ALIGN.CENTER, 0, 0) self.right_button = lv.btn(weather_cont, None) self.right_button.set_size(25, 25) self.right_button.add_style(lv.btn.PART.MAIN, btn_style) right_label = lv.label(self.right_button, None) right_label.set_text(lv.SYMBOL.RIGHT) self.right_button.align(weather_cont, lv.ALIGN.IN_RIGHT_MID, -5, 0) self.right_button.set_event_cb(self.increment_day) icon_cont_style = lv.style_t() icon_cont_style.copy(weather_style) icon_cont_style.set_bg_opa(lv.obj.PART.MAIN, lv.OPA.TRANSP) icon_cont = lv.cont(self.weather_app_tile, None) icon_cont.set_layout(lv.LAYOUT.COLUMN_LEFT) icon_cont.add_style(lv.cont.PART.MAIN, icon_cont_style) icon_cont.set_fit(lv.FIT.TIGHT) self.icon = lv.img(icon_cont, None) key_list = list(self.icon_filename.keys()) self.log.debug(key_list) index = key_list.index(self.weather_state_abbr[self.day_index]) self.log.debug("index of %s: %d" % (self.weather_state_abbr[self.day_index], index)) self.icon.set_src(self.icon_dsc[index]) icon_cont.align(weather_cont, lv.ALIGN.OUT_BOTTOM_LEFT, 0, 0) self.state_label = lv.label(icon_cont, None) self.state_label.set_width(100) self.state_label.set_text(self.weather_state_name[self.day_index]) info_cont_style = lv.style_t() info_cont_style.copy(weather_style) info_cont_style.set_pad_top(lv.STATE.DEFAULT, 6) info_cont_style.set_pad_inner(lv.STATE.DEFAULT, 4) info_cont = lv.cont(self.weather_app_tile, None) info_cont.set_size(lv.scr_act().get_disp().driver.hor_res, 90) info_cont.set_layout(lv.LAYOUT.COLUMN_LEFT) info_cont.add_style(lv.cont.PART.MAIN, icon_cont_style) info_cont.set_fit(lv.FIT.NONE) info_cont.align(icon_cont, lv.ALIGN.OUT_BOTTOM_LEFT, 0, 0) info_cont.add_style(lv.cont.PART.MAIN, info_cont_style) self.confidence_label = lv.label(info_cont, None) self.confidence_label.set_text("Confidence level: {}%".format( self.predic[self.day_index])) self.temp_label = lv.label(info_cont, None) self.temp_label.set_text( "Temp: min: %3.1f°C, max: %3.1f°C" % (self.min_temp[self.day_index], self.max_temp[self.day_index])) self.humidity_label = lv.label(info_cont, None) self.humidity_label.set_text("Humidity: {}%".format( self.humid[self.day_index])) self.pressure_label = lv.label(info_cont, None) self.pressure_label.set_text("Air pressure: %d hPa" % self.air_pressure[self.day_index]) info_cont2 = lv.cont(self.weather_app_tile, None) # info_cont2.set_size(140,120) info_cont2.set_layout(lv.LAYOUT.COLUMN_LEFT) info_cont2.add_style(lv.cont.PART.MAIN, icon_cont_style) info_cont2.set_fit(lv.FIT.TIGHT) info_cont2.align(icon_cont, lv.ALIGN.OUT_RIGHT_TOP, -5, 0) info_cont2.add_style(lv.cont.PART.MAIN, info_cont_style) self.location_label = lv.label(info_cont2, None) self.location_label.set_text("Location: " + self.location) self.wind_label = lv.label(info_cont2, None) self.wind_label.set_text("Wind:\nspeed: %5.1f kph\ndir: %s" % (self.wind_speed[self.day_index], self.wind_direction[self.day_index])) exit_btn = lv.imgbtn(self.weather_app_tile, None) exit_btn.set_src(lv.btn.STATE.RELEASED, self.mainbar.get_exit_btn_dsc()) exit_btn.set_src(lv.btn.STATE.PRESSED, self.mainbar.get_exit_btn_dsc()) exit_btn.set_src(lv.btn.STATE.CHECKED_RELEASED, self.mainbar.get_exit_btn_dsc()) exit_btn.set_src(lv.btn.STATE.CHECKED_PRESSED, self.mainbar.get_exit_btn_dsc()) exit_btn.align(self.weather_app_tile, lv.ALIGN.IN_BOTTOM_RIGHT, -10, -10) exit_btn.set_event_cb(self.exit_weather_app_event_cb)
def usb_icon_event_cb(self, obj, evt): if evt == lv.EVENT.CLICKED: self.anim_out_all(lv.scr_act(), 0) delay = 200 back = self.add_back(self.back_to_print_event_cb) self.anim_in(back, delay) title = self.add_title("PRINTING FROM USB DRIVE") self.anim_in(title, delay) box_w = self.LV_HOR_RES * 5 // 10 list = lv.list(lv.scr_act(), None) list.set_size(box_w, self.LV_VER_RES // 2) list.align(None, lv.ALIGN.IN_TOP_LEFT, self.LV_HOR_RES // 20, self.LV_VER_RES // 5) dummy_file_list = [ "Contract 12.pdf", "Scanned_05_21.pdf", "Photo_132210.jpg", "Photo_232141.jpg", "Photo_091640.jpg", "Photo_124019.jpg", "Photo_232032.jpg", "Photo_232033.jpg", "Photo_232034.jpg", "Monday schedule.pdf", "Email from John.txt", "New file.txt", "Untitled.txt", "Untitled (1).txt", "Gallery_40.jpg", "Gallery_41.jpg", "Gallery_42.jpg", "Gallery_43.jpg", "Gallery_44.jpg" ] for filename in dummy_file_list: btn = lv.btn.__cast__(list.add_btn(lv.SYMBOL.FILE, filename)) btn.set_checkable(True) self.theme.apply(btn, lv.THEME.LIST_BTN) dropdown_box = lv.obj(lv.scr_act(), None) dropdown_box.set_size(box_w, self.LV_VER_RES // 5) dropdown_box.align(list, lv.ALIGN.OUT_BOTTOM_MID, 0, self.LV_HOR_RES // 30) dropdown = lv.dropdown(dropdown_box, None) dropdown.align(None, lv.ALIGN.IN_LEFT_MID, self.LV_HOR_RES // 60, 0) dropdown.set_max_height(self.LV_VER_RES // 3) dropdown.set_options_static("Best\nNormal\nDraft") dropdown.set_width((box_w - 3 * self.LV_HOR_RES // 60) // 2) dropdown.set_ext_click_area(5, 5, 5, 5) self.theme.apply(dropdown, lv.THEME.DROPDOWN) dropdown = lv.dropdown(dropdown_box, dropdown) dropdown.align(None, lv.ALIGN.IN_RIGHT_MID, -self.LV_HOR_RES // 60, 0) # dropdown.set_options_static("100 DPI\n200 DPI\n300 DPI\n400 DPI\n500 DPI\n1500 DPI") dropdown.set_options_static("\n".join([ "100 DPI", "200 DPI", "300 DPI", "400 DPI", "500 DPI", "1500 DPI" ])) self.theme.apply(dropdown, lv.THEME.DROPDOWN) box_w = 320 - 40 settings_box = lv.obj(lv.scr_act(), None) settings_box.set_size(box_w, self.LV_VER_RES // 2) settings_box.align(list, lv.ALIGN.OUT_RIGHT_TOP, self.LV_HOR_RES // 20, 0) self.print_cnt = 1 numbox = lv.cont(settings_box, None) self.theme.apply(numbox, LV_DEMO_PRINTER_THEME_BOX_BORDER) numbox.set_size(self.LV_HOR_RES // 7, self.LV_HOR_RES // 13) numbox.align(settings_box, lv.ALIGN.IN_TOP_MID, 0, self.LV_VER_RES // 10) numbox.set_style_local_value_str(lv.obj.PART.MAIN, lv.STATE.DEFAULT, "Copies") numbox.set_style_local_value_align(lv.obj.PART.MAIN, lv.STATE.DEFAULT, lv.ALIGN.OUT_TOP_MID) numbox.set_style_local_value_ofs_y(lv.obj.PART.MAIN, lv.STATE.DEFAULT, -self.LV_VER_RES // 50) numbox.set_style_local_value_font(lv.obj.PART.MAIN, lv.STATE.DEFAULT, self.theme.get_font_subtitle()) numbox.set_layout(lv.LAYOUT.CENTER) self.print_cnt_label = lv.label(numbox, None) self.print_cnt_label.set_text("1") self.print_cnt_label.set_style_local_text_font( lv.label.PART.MAIN, lv.STATE.DEFAULT, self.theme.get_font_subtitle()) btn = lv.btn(settings_box, None) btn.set_size(self.LV_HOR_RES // 13, self.LV_HOR_RES // 13) btn.align(numbox, lv.ALIGN.OUT_LEFT_MID, -self.LV_VER_RES // 60, 0) btn.set_style_local_value_str(lv.obj.PART.MAIN, lv.STATE.DEFAULT, lv.SYMBOL.DOWN) btn.set_style_local_value_font(lv.obj.PART.MAIN, lv.STATE.DEFAULT, self.theme.get_font_subtitle()) btn.set_event_cb(self.print_cnt_btn_event_cb) btn.set_ext_click_area(10, 10, 10, 10) self.theme.apply(btn, lv.THEME.BTN) sw = lv.switch(settings_box, None) sw.set_size(self.LV_HOR_RES // 10, self.LV_VER_RES // 12) sw.align(btn, lv.ALIGN.OUT_BOTTOM_LEFT, self.LV_HOR_RES // 50, self.LV_VER_RES // 7) sw.set_style_local_value_ofs_y(lv.obj.PART.MAIN, lv.STATE.DEFAULT, -self.LV_VER_RES // 50) sw.set_style_local_value_align(lv.obj.PART.MAIN, lv.STATE.DEFAULT, lv.ALIGN.OUT_TOP_MID) sw.set_style_local_value_str(lv.obj.PART.MAIN, lv.STATE.DEFAULT, "Color") sw.set_style_local_value_font(lv.obj.PART.MAIN, lv.STATE.DEFAULT, self.theme.get_font_subtitle()) self.theme.apply(sw, lv.THEME.SWITCH) btn = lv.btn(settings_box, btn) btn.align(numbox, lv.ALIGN.OUT_RIGHT_MID, self.LV_VER_RES // 60, 0) btn.set_style_local_value_str(lv.obj.PART.MAIN, lv.STATE.DEFAULT, lv.SYMBOL.UP) btn.set_style_local_value_font(lv.obj.PART.MAIN, lv.STATE.DEFAULT, self.theme.get_font_subtitle()) self.theme.apply(btn, lv.THEME.BTN) btn.set_event_cb(self.print_cnt_btn_event_cb) sw = lv.switch(settings_box, sw) sw.align(btn, lv.ALIGN.OUT_BOTTOM_RIGHT, -self.LV_HOR_RES // 50, self.LV_VER_RES // 7) sw.set_style_local_value_str(lv.obj.PART.MAIN, lv.STATE.DEFAULT, "Vertical") self.theme.apply(sw, lv.THEME.SWITCH) print_btn = lv.btn(lv.scr_act(), None) self.theme.apply(print_btn, LV_DEMO_PRINTER_THEME_BTN_CIRCLE) print_btn.set_size(box_w, 60) btn_ofs_y = (dropdown_box.get_height() - print_btn.get_height()) // 2 print_btn.align(settings_box, lv.ALIGN.OUT_BOTTOM_MID, 0, self.LV_HOR_RES // 30 + btn_ofs_y) print_btn.set_style_local_value_str(lv.obj.PART.MAIN, lv.STATE.DEFAULT, "PRINT") print_btn.set_style_local_value_font( lv.obj.PART.MAIN, lv.STATE.DEFAULT, self.theme.get_font_subtitle()) print_btn.set_style_local_bg_color(lv.obj.PART.MAIN, lv.STATE.DEFAULT, LV_DEMO_PRINTER_GREEN) print_btn.set_style_local_bg_color( lv.obj.PART.MAIN, lv.STATE.PRESSED, LV_DEMO_PRINTER_GREEN.color_darken(lv.OPA._20)) print_btn.set_event_cb(self.print_start_event_cb) delay += self.LV_DEMO_PRINTER_ANIM_DELAY self.anim_in(list, delay) delay += self.LV_DEMO_PRINTER_ANIM_DELAY self.anim_in(settings_box, delay) delay += self.LV_DEMO_PRINTER_ANIM_DELAY self.anim_in(dropdown_box, delay) delay += self.LV_DEMO_PRINTER_ANIM_DELAY self.anim_in(print_btn, delay) self.anim_bg(0, LV_DEMO_PRINTER_BLUE, self.LV_DEMO_PRINTER_BG_NORMAL)
def home_open(self, delay): self.bg_top.set_style_local_bg_opa(lv.obj.PART.MAIN, lv.STATE.DEFAULT, lv.OPA.COVER) self.bg_top.set_style_local_bg_color(lv.obj.PART.MAIN, lv.STATE.DEFAULT, LV_DEMO_PRINTER_BLUE) self.bg_top.set_y(self.LV_DEMO_PRINTER_BG_NORMAL) self.cont = lv.cont(lv.scr_act(), None) self.cont.set_size(350, 80) self.cont.clean_style_list(lv.cont.PART.MAIN) self.cont.align(None, lv.ALIGN.IN_TOP_LEFT, 60, 0) icon = lv.img(self.cont, None) icon.set_src(self.icon_wifi_dsc) icon.align(None, lv.ALIGN.IN_TOP_LEFT, 20, 45) self.anim_in(icon, delay) icon = lv.img(self.cont, None) icon.set_src(self.icon_tel_dsc) icon.align(None, lv.ALIGN.IN_TOP_LEFT, 110, 45) self.anim_in(icon, delay) icon = lv.img(self.cont, None) icon.set_src(self.icon_eco_dsc) icon.align(None, lv.ALIGN.IN_TOP_LEFT, 200, 45) self.anim_in(icon, delay) icon = lv.img(self.cont, None) icon.set_src(self.icon_pc_dsc) icon.align(None, lv.ALIGN.IN_TOP_LEFT, 290, 45) self.anim_in(icon, delay) title = self.add_title("23 February 2021 20:13") title.align(None, lv.ALIGN.IN_TOP_RIGHT, -60, LV_DEMO_PRINTER_TITLE_PAD) delay += self.LV_DEMO_PRINTER_ANIM_DELAY self.anim_in(title, delay) box_w = 720 box = lv.obj(lv.scr_act(), None) box.set_size(box_w, 260) self.theme.apply(box, lv.THEME.CONT) box.align(None, lv.ALIGN.IN_TOP_MID, 0, 100) delay += self.LV_DEMO_PRINTER_ANIM_DELAY self.anim_in(box, delay) icon = self.add_icon(box, self.img_btn_bg_1_dsc, self.img_copy_dsc, "COPY") icon.align(None, lv.ALIGN.IN_LEFT_MID, 1 * (box_w - 20) // 8 - 80, 0) icon.set_event_cb(self.copy_open_icon_event_cb) icon.fade_in(self.LV_DEMO_PRINTER_ANIM_TIME * 2, delay + self.LV_DEMO_PRINTER_ANIM_TIME + 50) icon = self.add_icon(box, self.img_btn_bg_2_dsc, self.img_scan_dsc, "SCAN") icon.align(None, lv.ALIGN.IN_LEFT_MID, 3 * (box_w - 20) // 8 - 80, 0) icon.fade_in(self.LV_DEMO_PRINTER_ANIM_TIME * 2, delay + self.LV_DEMO_PRINTER_ANIM_TIME + 50) icon.set_event_cb(self.scan_open_icon_event_cb) icon = self.add_icon(box, self.img_btn_bg_3_dsc, self.img_print_dsc, "PRINT") icon.align(None, lv.ALIGN.IN_LEFT_MID, 5 * (box_w - 20) // 8 - 80, 0) icon.fade_in(self.LV_DEMO_PRINTER_ANIM_TIME * 2, delay + self.LV_DEMO_PRINTER_ANIM_TIME + 50) icon.set_event_cb(self.print_open_event_cb) icon = self.add_icon(box, self.img_btn_bg_4_dsc, self.img_setup_dsc, "SETUP") icon.align(None, lv.ALIGN.IN_LEFT_MID, 7 * (box_w - 20) // 8 - 80, 0) icon.fade_in(self.LV_DEMO_PRINTER_ANIM_TIME * 2, delay + self.LV_DEMO_PRINTER_ANIM_TIME + 50) icon.set_event_cb(self.setup_icon_event_cb) box = lv.obj(lv.scr_act(), None) box.set_size(500, 80) box.align(None, lv.ALIGN.IN_BOTTOM_LEFT, self.LV_HOR_RES // 20, -self.LV_HOR_RES // 40) label = lv.label(box, None) label.set_text("What do you want to do today?") self.theme.apply(label, lv.THEME.LABEL) label.align(box, lv.ALIGN.CENTER, 0, 0) delay += self.LV_DEMO_PRINTER_ANIM_DELAY self.anim_in(box, delay) box = lv.obj(lv.scr_act(), None) box_w = 200 box.set_size(box_w, 80) box.align(None, lv.ALIGN.IN_BOTTOM_RIGHT, -self.LV_HOR_RES // 20, -self.LV_HOR_RES // 40) bar = lv.bar(box, None) bar.set_style_local_bg_color(lv.bar.PART.INDIC, lv.STATE.DEFAULT, lv.color_hex(0x01d3d4)) bar.set_size(25, 50) bar.align(None, lv.ALIGN.IN_LEFT_MID, 1 * (box_w - 20) // 8 + 10, 0) bar.set_value(60, lv.ANIM.ON) bar = lv.bar(box, None) bar.set_style_local_bg_color(lv.bar.PART.INDIC, lv.STATE.DEFAULT, lv.color_hex(0xe600e6)) bar.set_size(25, 50) bar.align(None, lv.ALIGN.IN_LEFT_MID, 3 * (box_w - 20) // 8 + 10, 0) bar.set_value(30, lv.ANIM.ON) bar = lv.bar(box, None) bar.set_style_local_bg_color(lv.bar.PART.INDIC, lv.STATE.DEFAULT, lv.color_hex(0xefef01)) bar.set_size(25, 50) bar.align(None, lv.ALIGN.IN_LEFT_MID, 5 * (box_w - 20) // 8 + 10, 0) bar.set_value(80, lv.ANIM.ON) bar = lv.bar(box, None) bar.set_style_local_bg_color(lv.bar.PART.INDIC, lv.STATE.DEFAULT, lv.color_hex(0x1d1d25)) bar.set_size(25, 50) bar.align(None, lv.ALIGN.IN_LEFT_MID, 7 * (box_w - 20) // 8 + 10, 0) bar.set_value(20, lv.ANIM.ON)
# Set a very visible color for the screen to clearly see what happens lv.scr_act().set_style_local_bg_color(lv.obj.PART.MAIN, lv.STATE.DEFAULT, lv.color_hex3(0xf33)) om = lv.objmask(lv.scr_act(), None) om.set_size(200, 200) om.align(None, lv.ALIGN.CENTER, 0, 0) label = lv.label(om, None) label.set_long_mode(lv.label.LONG.BREAK) label.set_align(lv.label.ALIGN.CENTER) label.set_width(180) label.set_text("This label will be masked out. See how it works.") label.align(None, lv.ALIGN.IN_TOP_MID, 0, 20) cont = lv.cont(om, None) cont.set_size(180, 100) cont.set_drag(True) cont.align(None, lv.ALIGN.IN_BOTTOM_MID, 0, -10) btn = lv.btn(cont, None) btn.align(None, lv.ALIGN.CENTER, 0, 0) btn.set_style_local_value_str(lv.btn.PART.MAIN, lv.STATE.DEFAULT, "Button") lv.refr_now(None) t = lv.tick_get() while lv.tick_elaps(t) < 1000: pass a = lv.area_t() r1 = lv.draw_mask_radius_param_t()
# m7() # dashboard #btn_event def btn_event(obj, event): if obj == home_button and event == lv.EVENT.CLICKED: m5() #gui code scr = lv.obj() lv.scr_load(scr) cont = lv.cont(scr) cont.align(scr, lv.ALIGN.IN_TOP_MID, 0, 0) cont.set_style_local_radius(0, 0, 0) cont.set_fit2(lv.FIT.PARENT, lv.FIT.TIGHT) home_button = lv.btn(cont) home_button.align(cont, lv.ALIGN.IN_LEFT_MID,0,10) home_button.set_fit(lv.FIT.TIGHT) lbl_home = lv.label(home_button) lbl_home.set_text(lv.SYMBOL.HOME) lbl_home.set_event_cb(btn_event) lbl_header = lv.label(cont) lbl_header.set_text("Dashboard")
def scan_next_event_cb(self, obj, evt): LV_IMG_ZOOM_NONE = 250 if evt == lv.EVENT.CLICKED: self.anim_out_all(lv.scr_act(), 0) delay = 400 back = self.add_back(self.back_to_home_event_cb) self.anim_in(back, delay) title = self.add_title("ADJUST IMAGE") self.anim_in(title, delay) box_w = 400 self.scan_img.set_pivot(0, 0) self.scan_img.set_antialias(False) a = lv.anim_t() a.init() a.set_var(self.scan_img) a.set_custom_exec_cb( lambda a, val: self.set_zoom(self.scan_img, val)) a.set_values(LV_IMG_ZOOM_NONE, 190) a.set_time(200) a.set_delay(200) lv.anim_t.start(a) # self.scan_img = None # To allow anim out dropdown_box = lv.obj(lv.scr_act(), None) dropdown_box.set_size(box_w, self.LV_VER_RES // 5) dropdown_box.align(None, lv.ALIGN.IN_BOTTOM_LEFT, 40, -20) dropdown = lv.dropdown(dropdown_box, None) dropdown.align(None, lv.ALIGN.IN_LEFT_MID, self.LV_HOR_RES // 60, 0) dropdown.set_max_height(self.LV_VER_RES // 3) dropdown.set_options_static("Best\nNormal\nDraft") dropdown.set_width((box_w - 3 * self.LV_HOR_RES // 60) // 2) self.theme.apply(dropdown, lv.THEME.DROPDOWN) dropdown = lv.dropdown(dropdown_box, dropdown) dropdown.align(None, lv.ALIGN.IN_RIGHT_MID, -self.LV_HOR_RES // 60, 0) dropdown.set_options_static( "72 DPI\n96 DPI\n150 DPI\n300 DPI\n600 DPI\n900 DPI\n1200 DPI") self.theme.apply(dropdown, lv.THEME.DROPDOWN) box_w = 320 - 40 settings_box = lv.obj(lv.scr_act(), None) settings_box.set_size(box_w, self.LV_VER_RES // 2) settings_box.align(None, lv.ALIGN.IN_TOP_RIGHT, -40, 100) numbox = lv.cont(settings_box, None) self.theme.apply(numbox, LV_DEMO_PRINTER_THEME_BOX_BORDER) numbox.set_size(self.LV_HOR_RES // 7, self.LV_HOR_RES // 13) numbox.align(settings_box, lv.ALIGN.IN_TOP_MID, 0, self.LV_VER_RES // 10) numbox.set_style_local_value_str(lv.obj.PART.MAIN, lv.STATE.DEFAULT, "Copies") numbox.set_style_local_value_align(lv.obj.PART.MAIN, lv.STATE.DEFAULT, lv.ALIGN.OUT_TOP_MID) numbox.set_style_local_value_ofs_y(lv.obj.PART.MAIN, lv.STATE.DEFAULT, -self.LV_VER_RES // 50) numbox.set_style_local_value_font(lv.obj.PART.MAIN, lv.STATE.DEFAULT, self.theme.get_font_subtitle()) numbox.set_layout(lv.LAYOUT.CENTER) self.print_cnt = 1 self.print_cnt_label = lv.label(numbox, None) self.print_cnt_label.set_text("1") self.print_cnt_label.set_style_local_text_font( lv.label.PART.MAIN, lv.STATE.DEFAULT, self.theme.get_font_subtitle()) btn = lv.btn(settings_box, None) btn.set_size(self.LV_HOR_RES // 13, self.LV_HOR_RES // 13) btn.align(numbox, lv.ALIGN.OUT_LEFT_MID, -self.LV_VER_RES // 60, 0) btn.set_style_local_value_str(lv.obj.PART.MAIN, lv.STATE.DEFAULT, lv.SYMBOL.DOWN) btn.set_style_local_value_font(lv.obj.PART.MAIN, lv.STATE.DEFAULT, self.theme.get_font_subtitle()) btn.set_event_cb(self.print_cnt_btn_event_cb) btn.set_ext_click_area(10, 10, 10, 10) self.theme.apply(btn, lv.THEME.BTN) sw = lv.switch(settings_box, None) sw.set_size(self.LV_HOR_RES // 10, self.LV_VER_RES // 12) sw.align(btn, lv.ALIGN.OUT_BOTTOM_LEFT, self.LV_HOR_RES // 50, self.LV_VER_RES // 7) sw.set_style_local_value_ofs_y(lv.obj.PART.MAIN, lv.STATE.DEFAULT, -self.LV_VER_RES // 50) sw.set_style_local_value_align(lv.obj.PART.MAIN, lv.STATE.DEFAULT, lv.ALIGN.OUT_TOP_MID) sw.set_style_local_value_str(lv.obj.PART.MAIN, lv.STATE.DEFAULT, "Color") sw.set_style_local_value_font(lv.obj.PART.MAIN, lv.STATE.DEFAULT, self.theme.get_font_subtitle()) self.theme.apply(sw, lv.THEME.SWITCH) btn = lv.btn(settings_box, btn) btn.align(numbox, lv.ALIGN.OUT_RIGHT_MID, self.LV_VER_RES // 60, 0) btn.set_style_local_value_str(lv.obj.PART.MAIN, lv.STATE.DEFAULT, lv.SYMBOL.UP) btn.set_event_cb(self.print_cnt_btn_event_cb) self.theme.apply(btn, lv.THEME.BTN) sw = lv.switch(settings_box, sw) sw.align(btn, lv.ALIGN.OUT_BOTTOM_RIGHT, -self.LV_HOR_RES // 50, self.LV_VER_RES // 7) sw.set_style_local_value_str(lv.obj.PART.MAIN, lv.STATE.DEFAULT, "Vertical") print_btn = lv.btn(lv.scr_act(), None) self.theme.apply(print_btn, LV_DEMO_PRINTER_THEME_BTN_CIRCLE) print_btn.set_size(box_w, 60) print_btn.set_event_cb(self.print_start_event_cb) btn_ofs_y = (dropdown_box.get_height() - print_btn.get_height()) // 2 print_btn.align(settings_box, lv.ALIGN.OUT_BOTTOM_MID, 0, self.LV_HOR_RES // 30 + btn_ofs_y) print_btn.set_style_local_value_str(lv.obj.PART.MAIN, lv.STATE.DEFAULT, "PRINT") print_btn.set_style_local_value_font( lv.obj.PART.MAIN, lv.STATE.DEFAULT, self.theme.get_font_subtitle()) print_btn.set_style_local_bg_color(lv.obj.PART.MAIN, lv.STATE.DEFAULT, LV_DEMO_PRINTER_GREEN) print_btn.set_style_local_bg_color( lv.obj.PART.MAIN, lv.STATE.PRESSED, LV_DEMO_PRINTER_GREEN.color_darken(lv.OPA._20)) delay += self.LV_DEMO_PRINTER_ANIM_DELAY self.anim_in(settings_box, delay) delay += self.LV_DEMO_PRINTER_ANIM_DELAY self.anim_in(dropdown_box, delay) delay += self.LV_DEMO_PRINTER_ANIM_DELAY self.anim_in(print_btn, delay) self.anim_bg(0, LV_DEMO_PRINTER_BLUE, self.LV_DEMO_PRINTER_BG_NORMAL)
def popup_pid_params(self): """ The popup window of PID params settings """ modal_style = lv.style_t() lv.style_copy(modal_style, lv.style_plain_color) modal_style.body.main_color = modal_style.body.grad_color = lv.color_make( 0, 0, 0) modal_style.body.opa = lv.OPA._50 bg = lv.obj(self.main_scr) bg.set_style(modal_style) bg.set_pos(0, 0) bg.set_size(self.main_scr.get_width(), self.main_scr.get_height()) bg.set_opa_scale_enable(True) # init mbox and title popup_pid = lv.mbox(bg) popup_pid.set_text('Set PID Params') popup_pid.set_size(220, 300) popup_pid.align(bg, lv.ALIGN.CENTER, 0, 0) input_cont = lv.cont(popup_pid) input_cont.set_size(210, 180) def input_event_cb(ta, event): if event == lv.EVENT.CLICKED: self.current_input_placeholder = ta.get_placeholder_text() if self.current_input_placeholder == 'Set Offset': popup_pid.align(bg, lv.ALIGN.CENTER, 0, -55) else: popup_pid.align(bg, lv.ALIGN.CENTER, 0, 0) if kb.get_hidden(): kb.set_hidden(False) # Focus on the clicked text area kb.set_ta(ta) def keyboard_event_cb(event_kb, event): event_kb.def_event_cb(event) if event == lv.EVENT.CANCEL or event == lv.EVENT.APPLY: kb.set_hidden(True) if self.current_input_placeholder == 'Set Offset': popup_pid.align(bg, lv.ALIGN.CENTER, 0, 0) # init keyboard kb = lv.kb(bg) kb.set_cursor_manage(True) kb.set_event_cb(keyboard_event_cb) lv.kb.set_mode(kb, lv.kb.MODE.NUM) rel_style = lv.style_t() pr_style = lv.style_t() lv.style_copy(rel_style, lv.style_btn_rel) rel_style.body.radius = 0 rel_style.body.border.width = 1 lv.style_copy(pr_style, lv.style_btn_pr) pr_style.body.radius = 0 pr_style.body.border.width = 1 kb.set_style(lv.kb.STYLE.BG, lv.style_transp_tight) kb.set_style(lv.kb.STYLE.BTN_REL, rel_style) kb.set_style(lv.kb.STYLE.BTN_PR, pr_style) # init text areas kp_input = lv.ta(input_cont) kp_input.set_text(str(self.pid_params.get('kp'))) kp_input.set_placeholder_text('Set Kp') kp_input.set_accepted_chars('0123456789.+-') kp_input.set_one_line(True) kp_input.set_width(120) kp_input.align(input_cont, lv.ALIGN.IN_TOP_MID, 30, 20) kp_input.set_event_cb(input_event_cb) kp_label = lv.label(input_cont) kp_label.set_text("Kp: ") kp_label.align(kp_input, lv.ALIGN.OUT_LEFT_MID, 0, 0) pid_title_label = lv.label(input_cont) pid_title_label.set_text("PID Params:") pid_title_label.align(kp_input, lv.ALIGN.OUT_TOP_LEFT, -65, 0) ki_input = lv.ta(input_cont) ki_input.set_text(str(self.pid_params.get('ki'))) ki_input.set_placeholder_text('Set Ki') ki_input.set_accepted_chars('0123456789.+-') ki_input.set_one_line(True) ki_input.set_width(120) ki_input.align(input_cont, lv.ALIGN.IN_TOP_MID, 30, 55) ki_input.set_event_cb(input_event_cb) ki_input.set_cursor_type(lv.CURSOR.LINE | lv.CURSOR.HIDDEN) ki_label = lv.label(input_cont) ki_label.set_text("Ki: ") ki_label.align(ki_input, lv.ALIGN.OUT_LEFT_MID, 0, 0) kd_input = lv.ta(input_cont) kd_input.set_text(str(self.pid_params.get('kd'))) kd_input.set_placeholder_text('Set Kd') kd_input.set_accepted_chars('0123456789.+-') kd_input.set_one_line(True) kd_input.set_width(120) kd_input.align(input_cont, lv.ALIGN.IN_TOP_MID, 30, 90) kd_input.set_event_cb(input_event_cb) kd_input.set_cursor_type(lv.CURSOR.LINE | lv.CURSOR.HIDDEN) kd_label = lv.label(input_cont) kd_label.set_text("Kd: ") kd_label.align(kd_input, lv.ALIGN.OUT_LEFT_MID, 0, 0) temp_offset_input = lv.ta(input_cont) temp_offset_input.set_text(str(self.temp_offset)) temp_offset_input.set_placeholder_text('Set Offset') temp_offset_input.set_accepted_chars('0123456789.+-') temp_offset_input.set_one_line(True) temp_offset_input.set_width(120) temp_offset_input.align(input_cont, lv.ALIGN.IN_TOP_MID, 30, 145) temp_offset_input.set_event_cb(input_event_cb) temp_offset_input.set_cursor_type(lv.CURSOR.LINE | lv.CURSOR.HIDDEN) temp_offset_label = lv.label(input_cont) temp_offset_label.set_text("Offset: ") temp_offset_label.align(temp_offset_input, lv.ALIGN.OUT_LEFT_MID, 0, 0) offset_title_label = lv.label(input_cont) offset_title_label.set_text("Temp Correction:") offset_title_label.align(temp_offset_input, lv.ALIGN.OUT_TOP_LEFT, -65, 0) # set btns to mbox btns = ['Save', 'Cancel', ''] popup_pid.add_btns(btns) lv.cont.set_fit(popup_pid, lv.FIT.NONE) mbox_style = popup_pid.get_style(popup_pid.STYLE.BTN_REL) popup_pid_style = lv.style_t() lv.style_copy(popup_pid_style, mbox_style) popup_pid_style.body.padding.bottom = 46 popup_pid.set_style(popup_pid.STYLE.BTN_REL, popup_pid_style) popup_pid.set_size(220, 300) def event_handler(obj, event): if event == lv.EVENT.VALUE_CHANGED: active_btn_text = popup_pid.get_active_btn_text() if active_btn_text == 'Save': kp_value = float(kp_input.get_text()) ki_value = float(ki_input.get_text()) kd_value = float(kd_input.get_text()) temp_offset_value = float(temp_offset_input.get_text()) self.config['pid'] = { 'kp': kp_value, 'ki': ki_value, 'kd': kd_value } self.config['sensor_offset'] = temp_offset_value self.pid_params = self.config.get('pid') self.temp_offset = self.config.get('sensor_offset') # Save settings to config.json with open('config.json', 'w') as f: ujson.dump(self.config, f) # Apply settings immediately self.pid.reset(kp_value, ki_value, kd_value) self.sensor.set_offset(temp_offset_value) bg.del_async() popup_pid.start_auto_close(5) popup_pid.set_event_cb(event_handler) popup_pid.align(bg, lv.ALIGN.CENTER, 0, 0) kb.set_ta(kp_input) kb.set_hidden(True)