[gimp] app: fix selected layers in duplicated image.



commit dadae644bfbe85f552324a84c9b1d4402a5fb55c
Author: Jehan <jehan girinstud io>
Date:   Fri Jun 26 00:09:12 2020 +0200

    app: fix selected layers in duplicated image.
    
    This seems to have been broken since much longer, but it only made a
    problem with recent changes. Since we were duplicating layer groups and
    contents layers at once, the current code could not keep layer selection
    other than at root level in a duplicated image.
    Use the layer paths to make sure we select exactly the right copied
    layers, since the path should not change in a fully duplicated image.

 app/core/gimpimage-duplicate.c | 24 +++++++++++++++++-------
 1 file changed, 17 insertions(+), 7 deletions(-)
---
diff --git a/app/core/gimpimage-duplicate.c b/app/core/gimpimage-duplicate.c
index e013cb3cb4..807412e26f 100644
--- a/app/core/gimpimage-duplicate.c
+++ b/app/core/gimpimage-duplicate.c
@@ -225,13 +225,19 @@ static GList *
 gimp_image_duplicate_layers (GimpImage *image,
                              GimpImage *new_image)
 {
-  GList *new_selected_layers = NULL;
-  GList *selected_layers;
-  GList *list;
-  gint   count;
+  GList         *new_selected_layers = NULL;
+  GList         *selected_paths      = NULL;
+  GList         *selected_layers;
+  GimpItemStack *new_item_stack;
+  GList         *list;
+  gint           count;
 
   selected_layers = gimp_image_get_selected_layers (image);
 
+  for (list = selected_layers; list; list = list->next)
+    selected_paths = g_list_prepend (selected_paths,
+                                     gimp_item_get_path (list->data));
+
   for (list = gimp_image_get_layer_iter (image), count = 0;
        list;
        list = g_list_next (list))
@@ -252,13 +258,17 @@ gimp_image_duplicate_layers (GimpImage *image,
         gimp_object_set_name (GIMP_OBJECT (new_layer->mask),
                               gimp_object_get_name (layer->mask));
 
-      if (g_list_find (selected_layers, layer))
-        new_selected_layers = g_list_prepend (new_selected_layers, new_layer);
-
       gimp_image_add_layer (new_image, new_layer,
                             NULL, count++, FALSE);
     }
 
+  new_item_stack = GIMP_ITEM_STACK (gimp_image_get_layers (new_image));
+  for (list = selected_paths; list; list = list->next)
+    new_selected_layers = g_list_prepend (new_selected_layers,
+                                          gimp_item_stack_get_item_by_path (new_item_stack, list->data));
+
+  g_list_free_full (selected_paths, (GDestroyNotify) g_list_free);
+
   return new_selected_layers;
 }
 


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