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:
Michael Natterer
2011-02-14 09:45:59 +01:00
parent 4807a1848a
commit 02477f5563
8 changed files with 62 additions and 28 deletions

View File

@ -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);

View File

@ -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;

View File

@ -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,

View File

@ -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);

View File

@ -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);

View File

@ -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);
} }

View File

@ -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;

View File

@ -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;