From 4f9c16f1774b466b55e1dd819313431098521735 Mon Sep 17 00:00:00 2001 From: Gabor Kiss-Vamosi Date: Mon, 29 Jan 2024 13:27:21 +0100 Subject: [PATCH] fix(chart): set the series id correctly (#5482) --- demos/widgets/lv_demo_widgets.c | 22 +---- src/widgets/chart/lv_chart.c | 19 +++- .../ref_imgs/widgets/chart_bar_draw_hook.png | Bin 0 -> 15929 bytes .../ref_imgs/widgets/chart_line_draw_hook.png | Bin 0 -> 22214 bytes tests/src/test_cases/widgets/test_chart.c | 88 ++++++++++++++++++ 5 files changed, 106 insertions(+), 23 deletions(-) create mode 100644 tests/ref_imgs/widgets/chart_bar_draw_hook.png create mode 100644 tests/ref_imgs/widgets/chart_line_draw_hook.png diff --git a/demos/widgets/lv_demo_widgets.c b/demos/widgets/lv_demo_widgets.c index c8633a845..18e6d7978 100644 --- a/demos/widgets/lv_demo_widgets.c +++ b/demos/widgets/lv_demo_widgets.c @@ -1500,24 +1500,10 @@ static void chart_event_cb(lv_event_t * e) lv_text_get_size(&text_size, buf, font_normal, 0, 0, LV_COORD_MAX, LV_TEXT_FLAG_NONE); lv_area_t txt_area; - if(lv_chart_get_type(obj) == LV_CHART_TYPE_BAR) { - txt_area.y2 = draw_task->area.y1 - LV_DPX(15); - txt_area.y1 = txt_area.y2 - text_size.y; - if(ser == lv_chart_get_series_next(obj, NULL)) { - txt_area.x1 = draw_task->area.x1 + lv_area_get_width(&draw_task->area) / 2; - txt_area.x2 = txt_area.x1 + text_size.x; - } - else { - txt_area.x2 = draw_task->area.x1 + lv_area_get_width(&draw_task->area) / 2; - txt_area.x1 = txt_area.x2 - text_size.x; - } - } - else { - txt_area.x1 = draw_task->area.x1 + lv_area_get_width(&draw_task->area) / 2 - text_size.x / 2; - txt_area.x2 = txt_area.x1 + text_size.x; - txt_area.y2 = draw_task->area.y1 - LV_DPX(15); - txt_area.y1 = txt_area.y2 - text_size.y; - } + txt_area.y2 = draw_task->area.y1 - LV_DPX(15); + txt_area.y1 = txt_area.y2 - text_size.y; + txt_area.x1 = draw_task->area.x1 + (lv_area_get_width(&draw_task->area) - text_size.x) / 2; + txt_area.x2 = txt_area.x1 + text_size.x; lv_area_t bg_area; bg_area.x1 = txt_area.x1 - LV_DPX(8); diff --git a/src/widgets/chart/lv_chart.c b/src/widgets/chart/lv_chart.c index 1379cfa15..782b7c5a6 100644 --- a/src/widgets/chart/lv_chart.c +++ b/src/widgets/chart/lv_chart.c @@ -804,9 +804,15 @@ static void draw_series_line(lv_obj_t * obj, lv_layer_t * layer) /*If there are at least as many points as pixels then draw only vertical lines*/ bool crowded_mode = (int32_t)chart->point_cnt >= w; + line_dsc.base.id1 = _lv_ll_get_len(&chart->series_ll) - 1; + point_dsc_default.base.id1 = line_dsc.base.id1; /*Go through all data lines*/ _LV_LL_READ_BACK(&chart->series_ll, ser) { - if(ser->hidden) continue; + if(ser->hidden) { + line_dsc.base.id1--; + point_dsc_default.base.id1--; + continue; + } line_dsc.color = ser->color; point_dsc_default.bg_color = ser->color; line_dsc.base.id2 = 0; @@ -899,10 +905,10 @@ static void draw_series_line(lv_obj_t * obj, lv_layer_t * layer) point_dsc_default.base.id2 = i - 1; lv_draw_rect(layer, &point_dsc_default, &point_area); } - - point_dsc_default.base.id1++; - line_dsc.base.id1++; } + + point_dsc_default.base.id1--; + line_dsc.base.id1--; } layer->_clip_area = clip_area_ori; @@ -1083,7 +1089,10 @@ static void draw_series_bar(lv_obj_t * obj, lv_layer_t * layer) col_a.x2 = col_a.x1 + col_w - 1; x_act += col_w + ser_gap; - if(col_a.x2 < clip_area.x1) continue; + if(col_a.x2 < clip_area.x1) { + col_dsc.base.id1++; + continue; + } if(col_a.x1 > clip_area.x2) break; col_dsc.bg_color = ser->color; diff --git a/tests/ref_imgs/widgets/chart_bar_draw_hook.png b/tests/ref_imgs/widgets/chart_bar_draw_hook.png new file mode 100644 index 0000000000000000000000000000000000000000..46b420d5a3ba215a60ee5b307e5b1d4edeac69c9 GIT binary patch literal 15929 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 literal 0 HcmV?d00001 diff --git a/tests/ref_imgs/widgets/chart_line_draw_hook.png b/tests/ref_imgs/widgets/chart_line_draw_hook.png new file mode 100644 index 0000000000000000000000000000000000000000..9c0af4587fa52dc309bcc56ea2e265512c397cab GIT binary patch literal 22214 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 Cjv4j< literal 0 HcmV?d00001 diff --git a/tests/src/test_cases/widgets/test_chart.c b/tests/src/test_cases/widgets/test_chart.c index de8e94bca..575c92639 100644 --- a/tests/src/test_cases/widgets/test_chart.c +++ b/tests/src/test_cases/widgets/test_chart.c @@ -19,6 +19,7 @@ void setUp(void) void tearDown(void) { /* Is there a way to destroy a chart without having to call remove_series for each of it series? */ + lv_obj_clean(active_screen); } /* NOTE: Default chart type is LV_CHART_TYPE_LINE */ @@ -104,4 +105,91 @@ void test_chart_one_point_when_setting_point_count_to_zero(void) TEST_ASSERT_EQUAL(1u, lv_chart_get_point_count(chart)); } +static void chart_event_cb(lv_event_t * e) +{ + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_target(e); + + if(code == LV_EVENT_DRAW_TASK_ADDED) { + lv_draw_task_t * draw_task = lv_event_get_param(e); + lv_draw_dsc_base_t * base_dsc = draw_task->draw_dsc; + + lv_chart_type_t chart_type = lv_chart_get_type(obj); + if(chart_type == LV_CHART_TYPE_LINE && base_dsc->part != LV_PART_INDICATOR) return; + if(chart_type == LV_CHART_TYPE_BAR && base_dsc->part != LV_PART_ITEMS) return; + + const lv_chart_series_t * ser = NULL; + for(uint32_t i = 0; i < base_dsc->id1 + 1; i++) { + ser = lv_chart_get_series_next(obj, ser); + } + + char buf[8]; + lv_snprintf(buf, sizeof(buf), "%"LV_PRIu32, ser->y_points[base_dsc->id2]); + + lv_point_t text_size; + lv_text_get_size(&text_size, buf, LV_FONT_DEFAULT, 0, 0, LV_COORD_MAX, LV_TEXT_FLAG_NONE); + + lv_area_t txt_area; + txt_area.x1 = draw_task->area.x1 + lv_area_get_width(&draw_task->area) / 2 - text_size.x / 2; + txt_area.x2 = txt_area.x1 + text_size.x; + txt_area.y2 = draw_task->area.y1 - LV_DPX(15); + txt_area.y1 = txt_area.y2 - text_size.y; + + lv_area_t bg_area; + bg_area.x1 = txt_area.x1 - LV_DPX(8); + bg_area.x2 = txt_area.x2 + LV_DPX(8); + bg_area.y1 = txt_area.y1 - LV_DPX(8); + bg_area.y2 = txt_area.y2 + LV_DPX(8); + + lv_draw_rect_dsc_t rect_dsc; + lv_draw_rect_dsc_init(&rect_dsc); + rect_dsc.bg_color = ser->color; + rect_dsc.radius = LV_DPX(5); + lv_draw_rect(base_dsc->layer, &rect_dsc, &bg_area); + + lv_draw_label_dsc_t label_dsc; + lv_draw_label_dsc_init(&label_dsc); + label_dsc.color = lv_color_white(); + label_dsc.font = LV_FONT_DEFAULT; + label_dsc.text = buf; + label_dsc.text_local = true; + lv_draw_label(base_dsc->layer, &label_dsc, &txt_area); + } +} + +void test_draw_task_hooking(void) +{ + lv_obj_t * chart_wrapper = lv_obj_create(lv_screen_active()); + lv_obj_set_size(chart_wrapper, 600, 300); + lv_obj_center(chart_wrapper); + + lv_obj_set_parent(chart, chart_wrapper); + lv_obj_set_size(chart, lv_pct(200), lv_pct(100)); + lv_obj_add_flag(chart, LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS); + lv_chart_set_div_line_count(chart, 0, 21); + lv_chart_set_point_count(chart, 21); + lv_obj_add_event_cb(chart, chart_event_cb, LV_EVENT_DRAW_TASK_ADDED, NULL); + + lv_chart_series_t * chart_set1 = lv_chart_add_series(chart, lv_palette_main(LV_PALETTE_YELLOW), 0); + lv_chart_series_t * chart_set2 = lv_chart_add_series(chart, lv_palette_main(LV_PALETTE_GREEN), 0); + lv_chart_series_t * chart_set3 = lv_chart_add_series(chart, lv_palette_main(LV_PALETTE_RED), 0); + lv_chart_set_range(chart, LV_CHART_AXIS_PRIMARY_Y, 0, 700); + + int32_t points[21] = {0, 31, 59, 81, 95, 100, 95, 81, 59, 31, 0, -31, -59, -81, -95, -100, -95, -81, -59, -31, 0}; + + for(uint32_t i = 0; i < 21; i++) { + lv_chart_set_next_value(chart, chart_set1, points[i] + 100); + lv_chart_set_next_value(chart, chart_set2, points[i] + 300); + lv_chart_set_next_value(chart, chart_set3, points[i] + 500); + } + + lv_obj_scroll_to_x(chart_wrapper, 300, LV_ANIM_OFF); + + lv_chart_set_type(chart, LV_CHART_TYPE_LINE); + TEST_ASSERT_EQUAL_SCREENSHOT("widgets/chart_line_draw_hook.png"); + + lv_chart_set_type(chart, LV_CHART_TYPE_BAR); + TEST_ASSERT_EQUAL_SCREENSHOT("widgets/chart_bar_draw_hook.png"); +} + #endif