Hello If you get compilation error related to Elm nstate class not found, please do a clean build.
#git clean -xfd . Somehow Elementary.h is not getting replaced, if already present, by Elementary.h.in Regards Amitesh On Apr 7, 2016 15:34, "Amitesh Singh" <[email protected]> wrote: > jpeg pushed a commit to branch master. > > > http://git.enlightenment.org/core/efl.git/commit/?id=56ab4359981baffbbc93102b098eede1ad79e47a > > commit 56ab4359981baffbbc93102b098eede1ad79e47a > Author: Amitesh Singh <[email protected]> > Date: Thu Apr 7 18:25:59 2016 +0900 > > elm_nstate: introduce nstate widget and inherit check from it > > Test Plan: > elementary_test -to "nstate" > > @feature > > Reviewers: yashu21985, tasn, Hermet, seoz, smohanty, felipealmeida, > JackDanielZ, jypark, woohyun, herdsman, raster, cedric, jpeg > > Subscribers: saurabhbunty, seoz > > Differential Revision: https://phab.enlightenment.org/D3786 > --- > config/default/base.src.in | 23 ++++ > config/mobile/base.src.in | 23 ++++ > config/standard/base.src.in | 23 ++++ > data/elementary/themes/default.edc | 1 + > data/elementary/themes/edc/elm/nstate.edc | 10 ++ > doc/widgets/Makefile.am | 1 + > src/Makefile_Elementary.am | 5 + > src/bin/elementary/Makefile.am | 1 + > src/bin/elementary/test.c | 4 + > src/bin/elementary/test_nstate.c | 42 +++++++ > src/lib/elementary/Elementary.h.in | 1 + > src/lib/elementary/Makefile.am | 4 + > src/lib/elementary/elm_check.c | 185 > +++++++++++++----------------- > src/lib/elementary/elm_check.eo | 41 ++----- > src/lib/elementary/elm_check_legacy.h | 43 ++++++- > src/lib/elementary/elm_nstate.c | 179 > +++++++++++++++++++++++++++++ > src/lib/elementary/elm_nstate.eo | 47 ++++++++ > src/lib/elementary/elm_nstate.h | 26 +++++ > src/lib/elementary/elm_widget_check.h | 1 - > src/lib/elementary/elm_widget_nstate.h | 38 ++++++ > 20 files changed, 559 insertions(+), 139 deletions(-) > > diff --git a/config/default/base.src.in b/config/default/base.src.in > index 891a7b7..e5933f8 100644 > --- a/config/default/base.src.in > +++ b/config/default/base.src.in > @@ -622,6 +622,29 @@ group "Elm_Config" struct { > } > } > group "Elm_Config_Bindings_Widget" struct { > + value "name" string: "Elm_Nstate"; > + group "key_bindings" list { > + group "Elm_Config_Binding_Key" struct { > + value "context" int: 0; > + value "key" string: "Return"; > + value "action" string: "activate"; > + value "params" string: ""; > + } > + group "Elm_Config_Binding_Key" struct { > + value "context" int: 0; > + value "key" string: "KP_Enter"; > + value "action" string: "activate"; > + value "params" string: ""; > + } > + group "Elm_Config_Binding_Key" struct { > + value "context" int: 0; > + value "key" string: "space"; > + value "action" string: "activate"; > + value "params" string: ""; > + } > + } > + } > + group "Elm_Config_Bindings_Widget" struct { > value "name" string: "Elm_Calendar"; > group "key_bindings" list { > group "Elm_Config_Binding_Key" struct { > diff --git a/config/mobile/base.src.in b/config/mobile/base.src.in > index b950c80..7ba03bc 100644 > --- a/config/mobile/base.src.in > +++ b/config/mobile/base.src.in > @@ -626,6 +626,29 @@ group "Elm_Config" struct { > } > } > group "Elm_Config_Bindings_Widget" struct { > + value "name" string: "Elm_Nstate"; > + group "key_bindings" list { > + group "Elm_Config_Binding_Key" struct { > + value "context" int: 0; > + value "key" string: "Return"; > + value "action" string: "activate"; > + value "params" string: ""; > + } > + group "Elm_Config_Binding_Key" struct { > + value "context" int: 0; > + value "key" string: "KP_Enter"; > + value "action" string: "activate"; > + value "params" string: ""; > + } > + group "Elm_Config_Binding_Key" struct { > + value "context" int: 0; > + value "key" string: "space"; > + value "action" string: "activate"; > + value "params" string: ""; > + } > + } > + } > + group "Elm_Config_Bindings_Widget" struct { > value "name" string: "Elm_Calendar"; > group "key_bindings" list { > group "Elm_Config_Binding_Key" struct { > diff --git a/config/standard/base.src.in b/config/standard/base.src.in > index 02344b0..ba0d700 100644 > --- a/config/standard/base.src.in > +++ b/config/standard/base.src.in > @@ -623,6 +623,29 @@ group "Elm_Config" struct { > } > } > group "Elm_Config_Bindings_Widget" struct { > + value "name" string: "Elm_Nstate"; > + group "key_bindings" list { > + group "Elm_Config_Binding_Key" struct { > + value "context" int: 0; > + value "key" string: "Return"; > + value "action" string: "activate"; > + value "params" string: ""; > + } > + group "Elm_Config_Binding_Key" struct { > + value "context" int: 0; > + value "key" string: "KP_Enter"; > + value "action" string: "activate"; > + value "params" string: ""; > + } > + group "Elm_Config_Binding_Key" struct { > + value "context" int: 0; > + value "key" string: "space"; > + value "action" string: "activate"; > + value "params" string: ""; > + } > + } > + } > + group "Elm_Config_Bindings_Widget" struct { > value "name" string: "Elm_Calendar"; > group "key_bindings" list { > group "Elm_Config_Binding_Key" struct { > diff --git a/data/elementary/themes/default.edc > b/data/elementary/themes/default.edc > index 2ba757d..0885311 100644 > --- a/data/elementary/themes/default.edc > +++ b/data/elementary/themes/default.edc > @@ -13,6 +13,7 @@ collections { > // elm > #include "edc/elm/bg.edc" > #include "edc/elm/button.edc" > +#include "edc/elm/nstate.edc" > // XXX: mobile mode needs invisible scrollers... make signals that do this > #include "edc/elm/scroller.edc" > // XXX: mobile mode needs different entry setup > diff --git a/data/elementary/themes/edc/elm/nstate.edc > b/data/elementary/themes/edc/elm/nstate.edc > new file mode 100644 > index 0000000..f058806 > --- /dev/null > +++ b/data/elementary/themes/edc/elm/nstate.edc > @@ -0,0 +1,10 @@ > +group { name: "elm/nstate/base/default"; > + inherit: "elm/button/base/default"; > + programs { > + program { > + signal: "mouse,clicked,1"; source: "event"; > + action: SIGNAL_EMIT "elm,action,state,changed" "elm"; > + } > + } > +} > + > diff --git a/doc/widgets/Makefile.am b/doc/widgets/Makefile.am > index 5002c8a..c056084 100644 > --- a/doc/widgets/Makefile.am > +++ b/doc/widgets/Makefile.am > @@ -176,6 +176,7 @@ EXTRA_DIST = \ > widget_preview_progressbar.c \ > widget_preview_box.c \ > widget_preview_notify.c \ > + widget_preview_nstate.c \ > widget_preview_slideshow.c \ > widget_preview_photocam.c \ > widget_preview_inwin1.c \ > diff --git a/src/Makefile_Elementary.am b/src/Makefile_Elementary.am > index 4d2f142..3ec83f9 100644 > --- a/src/Makefile_Elementary.am > +++ b/src/Makefile_Elementary.am > @@ -67,6 +67,7 @@ elm_eolian_files = \ > lib/elementary/elm_multibuttonentry.eo \ > lib/elementary/elm_naviframe.eo \ > lib/elementary/elm_notify.eo \ > + lib/elementary/elm_nstate.eo \ > lib/elementary/elm_pan.eo \ > lib/elementary/elm_panel.eo \ > lib/elementary/elm_panes.eo \ > @@ -196,6 +197,7 @@ includesunstable_HEADERS = \ > lib/elementary/elm_widget_multibuttonentry.h \ > lib/elementary/elm_widget_naviframe.h \ > lib/elementary/elm_widget_notify.h \ > + lib/elementary/elm_widget_nstate.h \ > lib/elementary/elm_widget_panel.h \ > lib/elementary/elm_widget_panes.h \ > lib/elementary/elm_widget_photo.h \ > @@ -400,6 +402,7 @@ includesub_HEADERS = \ > lib/elementary/elm_notify_common.h \ > lib/elementary/elm_notify_eo.h \ > lib/elementary/elm_notify_legacy.h \ > + lib/elementary/elm_nstate.h \ > lib/elementary/elm_object.h \ > lib/elementary/elm_object_item.h \ > lib/elementary/elm_panel.h \ > @@ -572,6 +575,7 @@ lib_elementary_libelementary_la_SOURCES = \ > lib/elementary/elm_menu.c \ > lib/elementary/elm_module.c \ > lib/elementary/elm_notify.c \ > + lib/elementary/elm_nstate.c \ > lib/elementary/elm_panel.c \ > lib/elementary/elm_panes.c \ > lib/elementary/elm_photo.c \ > @@ -737,6 +741,7 @@ bin/elementary/test_multibuttonentry.c \ > bin/elementary/test_naviframe.c \ > bin/elementary/test_naviframe_complex.c \ > bin/elementary/test_notify.c \ > +bin/elementary/test_nstate.c \ > bin/elementary/test_panel.c \ > bin/elementary/test_panes.c \ > bin/elementary/test_photo.c \ > diff --git a/src/bin/elementary/Makefile.am > b/src/bin/elementary/Makefile.am > index 0b2b4e3..5acd88f 100644 > --- a/src/bin/elementary/Makefile.am > +++ b/src/bin/elementary/Makefile.am > @@ -99,6 +99,7 @@ test_multibuttonentry.c \ > test_naviframe.c \ > test_naviframe_complex.c \ > test_notify.c \ > +test_nstate.c \ > test_panel.c \ > test_panes.c \ > test_photo.c \ > diff --git a/src/bin/elementary/test.c b/src/bin/elementary/test.c > index f1ccbe3..334ce0a 100644 > --- a/src/bin/elementary/test.c > +++ b/src/bin/elementary/test.c > @@ -49,6 +49,7 @@ void test_combobox(void *data, Evas_Object *obj, void > *event_info); > void test_combobox2(void *data, Evas_Object *obj, void *event_info); > void test_check(void *data, Evas_Object *obj, void *event_info); > void test_check_toggle(void *data, Evas_Object *obj, void *event_info); > +void test_nstate(void *data, Evas_Object *obj, void *event_info); > void test_radio(void *data, Evas_Object *obj, void *event_info); > void test_layout(void *data, Evas_Object *obj, void *event_info); > void test_layout2(void *data, Evas_Object *obj, void *event_info); > @@ -782,6 +783,9 @@ add_tests: > ADD_TEST(NULL, "Booleans", "Check Toggle", test_check_toggle); > > //------------------------------// > + ADD_TEST(NULL, "Range Values", "Nstate", test_nstate); > + > + //------------------------------// > ADD_TEST(NULL, "Popups", "Ctxpopup", test_ctxpopup); > ADD_TEST(NULL, "Popups", "Hover", test_hover); > ADD_TEST(NULL, "Popups", "Hover 2", test_hover2); > diff --git a/src/bin/elementary/test_nstate.c > b/src/bin/elementary/test_nstate.c > new file mode 100644 > index 0000000..8c66ae5 > --- /dev/null > +++ b/src/bin/elementary/test_nstate.c > @@ -0,0 +1,42 @@ > +#ifdef HAVE_CONFIG_H > +# include "elementary_config.h" > +#endif > +#include <Elementary.h> > + > +static void > +_state_changed_cb(void *d EINA_UNUSED, Evas_Object *o, void *ei > EINA_UNUSED) > +{ > + char buf[100]; > + int val; > + > + val = efl_ui_nstate_value_get(o); > + > + printf("nstate widget state: %d\n", val); > + sprintf(buf, "nstate = %d", val); > + elm_object_text_set(o, buf); > +} > + > +void > +test_nstate(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void > *event_info EINA_UNUSED) > +{ > + Evas_Object *win, *bx, *nstate; > + > + win = elm_win_util_standard_add("nstate", "nstate"); > + elm_win_autodel_set(win, EINA_TRUE); > + > + bx = elm_box_add(win); > + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, > EVAS_HINT_EXPAND); > + elm_win_resize_object_add(win, bx); > + evas_object_show(bx); > + > + nstate = eo_add(ELM_NSTATE_CLASS, win); > + efl_ui_nstate_count_set(nstate, 5); > + elm_object_text_set(nstate, "nstate = 0"); > + elm_box_pack_end(bx, nstate); > + evas_object_show(nstate); > + evas_object_smart_callback_add(nstate, "state,changed", > + _state_changed_cb, NULL); > + > + evas_object_resize(win, 100, 100); > + evas_object_show(win); > +} > diff --git a/src/lib/elementary/Elementary.h.in b/src/lib/elementary/ > Elementary.h.in > index 3e948c5..1723c58 100644 > --- a/src/lib/elementary/Elementary.h.in > +++ b/src/lib/elementary/Elementary.h.in > @@ -236,6 +236,7 @@ EAPI extern Elm_Version *elm_version; > #include <elm_mirroring.h> > #include <elm_need.h> > #include <elm_notify.h> > +#include <elm_nstate.h> > #include <elm_object.h> > > #include <elm_panel.h> > diff --git a/src/lib/elementary/Makefile.am > b/src/lib/elementary/Makefile.am > index 7ea2597..ca081b1 100644 > --- a/src/lib/elementary/Makefile.am > +++ b/src/lib/elementary/Makefile.am > @@ -87,6 +87,7 @@ elm_widget_menu.h \ > elm_widget_multibuttonentry.h \ > elm_widget_naviframe.h \ > elm_widget_notify.h \ > +elm_widget_nstate.h \ > elm_widget_panel.h \ > elm_widget_panes.h \ > elm_widget_photo.h \ > @@ -289,6 +290,7 @@ elm_notify.h \ > elm_notify_common.h \ > elm_notify_eo.h \ > elm_notify_legacy.h \ > +elm_nstate.h \ > elm_object.h \ > elm_object_item.h \ > elm_panel.h \ > @@ -462,6 +464,7 @@ elm_mapbuf.c \ > elm_menu.c \ > elm_module.c \ > elm_notify.c \ > +elm_nstate.c \ > elm_panel.c \ > elm_panes.c \ > elm_photo.c \ > @@ -583,6 +586,7 @@ elm_menu.eo \ > elm_multibuttonentry.eo \ > elm_naviframe.eo \ > elm_notify.eo \ > +elm_nstate.eo \ > elm_pan.eo \ > elm_panel.eo \ > elm_panes.eo \ > diff --git a/src/lib/elementary/elm_check.c > b/src/lib/elementary/elm_check.c > index 024e3da..6a12c70 100644 > --- a/src/lib/elementary/elm_check.c > +++ b/src/lib/elementary/elm_check.c > @@ -5,22 +5,17 @@ > #define ELM_INTERFACE_ATSPI_ACCESSIBLE_PROTECTED > #define ELM_INTERFACE_ATSPI_WIDGET_ACTION_PROTECTED > > +#define ELM_NSTATE_PROTECTED > #include <Elementary.h> > #include "elm_priv.h" > #include "elm_widget_check.h" > -#include "elm_widget_layout.h" > +#include "elm_widget_nstate.h" > > #define MY_CLASS ELM_CHECK_CLASS > > #define MY_CLASS_NAME "Elm_Check" > #define MY_CLASS_NAME_LEGACY "elm_check" > > -static const Elm_Layout_Part_Alias_Description _content_aliases[] = > -{ > - {"icon", "elm.swallow.content"}, > - {NULL, NULL} > -}; > - > static const Elm_Layout_Part_Alias_Description _text_aliases[] = > { > {"default", "elm.text"}, > @@ -53,9 +48,10 @@ _activate(Evas_Object *obj) > { > ELM_CHECK_DATA_GET(obj, sd); > > - sd->state = !sd->state; > - if (sd->statep) *sd->statep = sd->state; > - if (sd->state) > + efl_ui_nstate_activate(obj); > + if (sd->statep) *sd->statep = efl_ui_nstate_value_get(obj); > + > + if (efl_ui_nstate_value_get(obj) == 1) > { > // FIXME: to do animation during state change , we need different > signal > // so that we can distinguish between state change by user or > state change > @@ -66,7 +62,7 @@ _activate(Evas_Object *obj) > if (_elm_config->access_mode != ELM_ACCESS_MODE_OFF) > _elm_access_say(E_("State: On")); > } > - else > + else 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 > @@ -83,7 +79,7 @@ _activate(Evas_Object *obj) > if (_elm_config->atspi_mode) > elm_interface_atspi_accessible_state_changed_signal_emit(obj, > > ELM_ATSPI_STATE_CHECKED, > - > sd->state); > + > efl_ui_nstate_value_get(obj)); > } > > /* FIXME: replicated from elm_layout just because check's icon spot > @@ -144,37 +140,6 @@ _elm_check_elm_widget_activate(Eo *obj EINA_UNUSED, > Elm_Check_Data *_pd EINA_UNU > return EINA_TRUE; > } > > -/* FIXME: replicated from elm_layout just because check's icon spot > - * is elm.swallow.content, not elm.swallow.icon. Fix that whenever we > - * can changed the theme API */ > -EOLIAN static Eina_Bool > -_elm_check_elm_container_content_set(Eo *obj, Elm_Check_Data *_pd > EINA_UNUSED, const char *part, Evas_Object *content) > -{ > - Eina_Bool int_ret = EINA_FALSE; > - > - int_ret = elm_obj_container_content_set(eo_super(obj, MY_CLASS), part, > content); > - if (!int_ret) return EINA_FALSE; > - > - _icon_signal_emit(obj); > - > - elm_obj_layout_sizing_eval(obj); > - > - return EINA_TRUE; > -} > - > -EOLIAN static void > -_elm_check_elm_layout_sizing_eval(Eo *obj, Elm_Check_Data *_pd > EINA_UNUSED) > -{ > - Evas_Coord minw = -1, minh = -1; > - ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd); > - > - elm_coords_finger_size_adjust(1, &minw, 1, &minh); > - edje_object_size_min_restricted_calc > - (wd->resize_obj, &minw, &minh, minw, minh); > - evas_object_size_hint_min_set(obj, minw, minh); > - evas_object_size_hint_max_set(obj, -1, -1); > -} > - > static Eina_Bool > _key_action_activate(Evas_Object *obj, const char *params EINA_UNUSED) > { > @@ -199,17 +164,20 @@ _elm_check_elm_widget_event(Eo *obj, Elm_Check_Data > *_pd EINA_UNUSED, Evas_Objec > } > > EOLIAN static Eina_Bool > -_elm_check_elm_widget_theme_apply(Eo *obj, Elm_Check_Data *sd) > +_elm_check_elm_widget_theme_apply(Eo *obj, Elm_Check_Data *sd EINA_UNUSED) > { > Eina_Bool int_ret = EINA_FALSE; > > ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EINA_FALSE); > > int_ret = elm_obj_widget_theme_apply(eo_super(obj, MY_CLASS)); > + > if (!int_ret) return EINA_FALSE; > > - if (!sd->state) elm_layout_signal_emit(obj, "elm,state,check,off", > "elm"); > - else elm_layout_signal_emit(obj, "elm,state,check,on", "elm"); > + 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) > + elm_layout_signal_emit(obj, "elm,state,check,on", "elm"); > > edje_object_message_signal_process(wd->resize_obj); > > @@ -237,12 +205,11 @@ _access_info_cb(void *data EINA_UNUSED, Evas_Object > *obj) > static char * > _access_state_cb(void *data, Evas_Object *obj) > { > - Elm_Check_Data *sd = eo_data_scope_get(data, MY_CLASS); > const char *on_text, *off_text; > > if (elm_widget_disabled_get(obj)) > return strdup(E_("State: Disabled")); > - if (sd->state) > + if (efl_ui_nstate_value_get(obj)) > { > on_text = elm_layout_text_get(data, "on"); > > @@ -279,8 +246,8 @@ _on_check_off(void *data, > > ELM_CHECK_DATA_GET(obj, sd); > > - sd->state = EINA_FALSE; > - if (sd->statep) *sd->statep = sd->state; > + efl_ui_nstate_value_set(obj, 0); > + if (sd->statep) *sd->statep = efl_ui_nstate_value_get(obj); > > elm_layout_signal_emit(obj, "elm,state,check,off", "elm"); > eo_event_callback_call(obj, ELM_CHECK_EVENT_CHANGED, NULL); > @@ -288,7 +255,7 @@ _on_check_off(void *data, > if (_elm_config->atspi_mode) > elm_interface_atspi_accessible_state_changed_signal_emit(data, > > ELM_ATSPI_STATE_CHECKED, > - > sd->state); > + > efl_ui_nstate_value_get(obj)); > } > > static void > @@ -301,15 +268,15 @@ _on_check_on(void *data, > > ELM_CHECK_DATA_GET(obj, sd); > > - sd->state = EINA_TRUE; > - if (sd->statep) *sd->statep = sd->state; > + efl_ui_nstate_value_set(obj, 1); > + if (sd->statep) *sd->statep = efl_ui_nstate_value_get(obj); > elm_layout_signal_emit(obj, "elm,state,check,on", "elm"); > eo_event_callback_call(obj, ELM_CHECK_EVENT_CHANGED, NULL); > > if (_elm_config->atspi_mode) > - elm_interface_atspi_accessible_state_changed_signal_emit(data, > - > ELM_ATSPI_STATE_CHECKED, > - > sd->state); > + elm_interface_atspi_accessible_state_changed_signal_emit(data, > + > ELM_ATSPI_STATE_CHECKED, > + > efl_ui_nstate_value_get(obj)); > } > > static void > @@ -329,6 +296,9 @@ _elm_check_evas_object_smart_add(Eo *obj, > Elm_Check_Data *_pd EINA_UNUSED) > evas_obj_smart_add(eo_super(obj, MY_CLASS)); > elm_widget_sub_object_parent_add(obj); > > + if (!elm_layout_theme_set(obj, "check", "base", > elm_widget_style_get(obj))) > + CRI("Failed to set layout!"); > + > edje_object_signal_callback_add > (wd->resize_obj, "elm,action,check,on", "*", > _on_check_on, obj); > @@ -348,23 +318,40 @@ _elm_check_evas_object_smart_add(Eo *obj, > Elm_Check_Data *_pd EINA_UNUSED) > (_elm_access_info_get(obj), ELM_ACCESS_STATE, _access_state_cb, obj); > > elm_widget_can_focus_set(obj, EINA_TRUE); > - > - if (!elm_layout_theme_set(obj, "check", "base", > elm_widget_style_get(obj))) > - CRI("Failed to set layout!"); > - > elm_layout_sizing_eval(obj); > } > > EOLIAN static const Elm_Layout_Part_Alias_Description* > -_elm_check_elm_layout_content_aliases_get(Eo *obj EINA_UNUSED, > Elm_Check_Data *_pd EINA_UNUSED) > +_elm_check_elm_layout_text_aliases_get(Eo *obj EINA_UNUSED, > Elm_Check_Data *_pd EINA_UNUSED) > +{ > + return _text_aliases; > +} > + > +EOLIAN static Eina_Bool > +_elm_check_selected_get(Eo *obj, Elm_Check_Data *pd EINA_UNUSED) > { > - return _content_aliases; > + return !!efl_ui_nstate_value_get(obj); > } > > -EOLIAN static const Elm_Layout_Part_Alias_Description* > -_elm_check_elm_layout_text_aliases_get(Eo *obj EINA_UNUSED, > Elm_Check_Data *_pd EINA_UNUSED) > +EOLIAN static void > +_elm_check_selected_set(Eo *obj, Elm_Check_Data *pd EINA_UNUSED, > Eina_Bool value) > { > - return _text_aliases; > + efl_ui_nstate_value_set(obj, value); > +} > + > +EOLIAN static void > +_elm_check_elm_nstate_count_set(Eo *obj EINA_UNUSED, Elm_Check_Data *pd > EINA_UNUSED, int nstate EINA_UNUSED) > +{ > + //NOP; > +} > + > +EOLIAN static void > +_elm_check_elm_nstate_value_set(Eo *obj, Elm_Check_Data *pd EINA_UNUSED, > int state) > +{ > + Eina_Bool _state = !!state; > + if (_state == efl_ui_nstate_value_get(obj)) return; > + > + efl_ui_nstate_value_set(eo_super(obj, MY_CLASS), _state); > } > > EAPI Evas_Object * > @@ -386,59 +373,49 @@ _elm_check_eo_base_constructor(Eo *obj, > Elm_Check_Data *_pd EINA_UNUSED) > return obj; > } > > -EOLIAN static void > -_elm_check_state_set(Eo *obj, Elm_Check_Data *sd, Eina_Bool state) > +EAPI void > +elm_check_state_set(Evas_Object *obj, Eina_Bool state) > { > + ELM_CHECK_DATA_GET_OR_RETURN(obj, sd); > ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd); > > - if (state != sd->state) > - { > - sd->state = state; > - if (sd->statep) *sd->statep = sd->state; > - if (sd->state) > - elm_layout_signal_emit(obj, "elm,state,check,on", "elm"); > - else > - elm_layout_signal_emit(obj, "elm,state,check,off", "elm"); > - } > + if (state == efl_ui_nstate_value_get(obj)) return; > + > + efl_ui_nstate_value_set(obj, state); > + if (sd->statep) *sd->statep = efl_ui_nstate_value_get(obj); > + if (efl_ui_nstate_value_get(obj) == 1) > + elm_layout_signal_emit(obj, "elm,state,check,on", "elm"); > + else if (efl_ui_nstate_value_get(obj) == 0) > + elm_layout_signal_emit(obj, "elm,state,check,off", "elm"); > > edje_object_message_signal_process(wd->resize_obj); > } > > -EOLIAN static Eina_Bool > -_elm_check_state_get(Eo *obj EINA_UNUSED, Elm_Check_Data *sd) > +EAPI Eina_Bool > +elm_check_state_get(const Evas_Object *obj) > { > - return sd->state; > + return !!efl_ui_nstate_value_get(obj); > } > > -EOLIAN static void > -_elm_check_state_pointer_set(Eo *obj, Elm_Check_Data *sd, Eina_Bool > *statep) > +EAPI void > +elm_check_state_pointer_set(Eo *obj, Eina_Bool *statep) > { > - if (statep) > + ELM_CHECK_DATA_GET_OR_RETURN(obj, sd); > + if (!statep) > { > - sd->statep = statep; > - if (*sd->statep != sd->state) > - { > - sd->state = *sd->statep; > - if (sd->state) > - elm_layout_signal_emit(obj, "elm,state,check,on", "elm"); > - else > - elm_layout_signal_emit(obj, "elm,state,check,off", "elm"); > - } > + sd->statep = NULL; > + return; > } > - else > - sd->statep = NULL; > -} > > -EOLIAN static Eina_Bool > -_elm_check_elm_widget_focus_next_manager_is(Eo *obj EINA_UNUSED, > Elm_Check_Data *_pd EINA_UNUSED) > -{ > - return EINA_FALSE; > -} > - > -EOLIAN static Eina_Bool > -_elm_check_elm_widget_focus_direction_manager_is(Eo *obj EINA_UNUSED, > Elm_Check_Data *_pd EINA_UNUSED) > -{ > - return EINA_FALSE; > + sd->statep = statep; > + if (*sd->statep != efl_ui_nstate_value_get(obj)) > + { > + efl_ui_nstate_value_set(obj, *sd->statep); > + if (efl_ui_nstate_value_get(obj) == 1) > + elm_layout_signal_emit(obj, "elm,state,check,on", "elm"); > + else if (efl_ui_nstate_value_get(obj) == 0) > + elm_layout_signal_emit(obj, "elm,state,check,off", "elm"); > + } > } > > EOLIAN const Elm_Atspi_Action * > diff --git a/src/lib/elementary/elm_check.eo > b/src/lib/elementary/elm_check.eo > index 47a32ec..3833d6b 100644 > --- a/src/lib/elementary/elm_check.eo > +++ b/src/lib/elementary/elm_check.eo > @@ -1,38 +1,16 @@ > -class Elm.Check (Elm.Layout, Elm.Interface_Atspi_Widget_Action) > +class Elm.Check (Elm.Nstate, Elm.Interface_Atspi_Widget_Action) > { > - eo_prefix: elm_obj_check; > + eo_prefix: efl_ui_check; > methods { > - @property state { > + @property selected { > set { > - [[Set the on/off state of the check object > - > - This sets the state of the check. If set with > - @.state_pointer.set, the state of that variable is also > - changed. Calling this doesn't cause the "changed" signal to > - be emitted. > - ]] > + [[Set the on/off state of the check object.]] > } > get { > - [[Get the state of the check object]] > - } > - values { > - state: bool; [[The state to use (1 == on, 0 == off)]] > - } > - } > - @property state_pointer { > - set { > - [[Set a convenience pointer to a boolean to change > - > - This sets a pointer to a boolean, that, in addition to the > check > - objects state will also be modified directly. To stop > setting the > - object pointed to simply use null as the "statep" parameter. > - If "statep" is not null, then when this is called, the check > - objects state will also be modified to reflect the value of > the > - boolean "statep" points to, just like calling @.state.set. > - ]] > + [[Get the state of the check object.]] > } > values { > - statep: bool * @nullable; [[Pointer to the boolean to modify]] > + value: Eina_Bool; > } > } > } > @@ -41,15 +19,12 @@ class Elm.Check (Elm.Layout, > Elm.Interface_Atspi_Widget_Action) > Eo.Base.constructor; > Evas.Object_Smart.add; > Elm.Widget.activate; > - Elm.Widget.focus_next_manager_is; > - Elm.Widget.focus_direction_manager_is; > Elm.Widget.theme_apply; > Elm.Widget.sub_object_del; > Elm.Widget.event; > - Elm.Container.content.set; > Elm.Layout.text_aliases.get; > - Elm.Layout.content_aliases.get; > - Elm.Layout.sizing_eval; > + Elm.Nstate.count.set; > + Elm.Nstate.value.set; > Elm.Interface_Atspi_Accessible.state_set.get; > Elm.Interface_Atspi_Widget_Action.elm_actions.get; > } > diff --git a/src/lib/elementary/elm_check_legacy.h > b/src/lib/elementary/elm_check_legacy.h > index a6653c3..b1fc8da 100644 > --- a/src/lib/elementary/elm_check_legacy.h > +++ b/src/lib/elementary/elm_check_legacy.h > @@ -8,4 +8,45 @@ > */ > EAPI Evas_Object * elm_check_add(Evas_Object *parent); > > -#include "elm_check.eo.legacy.h" > \ No newline at end of file > +/** > + * @brief Get the state of the check object > + * > + * @param obj The check object > + * > + * @ingroup Check > + */ > +EAPI Eina_Bool elm_check_state_get(const Evas_Object > *obj); > + > +/** > + * @brief Set the on/off state of the check object > + * > + * This sets the state of the check. If set with > + * @.state_pointer.set, the state of that variable is also > + * changed. Calling this doesn't cause the "changed" signal to > + * be emitted. > + * > + * @param obj The check object > + * @param state The state to use (1 == on, 0 == off) > + * > + * @ingroup Check > + */ > +EAPI void elm_check_state_set(Evas_Object *obj, > Eina_Bool state); > + > +/** > + * @brief Set a convenience pointer to a boolean to change > + * > + * This sets a pointer to a boolean, that, in addition to the check > + * objects state will also be modified directly. To stop setting the > + * object pointed to simply use null as the "statep" parameter. > + * If "statep" is not null, then when this is called, the check > + * objects state will also be modified to reflect the value of the > + * boolean "statep" points to, just like calling @.state.set. > + * > + * @param obj The check object > + * @param statep pointer to the boolean to modify > + * > + * @ingroup Check > + */ > +EAPI void elm_check_state_pointer_set(Evas_Object > *obj, Eina_Bool *statep); > + > +#include "elm_check.eo.legacy.h" > diff --git a/src/lib/elementary/elm_nstate.c > b/src/lib/elementary/elm_nstate.c > new file mode 100644 > index 0000000..dac44d3 > --- /dev/null > +++ b/src/lib/elementary/elm_nstate.c > @@ -0,0 +1,179 @@ > +#ifdef HAVE_CONFIG_H > +# include "elementary_config.h" > +#endif > + > +#define ELM_NSTATE_PROTECTED > +#include "Elementary.h" > +#include "elm_priv.h" > +#include "elm_widget_nstate.h" > +#include "elm_widget_button.h" > + > +#define MY_CLASS ELM_NSTATE_CLASS > + > +#define MY_CLASS_NAME "Elm_Nstate" > +#define MY_CLASS_NAME_LEGACY "elm_nstate" > + > +static const Evas_Smart_Cb_Description _smart_callbacks[] = { > + {NULL, NULL} > +}; > + > +static Eina_Bool _key_action_activate(Evas_Object *obj, const char > *params); > +static void _state_active(Evas_Object *obj, Elm_Nstate_Data *sd); > + > +static const Elm_Action key_actions[] = { > + {"activate", _key_action_activate}, > + {NULL, NULL} > +}; > + > +EOLIAN static Eo_Base * > +_elm_nstate_eo_base_constructor(Eo *obj, Elm_Nstate_Data *pd EINA_UNUSED) > +{ > + obj = eo_constructor(eo_super(obj, MY_CLASS)); > + evas_obj_type_set(obj, MY_CLASS_NAME_LEGACY); > + evas_obj_smart_callbacks_descriptions_set(obj, _smart_callbacks); > + //TODO: Add ATSPI call here > + > + return obj; > +} > + > +static void > +_next_state_set(Elm_Nstate_Data *sd) > +{ > + ++sd->state; > + if (sd->state == sd->nstate) sd->state = 0; > +} > + > +static void > +_state_active(Evas_Object *obj, Elm_Nstate_Data *sd) > +{ > + char buf[64]; > + > + sprintf(buf, "elm,state,changed,%d", sd->state); > + elm_layout_signal_emit(obj, buf, "elm"); > + edje_object_message_signal_process(elm_layout_edje_get(obj)); > + elm_obj_layout_sizing_eval(obj); > + eo_event_callback_call(obj, ELM_NSTATE_EVENT_STATE_CHANGED, NULL); > +} > + > +static void > +_on_state_changed(void *data, > + Evas_Object *o EINA_UNUSED, > + const char *emission EINA_UNUSED, > + const char *source EINA_UNUSED) > +{ > + efl_ui_nstate_activate(data); > +} > + > +EOLIAN static void > +_elm_nstate_evas_object_smart_add(Eo *obj, Elm_Nstate_Data *pd) > +{ > + ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd); > + > + evas_obj_smart_add(eo_super(obj, MY_CLASS)); > + elm_widget_sub_object_parent_add(obj); > + > + pd->state = 0; > + // Default: 2 states > + pd->nstate = 2; > + > + if (!elm_layout_theme_set(obj, "nstate", "base", > elm_widget_style_get(obj))) > + CRI("Failed to set layout!"); > + > + edje_object_signal_callback_add(wd->resize_obj, > "elm,action,state,changed", > + "*", _on_state_changed, obj); > +} > + > +EOLIAN static void > +_elm_nstate_evas_object_smart_del(Eo *obj, Elm_Nstate_Data *pd > EINA_UNUSED) > +{ > + evas_obj_smart_del(eo_super(obj, MY_CLASS)); > +} > + > +EOLIAN static int > +_elm_nstate_count_get(Eo *obj EINA_UNUSED, Elm_Nstate_Data *pd) > +{ > + return pd->nstate; > +} > + > +EOLIAN static void > +_elm_nstate_count_set(Eo *obj EINA_UNUSED, Elm_Nstate_Data *pd, int > nstate) > +{ > + if (pd->nstate == nstate) return; > + > + pd->nstate = nstate; > + pd->state = 0; > +} > + > +EOLIAN static int > +_elm_nstate_value_get(Eo *obj EINA_UNUSED, Elm_Nstate_Data *pd) > +{ > + return pd->state; > +} > + > +static Eina_Bool > +_is_valid_state(Elm_Nstate_Data *sd, int state) > +{ > + if (sd->state == state || (state < 0 || state >= sd->nstate)) > + return EINA_FALSE; > + > + return EINA_TRUE; > +} > + > +EOLIAN static void > +_elm_nstate_value_set(Eo *obj, Elm_Nstate_Data *pd, int state) > +{ > + if (!_is_valid_state(pd, state)) return; > + > + pd->state = state; > + _state_active(obj, pd); > +} > + > +EOLIAN static Eina_Bool > +_elm_nstate_elm_widget_theme_apply(Eo *obj, Elm_Nstate_Data *pd) > +{ > + Eina_Bool int_ret; > + > + int_ret = elm_obj_widget_theme_apply(eo_super(obj, MY_CLASS)); > + if (!int_ret) return EINA_FALSE; > + > + _state_active(obj, pd); > + > + return EINA_TRUE; > +} > + > +static Eina_Bool > +_key_action_activate(Evas_Object *obj, const char *params EINA_UNUSED) > +{ > + efl_ui_nstate_activate(obj); > + return EINA_TRUE; > +} > + > +EOLIAN static Eina_Bool > +_elm_nstate_elm_widget_event(Eo *obj, Elm_Nstate_Data *_pd EINA_UNUSED, > Evas_Object *src EINA_UNUSED, Evas_Callback_Type type, void *event_info) > +{ > + Evas_Event_Key_Down *ev = event_info; > + > + if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE; > + if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE; > + > + if (!_elm_config_key_binding_call(obj, MY_CLASS_NAME, ev, key_actions)) > + return EINA_FALSE; > + > + ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; > + return EINA_TRUE; > +} > + > +EOLIAN static void > +_elm_nstate_activate(Eo *obj, Elm_Nstate_Data *_pd) > +{ > + _next_state_set(_pd); > + _state_active(obj, _pd); > +} > + > +EOLIAN static void > +_elm_nstate_class_constructor(Eo_Class *klass) > +{ > + evas_smart_legacy_type_register(MY_CLASS_NAME_LEGACY, klass); > +} > + > +#include "elm_nstate.eo.c" > diff --git a/src/lib/elementary/elm_nstate.eo > b/src/lib/elementary/elm_nstate.eo > new file mode 100644 > index 0000000..6ff0f89 > --- /dev/null > +++ b/src/lib/elementary/elm_nstate.eo > @@ -0,0 +1,47 @@ > +class Elm.Nstate(Elm.Button) > +{ > + eo_prefix: efl_ui_nstate; > + legacy_prefix: null; > + data: Elm_Nstate_Data; > + methods { > + activate @protected { > + } > + @property count { > + set { > + [[Set the maximum number of states. > + ]] > + } > + get { > + [[Get the max number of states. > + ]] > + } > + values { > + nstate: int; [[The number of states.]] > + } > + } > + @property value { > + set { > + [[Set the particular state given in (0...nstate}. > + ]] > + } > + get { > + [[Get the state value. > + ]] > + } > + values { > + state: int; [[The state.]] > + } > + } > + } > + implements { > + class.constructor; > + Eo.Base.constructor; > + Evas.Object_Smart.add; > + Evas.Object_Smart.del; > + Elm.Widget.theme_apply; > + Elm.Widget.event; > + } > + events { > + state,changed; > + } > +} > diff --git a/src/lib/elementary/elm_nstate.h > b/src/lib/elementary/elm_nstate.h > new file mode 100644 > index 0000000..66d7aed > --- /dev/null > +++ b/src/lib/elementary/elm_nstate.h > @@ -0,0 +1,26 @@ > +/** > + * @defgroup Elm_Nstate Nstate > + * @ingroup Elementary > + * > + * @image html nstate_inheritance_tree.png > + * @image latex nstate_inheritance_tree.eps > + * > + * @image html img/widget/nstate/preview-00.png > + * @image latex img/widget/nstate/preview-00.eps > + * > + * A Nstate is a widget which displays one of the state among states > defined by user. > + * > + * This widget inherits from the @ref Button, so that all the functions > acting on @ref Button also work for nstate objects. > + * > + * This widget emits the following signals, besides the ones sent from > + * @ref Button: > + * - @c "state,changed" - whenever state of nstate is changed > + * > + * Default content parts of the nstate widget that you can use are the > + * the same that you use with the @ref Button > + * @{ > + */ > + > +#ifdef EFL_EO_API_SUPPORT > +#include "elm_nstate.eo.h" > +#endif > diff --git a/src/lib/elementary/elm_widget_check.h > b/src/lib/elementary/elm_widget_check.h > index bcf3eac..d5cf27e 100644 > --- a/src/lib/elementary/elm_widget_check.h > +++ b/src/lib/elementary/elm_widget_check.h > @@ -26,7 +26,6 @@ > typedef struct _Elm_Check_Data Elm_Check_Data; > struct _Elm_Check_Data > { > - Eina_Bool state; > Eina_Bool *statep; > }; > > diff --git a/src/lib/elementary/elm_widget_nstate.h > b/src/lib/elementary/elm_widget_nstate.h > new file mode 100644 > index 0000000..6733d97 > --- /dev/null > +++ b/src/lib/elementary/elm_widget_nstate.h > @@ -0,0 +1,38 @@ > +#ifndef ELM_WIDGET_NSTATE_H > +#define ELM_WIDGET_NSTATE_H > + > +#include "elm_nstate.eo.h" > + > +typedef struct > +{ > + int nstate; > + int state; > +} Elm_Nstate_Data; > + > + > +#define ELM_NSTATE_DATA_GET(o, sd) \ > + Elm_Nstate_Data * sd = eo_data_scope_get(o, ELM_NSTATE_CLASS) > + > +#define ELM_NSTATE_DATA_GET_OR_RETURN(o, ptr) \ > + ELM_NSTATE_DATA_GET(o, ptr); \ > + if (EINA_UNLIKELY(!ptr)) \ > + { \ > + CRI("No widget data for object %p (%s)", \ > + o, evas_object_type_get(o)); \ > + return; \ > + } > + > +#define ELM_NSTATE_DATA_GET_OR_RETURN_VAL(o, ptr, val) \ > + ELM_NSTATE_DATA_GET(o, ptr); \ > + if (EINA_UNLIKELY(!ptr)) \ > + { \ > + CRI("No widget data for object %p (%s)", \ > + o, evas_object_type_get(o)); \ > + return val; \ > + } > + > +#define ELM_NSTATE_CHECK(obj) \ > + if (EINA_UNLIKELY(!eo_isa((obj), ELM_NSTATE_CLASS))) \ > + return > + > +#endif > > -- > > > ------------------------------------------------------------------------------ _______________________________________________ enlightenment-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/enlightenment-devel
