[gimp] Add infrastructure for dragging things between branches of a tree
- From: Michael Natterer <mitch src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gimp] Add infrastructure for dragging things between branches of a tree
- Date: Wed, 5 Aug 2009 17:00:47 +0000 (UTC)
commit b2c7c4f61bd65bf73ea8992ce055255e15d7b3e6
Author: Michael Natterer <mitch gimp org>
Date: Wed Aug 5 18:57:08 2009 +0200
Add infrastructure for dragging things between branches of a tree
* app/widgets/gimpcontainertreeview-dnd.c
(gimp_container_tree_view_real_drop_possible): support DND within a
tree and make sure a group item is not dropped into itself.
* app/widgets/gimpitemtreeview.c (gimp_item_tree_view_drop_viewable):
implement intra-container reordering within all branches; print a
message for inter-container reordering because that's not yet
implemented in the core.
app/widgets/gimpcontainertreeview-dnd.c | 72 ++++++++++++++++++++-----------
app/widgets/gimpitemtreeview.c | 54 +++++++++++++----------
2 files changed, 78 insertions(+), 48 deletions(-)
---
diff --git a/app/widgets/gimpcontainertreeview-dnd.c b/app/widgets/gimpcontainertreeview-dnd.c
index db611d1..b2f75b2 100644
--- a/app/widgets/gimpcontainertreeview-dnd.c
+++ b/app/widgets/gimpcontainertreeview-dnd.c
@@ -481,10 +481,38 @@ gimp_container_tree_view_real_drop_possible (GimpContainerTreeView *tree_view,
GtkTreeViewDropPosition *return_drop_pos,
GdkDragAction *return_drag_action)
{
- GimpContainerView *view = GIMP_CONTAINER_VIEW (tree_view);
- GimpContainer *container = gimp_container_view_get_container (view);
- gint src_index = -1;
- gint dest_index = -1;
+ GimpContainerView *view = GIMP_CONTAINER_VIEW (tree_view);
+ GimpContainer *container = gimp_container_view_get_container (view);
+ GimpContainer *src_container = NULL;
+ GimpContainer *dest_container = NULL;
+ gint src_index = -1;
+ gint dest_index = -1;
+
+ if (src_viewable)
+ {
+ GimpViewable *parent = gimp_viewable_get_parent (src_viewable);
+
+ if (parent)
+ src_container = gimp_viewable_get_children (parent);
+ else if (gimp_container_have (container, GIMP_OBJECT (src_viewable)))
+ src_container = container;
+
+ src_index = gimp_container_get_child_index (src_container,
+ GIMP_OBJECT (src_viewable));
+ }
+
+ if (dest_viewable)
+ {
+ GimpViewable *parent = gimp_viewable_get_parent (dest_viewable);
+
+ if (parent)
+ dest_container = gimp_viewable_get_children (parent);
+ else if (gimp_container_have (container, GIMP_OBJECT (dest_viewable)))
+ dest_container = container;
+
+ dest_index = gimp_container_get_child_index (dest_container,
+ GIMP_OBJECT (dest_viewable));
+ }
if (src_viewable && g_type_is_a (G_TYPE_FROM_INSTANCE (src_viewable),
gimp_container_get_children_type (container)))
@@ -492,33 +520,27 @@ gimp_container_tree_view_real_drop_possible (GimpContainerTreeView *tree_view,
if (src_viewable == dest_viewable)
return FALSE;
- src_index = gimp_container_get_child_index (container,
- GIMP_OBJECT (src_viewable));
-
- if (src_index == -1)
- return FALSE;
-
- if (dest_viewable)
- {
- dest_index = gimp_container_get_child_index (container,
- GIMP_OBJECT (dest_viewable));
- if (dest_index == -1)
- return FALSE;
- }
-
if (src_index == -1 || dest_index == -1)
return FALSE;
- }
- if (drop_pos == GTK_TREE_VIEW_DROP_BEFORE)
- {
- if (dest_index == (src_index + 1))
+ /* don't allow dropping a parent node onto one of its descendants
+ */
+ if (gimp_viewable_is_ancestor (src_viewable, dest_viewable))
return FALSE;
}
- else
+
+ if (src_container == dest_container)
{
- if (dest_index == (src_index - 1))
- return FALSE;
+ if (drop_pos == GTK_TREE_VIEW_DROP_BEFORE)
+ {
+ if (dest_index == (src_index + 1))
+ return FALSE;
+ }
+ else
+ {
+ if (dest_index == (src_index - 1))
+ return FALSE;
+ }
}
if (return_drop_pos)
diff --git a/app/widgets/gimpitemtreeview.c b/app/widgets/gimpitemtreeview.c
index 262c2d7..7d49a36 100644
--- a/app/widgets/gimpitemtreeview.c
+++ b/app/widgets/gimpitemtreeview.c
@@ -784,17 +784,9 @@ gimp_item_tree_view_drop_viewable (GimpContainerTreeView *tree_view,
GimpViewable *dest_viewable,
GtkTreeViewDropPosition drop_pos)
{
- GimpContainerView *container_view = GIMP_CONTAINER_VIEW (tree_view);
- GimpItemTreeView *item_view = GIMP_ITEM_TREE_VIEW (tree_view);
GimpItemTreeViewClass *item_view_class;
- GimpContainer *container;
- gint dest_index = -1;
-
- container = gimp_container_view_get_container (container_view);
-
- if (dest_viewable)
- dest_index = gimp_container_get_child_index (container,
- GIMP_OBJECT (dest_viewable));
+ GimpItemTreeView *item_view = GIMP_ITEM_TREE_VIEW (tree_view);
+ gint dest_index = -1;
item_view_class = GIMP_ITEM_TREE_VIEW_GET_CLASS (item_view);
@@ -823,25 +815,41 @@ gimp_item_tree_view_drop_viewable (GimpContainerTreeView *tree_view,
}
else if (dest_viewable)
{
- gint src_index;
+ GimpContainer *src_container;
+ GimpContainer *dest_container;
+ gint src_index;
+ gint dest_index;
+
+ src_container = gimp_item_get_container (GIMP_ITEM (src_viewable));
+ src_index = gimp_item_get_index (GIMP_ITEM (src_viewable));
- src_index = gimp_container_get_child_index (container,
- GIMP_OBJECT (src_viewable));
+ dest_container = gimp_item_get_container (GIMP_ITEM (dest_viewable));
+ dest_index = gimp_item_get_index (GIMP_ITEM (dest_viewable));
- if (drop_pos == GTK_TREE_VIEW_DROP_AFTER && src_index > dest_index)
+ if (src_container == dest_container)
{
- dest_index++;
+ if (drop_pos == GTK_TREE_VIEW_DROP_AFTER &&
+ src_index > dest_index)
+ {
+ dest_index++;
+ }
+ else if (drop_pos == GTK_TREE_VIEW_DROP_BEFORE &&
+ src_index < dest_index)
+ {
+ dest_index--;
+ }
+
+ item_view_class->reorder_item (item_view->priv->image,
+ GIMP_ITEM (src_viewable),
+ dest_index,
+ TRUE,
+ item_view_class->reorder_desc);
}
- else if (drop_pos == GTK_TREE_VIEW_DROP_BEFORE && src_index < dest_index)
+ else
{
- dest_index--;
+ g_printerr ("%s: dnd between containers (%d -> %d)\n",
+ G_STRFUNC, src_index, dest_index);
}
-
- item_view_class->reorder_item (item_view->priv->image,
- GIMP_ITEM (src_viewable),
- dest_index,
- TRUE,
- item_view_class->reorder_desc);
}
gimp_image_flush (item_view->priv->image);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]