[gimp] Let gimp_item_tree_get_insert_pos() return a boolean indicating success



commit 8afdbd805303045d82e4965eb8a758a223dc140a
Author: Michael Natterer <mitch gimp org>
Date:   Tue Feb 9 17:47:08 2010 +0100

    Let gimp_item_tree_get_insert_pos() return a boolean indicating success
    
    and move more precondition checks there. Remove lots and lots of
    checks from all its callers and simply bail out if it returns FALSE.

 app/core/gimpimage.c    |  106 ++++++++++++----------------------------------
 app/core/gimpitemtree.c |   61 +++++++++++++++------------
 app/core/gimpitemtree.h |   71 ++++++++++++++++---------------
 3 files changed, 98 insertions(+), 140 deletions(-)
---
diff --git a/app/core/gimpimage.c b/app/core/gimpimage.c
index 9696035..1f5668d 100644
--- a/app/core/gimpimage.c
+++ b/app/core/gimpimage.c
@@ -3259,30 +3259,16 @@ gimp_image_add_layer (GimpImage *image,
   gboolean          old_has_alpha;
 
   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 (parent == NULL ||
-                        parent == GIMP_IMAGE_ACTIVE_PARENT ||
-                        GIMP_IS_LAYER (parent), FALSE);
-  g_return_val_if_fail (parent == NULL ||
-                        parent == GIMP_IMAGE_ACTIVE_PARENT ||
-                        gimp_item_is_attached (GIMP_ITEM (parent)), FALSE);
-  g_return_val_if_fail (parent == NULL ||
-                        parent == GIMP_IMAGE_ACTIVE_PARENT ||
-                        gimp_item_get_image (GIMP_ITEM (parent)) == image,
-                        FALSE);
-  g_return_val_if_fail (parent == NULL ||
-                        parent == GIMP_IMAGE_ACTIVE_PARENT ||
-                        gimp_viewable_get_children (GIMP_VIEWABLE (parent)),
-                        FALSE);
 
   private = GIMP_IMAGE_GET_PRIVATE (image);
 
-  parent = GIMP_LAYER (gimp_item_tree_get_insert_pos (private->layers,
-                                                      (GimpItem *) parent,
-                                                      &position));
+  /*  item and parent are type-checked in GimpItemTree
+   */
+  if (! gimp_item_tree_get_insert_pos (private->layers,
+                                       (GimpItem *) layer,
+                                       (GimpItem **) &parent,
+                                       &position))
+    return FALSE;
 
   /*  If there is a floating selection (and this isn't it!),
    *  make sure the insert position is greater than 0
@@ -3449,24 +3435,16 @@ gimp_image_add_layers (GimpImage   *image,
 
   g_return_if_fail (GIMP_IS_IMAGE (image));
   g_return_if_fail (layers != NULL);
-  g_return_if_fail (parent == NULL ||
-                    parent == GIMP_IMAGE_ACTIVE_PARENT ||
-                    GIMP_IS_LAYER (parent));
-  g_return_if_fail (parent == NULL ||
-                    parent == GIMP_IMAGE_ACTIVE_PARENT ||
-                    gimp_item_is_attached (GIMP_ITEM (parent)));
-  g_return_if_fail (parent == NULL ||
-                    parent == GIMP_IMAGE_ACTIVE_PARENT ||
-                    gimp_item_get_image (GIMP_ITEM (parent)) == image);
-  g_return_if_fail (parent == NULL ||
-                    parent == GIMP_IMAGE_ACTIVE_PARENT ||
-                    gimp_viewable_get_children (GIMP_VIEWABLE (parent)));
 
   private = GIMP_IMAGE_GET_PRIVATE (image);
 
-  parent = GIMP_LAYER (gimp_item_tree_get_insert_pos (private->layers,
-                                                      (GimpItem *) parent,
-                                                      &position));
+  /*  item and parent are type-checked in GimpItemTree
+   */
+  if (! gimp_item_tree_get_insert_pos (private->layers,
+                                       (GimpItem *) layers->data,
+                                       (GimpItem **) &parent,
+                                       &position))
+    return;
 
   for (list = layers; list; list = g_list_next (list))
     {
@@ -3622,30 +3600,16 @@ gimp_image_add_channel (GimpImage   *image,
   GimpImagePrivate *private;
 
   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 (parent == NULL ||
-                        parent == GIMP_IMAGE_ACTIVE_PARENT ||
-                        GIMP_IS_CHANNEL (parent), FALSE);
-  g_return_val_if_fail (parent == NULL ||
-                        parent == GIMP_IMAGE_ACTIVE_PARENT ||
-                        gimp_item_is_attached (GIMP_ITEM (parent)), FALSE);
-  g_return_val_if_fail (parent == NULL ||
-                        parent == GIMP_IMAGE_ACTIVE_PARENT ||
-                        gimp_item_get_image (GIMP_ITEM (parent)) == image,
-                        FALSE);
-  g_return_val_if_fail (parent == NULL ||
-                        parent == GIMP_IMAGE_ACTIVE_PARENT ||
-                        gimp_viewable_get_children (GIMP_VIEWABLE (parent)),
-                        FALSE);
 
   private = GIMP_IMAGE_GET_PRIVATE (image);
 
-  parent = GIMP_CHANNEL (gimp_item_tree_get_insert_pos (private->channels,
-                                                        (GimpItem *) parent,
-                                                        &position));
+  /*  item and parent are type-checked in GimpItemTree
+   */
+  if (! gimp_item_tree_get_insert_pos (private->channels,
+                                       (GimpItem *) channel,
+                                       (GimpItem **) &parent,
+                                       &position))
+    return FALSE;
 
   if (push_undo)
     gimp_image_undo_push_channel_add (image, _("Add Channel"),
@@ -3837,30 +3801,16 @@ gimp_image_add_vectors (GimpImage   *image,
   GimpImagePrivate *private;
 
   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 (parent == NULL ||
-                        parent == GIMP_IMAGE_ACTIVE_PARENT ||
-                        GIMP_IS_VECTORS (parent), FALSE);
-  g_return_val_if_fail (parent == NULL ||
-                        parent == GIMP_IMAGE_ACTIVE_PARENT ||
-                        gimp_item_is_attached (GIMP_ITEM (parent)), FALSE);
-  g_return_val_if_fail (parent == NULL ||
-                        parent == GIMP_IMAGE_ACTIVE_PARENT ||
-                        gimp_item_get_image (GIMP_ITEM (parent)) == image,
-                        FALSE);
-  g_return_val_if_fail (parent == NULL ||
-                        parent == GIMP_IMAGE_ACTIVE_PARENT ||
-                        gimp_viewable_get_children (GIMP_VIEWABLE (parent)),
-                        FALSE);
 
   private = GIMP_IMAGE_GET_PRIVATE (image);
 
-  parent = GIMP_VECTORS (gimp_item_tree_get_insert_pos (private->vectors,
-                                                        (GimpItem *) parent,
-                                                        &position));
+  /*  item and parent are type-checked in GimpItemTree
+   */
+  if (! gimp_item_tree_get_insert_pos (private->vectors,
+                                       (GimpItem *) vectors,
+                                       (GimpItem **) &parent,
+                                       &position))
+    return FALSE;
 
   if (push_undo)
     gimp_image_undo_push_vectors_add (image, _("Add Path"),
diff --git a/app/core/gimpitemtree.c b/app/core/gimpitemtree.c
index 9623516..6a1667c 100644
--- a/app/core/gimpitemtree.c
+++ b/app/core/gimpitemtree.c
@@ -325,37 +325,43 @@ gimp_item_tree_get_item_by_name (GimpItemTree *tree,
                               name);
 }
 
-GimpItem *
-gimp_item_tree_get_insert_pos (GimpItemTree *tree,
-                               GimpItem     *parent,
-                               gint         *position)
+gboolean
+gimp_item_tree_get_insert_pos (GimpItemTree  *tree,
+                               GimpItem      *item,
+                               GimpItem     **parent,
+                               gint          *position)
 {
   GimpItemTreePrivate *private;
   GimpContainer       *container;
 
-  g_return_val_if_fail (GIMP_IS_ITEM_TREE (tree), NULL);
+  g_return_val_if_fail (GIMP_IS_ITEM_TREE (tree), FALSE);
+  g_return_val_if_fail (parent != NULL, FALSE);
 
   private = GIMP_ITEM_TREE_GET_PRIVATE (tree);
 
-  g_return_val_if_fail (parent == NULL ||
-                        parent == GIMP_IMAGE_ACTIVE_PARENT ||
-                        G_TYPE_CHECK_INSTANCE_TYPE (parent, private->item_type),
+  g_return_val_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (item, private->item_type),
                         FALSE);
-  g_return_val_if_fail (parent == NULL ||
-                        parent == GIMP_IMAGE_ACTIVE_PARENT ||
-                        gimp_item_is_attached (parent), FALSE);
-  g_return_val_if_fail (parent == NULL ||
-                        parent == GIMP_IMAGE_ACTIVE_PARENT ||
-                        gimp_item_get_image (parent) == private->image,
+  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 (*parent == NULL ||
+                        *parent == GIMP_IMAGE_ACTIVE_PARENT ||
+                        G_TYPE_CHECK_INSTANCE_TYPE (*parent, private->item_type),
+                        FALSE);
+  g_return_val_if_fail (*parent == NULL ||
+                        *parent == GIMP_IMAGE_ACTIVE_PARENT ||
+                        gimp_item_is_attached (*parent), FALSE);
+  g_return_val_if_fail (*parent == NULL ||
+                        *parent == GIMP_IMAGE_ACTIVE_PARENT ||
+                        gimp_item_get_image (*parent) == private->image,
                         FALSE);
-  g_return_val_if_fail (parent == NULL ||
-                        parent == GIMP_IMAGE_ACTIVE_PARENT ||
-                        gimp_viewable_get_children (GIMP_VIEWABLE (parent)),
+  g_return_val_if_fail (*parent == NULL ||
+                        *parent == GIMP_IMAGE_ACTIVE_PARENT ||
+                        gimp_viewable_get_children (GIMP_VIEWABLE (*parent)),
                         FALSE);
-  g_return_val_if_fail (position != NULL, NULL);
+  g_return_val_if_fail (position != NULL, FALSE);
 
   /*  if we want to insert in the active item's parent container  */
-  if (parent == GIMP_IMAGE_ACTIVE_PARENT)
+  if (*parent == GIMP_IMAGE_ACTIVE_PARENT)
     {
       if (private->active_item)
         {
@@ -365,23 +371,23 @@ gimp_item_tree_get_insert_pos (GimpItemTree *tree,
            */
           if (gimp_viewable_get_children (GIMP_VIEWABLE (private->active_item)))
             {
-              parent    = private->active_item;
+              *parent   = private->active_item;
               *position = 0;
             }
           else
             {
-              parent = gimp_item_get_parent (private->active_item);
+              *parent = gimp_item_get_parent (private->active_item);
             }
         }
       else
         {
           /*  use the toplevel container if there is no active item  */
-          parent = NULL;
+          *parent = NULL;
         }
     }
 
-  if (parent)
-    container = gimp_viewable_get_children (GIMP_VIEWABLE (parent));
+  if (*parent)
+    container = gimp_viewable_get_children (GIMP_VIEWABLE (*parent));
   else
     container = tree->container;
 
@@ -389,8 +395,9 @@ gimp_item_tree_get_insert_pos (GimpItemTree *tree,
   if (*position == -1)
     {
       if (private->active_item)
-        *position = gimp_container_get_child_index (container,
-                                                    GIMP_OBJECT (private->active_item));
+        *position =
+          gimp_container_get_child_index (container,
+                                          GIMP_OBJECT (private->active_item));
 
       /*  if the active item is not in the specified parent container,
        *  fall back to index 0
@@ -402,7 +409,7 @@ gimp_item_tree_get_insert_pos (GimpItemTree *tree,
   /*  don't add at a non-existing index  */
   *position = CLAMP (*position, 0, gimp_container_get_n_children (container));
 
-  return parent;
+  return TRUE;
 }
 
 void
diff --git a/app/core/gimpitemtree.h b/app/core/gimpitemtree.h
index 0eecfbe..6ff5467 100644
--- a/app/core/gimpitemtree.h
+++ b/app/core/gimpitemtree.h
@@ -48,41 +48,42 @@ 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);
-
-GimpItem     * gimp_item_tree_get_active_item  (GimpItemTree *tree);
-void           gimp_item_tree_set_active_item  (GimpItemTree *tree,
-                                                GimpItem     *item);
-
-GimpItem     * gimp_item_tree_get_item_by_name (GimpItemTree *tree,
-                                                const gchar  *name);
-
-GimpItem     * gimp_item_tree_get_insert_pos   (GimpItemTree *tree,
-                                                GimpItem     *parent,
-                                                gint         *position);
-
-void           gimp_item_tree_add_item         (GimpItemTree *tree,
-                                                GimpItem     *item,
-                                                GimpItem     *parent,
-                                                gint          position);
-GimpItem     * gimp_item_tree_remove_item      (GimpItemTree *tree,
-                                                GimpItem     *item,
-                                                GimpItem     *new_active);
-
-gboolean       gimp_item_tree_reorder_item     (GimpItemTree *tree,
-                                                GimpItem     *item,
-                                                GimpItem     *new_parent,
-                                                gint          new_index,
-                                                gboolean      push_undo,
-                                                const gchar  *undo_desc);
-
-void           gimp_item_tree_rename_item      (GimpItemTree *tree,
-                                                GimpItem     *item,
-                                                const gchar  *new_name,
-                                                gboolean      push_undo,
-                                                const gchar  *undo_desc);
+GimpItemTree * gimp_item_tree_new              (GimpImage     *image,
+                                                GType          container_type,
+                                                GType          item_type);
+
+GimpItem     * gimp_item_tree_get_active_item  (GimpItemTree  *tree);
+void           gimp_item_tree_set_active_item  (GimpItemTree  *tree,
+                                                GimpItem      *item);
+
+GimpItem     * gimp_item_tree_get_item_by_name (GimpItemTree  *tree,
+                                                const gchar   *name);
+
+gboolean       gimp_item_tree_get_insert_pos   (GimpItemTree  *tree,
+                                                GimpItem      *item,
+                                                GimpItem     **parent,
+                                                gint          *position);
+
+void           gimp_item_tree_add_item         (GimpItemTree  *tree,
+                                                GimpItem      *item,
+                                                GimpItem      *parent,
+                                                gint           position);
+GimpItem     * gimp_item_tree_remove_item      (GimpItemTree  *tree,
+                                                GimpItem      *item,
+                                                GimpItem      *new_active);
+
+gboolean       gimp_item_tree_reorder_item     (GimpItemTree  *tree,
+                                                GimpItem      *item,
+                                                GimpItem      *new_parent,
+                                                gint           new_index,
+                                                gboolean       push_undo,
+                                                const gchar   *undo_desc);
+
+void           gimp_item_tree_rename_item      (GimpItemTree  *tree,
+                                                GimpItem      *item,
+                                                const gchar   *new_name,
+                                                gboolean       push_undo,
+                                                const gchar   *undo_desc);
 
 
 #endif  /*  __GIMP_ITEM_TREE_H__  */



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