elm_interface_scrollable : Fix logic about setting EVAS_EVENT_FLAG_ON_HOLD
authorHosang Kim <hosang12.kim@samsung.com>
Wed, 3 Jun 2015 13:08:38 +0000 (22:08 +0900)
committerChunEon Park <hermet@hermet.pe.kr>
Mon, 15 Jun 2015 00:56:02 +0000 (09:56 +0900)
Summary: Even if scroller is not scrolled, EVAS_EVENT_FLAG_ON_HOLD is set. So clicked event is canceled in Edje.

Test Plan:
On the button in the vertical scroller, click button and move mouse horizontal.
Mouse up on the button, so now button is not clicked

Reviewers: Hermet, CHAN, seoz, jaehwan, woohyun, SanghyeonLee

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

src/lib/elm_interface_scrollable.c

index fbfd7ce..bf598db 100644 (file)
@@ -2782,49 +2782,62 @@ _elm_scroll_post_event_move(void *data,
    elm_widget_parents_bounce_get(sid->obj, &horiz, &vert);
    if (sid->down.hold_parent)
      {
-        if ((sid->down.dir_x) && horiz &&
+        if ((sid->down.dir_x) && (horiz || !sid->bounce_horiz) &&
             !_elm_scroll_can_scroll(sid, sid->down.hdir))
           {
              sid->down.dir_x = EINA_FALSE;
           }
-        if ((sid->down.dir_y) && vert &&
+        if ((sid->down.dir_y) && (vert || !sid->bounce_vert) &&
             !_elm_scroll_can_scroll(sid, sid->down.vdir))
           {
              sid->down.dir_y = EINA_FALSE;
           }
+        sid->down.dragged_began = EINA_TRUE;
      }
    if (sid->down.dir_x)
      {
         if ((!sid->obj) ||
             (!elm_widget_drag_child_locked_x_get(sid->obj)))
           {
-             sid->down.want_dragged = EINA_FALSE;
-             sid->down.dragged = EINA_TRUE;
-             if (sid->obj)
+             if (sid->down.dragged_began)
                {
-                  elm_widget_drag_lock_x_set(sid->obj, 1);
+                  sid->down.want_dragged = EINA_FALSE;
+                  sid->down.dragged = EINA_TRUE;
+                  if (sid->obj)
+                    {
+                       elm_widget_drag_lock_x_set(sid->obj, 1);
+                    }
+                  start = 1;
                }
-             start = 1;
           }
         else
-          sid->down.dir_x = EINA_FALSE;
+          {
+             sid->down.dragged_began = EINA_TRUE;
+             sid->down.dir_x = EINA_FALSE;
+          }
      }
    if (sid->down.dir_y)
      {
         if ((!sid->obj) ||
             (!elm_widget_drag_child_locked_y_get(sid->obj)))
           {
-             sid->down.want_dragged = EINA_FALSE;
-             sid->down.dragged = EINA_TRUE;
-             if (sid->obj)
+             if (sid->down.dragged_began)
                {
-                  elm_widget_drag_lock_y_set
-                    (sid->obj, EINA_TRUE);
+                  sid->down.want_dragged = EINA_FALSE;
+                  sid->down.dragged = EINA_TRUE;
+                  if (sid->obj)
+                    {
+                       elm_widget_drag_lock_y_set
+                          (sid->obj, EINA_TRUE);
+                    }
+                  start = 1;
                }
-             start = 1;
           }
         else
-          sid->down.dir_y = EINA_FALSE;
+          {
+             sid->down.dragged_began = EINA_TRUE;
+             sid->down.dir_y = EINA_FALSE;
+          }
      }
    if ((!sid->down.dir_x) && (!sid->down.dir_y))
      {
@@ -3137,10 +3150,9 @@ _elm_scroll_mouse_move_event_cb(void *data,
 
         if (sid->one_direction_at_a_time)
           {
-             if (!((sid->down.dir_x) || (sid->down.dir_y)) &&
-                 (((x * x) + (y * y)) >
-                  (_elm_config->thumbscroll_threshold *
-                   _elm_config->thumbscroll_threshold)))
+             if (((x * x) + (y * y)) >
+                 (_elm_config->thumbscroll_threshold *
+                  _elm_config->thumbscroll_threshold))
                {
                   if (sid->one_direction_at_a_time ==
                       ELM_SCROLLER_SINGLE_DIRECTION_SOFT)
@@ -3236,13 +3248,19 @@ _elm_scroll_mouse_move_event_cb(void *data,
                   sid->down.dragged_began_timestamp = ecore_loop_time_get();
 #endif
                }
-             sid->down.dragged_began = EINA_TRUE;
+
              if (!sid->down.dragged)
                {
                   sid->down.want_dragged = EINA_TRUE;
+               }
+             if ((((_elm_scroll_can_scroll(sid, LEFT) || _elm_scroll_can_scroll(sid, RIGHT)) && sid->down.dir_x) ||
+                  ((_elm_scroll_can_scroll(sid, UP) || _elm_scroll_can_scroll(sid, DOWN)) && sid->down.dir_y)) &&
+                 !sid->down.dragged_began)
+               {
                   ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
+                  sid->down.dragged_began = EINA_TRUE;
                }
-             if (sid->down.dragged)
+             else if (sid->down.dragged_began)
                {
                   ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
                }
@@ -3309,7 +3327,11 @@ _elm_scroll_mouse_move_event_cb(void *data,
           {
              if (sid->down.dragged_began)
                {
-                  ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
+                  if ((_elm_scroll_can_scroll(sid, sid->down.hdir) && sid->down.dir_x) ||
+                      (_elm_scroll_can_scroll(sid, sid->down.vdir) && sid->down.dir_y))
+                    {
+                       ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
+                    }
                   if (!sid->down.hold)
                     {
                        sid->down.hold = EINA_TRUE;