[gimp] app: fix paste-in-place when pasting over a layer group/locked item



commit 8f07d76786cbc898fa18d75d688de564ac99e149
Author: Ell <ell_se yahoo com>
Date:   Sat Mar 24 12:43:30 2018 -0400

    app: fix paste-in-place when pasting over a layer group/locked item
    
    When pasting in place over a layer group or a content-locked item,
    change the paste type to NEW_LAYER_IN_PLACE, rather than NEW_LAYER,
    so that the new layer is still pasted in the right location.
    
    Additionally, avoid showing the "Pasted as new layer because ..."
    message when pasting over a layer group or a content-locked item,
    when the paste type is NEW_LAYER[_IN_PLACE] to begin with.

 app/actions/edit-commands.c |   10 ++++----
 app/core/gimp-edit.c        |   44 +++++++++++++++++++++++++++++-------------
 2 files changed, 35 insertions(+), 19 deletions(-)
---
diff --git a/app/actions/edit-commands.c b/app/actions/edit-commands.c
index 9959c63..0c6d75d 100644
--- a/app/actions/edit-commands.c
+++ b/app/actions/edit-commands.c
@@ -560,7 +560,9 @@ edit_paste (GimpDisplay   *display,
       gint              x, y;
       gint              width, height;
 
-      if (drawable)
+      if (drawable                                &&
+          paste_type != GIMP_PASTE_TYPE_NEW_LAYER &&
+          paste_type != GIMP_PASTE_TYPE_NEW_LAYER_IN_PLACE)
         {
           if (gimp_viewable_get_children (GIMP_VIEWABLE (drawable)))
             {
@@ -568,8 +570,6 @@ edit_paste (GimpDisplay   *display,
                                     GIMP_MESSAGE_INFO,
                                     _("Pasted as new layer because the "
                                       "target is a layer group."));
-
-              paste_type = GIMP_PASTE_TYPE_NEW_LAYER;
             }
           else if (gimp_item_is_content_locked (GIMP_ITEM (drawable)))
             {
@@ -577,9 +577,9 @@ edit_paste (GimpDisplay   *display,
                                     GIMP_MESSAGE_INFO,
                                     _("Pasted as new layer because the "
                                       "target's pixels are locked."));
-
-              paste_type = GIMP_PASTE_TYPE_NEW_LAYER;
             }
+
+          /* the actual paste-type conversion happens in gimp_edit_paste() */
         }
 
       gimp_display_shell_untransform_viewport (shell, &x, &y, &width, &height);
diff --git a/app/core/gimp-edit.c b/app/core/gimp-edit.c
index 6591d36..36662a6 100644
--- a/app/core/gimp-edit.c
+++ b/app/core/gimp-edit.c
@@ -197,6 +197,25 @@ gimp_edit_copy_visible (GimpImage    *image,
   return NULL;
 }
 
+static gboolean
+gimp_edit_paste_is_in_place (GimpPasteType paste_type)
+{
+  switch (paste_type)
+    {
+    case GIMP_PASTE_TYPE_FLOATING:
+    case GIMP_PASTE_TYPE_FLOATING_INTO:
+    case GIMP_PASTE_TYPE_NEW_LAYER:
+      return FALSE;
+
+    case GIMP_PASTE_TYPE_FLOATING_IN_PLACE:
+    case GIMP_PASTE_TYPE_FLOATING_INTO_IN_PLACE:
+    case GIMP_PASTE_TYPE_NEW_LAYER_IN_PLACE:
+      return TRUE;
+    }
+
+  g_return_val_if_reached (FALSE);
+}
+
 static GimpLayer *
 gimp_edit_paste_get_layer (GimpImage     *image,
                            GimpDrawable  *drawable,
@@ -213,7 +232,10 @@ gimp_edit_paste_get_layer (GimpImage     *image,
       gimp_viewable_get_children (GIMP_VIEWABLE (drawable)) ||
       gimp_item_is_content_locked (GIMP_ITEM (drawable)))
     {
-      *paste_type = GIMP_PASTE_TYPE_NEW_LAYER;
+      if (gimp_edit_paste_is_in_place (*paste_type))
+        *paste_type = GIMP_PASTE_TYPE_NEW_LAYER_IN_PLACE;
+      else
+        *paste_type = GIMP_PASTE_TYPE_NEW_LAYER;
     }
 
   /*  floating pastes always have the pasted-to drawable's format with
@@ -546,11 +568,14 @@ gimp_edit_paste (GimpImage     *image,
   if (! layer)
     return NULL;
 
-  switch (paste_type)
+  if (gimp_edit_paste_is_in_place (paste_type))
+    {
+      gimp_edit_paste_get_paste_offset (image, drawable, paste,
+                                        &offset_x,
+                                        &offset_y);
+    }
+  else
     {
-    case GIMP_PASTE_TYPE_FLOATING:
-    case GIMP_PASTE_TYPE_FLOATING_INTO:
-    case GIMP_PASTE_TYPE_NEW_LAYER:
       gimp_edit_paste_get_viewport_offset (image, drawable, GIMP_OBJECT (layer),
                                            viewport_x,
                                            viewport_y,
@@ -558,15 +583,6 @@ gimp_edit_paste (GimpImage     *image,
                                            viewport_height,
                                            &offset_x,
                                            &offset_y);
-      break;
-
-    case GIMP_PASTE_TYPE_FLOATING_IN_PLACE:
-    case GIMP_PASTE_TYPE_FLOATING_INTO_IN_PLACE:
-    case GIMP_PASTE_TYPE_NEW_LAYER_IN_PLACE:
-      gimp_edit_paste_get_paste_offset (image, drawable, paste,
-                                        &offset_x,
-                                        &offset_y);
-      break;
     }
 
   return gimp_edit_paste_paste (image, drawable, layer, paste_type,


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