Merge branch 'wip/Jehan/mask-edit-option' into 'master'

app, pdb: "Add Layer Mask" dialog asks whether to edit mask immediately.

See merge request GNOME/gimp!1326
This commit is contained in:
Jehan 2025-07-02 11:05:56 +00:00
commit 0dccac60c2
16 changed files with 82 additions and 16 deletions

View file

@ -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));
@ -2499,6 +2504,7 @@ layers_add_mask_callback (GtkWidget *dialog,
g_object_set (config,
"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,

View file

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

View file

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

View file

@ -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.")

View file

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

View file

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

View file

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

View file

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

View file

@ -38,6 +38,7 @@ struct _GimpLayerMaskUndo
GimpItemUndo parent_instance;
GimpLayerMask *layer_mask;
gboolean edit_mask;
};
struct _GimpLayerMaskUndoClass

View file

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

View file

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

View file

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

View file

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

View file

@ -428,6 +428,7 @@ gimp_create_mainimage (Gimp *gimp,
NULL /*channel*/);
gimp_layer_add_mask (layer,
layer_mask,
TRUE /* edit_mask */,
FALSE /* push_undo */,
NULL /* error */);

View file

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

View file

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