feat(scale): add lv_scale_set_post_draw and use label_dsc.text_local in a smarter way

This commit is contained in:
Gabor Kiss-Vamosi
2023-09-08 21:40:19 +02:00
parent 1768e5740a
commit 4415f4a766
2 changed files with 35 additions and 4 deletions

View File

@@ -186,6 +186,16 @@ void lv_scale_set_text_src(lv_obj_t * obj, char * txt_src[])
lv_obj_invalidate(obj);
}
void lv_scale_set_post_draw(lv_obj_t * obj, bool en)
{
LV_ASSERT_OBJ(obj, MY_CLASS);
lv_scale_t * scale = (lv_scale_t *)obj;
scale->post_draw = en;
lv_obj_invalidate(obj);
}
lv_scale_section_t * lv_scale_add_section(lv_obj_t * obj)
{
LV_ASSERT_OBJ(obj, MY_CLASS);
@@ -239,6 +249,7 @@ void lv_scale_section_set_style(lv_scale_section_t * section, uint32_t part, lv_
}
}
/*=====================
* Getter functions
*====================*/
@@ -307,9 +318,18 @@ static void lv_scale_event(const lv_obj_class_t * class_p, lv_event_t * event)
LV_UNUSED(scale);
if(event_code == LV_EVENT_DRAW_MAIN) {
scale_find_section_tick_idx(obj);
scale_draw_indicator(obj, event);
scale_draw_main(obj, event);
if(scale->post_draw == false) {
scale_find_section_tick_idx(obj);
scale_draw_indicator(obj, event);
scale_draw_main(obj, event);
}
}
if(event_code == LV_EVENT_DRAW_POST) {
if(scale->post_draw == true) {
scale_find_section_tick_idx(obj);
scale_draw_indicator(obj, event);
scale_draw_main(obj, event);
}
}
else if(event_code == LV_EVENT_REFR_EXT_DRAW_SIZE) {
/* NOTE: Extend scale draw size so the first tick label can be shown */
@@ -331,7 +351,6 @@ static void scale_draw_indicator(lv_obj_t * obj, lv_event_t * event)
lv_draw_label_dsc_init(&label_dsc);
/* Formatting the labels with the configured style for LV_PART_INDICATOR */
lv_obj_init_draw_label_dsc(obj, LV_PART_INDICATOR, &label_dsc);
label_dsc.text_local = 1;
/* Major tick style */
lv_draw_line_dsc_t major_tick_dsc;
@@ -391,6 +410,7 @@ static void scale_draw_indicator(lv_obj_t * obj, lv_event_t * event)
if(scale->txt_src) {
if(scale->txt_src[major_tick_idx - 1U]) {
label_dsc.text = scale->txt_src[major_tick_idx - 1U];
label_dsc.text_local = 0;
}
else {
label_dsc.text = NULL;
@@ -399,6 +419,7 @@ static void scale_draw_indicator(lv_obj_t * obj, lv_event_t * event)
else { /* Add label with mapped values */
lv_snprintf(text_buffer, sizeof(text_buffer), "%" LV_PRId32, tick_value);
label_dsc.text = text_buffer;
label_dsc.text_local = 1;
}
scale_get_label_coords(obj, &label_dsc, &tick_point_b, &label_coords);
@@ -541,6 +562,7 @@ static void scale_draw_indicator(lv_obj_t * obj, lv_event_t * event)
if(scale->txt_src) {
if(scale->txt_src[major_tick_idx - 1U]) {
label_dsc.text = scale->txt_src[major_tick_idx - 1U];
label_dsc.text_local = 0;
}
else {
label_dsc.text = NULL;
@@ -549,6 +571,7 @@ static void scale_draw_indicator(lv_obj_t * obj, lv_event_t * event)
else { /* Add label with mapped values */
lv_snprintf(text_buffer, sizeof(text_buffer), "%" LV_PRId32, tick_value);
label_dsc.text = text_buffer;
label_dsc.text_local = 1;
}
/* Also take into consideration the letter space of the style */

View File

@@ -81,6 +81,7 @@ typedef struct {
uint32_t major_tick_every : 15;
lv_scale_mode_t mode;
uint32_t label_enabled : 1;
uint32_t post_draw : 1;
lv_coord_t last_tick_width;
lv_coord_t first_tick_width;
/* Round scale */
@@ -174,6 +175,13 @@ void lv_scale_set_round_props(lv_obj_t * obj, uint16_t angle_range, int16_t rota
*/
void lv_scale_set_text_src(lv_obj_t * obj, char * txt_src[]);
/**
* Draw the scale after all the children are drawn
* @param obj pointer to a scale object
* @param en true: eanble post draw
*/
void lv_scale_set_post_draw(lv_obj_t * obj, bool en);
/**
* Add a section to the given scale
* @param obj pointer to a scale object