From 26e15fa577f97d510b218fb95fc9a4bd440b00bc Mon Sep 17 00:00:00 2001 From: Gabor Kiss-Vamosi Date: Mon, 13 Sep 2021 17:44:02 +0200 Subject: [PATCH] fix(imgbtn) add lv_imgbtn_set_state The normal lv_obj_add/clear_state couldn't refresh the image button properly. --- docs/widgets/extra/imgbtn.md | 5 +++++ src/extra/widgets/imgbtn/lv_imgbtn.c | 17 +++++++++++++++++ src/extra/widgets/imgbtn/lv_imgbtn.h | 7 +++++++ 3 files changed, 29 insertions(+) diff --git a/docs/widgets/extra/imgbtn.md b/docs/widgets/extra/imgbtn.md index d2db4dbb8..9c206090f 100644 --- a/docs/widgets/extra/imgbtn.md +++ b/docs/widgets/extra/imgbtn.md @@ -34,6 +34,11 @@ The possible states are: If you set sources only in `LV_IMGBTN_STATE_RELEASED`, these sources will be used in other states too. If you set e.g. `LV_IMGBTN_STATE_PRESSED` they will be used in pressed state instead of the released images. + +### States +Instead of the regular `lv_obj_add/clear_state()` functions the `lv_imgbtn_set_state(imgbtn, LV_IMGBTN_STATE_...)` functions should be used to manually set a state. + + ## Events - `LV_EVENT_VALUE_CHANGED` Sent when the button is toggled. diff --git a/src/extra/widgets/imgbtn/lv_imgbtn.c b/src/extra/widgets/imgbtn/lv_imgbtn.c index 78ae570d6..964801f7c 100644 --- a/src/extra/widgets/imgbtn/lv_imgbtn.c +++ b/src/extra/widgets/imgbtn/lv_imgbtn.c @@ -90,6 +90,23 @@ void lv_imgbtn_set_src(lv_obj_t * obj, lv_imgbtn_state_t state, const void * src refr_img(obj); } +void lv_imgbtn_set_state(lv_obj_t * obj, lv_imgbtn_state_t state) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_state_t obj_state = LV_STATE_DEFAULT; + if(state == LV_IMGBTN_STATE_PRESSED || state == LV_IMGBTN_STATE_CHECKED_PRESSED) obj_state |= LV_STATE_PRESSED; + if(state == LV_IMGBTN_STATE_DISABLED || state == LV_IMGBTN_STATE_CHECKED_DISABLED) obj_state |= LV_STATE_DISABLED; + if(state == LV_IMGBTN_STATE_CHECKED_DISABLED || state == LV_IMGBTN_STATE_CHECKED_PRESSED || state == LV_IMGBTN_STATE_CHECKED_RELEASED) { + obj_state |= LV_STATE_CHECKED; + } + + lv_obj_clear_state(obj, LV_STATE_CHECKED | LV_STATE_PRESSED | LV_STATE_DISABLED); + lv_obj_add_state(obj, obj_state); + + refr_img(obj); +} + /*===================== * Getter functions *====================*/ diff --git a/src/extra/widgets/imgbtn/lv_imgbtn.h b/src/extra/widgets/imgbtn/lv_imgbtn.h index a3d7a1608..b8e2c8a2a 100644 --- a/src/extra/widgets/imgbtn/lv_imgbtn.h +++ b/src/extra/widgets/imgbtn/lv_imgbtn.h @@ -78,6 +78,13 @@ void lv_imgbtn_set_src(lv_obj_t * imgbtn, lv_imgbtn_state_t state, const void * const void * src_right); +/** + * Use this function instead of `lv_obj_add/clear_state` to set a state manually + * @param imgbtn pointer to an image button object + * @param state the new state + */ +void lv_imgbtn_set_state(lv_obj_t * imgbtn, lv_imgbtn_state_t state); + /*===================== * Getter functions *====================*/