1 #include "../../lv_examples.h"
2 #if LV_USE_BUTTONMATRIX && LV_BUILD_EXAMPLES
3 
event_cb(lv_event_t * e)4 static void event_cb(lv_event_t * e)
5 {
6     lv_obj_t * obj = lv_event_get_target(e);
7     lv_draw_task_t * draw_task = lv_event_get_draw_task(e);
8     lv_draw_dsc_base_t * base_dsc = lv_draw_task_get_draw_dsc(draw_task);
9     /*When the button matrix draws the buttons...*/
10     if(base_dsc->part == LV_PART_ITEMS) {
11         bool pressed = false;
12         if(lv_buttonmatrix_get_selected_button(obj) == base_dsc->id1 && lv_obj_has_state(obj, LV_STATE_PRESSED)) {
13             pressed = true;
14         }
15 
16         /*Change the draw descriptor of the 2nd button*/
17         if(base_dsc->id1 == 1) {
18             lv_draw_fill_dsc_t * fill_draw_dsc = lv_draw_task_get_fill_dsc(draw_task);
19             if(fill_draw_dsc) {
20                 fill_draw_dsc->radius = 0;
21                 if(pressed) fill_draw_dsc->color = lv_palette_darken(LV_PALETTE_BLUE, 3);
22                 else fill_draw_dsc->color = lv_palette_main(LV_PALETTE_BLUE);
23             }
24             lv_draw_box_shadow_dsc_t * box_shadow_draw_dsc = lv_draw_task_get_box_shadow_dsc(draw_task);
25             if(box_shadow_draw_dsc) {
26                 box_shadow_draw_dsc->width = 6;
27                 box_shadow_draw_dsc->ofs_x = 3;
28                 box_shadow_draw_dsc->ofs_y = 3;
29             }
30             lv_draw_label_dsc_t * label_draw_dsc = lv_draw_task_get_label_dsc(draw_task);
31             if(label_draw_dsc) {
32                 label_draw_dsc->color = lv_color_white();
33             }
34 
35         }
36         /*Change the draw descriptor of the 3rd button*/
37         else if(base_dsc->id1 == 2) {
38             lv_draw_fill_dsc_t * fill_draw_dsc = lv_draw_task_get_fill_dsc(draw_task);
39             if(fill_draw_dsc) {
40                 fill_draw_dsc->radius = LV_RADIUS_CIRCLE;
41                 if(pressed) fill_draw_dsc->color = lv_palette_darken(LV_PALETTE_RED, 3);
42                 else fill_draw_dsc->color = lv_palette_main(LV_PALETTE_RED);
43             }
44         }
45         else if(base_dsc->id1 == 3) {
46             lv_draw_label_dsc_t * label_draw_dsc = lv_draw_task_get_label_dsc(draw_task);
47             if(label_draw_dsc) {
48                 label_draw_dsc->opa = 0;
49             }
50             if(lv_draw_task_get_type(draw_task) == LV_DRAW_TASK_TYPE_FILL) {
51                 LV_IMAGE_DECLARE(img_star);
52                 lv_image_header_t header;
53                 lv_result_t res = lv_image_decoder_get_info(&img_star, &header);
54                 if(res != LV_RESULT_OK) return;
55 
56                 lv_area_t a;
57                 a.x1 = 0;
58                 a.x2 = header.w - 1;
59                 a.y1 = 0;
60                 a.y2 = header.h - 1;
61                 lv_area_t draw_task_area;
62                 lv_draw_task_get_area(draw_task, &draw_task_area);
63                 lv_area_align(&draw_task_area, &a, LV_ALIGN_CENTER, 0, 0);
64 
65                 lv_draw_image_dsc_t img_draw_dsc;
66                 lv_draw_image_dsc_init(&img_draw_dsc);
67                 img_draw_dsc.src = &img_star;
68                 img_draw_dsc.recolor = lv_color_black();
69                 if(pressed) img_draw_dsc.recolor_opa = LV_OPA_30;
70 
71                 lv_draw_image(base_dsc->layer, &img_draw_dsc, &a);
72 
73             }
74         }
75     }
76 }
77 
78 /**
79  * Add custom drawer to the button matrix to customize buttons one by one
80  */
lv_example_buttonmatrix_2(void)81 void lv_example_buttonmatrix_2(void)
82 {
83     lv_obj_t * btnm = lv_buttonmatrix_create(lv_screen_active());
84     lv_obj_add_event_cb(btnm, event_cb, LV_EVENT_DRAW_TASK_ADDED, NULL);
85     lv_obj_add_flag(btnm, LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS);
86     lv_obj_center(btnm);
87 }
88 
89 #endif
90