diff options
| author | jacqueline <me@jacqueline.id.au> | 2024-06-12 17:54:40 +1000 |
|---|---|---|
| committer | jacqueline <me@jacqueline.id.au> | 2024-06-12 17:54:40 +1000 |
| commit | 64bd9053a25297f7a442ca831c7da5b44bd33f84 (patch) | |
| tree | a90c6cad25a12028302ab1a5334510fba0229bae /lib/lvgl/examples/widgets/buttonmatrix | |
| parent | 611176ed667c4ed7ee9f609e958f9404f4aee91d (diff) | |
| download | tangara-fw-64bd9053a25297f7a442ca831c7da5b44bd33f84.tar.gz | |
Update LVGL to v9.1.0
Diffstat (limited to 'lib/lvgl/examples/widgets/buttonmatrix')
4 files changed, 208 insertions, 0 deletions
diff --git a/lib/lvgl/examples/widgets/buttonmatrix/index.rst b/lib/lvgl/examples/widgets/buttonmatrix/index.rst new file mode 100644 index 00000000..06a8f752 --- /dev/null +++ b/lib/lvgl/examples/widgets/buttonmatrix/index.rst @@ -0,0 +1,22 @@ + +Simple Button matrix +-------------------- + +.. lv_example:: widgets/buttonmatrix/lv_example_buttonmatrix_1 + :language: c + + +Custom buttons +-------------- + +.. lv_example:: widgets/buttonmatrix/lv_example_buttonmatrix_2 + :language: c + + +Pagination +---------- + +.. lv_example:: widgets/buttonmatrix/lv_example_buttonmatrix_3 + :language: c + + diff --git a/lib/lvgl/examples/widgets/buttonmatrix/lv_example_buttonmatrix_1.c b/lib/lvgl/examples/widgets/buttonmatrix/lv_example_buttonmatrix_1.c new file mode 100644 index 00000000..baa2057c --- /dev/null +++ b/lib/lvgl/examples/widgets/buttonmatrix/lv_example_buttonmatrix_1.c @@ -0,0 +1,32 @@ +#include "../../lv_examples.h" +#if LV_USE_BUTTONMATRIX && LV_BUILD_EXAMPLES + +static void event_handler(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_VALUE_CHANGED) { + uint32_t id = lv_buttonmatrix_get_selected_button(obj); + const char * txt = lv_buttonmatrix_get_button_text(obj, id); + LV_UNUSED(txt); + LV_LOG_USER("%s was pressed\n", txt); + } +} + +static const char * btnm_map[] = {"1", "2", "3", "4", "5", "\n", + "6", "7", "8", "9", "0", "\n", + "Action1", "Action2", "" + }; + +void lv_example_buttonmatrix_1(void) +{ + lv_obj_t * btnm1 = lv_buttonmatrix_create(lv_screen_active()); + lv_buttonmatrix_set_map(btnm1, btnm_map); + lv_buttonmatrix_set_button_width(btnm1, 10, 2); /*Make "Action1" twice as wide as "Action2"*/ + lv_buttonmatrix_set_button_ctrl(btnm1, 10, LV_BUTTONMATRIX_CTRL_CHECKABLE); + lv_buttonmatrix_set_button_ctrl(btnm1, 11, LV_BUTTONMATRIX_CTRL_CHECKED); + lv_obj_align(btnm1, LV_ALIGN_CENTER, 0, 0); + lv_obj_add_event_cb(btnm1, event_handler, LV_EVENT_ALL, NULL); +} + +#endif diff --git a/lib/lvgl/examples/widgets/buttonmatrix/lv_example_buttonmatrix_2.c b/lib/lvgl/examples/widgets/buttonmatrix/lv_example_buttonmatrix_2.c new file mode 100644 index 00000000..f355e37d --- /dev/null +++ b/lib/lvgl/examples/widgets/buttonmatrix/lv_example_buttonmatrix_2.c @@ -0,0 +1,87 @@ +#include "../../lv_examples.h" +#if LV_USE_BUTTONMATRIX && LV_BUILD_EXAMPLES + +static void event_cb(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_target(e); + lv_draw_task_t * draw_task = lv_event_get_draw_task(e); + lv_draw_dsc_base_t * base_dsc = draw_task->draw_dsc; + /*When the button matrix draws the buttons...*/ + if(base_dsc->part == LV_PART_ITEMS) { + bool pressed = false; + if(lv_buttonmatrix_get_selected_button(obj) == base_dsc->id1 && lv_obj_has_state(obj, LV_STATE_PRESSED)) { + pressed = true; + } + + /*Change the draw descriptor of the 2nd button*/ + if(base_dsc->id1 == 1) { + lv_draw_fill_dsc_t * fill_draw_dsc = lv_draw_task_get_fill_dsc(draw_task); + if(fill_draw_dsc) { + fill_draw_dsc->radius = 0; + if(pressed) fill_draw_dsc->color = lv_palette_darken(LV_PALETTE_BLUE, 3); + else fill_draw_dsc->color = lv_palette_main(LV_PALETTE_BLUE); + } + lv_draw_box_shadow_dsc_t * box_shadow_draw_dsc = lv_draw_task_get_box_shadow_dsc(draw_task); + if(box_shadow_draw_dsc) { + box_shadow_draw_dsc->width = 6; + box_shadow_draw_dsc->ofs_x = 3; + box_shadow_draw_dsc->ofs_y = 3; + } + lv_draw_label_dsc_t * label_draw_dsc = lv_draw_task_get_label_dsc(draw_task); + if(label_draw_dsc) { + label_draw_dsc->color = lv_color_white(); + } + + } + /*Change the draw descriptor of the 3rd button*/ + else if(base_dsc->id1 == 2) { + lv_draw_fill_dsc_t * fill_draw_dsc = lv_draw_task_get_fill_dsc(draw_task); + if(fill_draw_dsc) { + fill_draw_dsc->radius = LV_RADIUS_CIRCLE; + if(pressed) fill_draw_dsc->color = lv_palette_darken(LV_PALETTE_RED, 3); + else fill_draw_dsc->color = lv_palette_main(LV_PALETTE_RED); + } + } + else if(base_dsc->id1 == 3) { + lv_draw_label_dsc_t * label_draw_dsc = lv_draw_task_get_label_dsc(draw_task); + if(label_draw_dsc) { + label_draw_dsc->opa = 0; + } + if(draw_task->type == LV_DRAW_TASK_TYPE_FILL) { + LV_IMAGE_DECLARE(img_star); + lv_image_header_t header; + lv_result_t res = lv_image_decoder_get_info(&img_star, &header); + if(res != LV_RESULT_OK) return; + + lv_area_t a; + a.x1 = 0; + a.x2 = header.w - 1; + a.y1 = 0; + a.y2 = header.h - 1; + lv_area_align(&draw_task->area, &a, LV_ALIGN_CENTER, 0, 0); + + lv_draw_image_dsc_t img_draw_dsc; + lv_draw_image_dsc_init(&img_draw_dsc); + img_draw_dsc.src = &img_star; + img_draw_dsc.recolor = lv_color_black(); + if(pressed) img_draw_dsc.recolor_opa = LV_OPA_30; + + lv_draw_image(base_dsc->layer, &img_draw_dsc, &a); + + } + } + } +} + +/** + * Add custom drawer to the button matrix to customize buttons one by one + */ +void lv_example_buttonmatrix_2(void) +{ + lv_obj_t * btnm = lv_buttonmatrix_create(lv_screen_active()); + lv_obj_add_event_cb(btnm, event_cb, LV_EVENT_DRAW_TASK_ADDED, NULL); + lv_obj_add_flag(btnm, LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS); + lv_obj_center(btnm); +} + +#endif diff --git a/lib/lvgl/examples/widgets/buttonmatrix/lv_example_buttonmatrix_3.c b/lib/lvgl/examples/widgets/buttonmatrix/lv_example_buttonmatrix_3.c new file mode 100644 index 00000000..d8e84d29 --- /dev/null +++ b/lib/lvgl/examples/widgets/buttonmatrix/lv_example_buttonmatrix_3.c @@ -0,0 +1,67 @@ +#include "../../lv_examples.h" +#if LV_USE_BUTTONMATRIX && LV_BUILD_EXAMPLES + +static void event_cb(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_target(e); + uint32_t id = lv_buttonmatrix_get_selected_button(obj); + bool prev = id == 0; + bool next = id == 6; + if(prev || next) { + /*Find the checked button*/ + uint32_t i; + for(i = 1; i < 7; i++) { + if(lv_buttonmatrix_has_button_ctrl(obj, i, LV_BUTTONMATRIX_CTRL_CHECKED)) break; + } + + if(prev && i > 1) i--; + else if(next && i < 5) i++; + + lv_buttonmatrix_set_button_ctrl(obj, i, LV_BUTTONMATRIX_CTRL_CHECKED); + } +} + +/** + * Make a button group (pagination) + */ +void lv_example_buttonmatrix_3(void) +{ + static lv_style_t style_bg; + lv_style_init(&style_bg); + lv_style_set_pad_all(&style_bg, 0); + lv_style_set_pad_gap(&style_bg, 0); + lv_style_set_clip_corner(&style_bg, true); + lv_style_set_radius(&style_bg, LV_RADIUS_CIRCLE); + lv_style_set_border_width(&style_bg, 0); + + static lv_style_t style_btn; + lv_style_init(&style_btn); + lv_style_set_radius(&style_btn, 0); + lv_style_set_border_width(&style_btn, 1); + lv_style_set_border_opa(&style_btn, LV_OPA_50); + lv_style_set_border_color(&style_btn, lv_palette_main(LV_PALETTE_GREY)); + lv_style_set_border_side(&style_btn, LV_BORDER_SIDE_INTERNAL); + lv_style_set_radius(&style_btn, 0); + + static const char * map[] = {LV_SYMBOL_LEFT, "1", "2", "3", "4", "5", LV_SYMBOL_RIGHT, ""}; + + lv_obj_t * btnm = lv_buttonmatrix_create(lv_screen_active()); + lv_buttonmatrix_set_map(btnm, map); + lv_obj_add_style(btnm, &style_bg, 0); + lv_obj_add_style(btnm, &style_btn, LV_PART_ITEMS); + lv_obj_add_event_cb(btnm, event_cb, LV_EVENT_VALUE_CHANGED, NULL); + lv_obj_set_size(btnm, 225, 35); + + /*Allow selecting on one number at time*/ + lv_buttonmatrix_set_button_ctrl_all(btnm, LV_BUTTONMATRIX_CTRL_CHECKABLE); + lv_buttonmatrix_clear_button_ctrl(btnm, 0, LV_BUTTONMATRIX_CTRL_CHECKABLE); + lv_buttonmatrix_clear_button_ctrl(btnm, 6, LV_BUTTONMATRIX_CTRL_CHECKABLE); + + lv_buttonmatrix_set_one_checked(btnm, true); + lv_buttonmatrix_set_button_ctrl(btnm, 1, LV_BUTTONMATRIX_CTRL_CHECKED); + + lv_obj_center(btnm); + +} + +#endif |
