mirror of
https://github.com/lvgl/lvgl.git
synced 2026-05-22 23:37:43 +08:00
feat(bar) send LV_DRAW_PART_BEGIN/END for the indicator
This commit is contained in:
+38
-26
@@ -384,28 +384,38 @@ static void draw_indic(lv_event_t * e)
|
||||
lv_coord_t short_side = LV_MIN(barw, barh);
|
||||
if(bg_radius > short_side >> 1) bg_radius = short_side >> 1;
|
||||
|
||||
lv_draw_rect_dsc_t draw_indic_dsc;
|
||||
lv_draw_rect_dsc_init(&draw_indic_dsc);
|
||||
lv_obj_init_draw_rect_dsc(obj, LV_PART_INDICATOR, &draw_indic_dsc);
|
||||
|
||||
lv_area_t indic_area;
|
||||
lv_area_copy(&indic_area, &bar->indic_area);
|
||||
|
||||
lv_draw_rect_dsc_t draw_rect_dsc;
|
||||
lv_draw_rect_dsc_init(&draw_rect_dsc);
|
||||
lv_obj_init_draw_rect_dsc(obj, LV_PART_INDICATOR, &draw_rect_dsc);
|
||||
|
||||
lv_obj_draw_dsc_t obj_draw_dsc;
|
||||
lv_obj_draw_dsc_init(&obj_draw_dsc, clip_area);
|
||||
obj_draw_dsc.part = LV_PART_INDICATOR;
|
||||
obj_draw_dsc.rect_dsc = &draw_rect_dsc;
|
||||
obj_draw_dsc.draw_area = bar->indic_area;
|
||||
|
||||
lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &obj_draw_dsc);
|
||||
|
||||
/*Draw only the shadow if the indicator is long enough.
|
||||
*The radius of the bg and the indicator can make a strange shape where
|
||||
*it'd be very difficult to draw shadow.*/
|
||||
if((hor && lv_area_get_width(&bar->indic_area) > bg_radius * 2) ||
|
||||
(!hor && lv_area_get_height(&bar->indic_area) > bg_radius * 2)) {
|
||||
lv_opa_t bg_opa = draw_indic_dsc.bg_opa;
|
||||
lv_opa_t bg_img_opa = draw_indic_dsc.bg_img_opa;
|
||||
lv_opa_t border_opa = draw_indic_dsc.border_opa;
|
||||
draw_indic_dsc.bg_opa = LV_OPA_TRANSP;
|
||||
draw_indic_dsc.bg_img_opa = LV_OPA_TRANSP;
|
||||
draw_indic_dsc.border_opa = LV_OPA_TRANSP;
|
||||
lv_draw_rect(&bar->indic_area, clip_area, &draw_indic_dsc);
|
||||
draw_indic_dsc.bg_opa = bg_opa;
|
||||
draw_indic_dsc.bg_img_opa = bg_img_opa;
|
||||
draw_indic_dsc.border_opa = border_opa;
|
||||
lv_opa_t bg_opa = draw_rect_dsc.bg_opa;
|
||||
lv_opa_t bg_img_opa = draw_rect_dsc.bg_img_opa;
|
||||
lv_opa_t border_opa = draw_rect_dsc.border_opa;
|
||||
draw_rect_dsc.bg_opa = LV_OPA_TRANSP;
|
||||
draw_rect_dsc.bg_img_opa = LV_OPA_TRANSP;
|
||||
draw_rect_dsc.border_opa = LV_OPA_TRANSP;
|
||||
|
||||
lv_draw_rect(&bar->indic_area, clip_area, &draw_rect_dsc);
|
||||
|
||||
draw_rect_dsc.bg_opa = bg_opa;
|
||||
draw_rect_dsc.bg_img_opa = bg_img_opa;
|
||||
draw_rect_dsc.border_opa = border_opa;
|
||||
}
|
||||
|
||||
#if LV_DRAW_COMPLEX
|
||||
@@ -421,10 +431,10 @@ static void draw_indic(lv_event_t * e)
|
||||
#endif
|
||||
|
||||
/*Draw_only the background and background image*/
|
||||
lv_opa_t shadow_opa = draw_indic_dsc.shadow_opa;
|
||||
lv_opa_t border_opa = draw_indic_dsc.border_opa;
|
||||
draw_indic_dsc.border_opa = LV_OPA_TRANSP;
|
||||
draw_indic_dsc.shadow_opa = LV_OPA_TRANSP;
|
||||
lv_opa_t shadow_opa = draw_rect_dsc.shadow_opa;
|
||||
lv_opa_t border_opa = draw_rect_dsc.border_opa;
|
||||
draw_rect_dsc.border_opa = LV_OPA_TRANSP;
|
||||
draw_rect_dsc.shadow_opa = LV_OPA_TRANSP;
|
||||
|
||||
/*Get the max possible indicator area. The gradient should be applied on this*/
|
||||
lv_area_t mask_indic_max_area;
|
||||
@@ -445,24 +455,26 @@ static void draw_indic(lv_event_t * e)
|
||||
#if LV_DRAW_COMPLEX
|
||||
/*Create a mask to the current indicator area to see only this part from the whole gradient.*/
|
||||
lv_draw_mask_radius_param_t mask_indic_param;
|
||||
lv_draw_mask_radius_init(&mask_indic_param, &bar->indic_area, draw_indic_dsc.radius, false);
|
||||
lv_draw_mask_radius_init(&mask_indic_param, &bar->indic_area, draw_rect_dsc.radius, false);
|
||||
int16_t mask_indic_id = lv_draw_mask_add(&mask_indic_param, NULL);
|
||||
#endif
|
||||
|
||||
lv_draw_rect(&mask_indic_max_area, clip_area, &draw_indic_dsc);
|
||||
draw_indic_dsc.border_opa = border_opa;
|
||||
draw_indic_dsc.shadow_opa = shadow_opa;
|
||||
lv_draw_rect(&mask_indic_max_area, clip_area, &draw_rect_dsc);
|
||||
draw_rect_dsc.border_opa = border_opa;
|
||||
draw_rect_dsc.shadow_opa = shadow_opa;
|
||||
|
||||
/*Draw the border*/
|
||||
draw_indic_dsc.bg_opa = LV_OPA_TRANSP;
|
||||
draw_indic_dsc.bg_img_opa = LV_OPA_TRANSP;
|
||||
draw_indic_dsc.shadow_opa = LV_OPA_TRANSP;
|
||||
lv_draw_rect(&bar->indic_area, clip_area, &draw_indic_dsc);
|
||||
draw_rect_dsc.bg_opa = LV_OPA_TRANSP;
|
||||
draw_rect_dsc.bg_img_opa = LV_OPA_TRANSP;
|
||||
draw_rect_dsc.shadow_opa = LV_OPA_TRANSP;
|
||||
lv_draw_rect(&bar->indic_area, clip_area, &draw_rect_dsc);
|
||||
|
||||
#if LV_DRAW_COMPLEX
|
||||
lv_draw_mask_remove_id(mask_indic_id);
|
||||
lv_draw_mask_remove_id(mask_bg_id);
|
||||
#endif
|
||||
|
||||
lv_event_send(obj, LV_EVENT_DRAW_PART_END, &obj_draw_dsc);
|
||||
}
|
||||
|
||||
static void lv_bar_event(const lv_obj_class_t * class_p, lv_event_t * e)
|
||||
|
||||
Reference in New Issue
Block a user