diff --git a/data/elementary/themes/edc/efl/radio.edc b/data/elementary/themes/edc/efl/radio.edc index 5c6dc64aa3..8e2ccf3b63 100644 --- a/data/elementary/themes/edc/efl/radio.edc +++ b/data/elementary/themes/edc/efl/radio.edc @@ -1,3 +1,292 @@ group { "efl/radio"; - inherit: "elm/radio/base/default"; + images.image: "inset_shadow_circle_tiny.png" COMP; + images.image: "inset_circle_tiny.png" COMP; + images.image: "sym_radio_alum.png" COMP; +#define ICON 1 +#define LABEL 2 +#define MASK 3 +#define DISABLE 4 + script { + public btmode; + public eval_mode(m) { + new m1 = m & MASK; + new d = m & DISABLE; + if (m1 == (ICON | LABEL)) { + if (!d) { + set_state(PART:"elm.swallow.content", "visible", 0.0); + set_state(PART:"sizer.content", "visible", 0.0); + set_state(PART:"elm.text", "visible", 0.0); + set_state(PART:"inset", "default", 0.0); + set_state(PART:"clip", "default", 0.0); + set_state(PART:"event", "default", 0.0); + } else { + set_state(PART:"elm.swallow.content", "visible", 0.0); + set_state(PART:"sizer.content", "visible", 0.0); + set_state(PART:"elm.text", "disabled_visible", 0.0); + set_state(PART:"inset", "disabled", 0.0); + set_state(PART:"clip", "disabled", 0.0); + set_state(PART:"event", "disabled", 0.0); + } + } else if (m1 == (ICON)) { + if (!d) { + set_state(PART:"elm.swallow.content", "visible", 0.0); + set_state(PART:"sizer.content", "icononly", 0.0); + set_state(PART:"elm.text", "default", 0.0); + set_state(PART:"inset", "default", 0.0); + set_state(PART:"clip", "default", 0.0); + set_state(PART:"event", "default", 0.0); + } else { + set_state(PART:"elm.swallow.content", "visible", 0.0); + set_state(PART:"sizer.content", "icononly", 0.0); + set_state(PART:"elm.text", "disabled", 0.0); + set_state(PART:"inset", "disabled", 0.0); + set_state(PART:"clip", "disabled", 0.0); + set_state(PART:"event", "disabled", 0.0); + } + } else if (m1 == (LABEL)) { + if (!d) { + set_state(PART:"elm.swallow.content", "default", 0.0); + set_state(PART:"sizer.content", "default", 0.0); + set_state(PART:"elm.text", "visible", 0.0); + set_state(PART:"inset", "default", 0.0); + set_state(PART:"clip", "default", 0.0); + set_state(PART:"event", "default", 0.0); + } else { + set_state(PART:"elm.swallow.content", "default", 0.0); + set_state(PART:"sizer.content", "default", 0.0); + set_state(PART:"elm.text", "disabled_visible", 0.0); + set_state(PART:"inset", "disabled", 0.0); + set_state(PART:"clip", "disabled", 0.0); + set_state(PART:"event", "disabled", 0.0); + } + } else { + if (!d) { + set_state(PART:"elm.swallow.content", "default", 0.0); + set_state(PART:"sizer.content", "default", 0.0); + set_state(PART:"elm.text", "default", 0.0); + set_state(PART:"inset", "default", 0.0); + set_state(PART:"clip", "default", 0.0); + set_state(PART:"event", "default", 0.0); + } else { + set_state(PART:"elm.swallow.content", "default", 0.0); + set_state(PART:"sizer.content", "default", 0.0); + set_state(PART:"elm.text", "default", 0.0); + set_state(PART:"inset", "disabled", 0.0); + set_state(PART:"clip", "disabled", 0.0); + set_state(PART:"event", "disabled", 0.0); + } + } + } + } + parts { + part { name: "inset"; mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + rel1.offset: 2 2; + rel2.relative: 0.0 1.0; + rel2.offset: 2 -3; + image.normal: "inset_shadow_circle_tiny.png"; + align: 0.0 0.5; + min: 13 13; + max: 13 13; + fixed: 1 0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + image.normal: "inset_circle_tiny.png"; + } + } + part { name: "indicator"; mouse_events: 0; + scale: 1; + clip_to: "clip"; + description { state: "default" 0.0; + rel1.to: "inset"; + rel2.to: "inset"; + image.normal: "sym_radio_alum.png"; + min: 11 11; + max: 11 11; + visible: 0; + } + description { state: "selected" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part { name: "clip"; type: RECT; + description { state: "default" 0.0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + color: 255 255 255 64; + } + } + part { name: "elm.swallow.content"; type: SWALLOW; + required; + scale: 1; + clip_to: "clip"; + description { state: "default" 0.0; + fixed: 1 0; + visible: 0; + align: 0.0 0.5; + max: 0 0; + rel1.to_x: "inset"; + rel1.relative: 1.0 0.0; + rel1.offset: 1 1; + rel2.to_x: "inset"; + rel2.offset: 1 -2; + rel2.relative: 1.0 1.0; + } + description { state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + aspect: 1.0 1.0; + min: 16 16; + } + } + part { name: "sizer.content"; type: TEXT; mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + fixed: 1 1; + visible: 0; + text { font: FN; size: 10; + min: 0 0; + text_class: "radio_text"; + } + } + description { state: "visible" 0.0; + inherit: "default" 0.0; + rel1.to: "elm.swallow.content"; + rel2.to: "elm.swallow.content"; + text { + min: 1 1; + ellipsis: -1; + text: "M"; + } + } + description { state: "icononly" 0.0; + inherit: "default" 0.0; + rel1.to: "elm.swallow.content"; + rel2.to: "elm.swallow.content"; + text { + min: 1 1; + ellipsis: -1; + text: "M"; + } + } + } + part { name: "elm.text"; type: TEXT; mouse_events: 0; + effect: SHADOW BOTTOM; + scale: 1; + required; + description { state: "default" 0.0; + rel1.offset: 2 2; + rel1.to_x: "elm.swallow.content"; + rel1.relative: 1.0 0.0; + rel2.offset: -3 -3; + color: FN_COL_DEFAULT; + color_class: "radio_text"; + text { font: FN; size: 10; + min: 0 0; + align: 0.0 0.5; + text_class: "radio"; + } + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + color_class: "radio_text_disabled"; + color3: 255 255 255 255; + } + description { state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + text.min: 1 1; + text.ellipsis: -1; + } + description { state: "disabled_visible" 0.0; + inherit: "default" 0.0; + color_class: "radio_text_disabled"; + color3: 255 255 255 255; + visible: 1; + text.min: 1 1; + text.ellipsis: -1; + } + } + part { name: "event"; type: RECT; + description { state: "default" 0.0; + color: 0 0 0 0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + } + programs { + program { + signal: "mouse,clicked,1"; source: "event"; + action: SIGNAL_EMIT "elm,action,radio,toggle" "elm"; + } + program { + signal: "elm,state,radio,on"; source: "elm"; + action: STATE_SET "selected" 0.0; + target: "indicator"; + } + program { + signal: "elm,state,radio,off"; source: "elm"; + action: STATE_SET "default" 0.0; + target: "indicator"; + } + program { + signal: "elm,state,elm.text,set"; source: "elm"; + script { + new m = get_int(btmode); + m |= LABEL; set_int(btmode, m); + eval_mode(m); + } + } + program { + signal: "elm,state,elm.text,unset"; source: "elm"; + script { + new m = get_int(btmode); + m &= ~LABEL; set_int(btmode, m); + eval_mode(m); + } + } + program { + signal: "elm,state,content,set"; source: "elm"; + script { + new m = get_int(btmode); + m |= ICON; set_int(btmode, m); + eval_mode(m); + } + } + program { + signal: "elm,state,content,unset"; source: "elm"; + script { + new m = get_int(btmode); + m &= ~ICON; set_int(btmode, m); + eval_mode(m); + } + } + program { + signal: "elm,state,disabled"; source: "elm"; + script { + new m = get_int(btmode); + m |= DISABLE; set_int(btmode, m); + eval_mode(m); + } + } + program { + signal: "elm,state,enabled"; source: "elm"; + script { + new m = get_int(btmode); + m &= ~DISABLE; set_int(btmode, m); + eval_mode(m); + } + } + } +#undef ICON +#undef LABEL +#undef MASK +#undef DISABLE } diff --git a/src/Makefile_Elementary.am b/src/Makefile_Elementary.am index 2728e7830d..8cdc38478b 100644 --- a/src/Makefile_Elementary.am +++ b/src/Makefile_Elementary.am @@ -107,6 +107,7 @@ elm_public_eolian_files = \ elm_public_eolian_files += \ lib/elementary/efl_ui_legacy.eo \ lib/elementary/efl_ui_button_legacy_part.eo \ + lib/elementary/efl_ui_radio_legacy_part.eo \ lib/elementary/elm_spinner.eo \ lib/elementary/elm_multibuttonentry_item.eo \ lib/elementary/elm_interface_scrollable.eo \ diff --git a/src/lib/elementary/efl_ui_radio.c b/src/lib/elementary/efl_ui_radio.c index 0a49b3c5fc..5cae7ec113 100644 --- a/src/lib/elementary/efl_ui_radio.c +++ b/src/lib/elementary/efl_ui_radio.c @@ -130,24 +130,6 @@ _key_action_activate(Evas_Object *obj, const char *params EINA_UNUSED) return EINA_TRUE; } -/* FIXME: replicated from elm_layout just because radio's icon spot - * is elm.swallow.content, not elm.swallow.icon. Fix that whenever we - * can changed the theme API */ -static void -_icon_signal_emit(Evas_Object *obj) -{ - char buf[64]; - Eo *edje; - - edje = elm_widget_resize_object_get(obj); - if (!edje) return; - snprintf(buf, sizeof(buf), "elm,state,icon,%s", - elm_layout_content_get(obj, "icon") ? "visible" : "hidden"); - - elm_layout_signal_emit(obj, buf, "elm"); - edje_object_message_signal_process(edje); -} - EOLIAN static Efl_Ui_Theme_Apply _efl_ui_radio_efl_ui_widget_theme_apply(Eo *obj, Efl_Ui_Radio_Data *sd) { @@ -161,11 +143,6 @@ _efl_ui_radio_efl_ui_widget_theme_apply(Eo *obj, Efl_Ui_Radio_Data *sd) edje_object_message_signal_process(wd->resize_obj); - /* FIXME: replicated from elm_layout just because radio's icon - * spot is elm.swallow.content, not elm.swallow.icon. Fix that - * whenever we can changed the theme API */ - _icon_signal_emit(obj); - elm_layout_sizing_eval(obj); return int_ret; @@ -368,6 +345,7 @@ ELM_LAYOUT_TEXT_ALIASES_IMPLEMENT(MY_CLASS_PFX) #include "efl_ui_radio.eo.c" #include "efl_ui_radio_legacy.eo.h" +#include "efl_ui_radio_legacy_part.eo.h" #define MY_CLASS_NAME_LEGACY "elm_radio" /* Legacy APIs */ @@ -386,6 +364,86 @@ _efl_ui_radio_legacy_efl_object_constructor(Eo *obj, void *_pd EINA_UNUSED) return obj; } +/* FIXME: replicated from elm_layout just because radio's icon spot + * is elm.swallow.content, not elm.swallow.icon. Fix that whenever we + * can changed the theme API */ +static void +_icon_signal_emit(Evas_Object *obj) +{ + char buf[63]; + Eo *edje; + + edje = elm_widget_resize_object_get(obj); + if (!edje) return; + snprintf(buf, sizeof(buf), "elm,state,icon,%s", + elm_layout_content_get(obj, "icon") ? "visible" : "hidden"); + + elm_layout_signal_emit(obj, buf, "elm"); + edje_object_message_signal_process(edje); + elm_layout_sizing_eval(obj); +} + +EOLIAN static Efl_Ui_Theme_Apply +_efl_ui_radio_legacy_efl_ui_widget_theme_apply(Eo *obj, void *_pd EINA_UNUSED) +{ + Efl_Ui_Theme_Apply int_ret = EFL_UI_THEME_APPLY_FAILED; + int_ret = efl_ui_widget_theme_apply(efl_super(obj, EFL_UI_RADIO_LEGACY_CLASS)); + if (!int_ret) return EFL_UI_THEME_APPLY_FAILED; + + /* FIXME: replicated from elm_layout just because radio's icon + * spot is elm.swallow.content, not elm.swallow.icon. Fix that + * whenever we can changed the theme API */ + _icon_signal_emit(obj); + + return int_ret; +} + +/* FIXME: replicated from elm_layout just because radio's icon spot + * is elm.swallow.content, not elm.swallow.icon. Fix that whenever we + * can changed the theme API */ +EOLIAN static Eina_Bool +_efl_ui_radio_legacy_efl_ui_widget_widget_sub_object_del(Eo *obj, void *_pd EINA_UNUSED, Evas_Object *sobj) +{ + Eina_Bool int_ret = EINA_FALSE; + + int_ret = elm_widget_sub_object_del(efl_super(obj, EFL_UI_RADIO_LEGACY_CLASS), sobj); + if (!int_ret) return EINA_FALSE; + + _icon_signal_emit(obj); + + return EINA_TRUE; +} + +/* FIXME: replicated from elm_layout just because radio's icon spot + * is elm.swallow.content, not elm.swallow.icon. Fix that whenever we + * can changed the theme API */ +static Eina_Bool +_efl_ui_radio_legacy_content_set(Eo *obj, void *_pd EINA_UNUSED, const char *part, Evas_Object *content) +{ + Eina_Bool int_ret = EINA_FALSE; + + int_ret = efl_content_set(efl_part(efl_super(obj, EFL_UI_RADIO_LEGACY_CLASS), part), content); + if (!int_ret) return EINA_FALSE; + + _icon_signal_emit(obj); + + return EINA_TRUE; +} + +/* Efl.Part begin */ + +static Eina_Bool +_part_is_efl_ui_radio_legacy_part(const Eo *obj EINA_UNUSED, const char *part) +{ + return eina_streq(part, "elm.swallow.content"); +} + +ELM_PART_OVERRIDE_PARTIAL(efl_ui_radio_legacy, EFL_UI_RADIO_LEGACY, void, _part_is_efl_ui_radio_legacy_part) +ELM_PART_OVERRIDE_CONTENT_SET(efl_ui_radio_legacy, EFL_UI_RADIO_LEGACY, void) +#include "efl_ui_radio_legacy_part.eo.c" + +/* Efl.Part end */ + EAPI Evas_Object * elm_radio_add(Evas_Object *parent) { diff --git a/src/lib/elementary/efl_ui_radio_legacy.eo b/src/lib/elementary/efl_ui_radio_legacy.eo index da18c8a654..664929533b 100644 --- a/src/lib/elementary/efl_ui_radio_legacy.eo +++ b/src/lib/elementary/efl_ui_radio_legacy.eo @@ -5,5 +5,8 @@ class Efl.Ui.Radio_Legacy (Efl.Ui.Radio, Efl.Ui.Legacy) implements { class.constructor; Efl.Object.constructor; + Efl.Ui.Widget.theme_apply; + Efl.Ui.Widget.widget_sub_object_del; + Efl.Part.part; } } diff --git a/src/lib/elementary/efl_ui_radio_legacy_part.eo b/src/lib/elementary/efl_ui_radio_legacy_part.eo new file mode 100644 index 0000000000..a9882a824d --- /dev/null +++ b/src/lib/elementary/efl_ui_radio_legacy_part.eo @@ -0,0 +1,8 @@ +class Efl.Ui.Radio_Legacy.Part (Efl.Ui.Layout.Part_Content) +{ + [[Elementary radio internal part class]] + data: null; + implements { + Efl.Content.content { set; } + } +}