[gimp] Make "Merge down" work on trees and start fixing the rest of the merge code



commit d91a89e1571e07f29de05dcd28b56edf1fffa702
Author: Michael Natterer <mitch gimp org>
Date:   Tue Aug 25 21:26:14 2009 +0200

    Make "Merge down" work on trees and start fixing the rest of the merge code
    
    * make internal merge functions aware of the container to merge and
      its parent layer.
    * git rid of some cruft in gimp_image_merge_down().
    * merge down works within one container (naturally) and needs:
      - the uppper layer not to be a group
      - the lower layer to be writable
    * fix action sensitivity accordingly.

 app/actions/layers-actions.c |   11 ++++++-
 app/core/gimpimage-merge.c   |   58 ++++++++++++++++++++++++++++-------------
 2 files changed, 48 insertions(+), 21 deletions(-)
---
diff --git a/app/actions/layers-actions.c b/app/actions/layers-actions.c
index 8e44ef3..e37e384 100644
--- a/app/actions/layers-actions.c
+++ b/app/actions/layers-actions.c
@@ -545,7 +545,13 @@ layers_actions_update (GimpActionGroup *group,
                    next_visible = g_list_next (next_visible))
                 {
                   if (gimp_item_get_visible (next_visible->data))
-                    break;
+                    {
+                      /*  next_visible is actually next_visible_and_writable  */
+                      if (gimp_item_get_lock_content (next_visible->data))
+                        next_visible = NULL;
+
+                      break;
+                    }
                 }
             }
 
@@ -581,7 +587,8 @@ layers_actions_update (GimpActionGroup *group,
   SET_SENSITIVE ("layers-lower-to-bottom",  layer && !fs && !ac && next);
 
   SET_SENSITIVE ("layers-anchor",           layer &&  fs && !ac);
-  SET_SENSITIVE ("layers-merge-down",       layer && !fs && !ac && next_visible);
+  SET_SENSITIVE ("layers-merge-down",       layer && !fs && !ac &&
+                                            !children && next_visible);
   SET_SENSITIVE ("layers-merge-layers",     layer && !fs && !ac);
   SET_SENSITIVE ("layers-flatten-image",    layer && !fs && !ac);
 
diff --git a/app/core/gimpimage-merge.c b/app/core/gimpimage-merge.c
index 93758e9..e293b25 100644
--- a/app/core/gimpimage-merge.c
+++ b/app/core/gimpimage-merge.c
@@ -51,6 +51,7 @@
 #include "gimp-intl.h"
 
 static GimpLayer * gimp_image_merge_layers (GimpImage     *image,
+                                            GimpContainer *container,
                                             GSList        *merge_list,
                                             GimpContext   *context,
                                             GimpMergeType  merge_type,
@@ -106,7 +107,9 @@ gimp_image_merge_visible_layers (GimpImage     *image,
                                        undo_desc);
         }
 
-      layer = gimp_image_merge_layers (image, merge_list, context, merge_type,
+      layer = gimp_image_merge_layers (image,
+                                       gimp_image_get_layers (image),
+                                       merge_list, context, merge_type,
                                        _("Merge Visible Layers"));
       g_slist_free (merge_list);
 
@@ -157,7 +160,9 @@ gimp_image_flatten (GimpImage   *image,
         merge_list = g_slist_append (merge_list, layer);
     }
 
-  layer = gimp_image_merge_layers (image, merge_list, context,
+  layer = gimp_image_merge_layers (image,
+                                   gimp_image_get_layers (image),
+                                   merge_list, context,
                                    GIMP_FLATTEN_IMAGE, _("Flatten Image"));
   g_slist_free (merge_list);
 
@@ -176,14 +181,18 @@ gimp_image_merge_down (GimpImage     *image,
 {
   GimpLayer *layer;
   GList     *list;
-  GList     *layer_list;
-  GSList    *merge_list;
+  GList     *layer_list = NULL;
+  GSList    *merge_list = NULL;
 
   g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
+  g_return_val_if_fail (GIMP_IS_LAYER (current_layer), NULL);
+  g_return_val_if_fail (gimp_item_is_attached (GIMP_ITEM (current_layer)), NULL);
+  g_return_val_if_fail (gimp_viewable_get_children (GIMP_VIEWABLE (current_layer)) == NULL,
+                        NULL);
   g_return_val_if_fail (GIMP_IS_CONTEXT (context), NULL);
 
-  for (list = gimp_image_get_layer_iter (image), layer_list = NULL;
-       list && !layer_list;
+  for (list = gimp_item_get_container_iter (GIMP_ITEM (current_layer));
+       list;
        list = g_list_next (list))
     {
       layer = list->data;
@@ -192,21 +201,29 @@ gimp_image_merge_down (GimpImage     *image,
         break;
     }
 
-  for (layer_list = g_list_next (list), merge_list = NULL;
-       layer_list && !merge_list;
+  for (layer_list = g_list_next (list);
+       layer_list;
        layer_list = g_list_next (layer_list))
     {
       layer = layer_list->data;
 
       if (gimp_item_get_visible (GIMP_ITEM (layer)))
-        merge_list = g_slist_append (NULL, layer);
+        {
+          g_return_val_if_fail (! gimp_item_get_lock_content (GIMP_ITEM (layer)),
+                                NULL);
+
+          merge_list = g_slist_append (NULL, layer);
+          break;
+        }
     }
 
   merge_list = g_slist_prepend (merge_list, current_layer);
 
   gimp_set_busy (image->gimp);
 
-  layer = gimp_image_merge_layers (image, merge_list, context, merge_type,
+  layer = gimp_image_merge_layers (image,
+                                   gimp_item_get_container (GIMP_ITEM (current_layer)),
+                                   merge_list, context, merge_type,
                                    _("Merge Down"));
   g_slist_free (merge_list);
 
@@ -304,6 +321,7 @@ gimp_image_merge_layers_get_operation (GimpLayer *dest,
 
 static GimpLayer *
 gimp_image_merge_layers (GimpImage     *image,
+                         GimpContainer *container,
                          GSList        *merge_list,
                          GimpContext   *context,
                          GimpMergeType  merge_type,
@@ -325,6 +343,7 @@ gimp_image_merge_layers (GimpImage     *image,
   gboolean         active[MAX_CHANNELS] = { TRUE, TRUE, TRUE, TRUE };
   gint             off_x, off_y;
   gchar           *name;
+  GimpLayer       *parent;
 
   g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
   g_return_val_if_fail (GIMP_IS_CONTEXT (context), NULL);
@@ -335,6 +354,8 @@ gimp_image_merge_layers (GimpImage     *image,
   x2 = y2      = 0;
   bottom_layer = NULL;
 
+  parent = GIMP_LAYER (gimp_viewable_get_parent (merge_list->data));
+
   /*  Get the layer extents  */
   count = 0;
   while (merge_list)
@@ -480,8 +501,8 @@ gimp_image_merge_layers (GimpImage     *image,
        */
       layer = reverse_list->data;
       position =
-        gimp_container_get_n_children (image->layers) -
-        gimp_container_get_child_index (image->layers, GIMP_OBJECT (layer));
+        gimp_container_get_n_children (container) -
+        gimp_container_get_child_index (container, GIMP_OBJECT (layer));
     }
 
   bottom_layer = layer;
@@ -588,18 +609,17 @@ gimp_image_merge_layers (GimpImage     *image,
           gimp_image_remove_layer (image, layer, TRUE, NULL);
         }
 
-      /* FIXME tree */
-      gimp_image_add_layer (image, merge_layer, NULL, position, TRUE);
+      gimp_image_add_layer (image, merge_layer, parent,
+                            position, TRUE);
     }
   else
     {
       /*  Add the layer to the image  */
 
-      /* FIXME tree */
-      gimp_image_add_layer
-        (image, merge_layer,
-         NULL, gimp_container_get_n_children (image->layers) - position + 1,
-         TRUE);
+      gimp_image_add_layer (image, merge_layer, parent,
+                            gimp_container_get_n_children (container) -
+                            position + 1,
+                            TRUE);
     }
 
   /* set the name after the original layers have been removed so we



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