[gimp] Add gimp_item_tree_reorder_item()



commit 25d39f2daa279598c5a7a7102d0f7e04216611f7
Author: Michael Natterer <mitch gimp org>
Date:   Sat Feb 6 16:00:06 2010 +0100

    Add gimp_item_tree_reorder_item()
    
    and remove the code duplication in gimp_image_reorder_layer(),
    _channel() and _vectors(), which now consist of a single call to
    gimp_item_tree_reorder_item().

 app/core/gimpimage.c    |  217 +++++++---------------------------------------
 app/core/gimpitemtree.c |   76 ++++++++++++++++
 app/core/gimpitemtree.h |   22 ++++-
 3 files changed, 127 insertions(+), 188 deletions(-)
---
diff --git a/app/core/gimpimage.c b/app/core/gimpimage.c
index c561f99..2c017a1 100644
--- a/app/core/gimpimage.c
+++ b/app/core/gimpimage.c
@@ -3276,33 +3276,6 @@ gimp_image_get_insert_pos (GimpItem       *parent,
   return parent;
 }
 
-static GimpContainer *
-gimp_image_get_reorder_pos (GimpItem      *item,
-                            GimpItem      *new_parent,
-                            gint          *new_index,
-                            GimpContainer *toplevel_container)
-{
-  GimpContainer *container;
-  GimpContainer *new_container;
-  gint           num_items;
-
-  container = gimp_item_get_container (item);
-
-  if (new_parent)
-    new_container = gimp_viewable_get_children (GIMP_VIEWABLE (new_parent));
-  else
-    new_container = toplevel_container;
-
-  num_items = gimp_container_get_n_children (new_container);
-
-  if (new_container == container)
-    num_items--;
-
-  *new_index = CLAMP (*new_index, 0, num_items);
-
-  return new_container;
-}
-
 gboolean
 gimp_image_add_layer (GimpImage *image,
                       GimpLayer *layer,
@@ -3718,59 +3691,19 @@ gimp_image_reorder_layer (GimpImage   *image,
                           gboolean     push_undo,
                           const gchar *undo_desc)
 {
-  GimpImagePrivate *private;
-  GimpContainer    *container;
-  GimpContainer    *new_container;
-
   g_return_val_if_fail (GIMP_IS_IMAGE (image), FALSE);
-  g_return_val_if_fail (GIMP_IS_LAYER (layer), FALSE);
-  g_return_val_if_fail (gimp_item_is_attached (GIMP_ITEM (layer)), FALSE);
-  g_return_val_if_fail (gimp_item_get_image (GIMP_ITEM (layer)) == image, FALSE);
-  g_return_val_if_fail (new_parent == NULL || GIMP_IS_LAYER (new_parent), FALSE);
-  g_return_val_if_fail (new_parent == NULL ||
-                        gimp_item_is_attached (GIMP_ITEM (new_parent)), FALSE);
-  g_return_val_if_fail (new_parent == NULL ||
-                        gimp_item_get_image (GIMP_ITEM (new_parent)) == image,
-                        FALSE);
-  g_return_val_if_fail (new_parent == NULL ||
-                        gimp_viewable_get_children (GIMP_VIEWABLE (new_parent)),
-                        FALSE);
-
-  private = GIMP_IMAGE_GET_PRIVATE (image);
-
-  container = gimp_item_get_container (GIMP_ITEM (layer));
-
-  new_container = gimp_image_get_reorder_pos (GIMP_ITEM (layer),
-                                              GIMP_ITEM (new_parent),
-                                              &new_index,
-                                              private->layers->container);
-
-  if (new_container != container ||
-      new_index     != gimp_item_get_index (GIMP_ITEM (layer)))
-    {
-      if (push_undo)
-        gimp_image_undo_push_layer_reorder (image, undo_desc, layer);
 
-      if (new_container != container)
-        {
-          g_object_ref (layer);
-
-          gimp_container_remove (container, GIMP_OBJECT (layer));
-
-          gimp_viewable_set_parent (GIMP_VIEWABLE (layer),
-                                    GIMP_VIEWABLE (new_parent));
-
-          gimp_container_insert (new_container, GIMP_OBJECT (layer), new_index);
-
-          g_object_unref (layer);
-        }
-      else
-        {
-          gimp_container_reorder (container, GIMP_OBJECT (layer), new_index);
-        }
-    }
-
-  return TRUE;
+  /*  item and new_parent are type-checked in GimpItemTree
+   */
+  return gimp_item_tree_reorder_item (GIMP_IMAGE_GET_PRIVATE (image)->layers,
+                                      (GimpItem *) layer,
+                                      (GimpItem *) new_parent,
+                                      new_index,
+                                      (GimpItemReorderUndoFunc)
+                                      (push_undo ?
+                                       gimp_image_undo_push_layer_reorder :
+                                       NULL),
+                                      undo_desc);
 }
 
 gboolean
@@ -4032,61 +3965,19 @@ gimp_image_reorder_channel (GimpImage   *image,
                             gboolean     push_undo,
                             const gchar *undo_desc)
 {
-  GimpImagePrivate *private;
-  GimpContainer    *container;
-  GimpContainer    *new_container;
-
   g_return_val_if_fail (GIMP_IS_IMAGE (image), FALSE);
-  g_return_val_if_fail (GIMP_IS_CHANNEL (channel), FALSE);
-  g_return_val_if_fail (gimp_item_is_attached (GIMP_ITEM (channel)), FALSE);
-  g_return_val_if_fail (gimp_item_get_image (GIMP_ITEM (channel)) == image,
-                        FALSE);
-  g_return_val_if_fail (new_parent == NULL ||
-                        GIMP_IS_CHANNEL (new_parent), FALSE);
-  g_return_val_if_fail (new_parent == NULL ||
-                        gimp_item_is_attached (GIMP_ITEM (new_parent)), FALSE);
-  g_return_val_if_fail (new_parent == NULL ||
-                        gimp_item_get_image (GIMP_ITEM (new_parent)) == image,
-                        FALSE);
-  g_return_val_if_fail (new_parent == NULL ||
-                        gimp_viewable_get_children (GIMP_VIEWABLE (new_parent)),
-                        FALSE);
-
-  private = GIMP_IMAGE_GET_PRIVATE (image);
 
-  container = gimp_item_get_container (GIMP_ITEM (channel));
-
-  new_container = gimp_image_get_reorder_pos (GIMP_ITEM (channel),
-                                              GIMP_ITEM (new_parent),
-                                              &new_index,
-                                              private->channels->container);
-
-  if (new_container != container ||
-      new_index     != gimp_item_get_index (GIMP_ITEM (channel)))
-    {
-      if (push_undo)
-        gimp_image_undo_push_channel_reorder (image, undo_desc, channel);
-
-      if (new_container != container)
-        {
-          g_object_ref (channel);
-
-          gimp_container_remove (container, GIMP_OBJECT (channel));
-
-          gimp_viewable_set_parent (GIMP_VIEWABLE (channel),
-                                    GIMP_VIEWABLE (new_parent));
-
-          gimp_container_insert (new_container, GIMP_OBJECT (channel), new_index);
-
-          g_object_unref (channel);
-        }
-      else
-        {
-          gimp_container_reorder (container, GIMP_OBJECT (channel), new_index);
-        }
-    }
-
-  return TRUE;
+  /*  item and new_parent are type-checked in GimpItemTree
+   */
+  return gimp_item_tree_reorder_item (GIMP_IMAGE_GET_PRIVATE (image)->channels,
+                                      (GimpItem *) channel,
+                                      (GimpItem *) new_parent,
+                                      new_index,
+                                      (GimpItemReorderUndoFunc)
+                                      (push_undo ?
+                                       gimp_image_undo_push_channel_reorder :
+                                       NULL),
+                                      undo_desc);
 }
 
 gboolean
@@ -4322,61 +4213,19 @@ gimp_image_reorder_vectors (GimpImage   *image,
                             gboolean     push_undo,
                             const gchar *undo_desc)
 {
-  GimpImagePrivate *private;
-  GimpContainer    *container;
-  GimpContainer    *new_container;
-
   g_return_val_if_fail (GIMP_IS_IMAGE (image), FALSE);
-  g_return_val_if_fail (GIMP_IS_VECTORS (vectors), FALSE);
-  g_return_val_if_fail (gimp_item_is_attached (GIMP_ITEM (vectors)), FALSE);
-  g_return_val_if_fail (gimp_item_get_image (GIMP_ITEM (vectors)) == image,
-                        FALSE);
-  g_return_val_if_fail (new_parent == NULL ||
-                        GIMP_IS_VECTORS (new_parent), FALSE);
-  g_return_val_if_fail (new_parent == NULL ||
-                        gimp_item_is_attached (GIMP_ITEM (new_parent)), FALSE);
-  g_return_val_if_fail (new_parent == NULL ||
-                        gimp_item_get_image (GIMP_ITEM (new_parent)) == image,
-                        FALSE);
-  g_return_val_if_fail (new_parent == NULL ||
-                        gimp_viewable_get_children (GIMP_VIEWABLE (new_parent)),
-                        FALSE);
-
-  private = GIMP_IMAGE_GET_PRIVATE (image);
-
-  container = gimp_item_get_container (GIMP_ITEM (vectors));
-
-  new_container = gimp_image_get_reorder_pos (GIMP_ITEM (vectors),
-                                              GIMP_ITEM (new_parent),
-                                              &new_index,
-                                              private->vectors->container);
-
-  if (new_container != container ||
-      new_index     != gimp_item_get_index (GIMP_ITEM (vectors)))
-    {
-      if (push_undo)
-        gimp_image_undo_push_vectors_reorder (image, undo_desc, vectors);
-
-      if (new_container != container)
-        {
-          g_object_ref (vectors);
 
-          gimp_container_remove (container, GIMP_OBJECT (vectors));
-
-          gimp_viewable_set_parent (GIMP_VIEWABLE (vectors),
-                                    GIMP_VIEWABLE (new_parent));
-
-          gimp_container_insert (new_container, GIMP_OBJECT (vectors), new_index);
-
-          g_object_unref (vectors);
-        }
-      else
-        {
-          gimp_container_reorder (container, GIMP_OBJECT (vectors), new_index);
-        }
-    }
-
-  return TRUE;
+  /*  item and new_parent are type-checked in GimpItemTree
+   */
+  return gimp_item_tree_reorder_item (GIMP_IMAGE_GET_PRIVATE (image)->vectors,
+                                      (GimpItem *) vectors,
+                                      (GimpItem *) new_parent,
+                                      new_index,
+                                      (GimpItemReorderUndoFunc)
+                                      (push_undo ?
+                                       gimp_image_undo_push_vectors_reorder :
+                                       NULL),
+                                      undo_desc);
 }
 
 GimpLayer *
diff --git a/app/core/gimpitemtree.c b/app/core/gimpitemtree.c
index 1083597..3f09d05 100644
--- a/app/core/gimpitemtree.c
+++ b/app/core/gimpitemtree.c
@@ -248,3 +248,79 @@ gimp_item_tree_new (GimpImage *image,
                        "item-type",      item_type,
                        NULL);
 }
+
+gboolean
+gimp_item_tree_reorder_item (GimpItemTree            *tree,
+                             GimpItem                *item,
+                             GimpItem                *new_parent,
+                             gint                     new_index,
+                             GimpItemReorderUndoFunc  undo_func,
+                             const gchar             *undo_desc)
+{
+  GimpItemTreePrivate *private;
+  GimpContainer       *container;
+  GimpContainer       *new_container;
+  gint                 n_items;
+
+  g_return_val_if_fail (GIMP_IS_ITEM_TREE (tree), FALSE);
+
+  private = GIMP_ITEM_TREE_GET_PRIVATE (tree);
+
+  g_return_val_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (item, private->item_type),
+                        FALSE);
+  g_return_val_if_fail (gimp_item_is_attached (item), FALSE);
+  g_return_val_if_fail (gimp_item_get_image (item) == private->image, FALSE);
+  g_return_val_if_fail (new_parent == NULL ||
+                        G_TYPE_CHECK_INSTANCE_TYPE (new_parent,
+                                                    private->item_type),
+                        FALSE);
+  g_return_val_if_fail (new_parent == NULL ||
+                        gimp_item_is_attached (new_parent), FALSE);
+  g_return_val_if_fail (new_parent == NULL ||
+                        gimp_item_get_image (new_parent) == private->image,
+                        FALSE);
+  g_return_val_if_fail (new_parent == NULL ||
+                        gimp_viewable_get_children (GIMP_VIEWABLE (new_parent)),
+                        FALSE);
+
+  container = gimp_item_get_container (item);
+
+  if (new_parent)
+    new_container = gimp_viewable_get_children (GIMP_VIEWABLE (new_parent));
+  else
+    new_container = tree->container;
+
+  n_items = gimp_container_get_n_children (new_container);
+
+  if (new_container == container)
+    n_items--;
+
+  new_index = CLAMP (new_index, 0, n_items);
+
+  if (new_container != container ||
+      new_index     != gimp_item_get_index (item))
+    {
+      if (undo_func)
+        undo_func (private->image, undo_desc, item);
+
+      if (new_container != container)
+        {
+          g_object_ref (item);
+
+          gimp_container_remove (container, GIMP_OBJECT (item));
+
+          gimp_viewable_set_parent (GIMP_VIEWABLE (item),
+                                    GIMP_VIEWABLE (new_parent));
+
+          gimp_container_insert (new_container, GIMP_OBJECT (item), new_index);
+
+          g_object_unref (item);
+        }
+      else
+        {
+          gimp_container_reorder (container, GIMP_OBJECT (item), new_index);
+        }
+    }
+
+  return TRUE;
+}
diff --git a/app/core/gimpitemtree.h b/app/core/gimpitemtree.h
index ae5f849..fbcff18 100644
--- a/app/core/gimpitemtree.h
+++ b/app/core/gimpitemtree.h
@@ -25,6 +25,14 @@
 #include "gimpobject.h"
 
 
+/*  this is temporary, reorder undo will operate generically on the
+ *  item tree too
+ */
+typedef GimpUndo * (* GimpItemReorderUndoFunc) (GimpImage   *image,
+                                                const gchar *undo_desc,
+                                                GimpItem    *item);
+
+
 #define GIMP_TYPE_ITEM_TREE            (gimp_item_tree_get_type ())
 #define GIMP_ITEM_TREE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_ITEM_TREE, GimpItemTree))
 #define GIMP_ITEM_TREE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_ITEM_TREE, GimpItemTreeClass))
@@ -47,10 +55,16 @@ struct _GimpItemTreeClass
 };
 
 
-GType          gimp_item_tree_get_type (void) G_GNUC_CONST;
-GimpItemTree * gimp_item_tree_new      (GimpImage *image,
-                                        GType      container_type,
-                                        GType      item_type);
+GType          gimp_item_tree_get_type     (void) G_GNUC_CONST;
+GimpItemTree * gimp_item_tree_new          (GimpImage               *image,
+                                            GType                    container_type,
+                                            GType                    item_type);
 
+gboolean       gimp_item_tree_reorder_item (GimpItemTree            *tree,
+                                            GimpItem                *item,
+                                            GimpItem                *new_parent,
+                                            gint                     new_index,
+                                            GimpItemReorderUndoFunc  undo_func,
+                                            const gchar             *undo_desc);
 
 #endif  /*  __GIMP_ITEM_TREE_H__  */



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]