efl_ui_radio: refactor for usage of efl_ui_check_selected

in previous versions of this widget, the calls that are available due to
inheritance did not work. efl_ui_check_selected_set did not work on a
radio button. However, the internal function _state_set did just exactly
that. So this commit refactors the activity emitting out of the
function, so the _state_set function can just be used as the
efl_ui_check_selected set function.

Reviewed-by: Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
Differential Revision: https://phab.enlightenment.org/D9059
This commit is contained in:
Marcel Hollerbach 2019-05-30 22:15:19 +02:00
parent c9177a9f8d
commit 8cc340e8b2
3 changed files with 60 additions and 60 deletions

View File

@ -7,14 +7,14 @@ static void
_rd_changed_cb(void *data EINA_UNUSED, Evas_Object *obj,
void *event_info EINA_UNUSED)
{
printf("radio value : %d\n", elm_radio_value_get(obj));
printf("radio(%p) value : %d\n", obj, elm_radio_value_get(obj));
}
static void
_rdg_changed_cb(void *data EINA_UNUSED, Evas_Object *obj,
void *event_info EINA_UNUSED)
{
printf("radio group value : %d\n", elm_radio_value_get(obj));
printf("radio(%p) group value : %d\n", obj, elm_radio_value_get(obj));
}
static void

View File

@ -43,57 +43,49 @@ static const Elm_Action key_actions[] = {
};
static void
_state_set(Evas_Object *obj, Eina_Bool state, Eina_Bool activate)
_radio_widget_signal_emit(Evas_Object *obj, const char *middle_term)
{
ELM_RADIO_DATA_GET(obj, sd);
const char *source, *state;
char path[PATH_MAX];
if (state != sd->state)
if (elm_widget_is_legacy(obj))
source = "elm";
else
source = "efl";
if (efl_ui_check_selected_get(obj))
state = "on";
else
state = "off";
snprintf(path, sizeof(path), "%s,%s,%s", source, middle_term, state);
elm_layout_signal_emit(obj, path, source);
}
static void
_efl_ui_radio_efl_ui_check_selected_set(Eo *obj, Efl_Ui_Radio_Data *pd EINA_UNUSED, Eina_Bool value)
{
if (value == efl_ui_check_selected_get(obj)) return;
efl_ui_check_selected_set(efl_super(obj, MY_CLASS), value);
_radio_widget_signal_emit(obj, "state,radio");
if (_elm_config->atspi_mode)
{
sd->state = state;
if (sd->state)
if (efl_ui_check_selected_get(obj))
{
// 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 (elm_widget_is_legacy(obj))
{
if (activate) elm_layout_signal_emit(obj, "elm,activate,radio,on", "elm");
elm_layout_signal_emit(obj, "elm,state,radio,on", "elm");
}
else
{
if (activate) elm_layout_signal_emit(obj, "efl,activate,radio,on", "efl");
elm_layout_signal_emit(obj, "efl,state,radio,on", "efl");
}
}
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
// 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 (elm_widget_is_legacy(obj))
{
if (activate) elm_layout_signal_emit(obj, "elm,activate,radio,off", "elm");
elm_layout_signal_emit(obj, "elm,state,radio,off", "elm");
}
else
{
if (activate) elm_layout_signal_emit(obj, "efl,activate,radio,off", "efl");
elm_layout_signal_emit(obj, "efl,state,radio,off", "efl");
}
}
if (_elm_config->atspi_mode)
{
if (sd->state)
{
efl_access_state_changed_signal_emit(obj, EFL_ACCESS_STATE_TYPE_CHECKED, EINA_TRUE);
}
efl_access_state_changed_signal_emit(obj, EFL_ACCESS_STATE_TYPE_CHECKED, EINA_TRUE);
}
}
}
static void
_activate_state_emit(Evas_Object *obj)
{
_radio_widget_signal_emit(obj, "activate,radio");
}
static void
_state_set_all(Efl_Ui_Radio_Data *sd, Eina_Bool activate)
{
@ -105,16 +97,25 @@ _state_set_all(Efl_Ui_Radio_Data *sd, Eina_Bool activate)
{
ELM_RADIO_DATA_GET(child, sdc);
if (sdc->state) selected = child;
if (efl_ui_check_selected_get(child)) selected = child;
if (sdc->value == sd->group->value)
{
_state_set(child, EINA_TRUE, activate);
if (!sdc->state) disabled = EINA_TRUE;
if (activate) _activate_state_emit(child);
efl_ui_check_selected_set(child, EINA_TRUE);
if (!efl_ui_check_selected_get(child)) disabled = EINA_TRUE;
}
else
{
if (activate) _activate_state_emit(child);
efl_ui_check_selected_set(child, EINA_FALSE);
}
else _state_set(child, EINA_FALSE, activate);
}
if ((disabled) && (selected)) _state_set(selected, 1, activate);
if ((disabled) && (selected))
{
if (activate) _activate_state_emit(selected);
efl_ui_check_selected_set(selected, EINA_TRUE);
}
}
static void
@ -148,7 +149,7 @@ _key_action_activate(Evas_Object *obj, const char *params EINA_UNUSED)
}
EOLIAN static Eina_Error
_efl_ui_radio_efl_ui_widget_theme_apply(Eo *obj, Efl_Ui_Radio_Data *sd)
_efl_ui_radio_efl_ui_widget_theme_apply(Eo *obj, Efl_Ui_Radio_Data *sd EINA_UNUSED)
{
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EFL_UI_THEME_APPLY_ERROR_GENERIC);
Eina_Error int_ret = EFL_UI_THEME_APPLY_ERROR_GENERIC;
@ -157,12 +158,12 @@ _efl_ui_radio_efl_ui_widget_theme_apply(Eo *obj, Efl_Ui_Radio_Data *sd)
if (elm_widget_is_legacy(obj))
{
if (sd->state) elm_layout_signal_emit(obj, "elm,state,radio,on", "elm");
if (efl_ui_check_selected_get(obj)) elm_layout_signal_emit(obj, "elm,state,radio,on", "elm");
else elm_layout_signal_emit(obj, "elm,state,radio,off", "elm");
}
else
{
if (sd->state) elm_layout_signal_emit(obj, "efl,state,radio,on", "efl");
if (efl_ui_check_selected_get(obj)) elm_layout_signal_emit(obj, "efl,state,radio,on", "efl");
else elm_layout_signal_emit(obj, "efl,state,radio,off", "efl");
}
@ -196,10 +197,8 @@ _access_info_cb(void *data EINA_UNUSED, Evas_Object *obj)
static char *
_access_state_cb(void *data EINA_UNUSED, Evas_Object *obj)
{
ELM_RADIO_DATA_GET(obj, sd);
if (elm_widget_disabled_get(obj)) return strdup(E_("State: Disabled"));
if (sd->state) return strdup(E_("State: On"));
if (efl_ui_check_selected_get(obj)) return strdup(E_("State: On"));
return strdup(E_("State: Off"));
}
@ -267,16 +266,16 @@ _efl_ui_radio_group_add(Eo *obj, Efl_Ui_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, EINA_FALSE);
else _state_set(obj, EINA_FALSE, EINA_FALSE);
if (sd->value == sd->group->value) efl_ui_check_selected_set(obj, EINA_TRUE);
else efl_ui_check_selected_set(obj, EINA_FALSE);
}
EOLIAN static void
_efl_ui_radio_state_value_set(Eo *obj, Efl_Ui_Radio_Data *sd, int value)
{
sd->value = value;
if (sd->value == sd->group->value) _state_set(obj, EINA_TRUE, EINA_FALSE);
else _state_set(obj, EINA_FALSE, EINA_FALSE);
if (sd->value == sd->group->value) efl_ui_check_selected_set(obj, EINA_TRUE);
else efl_ui_check_selected_set(obj, EINA_FALSE);
}
EOLIAN static int

View File

@ -28,5 +28,6 @@ class @beta Efl.Ui.Radio extends Efl.Ui.Check implements Efl.Access.Widget.Actio
Efl.Ui.Widget.widget_input_event_handler;
Efl.Access.Object.state_set { get; }
Efl.Access.Widget.Action.elm_actions { get; }
Efl.Ui.Check.selected {set;}
}
}