From 8cedf0f47c0a1db544d928e4ebbea21d3e64e2b8 Mon Sep 17 00:00:00 2001 From: Manuel QuiƱones Date: Thu, 04 Oct 2012 15:34:02 +0000 Subject: Fix drag and drop in favourites view and grid intersections - SL #3960 This fixes the unported API for drag-and-drop in favourites view. And in the grid, it fixes the collision detection, in GTK+3 we need to use Gdk.Rectangle objects instead of tuples with the rectangle definition. Signed-off-by: Manuel QuiƱones Acked-by: Simon Schampijer --- diff --git a/src/jarabe/desktop/favoriteslayout.py b/src/jarabe/desktop/favoriteslayout.py index eb5deef..c2bf8f5 100644 --- a/src/jarabe/desktop/favoriteslayout.py +++ b/src/jarabe/desktop/favoriteslayout.py @@ -124,6 +124,9 @@ class ViewLayout(Layout): def allocate_children(self, allocation, children): pass + def move_icon(self, child, x, y, allocation): + pass + def move(self, child, x, y, allocation=None): self._grid.move(child, x / _CELL_SIZE, y / _CELL_SIZE, locked=True) child_request = child.size_request() diff --git a/src/jarabe/desktop/favoritesview.py b/src/jarabe/desktop/favoritesview.py index 17d014e..cfe18eb 100644 --- a/src/jarabe/desktop/favoritesview.py +++ b/src/jarabe/desktop/favoritesview.py @@ -24,6 +24,7 @@ from gi.repository import GConf import glib from gi.repository import Gtk from gi.repository import Gdk +from gi.repository import GdkPixbuf from sugar3.graphics import style from sugar3.graphics.icon import Icon @@ -208,7 +209,9 @@ class FavoritesView(ViewContainer): int(x), int(y)): self._dragging = True - context_ = widget.drag_begin([_ICON_DND_TARGET], + target_entry = Gtk.TargetEntry.new(*_ICON_DND_TARGET) + target_list = Gtk.TargetList.new([target_entry]) + context_ = widget.drag_begin(target_list, Gdk.DragAction.MOVE, 1, event) @@ -219,18 +222,19 @@ class FavoritesView(ViewContainer): self._hot_x = pixbuf.props.width / 2 self._hot_y = pixbuf.props.height / 2 - context.set_icon_pixbuf(pixbuf, self._hot_x, self._hot_y) + Gtk.drag_set_icon_pixbuf(context, pixbuf, self._hot_x, self._hot_y) def __drag_motion_cb(self, widget, context, x, y, time): if self._last_clicked_icon is not None: - context.drag_status(context.suggested_action, time) + Gdk.drag_status(context, context.get_suggested_action(), time) return True else: return False def __drag_drop_cb(self, widget, context, x, y, time): if self._last_clicked_icon is not None: - self.drag_get_data(context, _ICON_DND_TARGET[0]) + target = Gdk.Atom.intern_static_string(_ICON_DND_TARGET[0]) + self.drag_get_data(context, target, time) self._layout.move_icon(self._last_clicked_icon, x - self._hot_x, y - self._hot_y, self.get_allocation()) @@ -249,7 +253,7 @@ class FavoritesView(ViewContainer): def __drag_data_received_cb(self, widget, context, x, y, selection_data, info, time): - context.drop_finish(success=True, time=time) + Gdk.drop_finish(context, success=True, time_=time) def __connect_to_bundle_registry_cb(self): registry = bundleregistry.get_registry() diff --git a/src/jarabe/desktop/grid.py b/src/jarabe/desktop/grid.py index 851c23e..9d6d820 100644 --- a/src/jarabe/desktop/grid.py +++ b/src/jarabe/desktop/grid.py @@ -114,39 +114,45 @@ class Grid(SugarExt.Grid): new_rects = [] + def _create_rectangle(x, y, width, height): + rect = Gdk.Rectangle() + rect.x, rect.y = x, y + rect.width, rect.height = width, height + return rect + # Get rects right, left, bottom and top if (rect.x + rect.width < self.width - 1): - new_rects.append((rect.x + 1, rect.y, + new_rects.append(_create_rectangle(rect.x + 1, rect.y, rect.width, rect.height)) if (rect.x - 1 > 0): - new_rects.append((rect.x - 1, rect.y, + new_rects.append(_create_rectangle(rect.x - 1, rect.y, rect.width, rect.height)) if (rect.y + rect.height < self.height - 1): - new_rects.append((rect.x, rect.y + 1, + new_rects.append(_create_rectangle(rect.x, rect.y + 1, rect.width, rect.height)) if (rect.y - 1 > 0): - new_rects.append((rect.x, rect.y - 1, + new_rects.append(_create_rectangle(rect.x, rect.y - 1, rect.width, rect.height)) # Get diagonal rects if rect.x + rect.width < self.width - 1 and \ rect.y + rect.height < self.height - 1: - new_rects.append((rect.x + 1, rect.y + 1, + new_rects.append(_create_rectangle(rect.x + 1, rect.y + 1, rect.width, rect.height)) if rect.x - 1 > 0 and rect.y + rect.height < self.height - 1: - new_rects.append((rect.x - 1, rect.y + 1, + new_rects.append(_create_rectangle(rect.x - 1, rect.y + 1, rect.width, rect.height)) if rect.x + rect.width < self.width - 1 and rect.y - 1 > 0: - new_rects.append((rect.x + 1, rect.y - 1, + new_rects.append(_create_rectangle(rect.x + 1, rect.y - 1, rect.width, rect.height)) if rect.x - 1 > 0 and rect.y - 1 > 0: - new_rects.append((rect.x - 1, rect.y - 1, + new_rects.append(_create_rectangle(rect.x - 1, rect.y - 1, rect.width, rect.height)) random.shuffle(new_rects) @@ -192,7 +198,8 @@ class Grid(SugarExt.Grid): collision_found = False child_rect = self._child_rects[child] for c in self._children: - intersects_, intersection = child_rect.intersect(self._child_rects[c]) + intersects_, intersection = Gdk.rectangle_intersect( + child_rect, self._child_rects[c]) if c != child and intersection.width > 0: if (c not in self._locked_children and c not in self._collisions): -- cgit v0.9.1