Bug 625167 - Problem exporting floating selections from within layer groups
Add "gboolean merge_active_group" to gimp_image_merge_visible_layers() and pass FALSE from the PDB wrapper so plug-in invoked layer merging always acts on the toplevel container as it did in 2.6. Do the same when opening an image as layer. Also, added a "Merge within active group only" toggle to the merge layers dialog and pass it down to the core, but default to TRUE here so.
This commit is contained in:
@ -109,11 +109,12 @@ static void image_merge_layers_response (GtkWidget *widget,
|
|||||||
|
|
||||||
/* private variables */
|
/* private variables */
|
||||||
|
|
||||||
static GimpMergeType image_merge_layers_type = GIMP_EXPAND_AS_NECESSARY;
|
static GimpMergeType image_merge_layers_type = GIMP_EXPAND_AS_NECESSARY;
|
||||||
static gboolean image_merge_layers_discard_invisible = FALSE;
|
static gboolean image_merge_layers_merge_active_group = TRUE;
|
||||||
static GimpUnit image_resize_unit = GIMP_UNIT_PIXEL;
|
static gboolean image_merge_layers_discard_invisible = FALSE;
|
||||||
static GimpUnit image_scale_unit = GIMP_UNIT_PIXEL;
|
static GimpUnit image_resize_unit = GIMP_UNIT_PIXEL;
|
||||||
static GimpInterpolationType image_scale_interp = -1;
|
static GimpUnit image_scale_unit = GIMP_UNIT_PIXEL;
|
||||||
|
static GimpInterpolationType image_scale_interp = -1;
|
||||||
|
|
||||||
|
|
||||||
/* public functions */
|
/* public functions */
|
||||||
@ -471,6 +472,7 @@ image_merge_layers_cmd_callback (GtkAction *action,
|
|||||||
action_data_get_context (data),
|
action_data_get_context (data),
|
||||||
widget,
|
widget,
|
||||||
image_merge_layers_type,
|
image_merge_layers_type,
|
||||||
|
image_merge_layers_merge_active_group,
|
||||||
image_merge_layers_discard_invisible);
|
image_merge_layers_discard_invisible);
|
||||||
|
|
||||||
g_signal_connect (dialog->dialog, "response",
|
g_signal_connect (dialog->dialog, "response",
|
||||||
@ -703,12 +705,14 @@ image_merge_layers_response (GtkWidget *widget,
|
|||||||
{
|
{
|
||||||
if (response_id == GTK_RESPONSE_OK)
|
if (response_id == GTK_RESPONSE_OK)
|
||||||
{
|
{
|
||||||
image_merge_layers_type = dialog->merge_type;
|
image_merge_layers_type = dialog->merge_type;
|
||||||
image_merge_layers_discard_invisible = dialog->discard_invisible;
|
image_merge_layers_merge_active_group = dialog->merge_active_group;
|
||||||
|
image_merge_layers_discard_invisible = dialog->discard_invisible;
|
||||||
|
|
||||||
gimp_image_merge_visible_layers (dialog->image,
|
gimp_image_merge_visible_layers (dialog->image,
|
||||||
dialog->context,
|
dialog->context,
|
||||||
image_merge_layers_type,
|
image_merge_layers_type,
|
||||||
|
image_merge_layers_merge_active_group,
|
||||||
image_merge_layers_discard_invisible);
|
image_merge_layers_discard_invisible);
|
||||||
|
|
||||||
gimp_image_flush (dialog->image);
|
gimp_image_flush (dialog->image);
|
||||||
|
@ -63,9 +63,9 @@ GimpLayer *
|
|||||||
gimp_image_merge_visible_layers (GimpImage *image,
|
gimp_image_merge_visible_layers (GimpImage *image,
|
||||||
GimpContext *context,
|
GimpContext *context,
|
||||||
GimpMergeType merge_type,
|
GimpMergeType merge_type,
|
||||||
|
gboolean merge_active_group,
|
||||||
gboolean discard_invisible)
|
gboolean discard_invisible)
|
||||||
{
|
{
|
||||||
GimpLayer *active_layer;
|
|
||||||
GimpContainer *container;
|
GimpContainer *container;
|
||||||
GList *list;
|
GList *list;
|
||||||
GSList *merge_list = NULL;
|
GSList *merge_list = NULL;
|
||||||
@ -74,25 +74,32 @@ gimp_image_merge_visible_layers (GimpImage *image,
|
|||||||
g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
|
g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
|
||||||
g_return_val_if_fail (GIMP_IS_CONTEXT (context), NULL);
|
g_return_val_if_fail (GIMP_IS_CONTEXT (context), NULL);
|
||||||
|
|
||||||
active_layer = gimp_image_get_active_layer (image);
|
if (merge_active_group)
|
||||||
|
|
||||||
/* if the active layer is the floating selection, get the underlying
|
|
||||||
* drawable, but only if it is a layer
|
|
||||||
*/
|
|
||||||
if (active_layer && gimp_layer_is_floating_sel (active_layer))
|
|
||||||
{
|
{
|
||||||
GimpDrawable *fs_drawable;
|
GimpLayer *active_layer = gimp_image_get_active_layer (image);
|
||||||
|
|
||||||
fs_drawable = gimp_layer_get_floating_sel_drawable (active_layer);
|
/* if the active layer is the floating selection, get the
|
||||||
|
* underlying drawable, but only if it is a layer
|
||||||
|
*/
|
||||||
|
if (active_layer && gimp_layer_is_floating_sel (active_layer))
|
||||||
|
{
|
||||||
|
GimpDrawable *fs_drawable;
|
||||||
|
|
||||||
if (GIMP_IS_LAYER (fs_drawable))
|
fs_drawable = gimp_layer_get_floating_sel_drawable (active_layer);
|
||||||
active_layer = GIMP_LAYER (fs_drawable);
|
|
||||||
|
if (GIMP_IS_LAYER (fs_drawable))
|
||||||
|
active_layer = GIMP_LAYER (fs_drawable);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (active_layer)
|
||||||
|
container = gimp_item_get_container (GIMP_ITEM (active_layer));
|
||||||
|
else
|
||||||
|
container = gimp_image_get_layers (image);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (active_layer)
|
|
||||||
container = gimp_item_get_container (GIMP_ITEM (active_layer));
|
|
||||||
else
|
else
|
||||||
container = gimp_image_get_layers (image);
|
{
|
||||||
|
container = gimp_image_get_layers (image);
|
||||||
|
}
|
||||||
|
|
||||||
for (list = gimp_item_stack_get_item_iter (GIMP_ITEM_STACK (container));
|
for (list = gimp_item_stack_get_item_iter (GIMP_ITEM_STACK (container));
|
||||||
list;
|
list;
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
GimpLayer * gimp_image_merge_visible_layers (GimpImage *image,
|
GimpLayer * gimp_image_merge_visible_layers (GimpImage *image,
|
||||||
GimpContext *context,
|
GimpContext *context,
|
||||||
GimpMergeType merge_type,
|
GimpMergeType merge_type,
|
||||||
|
gboolean merge_active_group,
|
||||||
gboolean discard_invisible);
|
gboolean discard_invisible);
|
||||||
GimpLayer * gimp_image_merge_down (GimpImage *image,
|
GimpLayer * gimp_image_merge_down (GimpImage *image,
|
||||||
GimpLayer *current_layer,
|
GimpLayer *current_layer,
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
|
|
||||||
#include "core/gimpcontext.h"
|
#include "core/gimpcontext.h"
|
||||||
#include "core/gimpimage.h"
|
#include "core/gimpimage.h"
|
||||||
|
#include "core/gimpitemstack.h"
|
||||||
|
|
||||||
#include "widgets/gimphelp-ids.h"
|
#include "widgets/gimphelp-ids.h"
|
||||||
#include "widgets/gimpviewabledialog.h"
|
#include "widgets/gimpviewabledialog.h"
|
||||||
@ -43,6 +44,7 @@ image_merge_layers_dialog_new (GimpImage *image,
|
|||||||
GimpContext *context,
|
GimpContext *context,
|
||||||
GtkWidget *parent,
|
GtkWidget *parent,
|
||||||
GimpMergeType merge_type,
|
GimpMergeType merge_type,
|
||||||
|
gboolean merge_active_group,
|
||||||
gboolean discard_invisible)
|
gboolean discard_invisible)
|
||||||
{
|
{
|
||||||
ImageMergeLayersDialog *dialog;
|
ImageMergeLayersDialog *dialog;
|
||||||
@ -55,9 +57,11 @@ image_merge_layers_dialog_new (GimpImage *image,
|
|||||||
|
|
||||||
dialog = g_slice_new0 (ImageMergeLayersDialog);
|
dialog = g_slice_new0 (ImageMergeLayersDialog);
|
||||||
|
|
||||||
dialog->image = image;
|
dialog->image = image;
|
||||||
dialog->context = context;
|
dialog->context = context;
|
||||||
dialog->merge_type = GIMP_EXPAND_AS_NECESSARY;
|
dialog->merge_type = GIMP_EXPAND_AS_NECESSARY;
|
||||||
|
dialog->merge_active_group = merge_active_group;
|
||||||
|
dialog->discard_invisible = discard_invisible;
|
||||||
|
|
||||||
dialog->dialog =
|
dialog->dialog =
|
||||||
gimp_viewable_dialog_new (GIMP_VIEWABLE (image), context,
|
gimp_viewable_dialog_new (GIMP_VIEWABLE (image), context,
|
||||||
@ -107,6 +111,19 @@ image_merge_layers_dialog_new (GimpImage *image,
|
|||||||
gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
|
gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
|
||||||
gtk_widget_show (frame);
|
gtk_widget_show (frame);
|
||||||
|
|
||||||
|
button = gtk_check_button_new_with_mnemonic (_("Merge within active _group only"));
|
||||||
|
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
|
||||||
|
dialog->merge_active_group);
|
||||||
|
gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
|
||||||
|
gtk_widget_show (button);
|
||||||
|
|
||||||
|
g_signal_connect (button, "toggled",
|
||||||
|
G_CALLBACK (gimp_toggle_button_update),
|
||||||
|
&dialog->merge_active_group);
|
||||||
|
|
||||||
|
if (gimp_item_stack_is_flat (GIMP_ITEM_STACK (gimp_image_get_layers (image))))
|
||||||
|
gtk_widget_set_sensitive (button, FALSE);
|
||||||
|
|
||||||
button = gtk_check_button_new_with_mnemonic (_("_Discard invisible layers"));
|
button = gtk_check_button_new_with_mnemonic (_("_Discard invisible layers"));
|
||||||
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
|
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
|
||||||
dialog->discard_invisible);
|
dialog->discard_invisible);
|
||||||
|
@ -28,6 +28,7 @@ struct _ImageMergeLayersDialog
|
|||||||
GimpImage *image;
|
GimpImage *image;
|
||||||
GimpContext *context;
|
GimpContext *context;
|
||||||
GimpMergeType merge_type;
|
GimpMergeType merge_type;
|
||||||
|
gboolean merge_active_group;
|
||||||
gboolean discard_invisible;
|
gboolean discard_invisible;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -37,6 +38,7 @@ ImageMergeLayersDialog *
|
|||||||
GimpContext *context,
|
GimpContext *context,
|
||||||
GtkWidget *parent,
|
GtkWidget *parent,
|
||||||
GimpMergeType merge_type,
|
GimpMergeType merge_type,
|
||||||
|
gboolean merge_active_group,
|
||||||
gboolean discard_invisible);
|
gboolean discard_invisible);
|
||||||
|
|
||||||
|
|
||||||
|
@ -500,7 +500,8 @@ file_open_layers (Gimp *gimp,
|
|||||||
g_list_free (layers);
|
g_list_free (layers);
|
||||||
|
|
||||||
layer = gimp_image_merge_visible_layers (new_image, context,
|
layer = gimp_image_merge_visible_layers (new_image, context,
|
||||||
GIMP_CLIP_TO_IMAGE, FALSE);
|
GIMP_CLIP_TO_IMAGE,
|
||||||
|
FALSE, FALSE);
|
||||||
|
|
||||||
layers = g_list_prepend (NULL, layer);
|
layers = g_list_prepend (NULL, layer);
|
||||||
}
|
}
|
||||||
|
@ -1440,7 +1440,8 @@ image_merge_visible_layers_invoker (GimpProcedure *procedure,
|
|||||||
|
|
||||||
if (success)
|
if (success)
|
||||||
{
|
{
|
||||||
layer = gimp_image_merge_visible_layers (image, context, merge_type, FALSE);
|
layer = gimp_image_merge_visible_layers (image, context, merge_type,
|
||||||
|
FALSE, FALSE);
|
||||||
|
|
||||||
if (! layer)
|
if (! layer)
|
||||||
success = FALSE;
|
success = FALSE;
|
||||||
|
@ -942,7 +942,8 @@ HELP
|
|||||||
headers => [ qw("core/gimpimage-merge.h") ],
|
headers => [ qw("core/gimpimage-merge.h") ],
|
||||||
code => <<'CODE'
|
code => <<'CODE'
|
||||||
{
|
{
|
||||||
layer = gimp_image_merge_visible_layers (image, context, merge_type, FALSE);
|
layer = gimp_image_merge_visible_layers (image, context, merge_type,
|
||||||
|
FALSE, FALSE);
|
||||||
|
|
||||||
if (! layer)
|
if (! layer)
|
||||||
success = FALSE;
|
success = FALSE;
|
||||||
|
Reference in New Issue
Block a user