mirror of https://github.com/GNOME/gimp.git
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.
This commit is contained in:
parent
888baac9c8
commit
8f07d76786
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue