diff --git a/src/lv_widgets/lv_btn.c b/src/lv_widgets/lv_btn.c index 4064fe7fe..bf21476b0 100644 --- a/src/lv_widgets/lv_btn.c +++ b/src/lv_widgets/lv_btn.c @@ -137,27 +137,26 @@ void lv_btn_set_state(lv_obj_t * btn, lv_btn_state_t state) switch(state) { case LV_BTN_STATE_RELEASED: - lv_obj_clear_state(btn, LV_STATE_PRESSED | LV_STATE_CHECKED | LV_STATE_DISABLED); + lv_obj_clear_state(btn, LV_STATE_PRESSED | LV_STATE_CHECKED); break; case LV_BTN_STATE_PRESSED: - lv_obj_clear_state(btn, LV_STATE_CHECKED | LV_STATE_DISABLED); + lv_obj_clear_state(btn, LV_STATE_CHECKED); lv_obj_add_state(btn, LV_STATE_PRESSED); break; case LV_BTN_STATE_CHECKED_RELEASED: lv_obj_add_state(btn, LV_STATE_CHECKED); - lv_obj_clear_state(btn, LV_STATE_PRESSED | LV_STATE_DISABLED); + lv_obj_clear_state(btn, LV_STATE_PRESSED); break; case LV_BTN_STATE_CHECKED_PRESSED: - lv_obj_add_state(btn, LV_STATE_PRESSED | LV_STATE_CHECKED | LV_STATE_DISABLED); + lv_obj_add_state(btn, LV_STATE_PRESSED | LV_STATE_CHECKED); break; case LV_BTN_STATE_DISABLED: - lv_obj_clear_state(btn, LV_STATE_PRESSED | LV_STATE_CHECKED); lv_obj_add_state(btn, LV_STATE_DISABLED); break; + case LV_BTN_STATE_ACTIVE: + lv_obj_clear_state(btn, LV_STATE_DISABLED); + break; } - - // /*Make the state change happen immediately, without transition*/ - // btn->prev_state = btn->state; } /** @@ -185,26 +184,25 @@ void lv_btn_toggle(lv_obj_t * btn) /** * Get the current state of the button * @param btn pointer to a button object - * @return the state of the button (from lv_btn_state_t enum) + * @return the state of the button (from lv_btn_state_t enum). + * If the button is in disabled state `LV_BTN_STATE_DISABLED` will be ORed to the other button states. */ lv_btn_state_t lv_btn_get_state(const lv_obj_t * btn) { LV_ASSERT_OBJ(btn, LV_OBJX_NAME); - lv_state_t state = lv_obj_get_state(btn, LV_BTN_PART_MAIN); + lv_state_t obj_state = lv_obj_get_state(btn, LV_BTN_PART_MAIN); + lv_btn_state_t btn_state = 0; + if(obj_state & LV_STATE_DISABLED) btn_state = LV_BTN_STATE_DISABLED; - if(state & LV_STATE_DISABLED) { - return LV_BTN_STATE_DISABLED; - } - else if(state & LV_STATE_CHECKED) { - if(state & LV_STATE_PRESSED) return LV_BTN_STATE_CHECKED_PRESSED; - else return LV_BTN_STATE_CHECKED_RELEASED; + if(obj_state & LV_STATE_CHECKED) { + if(obj_state & LV_STATE_PRESSED) return btn_state | LV_BTN_STATE_CHECKED_PRESSED; + else return btn_state | LV_BTN_STATE_CHECKED_RELEASED; } else { - if(state & LV_STATE_PRESSED) return LV_BTN_STATE_PRESSED; - else return LV_BTN_STATE_RELEASED; + if(obj_state & LV_STATE_PRESSED) return btn_state | LV_BTN_STATE_PRESSED; + else return btn_state | LV_BTN_STATE_RELEASED; } - } /** diff --git a/src/lv_widgets/lv_btn.h b/src/lv_widgets/lv_btn.h index 3c3f9ede9..6af82095e 100644 --- a/src/lv_widgets/lv_btn.h +++ b/src/lv_widgets/lv_btn.h @@ -36,11 +36,12 @@ extern "C" { /** Possible states of a button. * It can be used not only by buttons but other button-like objects too*/ enum { + LV_BTN_STATE_ACTIVE, LV_BTN_STATE_RELEASED, LV_BTN_STATE_PRESSED, LV_BTN_STATE_CHECKED_RELEASED, LV_BTN_STATE_CHECKED_PRESSED, - LV_BTN_STATE_DISABLED, + LV_BTN_STATE_DISABLED = 0x80, _LV_BTN_STATE_LAST, /* Number of states*/ }; typedef uint8_t lv_btn_state_t; @@ -153,6 +154,7 @@ static inline void lv_btn_set_fit(lv_obj_t * btn, lv_fit_t fit) * Get the current state of the button * @param btn pointer to a button object * @return the state of the button (from lv_btn_state_t enum) + * If the button is in disabled state `LV_BTN_STATE_DISABLED` will be ORed to the other button states. */ lv_btn_state_t lv_btn_get_state(const lv_obj_t * btn);