diff --git a/app/actions/layers-commands.c b/app/actions/layers-commands.c index bde74e484a..8fd6936d78 100644 --- a/app/actions/layers-commands.c +++ b/app/actions/layers-commands.c @@ -141,6 +141,7 @@ static void layers_add_mask_callback (GtkWidget *dialog, GimpAddMaskType add_mask_type, GimpChannel *channel, gboolean invert, + gboolean edit_mask, gpointer user_data); static void layers_scale_callback (GtkWidget *dialog, GimpViewable *viewable, @@ -1473,6 +1474,7 @@ layers_mask_add_cmd_callback (GimpAction *action, widget, config->layer_add_mask_type, config->layer_add_mask_invert, + config->layer_add_mask_edit_mask, layers_add_mask_callback, NULL); @@ -1548,7 +1550,9 @@ layers_mask_add_last_vals_cmd_callback (GimpAction *action, if (config->layer_add_mask_invert) gimp_channel_invert (GIMP_CHANNEL (mask), FALSE); - gimp_layer_add_mask (iter->data, mask, TRUE, NULL); + gimp_layer_add_mask (iter->data, mask, + config->layer_add_mask_edit_mask, + TRUE, NULL); } gimp_image_undo_group_end (image); @@ -2488,6 +2492,7 @@ layers_add_mask_callback (GtkWidget *dialog, GimpAddMaskType add_mask_type, GimpChannel *channel, gboolean invert, + gboolean edit_mask, gpointer user_data) { GimpImage *image = gimp_item_get_image (GIMP_ITEM (layers->data)); @@ -2497,8 +2502,9 @@ layers_add_mask_callback (GtkWidget *dialog, GError *error = NULL; g_object_set (config, - "layer-add-mask-type", add_mask_type, - "layer-add-mask-invert", invert, + "layer-add-mask-type", add_mask_type, + "layer-add-mask-invert", invert, + "layer-add-mask-edit-mask", edit_mask, NULL); gimp_image_undo_group_start (image, @@ -2514,7 +2520,7 @@ layers_add_mask_callback (GtkWidget *dialog, if (config->layer_add_mask_invert) gimp_channel_invert (GIMP_CHANNEL (mask), FALSE); - if (! gimp_layer_add_mask (iter->data, mask, TRUE, &error)) + if (! gimp_layer_add_mask (iter->data, mask, edit_mask, TRUE, &error)) { gimp_message_literal (image->gimp, G_OBJECT (dialog), GIMP_MESSAGE_WARNING, diff --git a/app/config/gimpdialogconfig.c b/app/config/gimpdialogconfig.c index 92e70f1302..ea57c5b48b 100644 --- a/app/config/gimpdialogconfig.c +++ b/app/config/gimpdialogconfig.c @@ -81,6 +81,7 @@ enum PROP_LAYER_ADD_MASK_TYPE, PROP_LAYER_ADD_MASK_INVERT, + PROP_LAYER_ADD_MASK_EDIT_MASK, PROP_LAYER_MERGE_TYPE, PROP_LAYER_MERGE_ACTIVE_GROUP_ONLY, @@ -389,6 +390,13 @@ gimp_dialog_config_class_init (GimpDialogConfigClass *klass) FALSE, GIMP_PARAM_STATIC_STRINGS); + GIMP_CONFIG_PROP_BOOLEAN (object_class, PROP_LAYER_ADD_MASK_EDIT_MASK, + "layer-add-mask-edit-mask", + "Default layer mask: edit mask immediately", + LAYER_ADD_MASK_EDIT_MASK, + TRUE, + GIMP_PARAM_STATIC_STRINGS); + GIMP_CONFIG_PROP_ENUM (object_class, PROP_LAYER_MERGE_TYPE, "layer-merge-type", "Default layer merge type", @@ -720,6 +728,9 @@ gimp_dialog_config_set_property (GObject *object, case PROP_LAYER_ADD_MASK_INVERT: config->layer_add_mask_invert = g_value_get_boolean (value); break; + case PROP_LAYER_ADD_MASK_EDIT_MASK: + config->layer_add_mask_edit_mask = g_value_get_boolean (value); + break; case PROP_LAYER_MERGE_TYPE: config->layer_merge_type = g_value_get_enum (value); @@ -920,6 +931,9 @@ gimp_dialog_config_get_property (GObject *object, case PROP_LAYER_ADD_MASK_INVERT: g_value_set_boolean (value, config->layer_add_mask_invert); break; + case PROP_LAYER_ADD_MASK_EDIT_MASK: + g_value_set_boolean (value, config->layer_add_mask_edit_mask); + break; case PROP_LAYER_MERGE_TYPE: g_value_set_enum (value, config->layer_merge_type); diff --git a/app/config/gimpdialogconfig.h b/app/config/gimpdialogconfig.h index 0dd9cedc40..3fbea8a8ef 100644 --- a/app/config/gimpdialogconfig.h +++ b/app/config/gimpdialogconfig.h @@ -79,6 +79,7 @@ struct _GimpDialogConfig GimpAddMaskType layer_add_mask_type; gboolean layer_add_mask_invert; + gboolean layer_add_mask_edit_mask; GimpMergeType layer_merge_type; gboolean layer_merge_active_group_only; diff --git a/app/config/gimprc-blurbs.h b/app/config/gimprc-blurbs.h index 5896547472..1c43ce2369 100644 --- a/app/config/gimprc-blurbs.h +++ b/app/config/gimprc-blurbs.h @@ -649,6 +649,9 @@ _("Sets the default mask for the 'Add Layer Mask' dialog.") #define LAYER_ADD_MASK_INVERT_BLURB \ _("Sets the default 'invert mask' state for the 'Add Layer Mask' dialog.") +#define LAYER_ADD_MASK_EDIT_MASK \ +_("Sets the default 'edit mask' state for the 'Add Layer Mask' dialog.") + #define LAYER_MERGE_TYPE_BLURB \ _("Sets the default merge type for the 'Merge Visible Layers' dialog.") diff --git a/app/core/gimpimage-undo-push.c b/app/core/gimpimage-undo-push.c index 468146e13a..1d50ce296c 100644 --- a/app/core/gimpimage-undo-push.c +++ b/app/core/gimpimage-undo-push.c @@ -898,6 +898,7 @@ gimp_image_undo_push_layer_mask_add (GimpImage *image, GIMP_DIRTY_IMAGE_STRUCTURE, "item", layer, "layer-mask", mask, + "edit-mask", FALSE, NULL); } @@ -920,6 +921,7 @@ gimp_image_undo_push_layer_mask_remove (GimpImage *image, GIMP_DIRTY_IMAGE_STRUCTURE, "item", layer, "layer-mask", mask, + "edit-mask", gimp_layer_get_edit_mask (layer), NULL); } diff --git a/app/core/gimplayer.c b/app/core/gimplayer.c index 4b1346599e..2f1247548c 100644 --- a/app/core/gimplayer.c +++ b/app/core/gimplayer.c @@ -989,10 +989,10 @@ gimp_layer_duplicate (GimpItem *item, mask = gimp_item_duplicate (GIMP_ITEM (layer->mask), G_TYPE_FROM_INSTANCE (layer->mask)); - gimp_layer_add_mask (new_layer, GIMP_LAYER_MASK (mask), FALSE, NULL); + gimp_layer_add_mask (new_layer, GIMP_LAYER_MASK (mask), + layer->edit_mask, FALSE, NULL); new_layer->apply_mask = layer->apply_mask; - new_layer->edit_mask = layer->edit_mask; new_layer->show_mask = layer->show_mask; } } @@ -1913,6 +1913,7 @@ gimp_layer_get_mask (GimpLayer *layer) GimpLayerMask * gimp_layer_add_mask (GimpLayer *layer, GimpLayerMask *mask, + gboolean edit_mask, gboolean push_undo, GError **error) { @@ -1954,7 +1955,7 @@ gimp_layer_add_mask (GimpLayer *layer, layer->mask = g_object_ref_sink (mask); layer->apply_mask = TRUE; - layer->edit_mask = TRUE; + layer->edit_mask = edit_mask; layer->show_mask = FALSE; gimp_layer_mask_set_layer (mask, layer); diff --git a/app/core/gimplayer.h b/app/core/gimplayer.h index df58355bb7..7dc5fc89e9 100644 --- a/app/core/gimplayer.h +++ b/app/core/gimplayer.h @@ -160,6 +160,7 @@ GimpLayerMask * gimp_layer_create_mask (GimpLayer *layer, GimpChannel *channel); GimpLayerMask * gimp_layer_add_mask (GimpLayer *layer, GimpLayerMask *mask, + gboolean edit_mask, gboolean push_undo, GError **error); void gimp_layer_apply_mask (GimpLayer *layer, diff --git a/app/core/gimplayermaskundo.c b/app/core/gimplayermaskundo.c index 96527a12f5..b6aeb200a2 100644 --- a/app/core/gimplayermaskundo.c +++ b/app/core/gimplayermaskundo.c @@ -33,7 +33,8 @@ enum { PROP_0, - PROP_LAYER_MASK + PROP_LAYER_MASK, + PROP_EDIT_MASK }; @@ -83,6 +84,11 @@ gimp_layer_mask_undo_class_init (GimpLayerMaskUndoClass *klass) GIMP_TYPE_LAYER_MASK, GIMP_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + g_object_class_install_property (object_class, PROP_EDIT_MASK, + g_param_spec_boolean ("edit-mask", NULL, NULL, + FALSE, + GIMP_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY)); } static void @@ -114,6 +120,9 @@ gimp_layer_mask_undo_set_property (GObject *object, case PROP_LAYER_MASK: layer_mask_undo->layer_mask = g_value_dup_object (value); break; + case PROP_EDIT_MASK: + layer_mask_undo->edit_mask = g_value_get_boolean (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); @@ -134,6 +143,9 @@ gimp_layer_mask_undo_get_property (GObject *object, case PROP_LAYER_MASK: g_value_set_object (value, layer_mask_undo->layer_mask); break; + case PROP_EDIT_MASK: + g_value_set_boolean (value, layer_mask_undo->edit_mask); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); @@ -175,13 +187,15 @@ gimp_layer_mask_undo_pop (GimpUndo *undo, { /* remove layer mask */ + layer_mask_undo->edit_mask = gimp_layer_get_edit_mask (layer); gimp_layer_apply_mask (layer, GIMP_MASK_DISCARD, FALSE); } else { /* restore layer mask */ - gimp_layer_add_mask (layer, layer_mask_undo->layer_mask, FALSE, NULL); + gimp_layer_add_mask (layer, layer_mask_undo->layer_mask, + layer_mask_undo->edit_mask, FALSE, NULL); } } diff --git a/app/core/gimplayermaskundo.h b/app/core/gimplayermaskundo.h index c8591c1606..ec6200cbb3 100644 --- a/app/core/gimplayermaskundo.h +++ b/app/core/gimplayermaskundo.h @@ -38,6 +38,7 @@ struct _GimpLayerMaskUndo GimpItemUndo parent_instance; GimpLayerMask *layer_mask; + gboolean edit_mask; }; struct _GimpLayerMaskUndoClass diff --git a/app/dialogs/layer-add-mask-dialog.c b/app/dialogs/layer-add-mask-dialog.c index 52d97c1910..5de52dd9fa 100644 --- a/app/dialogs/layer-add-mask-dialog.c +++ b/app/dialogs/layer-add-mask-dialog.c @@ -50,6 +50,7 @@ struct _LayerAddMaskDialog GimpAddMaskType add_mask_type; GimpChannel *channel; gboolean invert; + gboolean edit_mask; GimpAddMaskCallback callback; gpointer user_data; }; @@ -75,12 +76,14 @@ layer_add_mask_dialog_new (GList *layers, GtkWidget *parent, GimpAddMaskType add_mask_type, gboolean invert, + gboolean edit_mask, GimpAddMaskCallback callback, gpointer user_data) { LayerAddMaskDialog *private; GtkWidget *dialog; GtkWidget *vbox; + GtkWidget *hbox; GtkWidget *frame; GtkWidget *combo; GtkWidget *button; @@ -100,6 +103,7 @@ layer_add_mask_dialog_new (GList *layers, private->layers = layers; private->add_mask_type = add_mask_type; private->invert = invert; + private->edit_mask = edit_mask; private->callback = callback; private->user_data = user_data; @@ -182,15 +186,28 @@ layer_add_mask_dialog_new (GList *layers, gimp_container_view_select_item (GIMP_CONTAINER_VIEW (combo), GIMP_VIEWABLE (channel)); + hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 1); + gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); + gtk_widget_show (hbox); + button = gtk_check_button_new_with_mnemonic (_("In_vert mask")); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), private->invert); - gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0); gtk_widget_show (button); g_signal_connect (button, "toggled", G_CALLBACK (gimp_toggle_button_update), &private->invert); + button = gtk_check_button_new_with_mnemonic (_("_Edit mask immediately")); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), private->edit_mask); + gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0); + gtk_widget_show (button); + + g_signal_connect (button, "toggled", + G_CALLBACK (gimp_toggle_button_update), + &private->edit_mask); + return dialog; } @@ -226,6 +243,7 @@ layer_add_mask_dialog_response (GtkWidget *dialog, private->add_mask_type, private->channel, private->invert, + private->edit_mask, private->user_data); } else diff --git a/app/dialogs/layer-add-mask-dialog.h b/app/dialogs/layer-add-mask-dialog.h index c6d79767c2..0b97022eb2 100644 --- a/app/dialogs/layer-add-mask-dialog.h +++ b/app/dialogs/layer-add-mask-dialog.h @@ -24,6 +24,7 @@ typedef void (* GimpAddMaskCallback) (GtkWidget *dialog, GimpAddMaskType add_mask_type, GimpChannel *channel, gboolean invert, + gboolean edit_mask, gpointer user_data); @@ -32,6 +33,7 @@ GtkWidget * layer_add_mask_dialog_new (GList *layers, GtkWidget *parent, GimpAddMaskType add_mask_type, gboolean invert, + gboolean edit_mask, GimpAddMaskCallback callback, gpointer user_data); diff --git a/app/dialogs/preferences-dialog.c b/app/dialogs/preferences-dialog.c index fcf973699b..2141640be8 100644 --- a/app/dialogs/preferences-dialog.c +++ b/app/dialogs/preferences-dialog.c @@ -2477,6 +2477,9 @@ prefs_dialog_new (Gimp *gimp, prefs_check_button_add (object, "layer-add-mask-invert", _("Invert mask"), GTK_BOX (vbox2)); + prefs_check_button_add (object, "layer-add-mask-edit-mask", + _("Edit mask immediately"), + GTK_BOX (vbox2)); /* Merge Layers Dialog */ vbox2 = prefs_frame_new (_("Merge Layers Dialog"), diff --git a/app/pdb/layer-cmds.c b/app/pdb/layer-cmds.c index cd65434e27..9e6a2dde57 100644 --- a/app/pdb/layer-cmds.c +++ b/app/pdb/layer-cmds.c @@ -622,7 +622,7 @@ layer_add_mask_invoker (GimpProcedure *procedure, if (gimp_pdb_item_is_floating (GIMP_ITEM (mask), gimp_item_get_image (GIMP_ITEM (layer)), error)) - success = (gimp_layer_add_mask (layer, mask, TRUE, error) == mask); + success = (gimp_layer_add_mask (layer, mask, TRUE, TRUE, error) == mask); else success = FALSE; } diff --git a/app/tests/test-xcf.c b/app/tests/test-xcf.c index c4138bf583..ec78f8c457 100644 --- a/app/tests/test-xcf.c +++ b/app/tests/test-xcf.c @@ -428,8 +428,9 @@ gimp_create_mainimage (Gimp *gimp, NULL /*channel*/); gimp_layer_add_mask (layer, layer_mask, - FALSE /*push_undo*/, - NULL /*error*/); + TRUE /* edit_mask */, + FALSE /* push_undo */, + NULL /* error */); /* Image compression type * diff --git a/app/xcf/xcf-load.c b/app/xcf/xcf-load.c index a530db281c..1b0ba9b65f 100644 --- a/app/xcf/xcf-load.c +++ b/app/xcf/xcf-load.c @@ -1058,10 +1058,9 @@ xcf_load_add_masks (GimpImage *image) show_mask = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (layer), "gimp-layer-mask-show")); - gimp_layer_add_mask (layer, mask, FALSE, NULL); + gimp_layer_add_mask (layer, mask, edit_mask, FALSE, NULL); gimp_layer_set_apply_mask (layer, apply_mask, FALSE); - gimp_layer_set_edit_mask (layer, edit_mask); gimp_layer_set_show_mask (layer, show_mask, FALSE); g_object_set_data (G_OBJECT (layer), "gimp-layer-mask", NULL); diff --git a/pdb/groups/layer.pdb b/pdb/groups/layer.pdb index c6b753ec50..da5093d1a9 100644 --- a/pdb/groups/layer.pdb +++ b/pdb/groups/layer.pdb @@ -364,7 +364,7 @@ HELP if (gimp_pdb_item_is_floating (GIMP_ITEM (mask), gimp_item_get_image (GIMP_ITEM (layer)), error)) - success = (gimp_layer_add_mask (layer, mask, TRUE, error) == mask); + success = (gimp_layer_add_mask (layer, mask, TRUE, TRUE, error) == mask); else success = FALSE; }