From: Jeonghyun Yun <jh0506.yun@samsung.com>
authorraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Tue, 4 Oct 2011 00:59:18 +0000 (00:59 +0000)
committerraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Tue, 4 Oct 2011 00:59:18 +0000 (00:59 +0000)
Subject: Re: [E-devel] [Patch] elm_gengrid reorder bug patch

I found a gengrid bug about reordering.

It sometimes happens that some gengrid item disappear when reorder item.

git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/elementary@63783 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/lib/elm_gengrid.c

index a2d9e8f..0f9704d 100644 (file)
@@ -851,11 +851,12 @@ _mouse_up(void            *data,
      }
    if ((item->wd->reorder_mode) && (item->wd->reorder_item))
      {
+        evas_object_smart_callback_call(item->wd->self, SIG_MOVED, item->wd->reorder_item);
+        item->wd->reorder_item = NULL;
+        item->wd->move_effect_enabled = EINA_FALSE;
         if (item->wd->calc_job) ecore_job_del(item->wd->calc_job);
           item->wd->calc_job = ecore_job_add(_calc_job, item->wd);
 
-        evas_object_smart_callback_call(item->wd->self, SIG_MOVED, item->wd->reorder_item);
-        item->wd->reorder_item = NULL;
         elm_smart_scroller_hold_set(item->wd->scr, EINA_FALSE);
         elm_smart_scroller_bounce_allow_set(item->wd->scr, item->wd->h_bounce, item->wd->v_bounce);
         edje_object_signal_emit(item->base.view, "elm,state,reorder,disabled", "elm");
@@ -1313,107 +1314,116 @@ _item_place(Elm_Gengrid_Item *item,
                   item->parent_group_item->group_realized = EINA_TRUE;
                }
           }
-        if ((item->wd->reorder_mode) && (item->wd->reorder_item))
+        if (item->wd->reorder_mode)
           {
-             if (item->moving) return;
-
-             if (!item->wd->move_effect_enabled)
-               {
-                  item->ox = x;
-                  item->oy = y;
-               }
-             if (item->wd->reorder_item == item)
-               {
-                  evas_object_move(item->base.view,
-                                   item->wd->reorder_item_x, item->wd->reorder_item_y);
-                  evas_object_resize(item->base.view, iw, ih);
-                  return;
-               }
-             else
+             if (item->wd->reorder_item)
                {
-                  if (item->wd->move_effect_enabled)
+                  if (item->moving) return;
+
+                  if (!item->wd->move_effect_enabled)
+                    {
+                       item->ox = x;
+                       item->oy = y;
+                    }
+                  if (item->wd->reorder_item == item)
+                    {
+                       evas_object_move(item->base.view,
+                                        item->wd->reorder_item_x, item->wd->reorder_item_y);
+                       evas_object_resize(item->base.view, iw, ih);
+                       return;
+                    }
+                  else
                     {
-                       if ((item->ox != x) || (item->oy != y))
+                       if (item->wd->move_effect_enabled)
                          {
-                            if (((item->wd->old_pan_x == item->wd->pan_x) && (item->wd->old_pan_y == item->wd->pan_y)) ||
-                                ((item->wd->old_pan_x != item->wd->pan_x) && !(item->ox - item->wd->pan_x + item->wd->old_pan_x == x)) ||
-                                ((item->wd->old_pan_y != item->wd->pan_y) && !(item->oy - item->wd->pan_y + item->wd->old_pan_y == y)))
+                            if ((item->ox != x) || (item->oy != y))
                               {
-                                 item->tx = x;
-                                 item->ty = y;
-                                 item->rx = item->ox;
-                                 item->ry = item->oy;
-                                 item->moving = EINA_TRUE;
-                                 item->moving_effect_start_time = ecore_loop_time_get();
-                                 item->item_moving_effect_timer = ecore_animator_add(_reorder_item_moving_effect_timer_cb, item);
-                                 return;
+                                 if (((item->wd->old_pan_x == item->wd->pan_x) && (item->wd->old_pan_y == item->wd->pan_y)) ||
+                                     ((item->wd->old_pan_x != item->wd->pan_x) && !(item->ox - item->wd->pan_x + item->wd->old_pan_x == x)) ||
+                                     ((item->wd->old_pan_y != item->wd->pan_y) && !(item->oy - item->wd->pan_y + item->wd->old_pan_y == y)))
+                                   {
+                                      item->tx = x;
+                                      item->ty = y;
+                                      item->rx = item->ox;
+                                      item->ry = item->oy;
+                                      item->moving = EINA_TRUE;
+                                      item->moving_effect_start_time = ecore_loop_time_get();
+                                      item->item_moving_effect_timer = ecore_animator_add(_reorder_item_moving_effect_timer_cb, item);
+                                      return;
+                                   }
                               }
                          }
-                    }
 
-                  /* need fix here */
-                  Evas_Coord nx, ny, nw, nh;
-                  if (item->is_group)
-                    {
-                       if (item->wd->horizontal)
+                       /* need fix here */
+                       Evas_Coord nx, ny, nw, nh;
+                       if (item->is_group)
                          {
-                            nx = x + (item->wd->group_item_width / 2);
-                            ny = y;
-                            nw = 1;
-                            nh = vh;
+                            if (item->wd->horizontal)
+                              {
+                                 nx = x + (item->wd->group_item_width / 2);
+                                 ny = y;
+                                 nw = 1;
+                                 nh = vh;
+                              }
+                            else
+                              {
+                                 nx = x;
+                                 ny = y + (item->wd->group_item_height / 2);
+                                 nw = vw;
+                                 nh = 1;
+                              }
                          }
                        else
                          {
-                            nx = x;
-                            ny = y + (item->wd->group_item_height / 2);
-                            nw = vw;
+                            nx = x + (item->wd->item_width / 2);
+                            ny = y + (item->wd->item_height / 2);
+                            nw = 1;
                             nh = 1;
                          }
-                    }
-                  else
-                    {
-                       nx = x + (item->wd->item_width / 2);
-                       ny = y + (item->wd->item_height / 2);
-                       nw = 1;
-                       nh = 1;
-                    }
 
-                  if ( ELM_RECTS_INTERSECT(item->wd->reorder_item_x, item->wd->reorder_item_y,
-                                           item->wd->item_width, item->wd->item_height,
-                                           nx, ny, nw, nh))
-                    {
-                       if (item->wd->horizontal)
-                         {
-                            if ((item->wd->nmax * item->wd->reorder_item->x + item->wd->reorder_item->y) >
-                                (item->wd->nmax * item->x + item->y))
-                              reorder_item_move_forward = EINA_TRUE;
-                         }
-                       else
+                       if ( ELM_RECTS_INTERSECT(item->wd->reorder_item_x, item->wd->reorder_item_y,
+                                                item->wd->item_width, item->wd->item_height,
+                                                nx, ny, nw, nh))
                          {
-                            if ((item->wd->nmax * item->wd->reorder_item->y + item->wd->reorder_item->x) >
-                                (item->wd->nmax * item->y + item->x))
-                              reorder_item_move_forward = EINA_TRUE;
-                         }
-
-                       item->wd->items = eina_inlist_remove(item->wd->items,
-                                                            EINA_INLIST_GET(item->wd->reorder_item));
-                       if (reorder_item_move_forward)
-                         item->wd->items = eina_inlist_prepend_relative(item->wd->items,
-                                                                        EINA_INLIST_GET(item->wd->reorder_item),
-                                                                        EINA_INLIST_GET(item));
-                       else
-                         item->wd->items = eina_inlist_append_relative(item->wd->items,
-                                                                       EINA_INLIST_GET(item->wd->reorder_item),
-                                                                       EINA_INLIST_GET(item));
-
-                       item->wd->reorder_item_changed = EINA_TRUE;
-                       item->wd->move_effect_enabled = EINA_TRUE;
-                       if (item->wd->calc_job) ecore_job_del(item->wd->calc_job);
-                         item->wd->calc_job = ecore_job_add(_calc_job, item->wd);
+                            if (item->wd->horizontal)
+                              {
+                                 if ((item->wd->nmax * item->wd->reorder_item->x + item->wd->reorder_item->y) >
+                                     (item->wd->nmax * item->x + item->y))
+                                   reorder_item_move_forward = EINA_TRUE;
+                              }
+                            else
+                              {
+                                 if ((item->wd->nmax * item->wd->reorder_item->y + item->wd->reorder_item->x) >
+                                     (item->wd->nmax * item->y + item->x))
+                                   reorder_item_move_forward = EINA_TRUE;
+                              }
 
-                         return;
+                            item->wd->items = eina_inlist_remove(item->wd->items,
+                                                                 EINA_INLIST_GET(item->wd->reorder_item));
+                            if (reorder_item_move_forward)
+                              item->wd->items = eina_inlist_prepend_relative(item->wd->items,
+                                                                             EINA_INLIST_GET(item->wd->reorder_item),
+                                                                             EINA_INLIST_GET(item));
+                            else
+                              item->wd->items = eina_inlist_append_relative(item->wd->items,
+                                                                            EINA_INLIST_GET(item->wd->reorder_item),
+                                                                            EINA_INLIST_GET(item));
+
+                            item->wd->reorder_item_changed = EINA_TRUE;
+                            item->wd->move_effect_enabled = EINA_TRUE;
+                            if (item->wd->calc_job) ecore_job_del(item->wd->calc_job);
+                              item->wd->calc_job = ecore_job_add(_calc_job, item->wd);
+
+                            return;
+                         }
                     }
                }
+             else if (item->item_moving_effect_timer)
+               {
+                  ecore_animator_del(item->item_moving_effect_timer);
+                  item->item_moving_effect_timer = NULL;
+                  item->moving = EINA_FALSE;
+               }
           }
         if (!item->is_group)
           {