cedric pushed a commit to branch master.

http://git.enlightenment.org/core/elementary.git/commit/?id=32c89740f3fcb6f2c6b9739bea0589517a55c48a

commit 32c89740f3fcb6f2c6b9739bea0589517a55c48a
Author: Jee-Yong Um <jc9...@samsung.com>
Date:   Sun Oct 4 15:38:52 2015 +0200

    elm_hover: delay hover dismiss while handling edje signal
    
    Summary:
    elm_hover_dismiss() doesn't hide hover directly, but sends signal only.
    It can be translated that "dismiss" do not hide hover only, but handles
    some works. (EDC program, callbacks etc.)
    However, "dismiss" sends signals after hide hover itself, so following
    edje signals are ignored. (Hover cannot be seen already!)
    This patch makes hover dismiss delayed while handling edje signal.
    
    @fix
    
    Test Plan: elementary_test hover2
    
    Reviewers: Hermet, cedric
    
    Reviewed By: cedric
    
    Subscribers: woohyun
    
    Differential Revision: https://phab.enlightenment.org/D3068
    
    Signed-off-by: Cedric BAIL <ced...@osg.samsung.com>
---
 data/themes/edc/elm/hover.edc | 25 ++++++++++++++
 src/lib/elm_hover.c           | 80 ++++++++++++++++++++++++++++++++++---------
 2 files changed, 88 insertions(+), 17 deletions(-)

diff --git a/data/themes/edc/elm/hover.edc b/data/themes/edc/elm/hover.edc
index b34d36a..afed708 100644
--- a/data/themes/edc/elm/hover.edc
+++ b/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/src/lib/elm_hover.c b/src/lib/elm_hover.c
index 9306c78..7bfc6db 100644
--- a/src/lib/elm_hover.c
+++ b/src/lib/elm_hover.c
@@ -511,15 +511,65 @@ _target_move_cb(void *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)
 {
-   eo_do_super(obj, MY_CLASS, evas_obj_smart_hide());
+   const char *dismissstr;
 
-   elm_layout_signal_emit(obj, "elm,action,hide", "elm");
+   eo_do_super(obj, MY_CLASS, evas_obj_smart_hide());
 
-   ELM_HOVER_PARTS_FOREACH
-   {
-      char buf[1024];
+   // for backward compatibility
+   dismissstr = edje_object_data_get(elm_layout_edje_get(obj), "dismiss");
 
-      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*

-- 


Reply via email to