radio: add "elm,activate,radio,on" and "elm,activate,radio,off" signal to support value change animation.

Summary:
Currently when user clicks on the radio, and when api value_set() called by
the developer we emit "elm,state,radio,*" signal. To support value change animation when
user interacts with radio. There is no way to distinguish the action in EDC.
This "elm,activate,radio,*" is a way which edc can make use to distinguish the state change signal
by the user action or due to api call.

Reviewers: Hermet, raster, cedric

Reviewed By: cedric

Differential Revision: https://phab.enlightenment.org/D2829

Signed-off-by: Cedric BAIL <cedric@osg.samsung.com>
This commit is contained in:
Subhransu Mohanty 2015-07-29 23:14:30 +02:00 committed by Cedric BAIL
parent 427ffbc1b3
commit 67844a781c
1 changed files with 29 additions and 15 deletions

View File

@ -46,7 +46,7 @@ static const Elm_Action key_actions[] = {
};
static void
_state_set(Evas_Object *obj, Eina_Bool state)
_state_set(Evas_Object *obj, Eina_Bool state, Eina_Bool activate)
{
ELM_RADIO_DATA_GET(obj, sd);
@ -54,9 +54,23 @@ _state_set(Evas_Object *obj, Eina_Bool state)
{
sd->state = state;
if (sd->state)
elm_layout_signal_emit(obj, "elm,state,radio,on", "elm");
{
// FIXME: to do animation during state change , we need different signal
// so that we can distinguish between state change by user or state change
// by calling state_change() api. Keep both the signal for backward compatibility
// and only emit "elm,state,radio,on" when activate is false when we can break ABI.
if (activate) elm_layout_signal_emit(obj, "elm,activate,radio,on", "elm");
elm_layout_signal_emit(obj, "elm,state,radio,on", "elm");
}
else
elm_layout_signal_emit(obj, "elm,state,radio,off", "elm");
{
// FIXME: to do animation during state change , we need different signal
// so that we can distinguish between state change by user or state change
// by calling state_change() api. Keep both the signal for backward compatibility
// and only emit "elm,state,radio,off"when activate is false when we can break ABI.
if (activate) elm_layout_signal_emit(obj, "elm,activate,radio,off", "elm");
elm_layout_signal_emit(obj, "elm,state,radio,off", "elm");
}
if (_elm_config->atspi_mode)
{
if (sd->state)
@ -70,7 +84,7 @@ _state_set(Evas_Object *obj, Eina_Bool state)
}
static void
_state_set_all(Elm_Radio_Data *sd)
_state_set_all(Elm_Radio_Data *sd, Eina_Bool activate)
{
const Eina_List *l;
Eina_Bool disabled = EINA_FALSE;
@ -83,13 +97,13 @@ _state_set_all(Elm_Radio_Data *sd)
if (sdc->state) selected = child;
if (sdc->value == sd->group->value)
{
_state_set(child, EINA_TRUE);
_state_set(child, EINA_TRUE, activate);
if (!sdc->state) disabled = EINA_TRUE;
}
else _state_set(child, EINA_FALSE);
else _state_set(child, EINA_FALSE, activate);
}
if ((disabled) && (selected)) _state_set(selected, 1);
if ((disabled) && (selected)) _state_set(selected, 1, activate);
}
static void
@ -105,7 +119,7 @@ _activate(Evas_Object *obj)
sd->group->value = sd->value;
if (sd->group->valuep) *(sd->group->valuep) = sd->group->value;
_state_set_all(sd);
_state_set_all(sd, EINA_TRUE);
if (_elm_config->access_mode)
_elm_access_say(E_("State: On"));
@ -199,7 +213,7 @@ _elm_radio_elm_widget_theme_apply(Eo *obj, Elm_Radio_Data *sd)
if (sd->state) elm_layout_signal_emit(obj, "elm,state,radio,on", "elm");
else elm_layout_signal_emit(obj, "elm,state,radio,off", "elm");
if (sd->state) _state_set(obj, EINA_FALSE);
if (sd->state) _state_set(obj, EINA_FALSE, EINA_FALSE);
edje_object_message_signal_process(wd->resize_obj);
@ -349,16 +363,16 @@ _elm_radio_group_add(Eo *obj, Elm_Radio_Data *sd, Evas_Object *group)
sd->group = sdg->group;
sd->group->radios = eina_list_append(sd->group->radios, obj);
}
if (sd->value == sd->group->value) _state_set(obj, EINA_TRUE);
else _state_set(obj, EINA_FALSE);
if (sd->value == sd->group->value) _state_set(obj, EINA_TRUE, EINA_FALSE);
else _state_set(obj, EINA_FALSE, EINA_FALSE);
}
EOLIAN static void
_elm_radio_state_value_set(Eo *obj, Elm_Radio_Data *sd, int value)
{
sd->value = value;
if (sd->value == sd->group->value) _state_set(obj, EINA_TRUE);
else _state_set(obj, EINA_FALSE);
if (sd->value == sd->group->value) _state_set(obj, EINA_TRUE, EINA_FALSE);
else _state_set(obj, EINA_FALSE, EINA_FALSE);
}
EOLIAN static int
@ -373,7 +387,7 @@ _elm_radio_value_set(Eo *obj EINA_UNUSED, Elm_Radio_Data *sd, int value)
if (value == sd->group->value) return;
sd->group->value = value;
if (sd->group->valuep) *(sd->group->valuep) = sd->group->value;
_state_set_all(sd);
_state_set_all(sd, EINA_FALSE);
}
EOLIAN static int
@ -391,7 +405,7 @@ _elm_radio_value_pointer_set(Eo *obj EINA_UNUSED, Elm_Radio_Data *sd, int *value
if (*(sd->group->valuep) != sd->group->value)
{
sd->group->value = *(sd->group->valuep);
_state_set_all(sd);
_state_set_all(sd, EINA_FALSE);
}
}
else sd->group->valuep = NULL;