feat(bar) send LV_DRAW_PART_BEGIN/END for the indicator

This commit is contained in:
Gabor Kiss-Vamosi
2021-04-30 10:00:25 +02:00
parent 4f37e3ee25
commit 3c40c83691
+38 -26
View File
@@ -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)