diff --git a/legacy/elementary/data/themes/edc/elm/hover.edc b/legacy/elementary/data/themes/edc/elm/hover.edc index b34d36a50f..afed7088f1 100644 --- a/legacy/elementary/data/themes/edc/elm/hover.edc +++ b/legacy/elementary/data/themes/edc/elm/hover.edc @@ -1,5 +1,6 @@ /* TODO: replicate diagonal swallow slots to the other hover styles */ group { name: "elm/hover/base/default"; + data.item: "dismiss" "on"; parts { part { name: "elm.swallow.offset"; type: SWALLOW; description { state: "default" 0.0; @@ -131,10 +132,18 @@ group { name: "elm/hover/base/default"; signal: "mouse,up,*"; source: "base"; action: SIGNAL_EMIT "elm,action,dismiss" "elm"; } + program { name: "hide"; + signal: "elm,action,hide"; source: "elm"; + after: "hidefinished"; + } + program { name: "hidefinished"; + action: SIGNAL_EMIT "elm,action,hide,finished" "elm"; + } } } group { name: "elm/hover/base/popout"; + data.item: "dismiss" "on"; images.image: "button_normal.png" COMP; parts { part { name: "elm.swallow.offset"; type: SWALLOW; @@ -362,7 +371,12 @@ group { name: "elm/hover/base/popout"; program { name: "hide"; signal: "elm,action,hide"; source: "elm"; action: STATE_SET "default" 0.0; + transition: DECELERATE 0.5; target: "base"; + after: "hidefinished"; + } + program { name: "hidefinished"; + action: SIGNAL_EMIT "elm,action,hide,finished" "elm"; } program { name: "leftshow"; signal: "elm,action,slot,left,show"; source: "elm"; @@ -427,6 +441,7 @@ group { name: "elm/hover/base/hoversel_vertical/default"; alias: "elm/hover/base/hoversel_vertical/entry"; images.image: "button_normal.png" COMP; images.image: "vertical_separated_bar_glow.png" COMP; + data.item: "dismiss" "on"; data.item: "max_size" "60"; parts { part { name: "elm.swallow.offset"; type: SWALLOW; @@ -597,7 +612,12 @@ group { name: "elm/hover/base/hoversel_vertical/default"; program { name: "hide"; signal: "elm,action,hide"; source: "elm"; action: STATE_SET "default" 0.0; + transition: DECELERATE 0.5; target: "base"; + after: "hidefinished"; + } + program { name: "hidefinished"; + action: SIGNAL_EMIT "elm,action,hide,finished" "elm"; } program { name: "topshow"; @@ -645,6 +665,7 @@ group { name: "elm/hover/base/hoversel_vertical/default"; group { name: "elm/hover/base/hoversel_horizontal/default"; alias: "elm/hover/base/hoversel_horizontal/entry"; images.image: "button_normal.png" COMP; + data.item: "dismiss" "on"; data.item: "max_size" "120"; parts { part { name: "elm.swallow.offset"; type: SWALLOW; @@ -774,6 +795,10 @@ group { name: "elm/hover/base/hoversel_horizontal/default"; action: STATE_SET "default" 0.0; transition: DECELERATE 0.5; target: "base"; + after: "hidefinished"; + } + program { name: "hidefinished"; + action: SIGNAL_EMIT "elm,action,hide,finished" "elm"; } program { name: "leftshow"; diff --git a/legacy/elementary/src/lib/elm_hover.c b/legacy/elementary/src/lib/elm_hover.c index 9306c78057..7bfc6dbb56 100644 --- a/legacy/elementary/src/lib/elm_hover.c +++ b/legacy/elementary/src/lib/elm_hover.c @@ -510,16 +510,66 @@ _target_move_cb(void *data, _elm_hover_smt_sub_re_eval(data); } +static void +_hide_signals_emit(Evas_Object *obj) +{ + ELM_HOVER_DATA_GET(obj, sd); + + elm_layout_signal_emit(obj, "elm,action,hide", "elm"); + + ELM_HOVER_PARTS_FOREACH + { + char buf[1024]; + + if (sd->subs[i].obj) + { + snprintf(buf, sizeof(buf), "elm,action,slot,%s,hide", + sd->subs[i].swallow); + elm_layout_signal_emit(obj, buf, "elm"); + } + } +} + +static void +_hov_hide_cb(void *data, + Evas_Object *obj EINA_UNUSED, + const char *emission EINA_UNUSED, + const char *source EINA_UNUSED) +{ + const char *dismissstr; + + dismissstr = edje_object_data_get(elm_layout_edje_get(data), "dismiss"); + + if (dismissstr && !strcmp(dismissstr, "on")) + { + evas_object_hide(data); + eo_do(data, eo_event_callback_call(ELM_HOVER_EVENT_DISMISSED, NULL)); + } +} + static void _hov_dismiss_cb(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *source EINA_UNUSED) { - evas_object_hide(data); - eo_do(data, eo_event_callback_call - (EVAS_CLICKABLE_INTERFACE_EVENT_CLICKED, NULL)); - eo_do(data, eo_event_callback_call(ELM_HOVER_EVENT_DISMISSED, NULL)); + const char *dismissstr; + + dismissstr = edje_object_data_get(elm_layout_edje_get(data), "dismiss"); + + if (dismissstr && !strcmp(dismissstr, "on")) + { + _hide_signals_emit(data); + eo_do(data, eo_event_callback_call + (EVAS_CLICKABLE_INTERFACE_EVENT_CLICKED, NULL)); + } + else + { + evas_object_hide(data); + eo_do(data, eo_event_callback_call + (EVAS_CLICKABLE_INTERFACE_EVENT_CLICKED, NULL)); + eo_do(data, eo_event_callback_call(ELM_HOVER_EVENT_DISMISSED, NULL)); + } // for backward compatibility } EOLIAN static void @@ -538,6 +588,8 @@ _elm_hover_evas_object_smart_add(Eo *obj, Elm_Hover_Data *priv) elm_layout_signal_callback_add (obj, "elm,action,dismiss", "*", _hov_dismiss_cb, obj); + elm_layout_signal_callback_add + (obj, "elm,action,hide,finished", "elm", _hov_hide_cb, obj); priv->offset = evas_object_rectangle_add(evas_object_evas_get(obj)); evas_object_pass_events_set(priv->offset, EINA_TRUE); @@ -599,23 +651,17 @@ _elm_hover_evas_object_smart_show(Eo *obj, Elm_Hover_Data *_pd EINA_UNUSED) } EOLIAN static void -_elm_hover_evas_object_smart_hide(Eo *obj, Elm_Hover_Data *sd) +_elm_hover_evas_object_smart_hide(Eo *obj, Elm_Hover_Data *_pd EINA_UNUSED) { + const char *dismissstr; + eo_do_super(obj, MY_CLASS, evas_obj_smart_hide()); - elm_layout_signal_emit(obj, "elm,action,hide", "elm"); + // for backward compatibility + dismissstr = edje_object_data_get(elm_layout_edje_get(obj), "dismiss"); - ELM_HOVER_PARTS_FOREACH - { - char buf[1024]; - - if (sd->subs[i].obj) - { - snprintf(buf, sizeof(buf), "elm,action,slot,%s,hide", - sd->subs[i].swallow); - elm_layout_signal_emit(obj, buf, "elm"); - } - } + if (!dismissstr || strcmp(dismissstr, "on")) + _hide_signals_emit(obj); } EOLIAN static const Elm_Layout_Part_Alias_Description*