app: Paste as new layer by default

This changes the default selection pasting behavior to be a new layer,
rather than a floating selection. It also removes the
"Paste as New Layer" submenu options as they are now redundant.
This commit is contained in:
Alx Sa 2022-10-29 18:53:44 +00:00 committed by Jehan
parent f6dd7f9b3a
commit 2c4f91f585
6 changed files with 67 additions and 25 deletions

View File

@ -168,14 +168,14 @@ static const GimpEnumActionEntry edit_paste_actions[] =
{ "edit-paste", GIMP_ICON_EDIT_PASTE,
NC_("edit-action", "_Paste"), "<primary>V",
NC_("edit-action", "Paste the content of the clipboard"),
GIMP_PASTE_TYPE_FLOATING, FALSE,
GIMP_PASTE_TYPE_NEW_LAYER_OR_FLOATING, FALSE,
GIMP_HELP_EDIT_PASTE },
{ "edit-paste-in-place", GIMP_ICON_EDIT_PASTE,
NC_("edit-action", "Paste In P_lace"), "<primary><alt>V",
NC_("edit-action",
"Paste the content of the clipboard at its original position"),
GIMP_PASTE_TYPE_FLOATING_IN_PLACE, FALSE,
GIMP_PASTE_TYPE_NEW_LAYER_OR_FLOATING_IN_PLACE, FALSE,
GIMP_HELP_EDIT_PASTE_IN_PLACE },
{ "edit-paste-into", GIMP_ICON_EDIT_PASTE_INTO,
@ -191,21 +191,7 @@ static const GimpEnumActionEntry edit_paste_actions[] =
"Paste the content of the clipboard into the current selection "
"at its original position"),
GIMP_PASTE_TYPE_FLOATING_INTO_IN_PLACE, FALSE,
GIMP_HELP_EDIT_PASTE_INTO_IN_PLACE },
{ "edit-paste-as-new-layer", GIMP_ICON_EDIT_PASTE_AS_NEW,
NC_("edit-action", "New _Layer"), NULL,
NC_("edit-action", "Create a new layer from the content of the clipboard"),
GIMP_PASTE_TYPE_NEW_LAYER, FALSE,
GIMP_HELP_EDIT_PASTE_AS_NEW_LAYER },
{ "edit-paste-as-new-layer-in-place", GIMP_ICON_EDIT_PASTE_AS_NEW,
NC_("edit-action", "New Layer In _Place"), NULL,
NC_("edit-action",
"Create a new layer from the content of the clipboard "
"and place it at its original position"),
GIMP_PASTE_TYPE_NEW_LAYER_IN_PLACE, FALSE,
GIMP_HELP_EDIT_PASTE_AS_NEW_LAYER_IN_PLACE }
GIMP_HELP_EDIT_PASTE_INTO_IN_PLACE }
};
static const GimpEnumActionEntry edit_fill_actions[] =
@ -369,8 +355,6 @@ edit_actions_update (GimpActionGroup *group,
SET_SENSITIVE ("edit-paste-in-place", image);
SET_SENSITIVE ("edit-paste-into", image);
SET_SENSITIVE ("edit-paste-into-in-place", image);
SET_SENSITIVE ("edit-paste-as-new-layer", image);
SET_SENSITIVE ("edit-paste-as-new-layer-in-place", image);
SET_SENSITIVE ("edit-named-cut", have_writable && have_no_groups);
SET_SENSITIVE ("edit-named-copy", drawables);

View File

@ -36,6 +36,7 @@
#include "core/gimpfilloptions.h"
#include "core/gimplayer.h"
#include "core/gimplayer-new.h"
#include "core/gimplayermask.h"
#include "core/gimpimage.h"
#include "core/gimpimage-undo.h"
@ -340,8 +341,13 @@ edit_paste_cmd_callback (GimpAction *action,
GVariant *value,
gpointer data)
{
GimpImage *image;
GimpDisplay *display = action_data_get_display (data);
GimpPasteType paste_type = (GimpPasteType) g_variant_get_int32 (value);
GimpPasteType converted_type;
GList *drawables;
return_if_no_image (image, data);
if (paste_type == GIMP_PASTE_TYPE_FLOATING)
{
@ -368,6 +374,31 @@ edit_paste_cmd_callback (GimpAction *action,
case GIMP_PASTE_TYPE_NEW_LAYER_IN_PLACE:
edit_paste (display, paste_type, FALSE);
break;
case GIMP_PASTE_TYPE_NEW_LAYER_OR_FLOATING:
case GIMP_PASTE_TYPE_NEW_LAYER_OR_FLOATING_IN_PLACE:
drawables = gimp_image_get_selected_drawables (image);
if (drawables &&
(g_list_length (drawables) == 1) &&
GIMP_IS_LAYER_MASK (drawables->data))
{
converted_type = (paste_type == GIMP_PASTE_TYPE_NEW_LAYER_OR_FLOATING) ?
GIMP_PASTE_TYPE_FLOATING :
GIMP_PASTE_TYPE_FLOATING_IN_PLACE;
edit_paste (display, converted_type, TRUE);
}
else
{
converted_type = (paste_type == GIMP_PASTE_TYPE_NEW_LAYER_OR_FLOATING) ?
GIMP_PASTE_TYPE_NEW_LAYER :
GIMP_PASTE_TYPE_NEW_LAYER_IN_PLACE;
edit_paste (display, converted_type, FALSE);
}
break;
}
}

View File

@ -948,6 +948,8 @@ gimp_paste_type_get_type (void)
{ GIMP_PASTE_TYPE_FLOATING_INTO_IN_PLACE, "GIMP_PASTE_TYPE_FLOATING_INTO_IN_PLACE", "floating-into-in-place" },
{ GIMP_PASTE_TYPE_NEW_LAYER, "GIMP_PASTE_TYPE_NEW_LAYER", "new-layer" },
{ GIMP_PASTE_TYPE_NEW_LAYER_IN_PLACE, "GIMP_PASTE_TYPE_NEW_LAYER_IN_PLACE", "new-layer-in-place" },
{ GIMP_PASTE_TYPE_NEW_LAYER_OR_FLOATING, "GIMP_PASTE_TYPE_NEW_LAYER_OR_FLOATING", "new-layer-or-floating" },
{ GIMP_PASTE_TYPE_NEW_LAYER_OR_FLOATING_IN_PLACE, "GIMP_PASTE_TYPE_NEW_LAYER_OR_FLOATING_IN_PLACE", "new-layer-or-floating-in-place" },
{ 0, NULL, NULL }
};
@ -959,6 +961,8 @@ gimp_paste_type_get_type (void)
{ GIMP_PASTE_TYPE_FLOATING_INTO_IN_PLACE, "GIMP_PASTE_TYPE_FLOATING_INTO_IN_PLACE", NULL },
{ GIMP_PASTE_TYPE_NEW_LAYER, "GIMP_PASTE_TYPE_NEW_LAYER", NULL },
{ GIMP_PASTE_TYPE_NEW_LAYER_IN_PLACE, "GIMP_PASTE_TYPE_NEW_LAYER_IN_PLACE", NULL },
{ GIMP_PASTE_TYPE_NEW_LAYER_OR_FLOATING, "GIMP_PASTE_TYPE_NEW_LAYER_OR_FLOATING", NULL },
{ GIMP_PASTE_TYPE_NEW_LAYER_OR_FLOATING_IN_PLACE, "GIMP_PASTE_TYPE_NEW_LAYER_OR_FLOATING_IN_PLACE", NULL },
{ 0, NULL, NULL }
};

View File

@ -435,7 +435,9 @@ typedef enum /*< pdb-skip >*/
GIMP_PASTE_TYPE_FLOATING_INTO,
GIMP_PASTE_TYPE_FLOATING_INTO_IN_PLACE,
GIMP_PASTE_TYPE_NEW_LAYER,
GIMP_PASTE_TYPE_NEW_LAYER_IN_PLACE
GIMP_PASTE_TYPE_NEW_LAYER_IN_PLACE,
GIMP_PASTE_TYPE_NEW_LAYER_OR_FLOATING,
GIMP_PASTE_TYPE_NEW_LAYER_OR_FLOATING_IN_PLACE
} GimpPasteType;

View File

@ -37,6 +37,7 @@
#include "gimpimage-undo.h"
#include "gimplayer-floating-selection.h"
#include "gimplayer-new.h"
#include "gimplayermask.h"
#include "gimplist.h"
#include "gimppickable.h"
#include "gimpselection.h"
@ -266,11 +267,13 @@ gimp_edit_paste_is_in_place (GimpPasteType paste_type)
case GIMP_PASTE_TYPE_FLOATING:
case GIMP_PASTE_TYPE_FLOATING_INTO:
case GIMP_PASTE_TYPE_NEW_LAYER:
case GIMP_PASTE_TYPE_NEW_LAYER_OR_FLOATING:
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:
case GIMP_PASTE_TYPE_NEW_LAYER_OR_FLOATING_IN_PLACE:
return TRUE;
}
@ -278,7 +281,8 @@ gimp_edit_paste_is_in_place (GimpPasteType paste_type)
}
static gboolean
gimp_edit_paste_is_floating (GimpPasteType paste_type)
gimp_edit_paste_is_floating (GimpPasteType paste_type,
GimpDrawable *drawable)
{
switch (paste_type)
{
@ -291,6 +295,13 @@ gimp_edit_paste_is_floating (GimpPasteType paste_type)
case GIMP_PASTE_TYPE_NEW_LAYER:
case GIMP_PASTE_TYPE_NEW_LAYER_IN_PLACE:
return FALSE;
case GIMP_PASTE_TYPE_NEW_LAYER_OR_FLOATING:
case GIMP_PASTE_TYPE_NEW_LAYER_OR_FLOATING_IN_PLACE:
if (GIMP_IS_LAYER_MASK (drawable))
return TRUE;
else
return FALSE;
}
g_return_val_if_reached (FALSE);
@ -321,7 +332,7 @@ gimp_edit_paste_get_layers (GimpImage *image,
/* floating pastes always have the pasted-to drawable's format with
* alpha; if drawable == NULL, user is pasting into an empty image
*/
if (drawable && gimp_edit_paste_is_floating (*paste_type))
if (drawable && gimp_edit_paste_is_floating (*paste_type, drawable))
floating_format = gimp_drawable_get_format_with_alpha (drawable);
else
floating_format = gimp_image_get_layer_format (image, TRUE);
@ -606,6 +617,18 @@ gimp_edit_paste_paste (GimpImage *image,
floating_sel_attach (iter->data, drawable);
break;
case GIMP_PASTE_TYPE_NEW_LAYER_OR_FLOATING:
case GIMP_PASTE_TYPE_NEW_LAYER_OR_FLOATING_IN_PLACE:
if (GIMP_IS_LAYER_MASK (drawable))
{
if (! gimp_channel_is_empty (gimp_image_get_mask (image)))
gimp_channel_clear (gimp_image_get_mask (image), NULL, TRUE);
floating_sel_attach (iter->data, drawable);
break;
}
/* fall thru if not a layer mask */
case GIMP_PASTE_TYPE_NEW_LAYER:
case GIMP_PASTE_TYPE_NEW_LAYER_IN_PLACE:
{
@ -872,4 +895,4 @@ gimp_edit_extract (GimpImage *image,
}
return NULL;
}
}

View File

@ -199,8 +199,6 @@
<menuitem action="edit-paste-into-in-place" />
</placeholder>
<menu action="edit-paste-as-menu" name="Paste as">
<menuitem action="edit-paste-as-new-layer" />
<menuitem action="edit-paste-as-new-layer-in-place" />
<menuitem action="edit-paste-as-new-image-short" />
</menu>
<menu action="edit-buffer-menu" name="Buffer">