def draw_event_cb(e): obj = e.get_target() cont_a = lv.area_t() obj.get_coords(cont_a) #Add the faded area before the lines are drawn dsc = e.get_draw_part_dsc() if dsc.part == lv.PART.ITEMS: if not dsc.p1 or not dsc.p2: return # Add a line mask that keeps the area below the line 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) #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.COVER draw_rect_dsc.bg_color = dsc.line_dsc.color a = lv.area_t() a.x1 = dsc.p1.x a.x2 = dsc.p2.x a.y1 = min(dsc.p1.y, dsc.p2.y) a.y2 = cont_a.y2 - 13 # -13 cuts off where the rectangle draws over the chart margin. Without this an area of 0 doesn't look like 0 dsc.draw_ctx.rect(draw_rect_dsc, a) # Remove the mask lv.draw_mask_free_param(line_mask_param) lv.draw_mask_remove_id(line_mask_id)
def event_cb(e): dsc = lv.obj_draw_part_dsc_t.cast(e.get_param()) if dsc.part != lv.PART.INDICATOR: return obj = lv.bar.__cast__(e.get_target()) label_dsc = lv.draw_label_dsc_t() label_dsc.init() # label_dsc.font = LV_FONT_DEFAULT; value_txt = str(obj.get_value()) txt_size = lv.point_t() lv.txt_get_size(txt_size, value_txt, label_dsc.font, label_dsc.letter_space, label_dsc.line_space, lv.COORD.MAX, label_dsc.flag) txt_area = lv.area_t() # If the indicator is long enough put the text inside on the right if dsc.draw_area.get_width() > txt_size.x + 20: txt_area.x2 = dsc.draw_area.x2 - 5 txt_area.x1 = txt_area.x2 - txt_size.x + 1 label_dsc.color = lv.color_white() # If the indicator is still short put the text out of it on the right*/ else: txt_area.x1 = dsc.draw_area.x2 + 5 txt_area.x2 = txt_area.x1 + txt_size.x - 1 label_dsc.color = lv.color_black() txt_area.y1 = dsc.draw_area.y1 + (dsc.draw_area.get_height() - txt_size.y) // 2 txt_area.y2 = txt_area.y1 + txt_size.y - 1 lv.draw_label(txt_area, dsc.clip_area, label_dsc, value_txt, None)
def getCenter(obj): ar = lv.area_t() obj.get_coords(ar) pt = lv.point_t() pt.x = (ar.x1+ar.x2)//2 pt.y = (ar.y1+ar.y2)//2 return pt
def slider_event_cb(e): code = e.get_code() obj = e.get_target() # Provide some extra space for the value if code == lv.EVENT.REFR_EXT_DRAW_SIZE: e.set_ext_draw_size(50) elif code == lv.EVENT.DRAW_PART_END: # print("DRAW_PART_END") dsc = lv.obj_draw_part_dsc_t.__cast__(e.get_param()) # print(dsc) if dsc.part == lv.PART.INDICATOR: label_text = "{:d} - {:d}".format(obj.get_left_value(),slider.get_value()) label_size = lv.point_t() lv.txt_get_size(label_size, label_text, lv.font_default(), 0, 0, lv.COORD.MAX, 0) # print(label_size.x,label_size.y) label_area = lv.area_t() label_area.x1 = dsc.draw_area.x1 + dsc.draw_area.get_width() // 2 - label_size.x // 2 label_area.x2 = label_area.x1 + label_size.x label_area.y2 = dsc.draw_area.y1 - 10 label_area.y1 = label_area.y2 - label_size.y label_draw_dsc = lv.draw_label_dsc_t() label_draw_dsc.init() lv.draw_label(label_area, dsc.clip_area, label_draw_dsc, label_text, None)
def draw_event_cb(e): obj = e.get_target() dsc = lv.obj_draw_part_dsc_t.__cast__(e.get_param()) # If the cells are drawn... if dsc.part == lv.PART.ITEMS: chk = obj.has_cell_ctrl(dsc.id, 0, lv.table.CELL_CTRL.CUSTOM_1) rect_dsc = lv.draw_rect_dsc_t() rect_dsc.init() if chk: rect_dsc.bg_color = lv.theme_get_color_primary(obj) else: rect_dsc.bg_color = lv.palette_lighten(lv.PALETTE.GREY,2) rect_dsc.radius = lv.RADIUS.CIRCLE sw_area = lv.area_t() sw_area.x1 = dsc.draw_area.x2 - 50; sw_area.x2 = sw_area.x1 + 40; sw_area.y1 = dsc.draw_area.y1 + dsc.draw_area.get_height() // 2 - 10 sw_area.y2 = sw_area.y1 + 20; lv.draw_rect(sw_area, dsc.clip_area, rect_dsc) rect_dsc.bg_color = lv.color_white() if chk: sw_area.x2 -= 2 sw_area.x1 = sw_area.x2 - 16 else: sw_area.x1 += 2 sw_area.x2 = sw_area.x1 + 16 sw_area.y1 += 2; sw_area.y2 -= 2; lv.draw_rect(sw_area, dsc.clip_area, rect_dsc)
def calc(self, obj): # Calculate object parameters area = lv.area_t() obj.get_content_coords(area) obj.draw_desc = lv.draw_rect_dsc_t() obj.draw_desc.init() obj.draw_desc.bg_opa = lv.OPA.COVER obj.draw_desc.bg_color = obj.get_style_bg_color(lv.PART.MAIN) obj.points = [ { 'x': area.x1 + area.get_width() // 2, 'y': area.y2 if obj.get_state() & lv.STATE.CHECKED else area.y1 }, { 'x': area.x2, 'y': area.y1 + area.get_height() // 2 }, { 'x': area.x1, 'y': area.y1 + area.get_height() // 2 }, ] obj.valid = True
def mask_event_cb(self, e): code = e.get_code() obj = e.get_target() if code == lv.EVENT.COVER_CHECK: e.set_cover_res(lv.COVER_RES.MASKED) elif code == lv.EVENT.DRAW_MAIN_BEGIN: # add mask font = obj.get_style_text_font(lv.PART.MAIN) line_space = obj.get_style_text_line_space(lv.PART.MAIN) font_h = font.get_line_height() roller_coords = lv.area_t() obj.get_coords(roller_coords) rect_area = lv.area_t() rect_area.x1 = roller_coords.x1 rect_area.x2 = roller_coords.x2 rect_area.y1 = roller_coords.y1 rect_area.y2 = roller_coords.y1 + (obj.get_height() - font_h - line_space) // 2 fade_mask_top = lv.draw_mask_fade_param_t() fade_mask_top.init(rect_area, lv.OPA.TRANSP, rect_area.y1, lv.OPA.COVER, rect_area.y2) self.mask_top_id = lv.draw_mask_add(fade_mask_top, None) rect_area.y1 = rect_area.y2 + font_h + line_space - 1 rect_area.y2 = roller_coords.y2 fade_mask_bottom = lv.draw_mask_fade_param_t() fade_mask_bottom.init(rect_area, lv.OPA.COVER, rect_area.y1, lv.OPA.TRANSP, rect_area.y2) self.mask_bottom_id = lv.draw_mask_add(fade_mask_bottom, None) elif code == lv.EVENT.DRAW_POST_END: fade_mask_top = lv.draw_mask_remove_id(self.mask_top_id) fade_mask_bottom = lv.draw_mask_remove_id(self.mask_bottom_id) # Remove the masks lv.draw_mask_remove_id(self.mask_top_id) lv.draw_mask_remove_id(self.mask_bottom_id) self.mask_top_id = -1 self.mask_bottom_id = -1
def event_cb(e): code = e.get_code() obj = e.get_target() if code == lv.EVENT.DRAW_PART_BEGIN: dsc = lv.obj_draw_part_dsc_t.__cast__(e.get_param()) # Change the draw descriptor the 2nd button if dsc.id == 1: dsc.rect_dsc.radius = 0 if obj.get_selected_btn() == dsc.id: dsc.rect_dsc.bg_color = lv.palette_darken(lv.PALETTE.GREY, 3) else: dsc.rect_dsc.bg_color = lv.palette_main(lv.PALETTE.BLUE) dsc.rect_dsc.shadow_width = 6 dsc.rect_dsc.shadow_ofs_x = 3 dsc.rect_dsc.shadow_ofs_y = 3 dsc.label_dsc.color = lv.color_white() # Change the draw descriptor the 3rd button elif dsc.id == 2: dsc.rect_dsc.radius = lv.RADIUS.CIRCLE if obj.get_selected_btn() == dsc.id: dsc.rect_dsc.bg_color = lv.palette_darken(lv.PALETTE.RED, 3) else: dsc.rect_dsc.bg_color = lv.palette_main(lv.PALETTE.RED) dsc.label_dsc.color = lv.color_white() elif dsc.id == 3: dsc.label_dsc.opa = lv.OPA.TRANSP # Hide the text if any if code == lv.EVENT.DRAW_PART_END: dsc = lv.obj_draw_part_dsc_t.__cast__(e.get_param()) # Add custom content to the 4th button when the button itself was drawn if dsc.id == 3: # LV_IMG_DECLARE(img_star); header = lv.img_header_t() res = lv.img.decoder_get_info(img_star_argb, header) if res != lv.RES.OK: print("error when getting image header") return else: a = lv.area_t() a.x1 = dsc.draw_area.x1 + (dsc.draw_area.get_width() - header.w) // 2 a.x2 = a.x1 + header.w - 1 a.y1 = dsc.draw_area.y1 + (dsc.draw_area.get_height() - header.h) // 2 a.y2 = a.y1 + header.h - 1 img_draw_dsc = lv.draw_img_dsc_t() img_draw_dsc.init() img_draw_dsc.recolor = lv.color_black() if obj.get_selected_btn() == dsc.id: img_draw_dsc.recolor_opa = lv.OPA._30 lv.draw_img(a, dsc.clip_area, img_star_argb, img_draw_dsc)
def draw_event_cb(e): obj = lv.obj.__cast__(e.get_target()) # Add the faded area before the lines are drawn dsc = lv.obj_draw_part_dsc_t.cast(e.get_param()) if dsc.part != lv.PART.ITEMS: return if not dsc.p1 or not dsc.p2: return # Add a line mask that keeps the area below the line 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 = line_mask_param.draw_mask_add(None) line_mask_id = lv.draw_mask_add(line_mask_param, None) # Add a fade effect: transparent bottom covering top h = obj.get_height() fade_mask_param = lv.draw_mask_fade_param_t() coords = lv.area_t() obj.get_coords(coords) 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._20 draw_rect_dsc.bg_color = dsc.line_dsc.color a = lv.area_t() a.x1 = dsc.p1.x a.x2 = dsc.p2.x - 1 a.y1 = min(dsc.p1.y, dsc.p2.y) coords = lv.area_t() obj.get_coords(coords) a.y2 = coords.y2 lv.draw_rect(a, dsc.clip_area, draw_rect_dsc) # Remove the masks lv.draw_mask_remove_id(line_mask_id) lv.draw_mask_remove_id(fade_mask_id)
def event_cb(e): code = e.get_code() chart = e.get_target() if code == lv.EVENT.VALUE_CHANGED: chart.invalidate() if code == lv.EVENT.REFR_EXT_DRAW_SIZE: e.set_ext_draw_size(20) elif code == lv.EVENT.DRAW_POST_END: id = lv.chart.get_pressed_point(chart) if id == lv.CHART_POINT.NONE: return # print("Selected point ", id) for i in range(len(series)): p = lv.point_t() chart.get_point_pos_by_id(series[i], id, p) value = series_points[i][id] buf = lv.SYMBOL.DUMMY + "$" + str(value) draw_rect_dsc = lv.draw_rect_dsc_t() draw_rect_dsc.init() draw_rect_dsc.bg_color = lv.color_black() draw_rect_dsc.bg_opa = lv.OPA._50 draw_rect_dsc.radius = 3 draw_rect_dsc.bg_img_src = buf draw_rect_dsc.bg_img_recolor = lv.color_white() a = lv.area_t() coords = lv.area_t() chart.get_coords(coords) a.x1 = coords.x1 + p.x - 20 a.x2 = coords.x1 + p.x + 20 a.y1 = coords.y1 + p.y - 30 a.y2 = coords.y1 + p.y - 10 clip_area = lv.area_t.cast(e.get_param()) lv.draw_rect(a, clip_area, draw_rect_dsc) elif code == lv.EVENT.RELEASED: chart.invalidate()
def scroll_event_cb(e): cont = e.get_target() cont_a = lv.area_t() cont.get_coords(cont_a) cont_y_center = cont_a.y1 + cont_a.get_height() // 2 r = cont.get_height() * 7 // 10 child_cnt = cont.get_child_cnt() for i in range(child_cnt): child = cont.get_child(i) child_a = lv.area_t() child.get_coords(child_a) child_y_center = child_a.y1 + child_a.get_height() // 2 diff_y = child_y_center - cont_y_center diff_y = abs(diff_y) # Get the x of diff_y on a circle. # If diff_y is out of the circle use the last point of the circle (the radius) if diff_y >= r: x = r else: # Use Pythagoras theorem to get x from radius and y x_sqr = r * r - diff_y * diff_y res = lv.sqrt_res_t() lv.sqrt(x_sqr, res, 0x8000) # Use lvgl's built in sqrt root function x = r - res.i # Translate the item by the calculated X coordinate child.set_style_translate_x(x, 0) # Use some opacity with larger translations opa = lv.map(x, 0, r, lv.OPA.TRANSP, lv.OPA.COVER) child.set_style_opa(lv.OPA.COVER - opa, 0)
def event_cb(self, e): code = e.get_code() chart = lv.chart.__cast__(e.get_target()) if code == lv.EVENT.VALUE_CHANGED: # print("last_id: ",self.last_id) self.last_id = chart.get_pressed_point() if self.last_id != lv.CHART_POINT.NONE: p = lv.point_t() chart.get_point_pos_by_id(self.ser, self.last_id, p) chart.set_cursor_point(self.cursor, None, self.last_id) elif code == lv.EVENT.DRAW_PART_END: # print("EVENT.DRAW_PART_END") dsc = lv.obj_draw_part_dsc_t.cast(e.get_param()) # if dsc.p1 and dsc.p2: # print("p1, p2", dsc.p1,dsc.p2) # print("p1.y, p2.y", dsc.p1.y, dsc.p2.y) # print("last_id: ",self.last_id) if dsc.part == lv.PART.CURSOR and dsc.p1 and dsc.p2 and dsc.p1.y == dsc.p2.y and self.last_id >= 0: v = self.ser_p[self.last_id] # print("value: ",v) value_txt = str(v) size = lv.point_t() lv.txt_get_size(size, value_txt, lv.font_default(), 0, 0, lv.COORD.MAX, lv.TEXT_FLAG.NONE) a = lv.area_t() a.y2 = dsc.p1.y - 5 a.y1 = a.y2 - size.y - 10 a.x1 = dsc.p1.x + 10 a.x2 = a.x1 + size.x + 10 draw_rect_dsc = lv.draw_rect_dsc_t() draw_rect_dsc.init() draw_rect_dsc.bg_color = lv.palette_main(lv.PALETTE.BLUE) draw_rect_dsc.radius = 3 lv.draw_rect(a, dsc.clip_area, draw_rect_dsc) draw_label_dsc = lv.draw_label_dsc_t() draw_label_dsc.init() draw_label_dsc.color = lv.color_white() a.x1 += 5 a.x2 -= 5 a.y1 += 5 a.y2 -= 5 lv.draw_label(a, dsc.clip_area, draw_label_dsc, value_txt, None)
def chart_event_cb(e): dsc = lv.obj_draw_part_dsc_t.__cast__(e.get_param()) if (dsc.part == lv.PART.ITEMS): draw_rect_dsc = lv.draw_rect_dsc_t() draw_rect_dsc.init() 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 + 6 draw_rect_dsc.bg_color = lv.color_white() draw_rect_dsc.radius = 0 draw_rect_dsc.shadow_opa = 0 lv.draw_rect(a, dsc.clip_area, draw_rect_dsc)
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() a.x1 = 10 a.y1 = 10 a.x2 = 190 a.y2 = 190 r1.init(a, lv.RADIUS.CIRCLE, False) om.add_mask(r1) lv.refr_now(None) t = lv.tick_get() while lv.tick_elaps(t) < 1000: pass a.x1 = 100