[gimp] Use GimpItemTrees to keep the image's layers, channels and vectors



commit c9d0b370fe0c69609185df3b45860aa91afce023
Author: Michael Natterer <mitch gimp org>
Date:   Sat Feb 6 13:41:16 2010 +0100

    Use GimpItemTrees to keep the image's layers, channels and vectors
    
    This commit is basically just an exchange of the stack-keeping
    objects and one big replacement of e.g. private->layers by
    private->layers->container. Useful code will follow :)

 app/core/gimpimage-private.h |    6 +-
 app/core/gimpimage.c         |  119 ++++++++++++++++++++++--------------------
 2 files changed, 66 insertions(+), 59 deletions(-)
---
diff --git a/app/core/gimpimage-private.h b/app/core/gimpimage-private.h
index 752807d..13bbf4e 100644
--- a/app/core/gimpimage-private.h
+++ b/app/core/gimpimage-private.h
@@ -69,9 +69,9 @@ struct _GimpImagePrivate
   GList             *sample_points;         /*  color sample points          */
 
   /*  Layer/Channel attributes  */
-  GimpContainer     *layers;                /*  the list of layers           */
-  GimpContainer     *channels;              /*  the list of masks            */
-  GimpContainer     *vectors;               /*  the list of vectors          */
+  GimpItemTree      *layers;                /*  the tree of layers           */
+  GimpItemTree      *channels;              /*  the tree of masks            */
+  GimpItemTree      *vectors;               /*  the tree of vectors          */
   GSList            *layer_stack;           /*  the layers in MRU order      */
 
   GQuark             layer_alpha_handler;
diff --git a/app/core/gimpimage.c b/app/core/gimpimage.c
index d74e70b..4b7f19f 100644
--- a/app/core/gimpimage.c
+++ b/app/core/gimpimage.c
@@ -51,6 +51,7 @@
 #include "gimpimage-quick-mask.h"
 #include "gimpimage-undo.h"
 #include "gimpimage-undo-push.h"
+#include "gimpitemtree.h"
 #include "gimplayer.h"
 #include "gimplayer-floating-sel.h"
 #include "gimplayermask.h"
@@ -618,37 +619,40 @@ gimp_image_init (GimpImage *image)
   private->grid                = NULL;
   private->sample_points       = NULL;
 
-  private->layers              = gimp_drawable_stack_new (GIMP_TYPE_LAYER);
-  private->channels            = gimp_drawable_stack_new (GIMP_TYPE_CHANNEL);
-  private->vectors             = gimp_item_stack_new     (GIMP_TYPE_VECTORS);
+  private->layers              = gimp_item_tree_new (GIMP_TYPE_DRAWABLE_STACK,
+                                                     GIMP_TYPE_LAYER);
+  private->channels            = gimp_item_tree_new (GIMP_TYPE_DRAWABLE_STACK,
+                                                     GIMP_TYPE_CHANNEL);
+  private->vectors             = gimp_item_tree_new (GIMP_TYPE_ITEM_STACK,
+                                                     GIMP_TYPE_VECTORS);
   private->layer_stack         = NULL;
 
-  g_signal_connect_swapped (private->layers, "update",
+  g_signal_connect_swapped (private->layers->container, "update",
                             G_CALLBACK (gimp_image_invalidate),
                             image);
 
   private->layer_alpha_handler =
-    gimp_container_add_handler (private->layers, "alpha-changed",
+    gimp_container_add_handler (private->layers->container, "alpha-changed",
                                 G_CALLBACK (gimp_image_layer_alpha_changed),
                                 image);
 
-  g_signal_connect_swapped (private->channels, "update",
+  g_signal_connect_swapped (private->channels->container, "update",
                             G_CALLBACK (gimp_image_invalidate),
                             image);
 
   private->channel_name_changed_handler =
-    gimp_container_add_handler (private->channels, "name-changed",
+    gimp_container_add_handler (private->channels->container, "name-changed",
                                 G_CALLBACK (gimp_image_channel_name_changed),
                                 image);
   private->channel_color_changed_handler =
-    gimp_container_add_handler (private->channels, "color-changed",
+    gimp_container_add_handler (private->channels->container, "color-changed",
                                 G_CALLBACK (gimp_image_channel_color_changed),
                                 image);
 
-  g_signal_connect (private->channels, "add",
+  g_signal_connect (private->channels->container, "add",
                     G_CALLBACK (gimp_image_channel_add),
                     image);
-  g_signal_connect (private->channels, "remove",
+  g_signal_connect (private->channels->container, "remove",
                     G_CALLBACK (gimp_image_channel_remove),
                     image);
 
@@ -749,10 +753,10 @@ gimp_image_constructor (GType                  type,
 
   g_signal_connect_object (config, "notify::transparency-type",
                            G_CALLBACK (gimp_item_stack_invalidate_previews),
-                           private->layers, G_CONNECT_SWAPPED);
+                           private->layers->container, G_CONNECT_SWAPPED);
   g_signal_connect_object (config, "notify::transparency-size",
                            G_CALLBACK (gimp_item_stack_invalidate_previews),
-                           private->layers, G_CONNECT_SWAPPED);
+                           private->layers->container, G_CONNECT_SWAPPED);
   g_signal_connect_object (config, "notify::layer-previews",
                            G_CALLBACK (gimp_viewable_size_changed),
                            image, G_CONNECT_SWAPPED);
@@ -834,32 +838,35 @@ gimp_image_dispose (GObject *object)
 
   gimp_image_undo_free (image);
 
-  g_signal_handlers_disconnect_by_func (private->layers,
+  g_signal_handlers_disconnect_by_func (private->layers->container,
                                         gimp_image_invalidate,
                                         image);
 
-  gimp_container_remove_handler (private->layers,
+  gimp_container_remove_handler (private->layers->container,
                                  private->layer_alpha_handler);
 
-  g_signal_handlers_disconnect_by_func (private->channels,
+  g_signal_handlers_disconnect_by_func (private->channels->container,
                                         gimp_image_invalidate,
                                         image);
 
-  gimp_container_remove_handler (private->channels,
+  gimp_container_remove_handler (private->channels->container,
                                  private->channel_name_changed_handler);
-  gimp_container_remove_handler (private->channels,
+  gimp_container_remove_handler (private->channels->container,
                                  private->channel_color_changed_handler);
 
-  g_signal_handlers_disconnect_by_func (private->channels,
+  g_signal_handlers_disconnect_by_func (private->channels->container,
                                         gimp_image_channel_add,
                                         image);
-  g_signal_handlers_disconnect_by_func (private->channels,
+  g_signal_handlers_disconnect_by_func (private->channels->container,
                                         gimp_image_channel_remove,
                                         image);
 
-  gimp_container_foreach (private->layers,   (GFunc) gimp_item_removed, NULL);
-  gimp_container_foreach (private->channels, (GFunc) gimp_item_removed, NULL);
-  gimp_container_foreach (private->vectors,  (GFunc) gimp_item_removed, NULL);
+  gimp_container_foreach (private->layers->container,
+                          (GFunc) gimp_item_removed, NULL);
+  gimp_container_foreach (private->channels->container,
+                          (GFunc) gimp_item_removed, NULL);
+  gimp_container_foreach (private->vectors->container,
+                          (GFunc) gimp_item_removed, NULL);
 
   G_OBJECT_CLASS (parent_class)->dispose (object);
 }
@@ -1162,7 +1169,7 @@ gimp_image_real_colormap_changed (GimpImage *image,
                              gimp_image_get_width  (image),
                              gimp_image_get_height (image));
 
-      gimp_item_stack_invalidate_previews (GIMP_ITEM_STACK (private->layers));
+      gimp_item_stack_invalidate_previews (GIMP_ITEM_STACK (private->layers->container));
     }
 }
 
@@ -1256,12 +1263,12 @@ gimp_image_get_graph (GimpProjectable *projectable)
   private->graph = gegl_node_new ();
 
   layers_node =
-    gimp_drawable_stack_get_graph (GIMP_DRAWABLE_STACK (private->layers));
+    gimp_drawable_stack_get_graph (GIMP_DRAWABLE_STACK (private->layers->container));
 
   gegl_node_add_child (private->graph, layers_node);
 
   channels_node =
-    gimp_drawable_stack_get_graph (GIMP_DRAWABLE_STACK (private->channels));
+    gimp_drawable_stack_get_graph (GIMP_DRAWABLE_STACK (private->channels->container));
 
   gegl_node_add_child (private->graph, channels_node);
 
@@ -1299,7 +1306,7 @@ gimp_image_layer_alpha_changed (GimpDrawable *drawable,
 {
   GimpImagePrivate *private = GIMP_IMAGE_GET_PRIVATE (image);
 
-  if (gimp_container_get_n_children (private->layers) == 1)
+  if (gimp_container_get_n_children (private->layers->container) == 1)
     private->flush_accum.alpha_changed = TRUE;
 }
 
@@ -1663,7 +1670,7 @@ gimp_image_has_alpha (const GimpImage *image)
 
   private = GIMP_IMAGE_GET_PRIVATE (image);
 
-  layer = GIMP_LAYER (gimp_container_get_first_child (private->layers));
+  layer = GIMP_LAYER (gimp_container_get_first_child (private->layers->container));
 
   return ((gimp_image_get_n_layers (image) > 1) ||
           (layer && gimp_drawable_has_alpha (GIMP_DRAWABLE (layer))));
@@ -1674,7 +1681,7 @@ gimp_image_is_empty (const GimpImage *image)
 {
   g_return_val_if_fail (GIMP_IS_IMAGE (image), TRUE);
 
-  return gimp_container_is_empty (GIMP_IMAGE_GET_PRIVATE (image)->layers);
+  return gimp_container_is_empty (GIMP_IMAGE_GET_PRIVATE (image)->layers->container);
 }
 
 void
@@ -2820,7 +2827,7 @@ gimp_image_get_layers (const GimpImage *image)
 {
   g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
 
-  return GIMP_IMAGE_GET_PRIVATE (image)->layers;
+  return GIMP_IMAGE_GET_PRIVATE (image)->layers->container;
 }
 
 GimpContainer *
@@ -2828,7 +2835,7 @@ gimp_image_get_channels (const GimpImage *image)
 {
   g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
 
-  return GIMP_IMAGE_GET_PRIVATE (image)->channels;
+  return GIMP_IMAGE_GET_PRIVATE (image)->channels->container;
 }
 
 GimpContainer *
@@ -2836,7 +2843,7 @@ gimp_image_get_vectors (const GimpImage *image)
 {
   g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
 
-  return GIMP_IMAGE_GET_PRIVATE (image)->vectors;
+  return GIMP_IMAGE_GET_PRIVATE (image)->vectors->container;
 }
 
 gint
@@ -2848,7 +2855,7 @@ gimp_image_get_n_layers (const GimpImage *image)
 
   private = GIMP_IMAGE_GET_PRIVATE (image);
 
-  return gimp_item_stack_get_n_items (GIMP_ITEM_STACK (private->layers));
+  return gimp_item_stack_get_n_items (GIMP_ITEM_STACK (private->layers->container));
 }
 
 gint
@@ -2860,7 +2867,7 @@ gimp_image_get_n_channels (const GimpImage *image)
 
   private = GIMP_IMAGE_GET_PRIVATE (image);
 
-  return gimp_item_stack_get_n_items (GIMP_ITEM_STACK (private->channels));
+  return gimp_item_stack_get_n_items (GIMP_ITEM_STACK (private->channels->container));
 }
 
 gint
@@ -2872,7 +2879,7 @@ gimp_image_get_n_vectors (const GimpImage *image)
 
   private = GIMP_IMAGE_GET_PRIVATE (image);
 
-  return gimp_item_stack_get_n_items (GIMP_ITEM_STACK (private->vectors));
+  return gimp_item_stack_get_n_items (GIMP_ITEM_STACK (private->vectors->container));
 }
 
 GList *
@@ -2884,7 +2891,7 @@ gimp_image_get_layer_iter (const GimpImage *image)
 
   private = GIMP_IMAGE_GET_PRIVATE (image);
 
-  return gimp_item_stack_get_item_iter (GIMP_ITEM_STACK (private->layers));
+  return gimp_item_stack_get_item_iter (GIMP_ITEM_STACK (private->layers->container));
 }
 
 GList *
@@ -2896,7 +2903,7 @@ gimp_image_get_channel_iter (const GimpImage *image)
 
   private = GIMP_IMAGE_GET_PRIVATE (image);
 
-  return gimp_item_stack_get_item_iter (GIMP_ITEM_STACK (private->channels));
+  return gimp_item_stack_get_item_iter (GIMP_ITEM_STACK (private->channels->container));
 }
 
 GList *
@@ -2908,7 +2915,7 @@ gimp_image_get_vectors_iter (const GimpImage *image)
 
   private = GIMP_IMAGE_GET_PRIVATE (image);
 
-  return gimp_item_stack_get_item_iter (GIMP_ITEM_STACK (private->vectors));
+  return gimp_item_stack_get_item_iter (GIMP_ITEM_STACK (private->vectors->container));
 }
 
 GList *
@@ -2920,7 +2927,7 @@ gimp_image_get_layer_list (const GimpImage *image)
 
   private = GIMP_IMAGE_GET_PRIVATE (image);
 
-  return gimp_item_stack_get_item_list (GIMP_ITEM_STACK (private->layers));
+  return gimp_item_stack_get_item_list (GIMP_ITEM_STACK (private->layers->container));
 }
 
 GList *
@@ -2932,7 +2939,7 @@ gimp_image_get_channel_list (const GimpImage *image)
 
   private = GIMP_IMAGE_GET_PRIVATE (image);
 
-  return gimp_item_stack_get_item_list (GIMP_ITEM_STACK (private->channels));
+  return gimp_item_stack_get_item_list (GIMP_ITEM_STACK (private->channels->container));
 }
 
 GList *
@@ -2944,7 +2951,7 @@ gimp_image_get_vectors_list (const GimpImage *image)
 
   private = GIMP_IMAGE_GET_PRIVATE (image);
 
-  return gimp_item_stack_get_item_list (GIMP_ITEM_STACK (private->vectors));
+  return gimp_item_stack_get_item_list (GIMP_ITEM_STACK (private->vectors->container));
 }
 
 GimpDrawable *
@@ -3134,7 +3141,7 @@ gimp_image_get_layer_by_tattoo (const GimpImage *image,
 
   g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
 
-  stack = GIMP_ITEM_STACK (GIMP_IMAGE_GET_PRIVATE (image)->layers);
+  stack = GIMP_ITEM_STACK (GIMP_IMAGE_GET_PRIVATE (image)->layers->container);
 
   return GIMP_LAYER (gimp_item_stack_get_item_by_tattoo (stack, tattoo));
 }
@@ -3147,7 +3154,7 @@ gimp_image_get_channel_by_tattoo (const GimpImage *image,
 
   g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
 
-  stack = GIMP_ITEM_STACK (GIMP_IMAGE_GET_PRIVATE (image)->channels);
+  stack = GIMP_ITEM_STACK (GIMP_IMAGE_GET_PRIVATE (image)->channels->container);
 
   return GIMP_CHANNEL (gimp_item_stack_get_item_by_tattoo (stack, tattoo));
 }
@@ -3160,7 +3167,7 @@ gimp_image_get_vectors_by_tattoo (const GimpImage *image,
 
   g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
 
-  stack = GIMP_ITEM_STACK (GIMP_IMAGE_GET_PRIVATE (image)->vectors);
+  stack = GIMP_ITEM_STACK (GIMP_IMAGE_GET_PRIVATE (image)->vectors->container);
 
   return GIMP_VECTORS (gimp_item_stack_get_item_by_tattoo (stack, tattoo));
 }
@@ -3174,7 +3181,7 @@ gimp_image_get_layer_by_name (const GimpImage *image,
   g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
   g_return_val_if_fail (name != NULL, NULL);
 
-  stack = GIMP_ITEM_STACK (GIMP_IMAGE_GET_PRIVATE (image)->layers);
+  stack = GIMP_ITEM_STACK (GIMP_IMAGE_GET_PRIVATE (image)->layers->container);
 
   return GIMP_LAYER (gimp_item_stack_get_item_by_name (stack, name));
 }
@@ -3188,7 +3195,7 @@ gimp_image_get_channel_by_name (const GimpImage *image,
   g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
   g_return_val_if_fail (name != NULL, NULL);
 
-  stack = GIMP_ITEM_STACK (GIMP_IMAGE_GET_PRIVATE (image)->channels);
+  stack = GIMP_ITEM_STACK (GIMP_IMAGE_GET_PRIVATE (image)->channels->container);
 
   return GIMP_CHANNEL (gimp_item_stack_get_item_by_name (stack, name));
 }
@@ -3202,7 +3209,7 @@ gimp_image_get_vectors_by_name (const GimpImage *image,
   g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
   g_return_val_if_fail (name != NULL, NULL);
 
-  stack = GIMP_ITEM_STACK (GIMP_IMAGE_GET_PRIVATE (image)->vectors);
+  stack = GIMP_ITEM_STACK (GIMP_IMAGE_GET_PRIVATE (image)->vectors->container);
 
   return GIMP_VECTORS (gimp_item_stack_get_item_by_name (stack, name));
 }
@@ -3333,7 +3340,7 @@ gimp_image_add_layer (GimpImage *image,
   parent = GIMP_LAYER (gimp_image_get_insert_pos ((GimpItem *) parent,
                                                   &position,
                                                   GIMP_ITEM (active_layer),
-                                                  private->layers,
+                                                  private->layers->container,
                                                   &container));
 
   floating_sel = gimp_image_get_floating_selection (image);
@@ -3341,7 +3348,7 @@ gimp_image_add_layer (GimpImage *image,
   /*  If there is a floating selection (and this isn't it!),
    *  make sure the insert position is greater than 0
    */
-  if (position == 0 && container == private->layers && floating_sel)
+  if (position == 0 && container == private->layers->container && floating_sel)
     position = 1;
 
   old_has_alpha = gimp_image_has_alpha (image);
@@ -3562,7 +3569,7 @@ gimp_image_add_layers (GimpImage   *image,
   parent = GIMP_LAYER (gimp_image_get_insert_pos ((GimpItem *) parent,
                                                   &position,
                                                   GIMP_ITEM (active_layer),
-                                                  private->layers,
+                                                  private->layers->container,
                                                   &container));
 
   for (list = layers; list; list = g_list_next (list))
@@ -3733,7 +3740,7 @@ gimp_image_reorder_layer (GimpImage   *image,
   new_container = gimp_image_get_reorder_pos (GIMP_ITEM (layer),
                                               GIMP_ITEM (new_parent),
                                               &new_index,
-                                              private->layers);
+                                              private->layers->container);
 
   if (new_container != container ||
       new_index     != gimp_item_get_index (GIMP_ITEM (layer)))
@@ -3801,7 +3808,7 @@ gimp_image_add_channel (GimpImage   *image,
   parent = GIMP_CHANNEL (gimp_image_get_insert_pos ((GimpItem *) parent,
                                                     &position,
                                                     GIMP_ITEM (active_channel),
-                                                    private->channels,
+                                                    private->channels->container,
                                                     &container));
 
   if (push_undo)
@@ -4049,7 +4056,7 @@ gimp_image_reorder_channel (GimpImage   *image,
   new_container = gimp_image_get_reorder_pos (GIMP_ITEM (channel),
                                               GIMP_ITEM (new_parent),
                                               &new_index,
-                                              private->channels);
+                                              private->channels->container);
 
   if (new_container != container ||
       new_index     != gimp_item_get_index (GIMP_ITEM (channel)))
@@ -4117,7 +4124,7 @@ gimp_image_add_vectors (GimpImage   *image,
   parent = GIMP_VECTORS (gimp_image_get_insert_pos ((GimpItem *) parent,
                                                     &position,
                                                     GIMP_ITEM (active_vectors),
-                                                    private->vectors,
+                                                    private->vectors->container,
                                                     &container));
 
   if (push_undo)
@@ -4339,7 +4346,7 @@ gimp_image_reorder_vectors (GimpImage   *image,
   new_container = gimp_image_get_reorder_pos (GIMP_ITEM (vectors),
                                               GIMP_ITEM (new_parent),
                                               &new_index,
-                                              private->vectors);
+                                              private->vectors->container);
 
   if (new_container != container ||
       new_index     != gimp_item_get_index (GIMP_ITEM (vectors)))
@@ -4467,6 +4474,6 @@ gimp_image_invalidate_previews (GimpImage *image)
 
   private = GIMP_IMAGE_GET_PRIVATE (image);
 
-  gimp_item_stack_invalidate_previews (GIMP_ITEM_STACK (private->layers));
-  gimp_item_stack_invalidate_previews (GIMP_ITEM_STACK (private->channels));
+  gimp_item_stack_invalidate_previews (GIMP_ITEM_STACK (private->layers->container));
+  gimp_item_stack_invalidate_previews (GIMP_ITEM_STACK (private->channels->container));
 }



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