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 */
static GimpMergeType image_merge_layers_type = GIMP_EXPAND_AS_NECESSARY;
static gboolean image_merge_layers_discard_invisible = FALSE;
static GimpUnit image_resize_unit = GIMP_UNIT_PIXEL;
static GimpUnit image_scale_unit = GIMP_UNIT_PIXEL;
static GimpInterpolationType image_scale_interp = -1;
static GimpMergeType image_merge_layers_type = GIMP_EXPAND_AS_NECESSARY;
static gboolean image_merge_layers_merge_active_group = TRUE;
static gboolean image_merge_layers_discard_invisible = FALSE;
static GimpUnit image_resize_unit = GIMP_UNIT_PIXEL;
static GimpUnit image_scale_unit = GIMP_UNIT_PIXEL;
static GimpInterpolationType image_scale_interp = -1;
/* public functions */
@ -471,6 +472,7 @@ image_merge_layers_cmd_callback (GtkAction *action,
action_data_get_context (data),
widget,
image_merge_layers_type,
image_merge_layers_merge_active_group,
image_merge_layers_discard_invisible);
g_signal_connect (dialog->dialog, "response",
@ -703,12 +705,14 @@ image_merge_layers_response (GtkWidget *widget,
{
if (response_id == GTK_RESPONSE_OK)
{
image_merge_layers_type = dialog->merge_type;
image_merge_layers_discard_invisible = dialog->discard_invisible;
image_merge_layers_type = dialog->merge_type;
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,
dialog->context,
image_merge_layers_type,
image_merge_layers_merge_active_group,
image_merge_layers_discard_invisible);
gimp_image_flush (dialog->image);

View File

@ -63,9 +63,9 @@ GimpLayer *
gimp_image_merge_visible_layers (GimpImage *image,
GimpContext *context,
GimpMergeType merge_type,
gboolean merge_active_group,
gboolean discard_invisible)
{
GimpLayer *active_layer;
GimpContainer *container;
GList *list;
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_CONTEXT (context), NULL);
active_layer = gimp_image_get_active_layer (image);
/* 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))
if (merge_active_group)
{
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))
active_layer = GIMP_LAYER (fs_drawable);
fs_drawable = gimp_layer_get_floating_sel_drawable (active_layer);
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
container = gimp_image_get_layers (image);
{
container = gimp_image_get_layers (image);
}
for (list = gimp_item_stack_get_item_iter (GIMP_ITEM_STACK (container));
list;

View File

@ -22,6 +22,7 @@
GimpLayer * gimp_image_merge_visible_layers (GimpImage *image,
GimpContext *context,
GimpMergeType merge_type,
gboolean merge_active_group,
gboolean discard_invisible);
GimpLayer * gimp_image_merge_down (GimpImage *image,
GimpLayer *current_layer,

View File

@ -26,6 +26,7 @@
#include "core/gimpcontext.h"
#include "core/gimpimage.h"
#include "core/gimpitemstack.h"
#include "widgets/gimphelp-ids.h"
#include "widgets/gimpviewabledialog.h"
@ -43,6 +44,7 @@ image_merge_layers_dialog_new (GimpImage *image,
GimpContext *context,
GtkWidget *parent,
GimpMergeType merge_type,
gboolean merge_active_group,
gboolean discard_invisible)
{
ImageMergeLayersDialog *dialog;
@ -55,9 +57,11 @@ image_merge_layers_dialog_new (GimpImage *image,
dialog = g_slice_new0 (ImageMergeLayersDialog);
dialog->image = image;
dialog->context = context;
dialog->merge_type = GIMP_EXPAND_AS_NECESSARY;
dialog->image = image;
dialog->context = context;
dialog->merge_type = GIMP_EXPAND_AS_NECESSARY;
dialog->merge_active_group = merge_active_group;
dialog->discard_invisible = discard_invisible;
dialog->dialog =
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_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"));
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
dialog->discard_invisible);

View File

@ -28,6 +28,7 @@ struct _ImageMergeLayersDialog
GimpImage *image;
GimpContext *context;
GimpMergeType merge_type;
gboolean merge_active_group;
gboolean discard_invisible;
};
@ -37,6 +38,7 @@ ImageMergeLayersDialog *
GimpContext *context,
GtkWidget *parent,
GimpMergeType merge_type,
gboolean merge_active_group,
gboolean discard_invisible);

View File

@ -500,7 +500,8 @@ file_open_layers (Gimp *gimp,
g_list_free (layers);
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);
}

View File

@ -1440,7 +1440,8 @@ image_merge_visible_layers_invoker (GimpProcedure *procedure,
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)
success = FALSE;

View File

@ -942,7 +942,8 @@ HELP
headers => [ qw("core/gimpimage-merge.h") ],
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)
success = FALSE;