1 #include "../../lv_examples.h"
2 #if LV_USE_SCALE && LV_BUILD_EXAMPLES
3 
4 #include "../../../lvgl_private.h" /*To expose the fields of lv_draw_task_t*/
5 
draw_event_cb(lv_event_t * e)6 static void draw_event_cb(lv_event_t * e)
7 {
8     lv_obj_t * obj = lv_event_get_target(e);
9     lv_draw_task_t * draw_task = lv_event_get_draw_task(e);
10     lv_draw_dsc_base_t * base_dsc = lv_draw_task_get_draw_dsc(draw_task);
11     lv_draw_label_dsc_t * label_draw_dsc = lv_draw_task_get_label_dsc(draw_task);
12     if(base_dsc->part == LV_PART_INDICATOR) {
13         if(label_draw_dsc) {
14             const lv_color_t color_idx[7] = {
15                 lv_palette_main(LV_PALETTE_RED),
16                 lv_palette_main(LV_PALETTE_ORANGE),
17                 lv_palette_main(LV_PALETTE_YELLOW),
18                 lv_palette_main(LV_PALETTE_GREEN),
19                 lv_palette_main(LV_PALETTE_CYAN),
20                 lv_palette_main(LV_PALETTE_BLUE),
21                 lv_palette_main(LV_PALETTE_PURPLE),
22             };
23             uint8_t major_tick = lv_scale_get_major_tick_every(obj);
24             label_draw_dsc->color = color_idx[base_dsc->id1 / major_tick];
25 
26             /*Free the previously allocated text if needed*/
27             if(label_draw_dsc->text_local) lv_free((void *)label_draw_dsc->text);
28 
29             /*Malloc the text and set text_local as 1 to make LVGL automatically free the text.
30              * (Local texts are malloc'd internally by LVGL. Mimic this behavior here too)*/
31             char tmp_buffer[20] = {0}; /* Big enough buffer */
32             lv_snprintf(tmp_buffer, sizeof(tmp_buffer), "%.1f", base_dsc->id2 * 1.0f);
33             label_draw_dsc->text = lv_strdup(tmp_buffer);
34             label_draw_dsc->text_local = 1;
35 
36             lv_point_t size;
37             lv_text_get_size(&size, label_draw_dsc->text, label_draw_dsc->font, 0, 0, 1000, LV_TEXT_FLAG_NONE);
38             int32_t new_w = size.x;
39             int32_t old_w = lv_area_get_width(&draw_task->area);
40 
41             /* Distribute the new size equally on both sides */
42             draw_task->area.x1 -= (new_w - old_w) / 2;
43             draw_task->area.x2 += ((new_w - old_w) + 1) / 2;  /* +1 for rounding */
44 
45         }
46     }
47 }
48 
49 /**
50  * Customizing scale major tick label color with `LV_EVENT_DRAW_TASK_ADDED` event
51  */
lv_example_scale_7(void)52 void lv_example_scale_7(void)
53 {
54     lv_obj_t * scale = lv_scale_create(lv_screen_active());
55     lv_obj_set_size(scale, lv_pct(80), 100);
56     lv_scale_set_mode(scale, LV_SCALE_MODE_HORIZONTAL_BOTTOM);
57     lv_obj_center(scale);
58 
59     lv_scale_set_label_show(scale, true);
60 
61     lv_scale_set_total_tick_count(scale, 31);
62     lv_scale_set_major_tick_every(scale, 5);
63 
64     lv_obj_set_style_length(scale, 5, LV_PART_ITEMS);
65     lv_obj_set_style_length(scale, 10, LV_PART_INDICATOR);
66     lv_scale_set_range(scale, 10, 40);
67 
68     lv_obj_add_event_cb(scale, draw_event_cb, LV_EVENT_DRAW_TASK_ADDED, NULL);
69     lv_obj_add_flag(scale, LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS);
70 }
71 
72 #endif
73