woohyun pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=d679425c481e692e3ad652b0da2b570709f9d86c
commit d679425c481e692e3ad652b0da2b570709f9d86c Author: WooHyun Jung <[email protected]> Date: Tue Feb 13 22:50:14 2018 +0900 efl_ui_nstate: make "changed" callback is called properly - "changed" callback is not called when theme_apply is called - elm_check_state_set does not call "changed" callback to keep backward compatibility --- src/Makefile_Elementary.am | 1 + src/lib/elementary/efl_ui_check.c | 76 +++++++++++++++++++++++--------------- src/lib/elementary/efl_ui_nstate.c | 17 +++++---- 3 files changed, 57 insertions(+), 37 deletions(-) diff --git a/src/Makefile_Elementary.am b/src/Makefile_Elementary.am index eee0170d3d..f737b02005 100644 --- a/src/Makefile_Elementary.am +++ b/src/Makefile_Elementary.am @@ -391,6 +391,7 @@ includesunstable_HEADERS = \ lib/elementary/efl_ui_widget_scroller.h \ lib/elementary/efl_ui_widget_scroll_manager.h \ lib/elementary/efl_ui_widget_pan.h \ + lib/elementary/efl_ui_nstate_private.h \ lib/elementary/Efl_Ui.h includesunstabledir = $(includedir)/elementary-@VMAJ@ diff --git a/src/lib/elementary/efl_ui_check.c b/src/lib/elementary/efl_ui_check.c index d36cdb0b1a..a4cce48c46 100644 --- a/src/lib/elementary/efl_ui_check.c +++ b/src/lib/elementary/efl_ui_check.c @@ -11,6 +11,7 @@ #include "elm_priv.h" #include "efl_ui_nstate.eo.h" #include "efl_ui_check_private.h" +#include "efl_ui_nstate_private.h" #define MY_CLASS EFL_UI_CHECK_CLASS #define MY_CLASS_PFX efl_ui_check @@ -49,10 +50,10 @@ _activate(Evas_Object *obj) { EFL_UI_CHECK_DATA_GET(obj, sd); - efl_ui_nstate_activate(obj); - if (sd->statep) *sd->statep = efl_ui_nstate_value_get(obj); + if (sd->statep) *sd->statep = !efl_ui_nstate_value_get(obj); - if (efl_ui_nstate_value_get(obj) == 1) + // state will be changed to 1 by efl_ui_nstate_activate(obj) + if (efl_ui_nstate_value_get(obj) == 0) { // FIXME: to do animation during state change , we need different signal // so that we can distinguish between state change by user or state change @@ -63,7 +64,7 @@ _activate(Evas_Object *obj) if (_elm_config->access_mode != ELM_ACCESS_MODE_OFF) _elm_access_say(E_("State: On")); } - else if (efl_ui_nstate_value_get(obj) == 0) + else { // FIXME: to do animation during state change , we need different signal // so that we can distinguish between state change by user or state change @@ -75,10 +76,12 @@ _activate(Evas_Object *obj) _elm_access_say(E_("State: Off")); } + efl_ui_nstate_activate(obj); + if (_elm_config->atspi_mode) - efl_access_state_changed_signal_emit(obj, - EFL_ACCESS_STATE_CHECKED, - efl_ui_nstate_value_get(obj)); + efl_access_state_changed_signal_emit(obj, + EFL_ACCESS_STATE_CHECKED, + efl_ui_nstate_value_get(obj)); } /* FIXME: replicated from elm_layout just because check's icon spot @@ -160,7 +163,7 @@ _efl_ui_check_efl_ui_widget_theme_apply(Eo *obj, Efl_Ui_Check_Data *sd EINA_UNUS if (efl_ui_nstate_value_get(obj) == 0) elm_layout_signal_emit(obj, "elm,state,check,off", "elm"); - else if (efl_ui_nstate_value_get(obj) == 1) + else elm_layout_signal_emit(obj, "elm,state,check,on", "elm"); edje_object_message_signal_process(wd->resize_obj); @@ -230,16 +233,14 @@ _on_check_off(void *data, EFL_UI_CHECK_DATA_GET(obj, sd); - efl_ui_nstate_value_set(obj, 0); - if (sd->statep) *sd->statep = efl_ui_nstate_value_get(obj); - + if (sd->statep) *sd->statep = 0; elm_layout_signal_emit(obj, "elm,state,check,off", "elm"); - efl_event_callback_legacy_call(obj, EFL_UI_CHECK_EVENT_CHANGED, NULL); + efl_ui_nstate_value_set(obj, 0); if (_elm_config->atspi_mode) - efl_access_state_changed_signal_emit(data, - EFL_ACCESS_STATE_CHECKED, - efl_ui_nstate_value_get(obj)); + efl_access_state_changed_signal_emit(data, + EFL_ACCESS_STATE_CHECKED, + efl_ui_nstate_value_get(obj)); } static void @@ -252,15 +253,14 @@ _on_check_on(void *data, EFL_UI_CHECK_DATA_GET(obj, sd); - efl_ui_nstate_value_set(obj, 1); - if (sd->statep) *sd->statep = efl_ui_nstate_value_get(obj); + if (sd->statep) *sd->statep = 1; elm_layout_signal_emit(obj, "elm,state,check,on", "elm"); - efl_event_callback_legacy_call(obj, EFL_UI_CHECK_EVENT_CHANGED, NULL); + efl_ui_nstate_value_set(obj, 1); if (_elm_config->atspi_mode) efl_access_state_changed_signal_emit(data, - EFL_ACCESS_STATE_CHECKED, - efl_ui_nstate_value_get(obj)); + EFL_ACCESS_STATE_CHECKED, + efl_ui_nstate_value_get(obj)); } static void @@ -283,14 +283,16 @@ _efl_ui_check_selected_set(Eo *obj, Efl_Ui_Check_Data *sd, Eina_Bool value) { ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd); - efl_ui_nstate_value_set(obj, value); - if (sd->statep) *sd->statep = efl_ui_nstate_value_get(obj); - if (efl_ui_nstate_value_get(obj) == 1) + if (sd->statep) *sd->statep = value; + + if (value == 1) elm_layout_signal_emit(obj, "elm,state,check,on", "elm"); - else if (efl_ui_nstate_value_get(obj) == 0) + else elm_layout_signal_emit(obj, "elm,state,check,off", "elm"); edje_object_message_signal_process(wd->resize_obj); + + efl_ui_nstate_value_set(obj, value); } EOLIAN static void @@ -341,7 +343,21 @@ _efl_ui_check_efl_object_constructor(Eo *obj, Efl_Ui_Check_Data *pd EINA_UNUSED) EAPI void elm_check_state_set(Evas_Object *obj, Eina_Bool state) { - efl_ui_check_selected_set(obj, state); + ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd); + EFL_UI_NSTATE_DATA_GET_OR_RETURN(obj, nd); + EFL_UI_CHECK_DATA_GET_OR_RETURN(obj, sd); + + if (state != nd->state) + { + nd->state = state; + if (sd->statep) *sd->statep = state; + + if (state == 1) + elm_layout_signal_emit(obj, "elm,state,check,on", "elm"); + else + elm_layout_signal_emit(obj, "elm,state,check,off", "elm"); + edje_object_message_signal_process(wd->resize_obj); + } } EAPI Eina_Bool @@ -354,6 +370,8 @@ EAPI void elm_check_state_pointer_set(Eo *obj, Eina_Bool *statep) { EFL_UI_CHECK_DATA_GET_OR_RETURN(obj, sd); + EFL_UI_NSTATE_DATA_GET_OR_RETURN(obj, nd); + if (!statep) { sd->statep = NULL; @@ -361,12 +379,12 @@ elm_check_state_pointer_set(Eo *obj, Eina_Bool *statep) } sd->statep = statep; - if (*sd->statep != efl_ui_nstate_value_get(obj)) + if (*sd->statep != nd->state) { - efl_ui_nstate_value_set(obj, *sd->statep); - if (efl_ui_nstate_value_get(obj) == 1) + nd->state = *sd->statep; + if (nd->state == 1) elm_layout_signal_emit(obj, "elm,state,check,on", "elm"); - else if (efl_ui_nstate_value_get(obj) == 0) + else elm_layout_signal_emit(obj, "elm,state,check,off", "elm"); } } diff --git a/src/lib/elementary/efl_ui_nstate.c b/src/lib/elementary/efl_ui_nstate.c index a555cbcd89..2f35480ddf 100644 --- a/src/lib/elementary/efl_ui_nstate.c +++ b/src/lib/elementary/efl_ui_nstate.c @@ -7,17 +7,12 @@ #include "elm_priv.h" #include "efl_ui_nstate.eo.h" #include "efl_ui_button_private.h" +#include "efl_ui_nstate_private.h" #define MY_CLASS EFL_UI_NSTATE_CLASS #define MY_CLASS_NAME "Efl.Ui.Nstate" -typedef struct -{ - int nstate; - int state; -} Efl_Ui_Nstate_Data; - static Eina_Bool _key_action_activate(Evas_Object *obj, const char *params); static void _state_active(Evas_Object *obj, Efl_Ui_Nstate_Data *sd); @@ -65,7 +60,7 @@ _next_state_set(Efl_Ui_Nstate_Data *sd) } static void -_state_active(Evas_Object *obj, Efl_Ui_Nstate_Data *sd) +_state_signal_emit(Evas_Object *obj, Efl_Ui_Nstate_Data *sd) { char buf[64]; @@ -73,6 +68,12 @@ _state_active(Evas_Object *obj, Efl_Ui_Nstate_Data *sd) elm_layout_signal_emit(obj, buf, "elm"); edje_object_message_signal_process(elm_layout_edje_get(obj)); elm_layout_sizing_eval(obj); +} + +static void +_state_active(Evas_Object *obj, Efl_Ui_Nstate_Data *sd) +{ + _state_signal_emit(obj, sd); efl_event_callback_legacy_call(obj, EFL_UI_NSTATE_EVENT_CHANGED, NULL); } @@ -123,7 +124,7 @@ _efl_ui_nstate_efl_ui_widget_theme_apply(Eo *obj, Efl_Ui_Nstate_Data *pd) int_ret = efl_ui_widget_theme_apply(efl_super(obj, MY_CLASS)); if (!int_ret) return EFL_UI_THEME_APPLY_FAILED; - _state_active(obj, pd); + _state_signal_emit(obj, pd); return int_ret; } --
