From b5c8a259c86ae1ef34de0b655753ce68b19f0851 Mon Sep 17 00:00:00 2001 From: Jehan Date: Wed, 22 Apr 2020 00:05:31 +0200 Subject: [PATCH] app: make layers-mask-add-last-values multi-selection aware. --- app/actions/layers-actions.c | 43 +++++++++++++++++++++++++---------- app/actions/layers-commands.c | 41 ++++++++++++++++++++++++--------- 2 files changed, 61 insertions(+), 23 deletions(-) diff --git a/app/actions/layers-actions.c b/app/actions/layers-actions.c index cb5cd6c76c..24087d1a36 100644 --- a/app/actions/layers-actions.c +++ b/app/actions/layers-actions.c @@ -259,9 +259,9 @@ static const GimpActionEntry layers_actions[] = GIMP_HELP_LAYER_CROP }, { "layers-mask-add", GIMP_ICON_LAYER_MASK, - NC_("layers-action", "Add La_yer Mask..."), NULL, + NC_("layers-action", "Add La_yer Masks..."), NULL, NC_("layers-action", - "Add a mask that allows non-destructive editing of transparency"), + "Add masks to selected layers that allows non-destructive editing of transparency"), layers_mask_add_cmd_callback, GIMP_HELP_LAYER_MASK_ADD }, @@ -269,16 +269,16 @@ static const GimpActionEntry layers_actions[] = * there is a mask on the layer */ { "layers-mask-add-button", GIMP_ICON_LAYER_MASK, - NC_("layers-action", "Add La_yer Mask..."), NULL, + NC_("layers-action", "Add La_yer Masks..."), NULL, NC_("layers-action", - "Add a mask that allows non-destructive editing of transparency"), + "Add masks to selected layers that allows non-destructive editing of transparency"), layers_mask_add_cmd_callback, GIMP_HELP_LAYER_MASK_ADD }, { "layers-mask-add-last-values", GIMP_ICON_LAYER_MASK, - NC_("layers-action", "Add La_yer Mask"), NULL, + NC_("layers-action", "Add La_yer Masks"), NULL, NC_("layers-action", - "Add a mask with last used values"), + "Add mask to selected layers with last used values"), layers_mask_add_last_vals_cmd_callback, GIMP_HELP_LAYER_MASK_ADD }, @@ -763,6 +763,7 @@ layers_actions_update (GimpActionGroup *group, { GimpImage *image = action_data_get_image (data); GList *layers = NULL; + GList *iter = NULL; GimpLayer *layer = NULL; GimpLayerMask *mask = NULL; /* layer mask */ gboolean fs = FALSE; /* floating sel */ @@ -785,6 +786,8 @@ layers_actions_update (GimpActionGroup *group, GList *prev = NULL; gboolean next_mode = FALSE; gboolean prev_mode = FALSE; + gboolean have_masks = FALSE; /* At least 1 selected layer has a mask. */ + gboolean have_no_masks = FALSE; /* At least 1 selected layer has no mask. */ gint n_layers = 0; if (image) @@ -797,8 +800,24 @@ layers_actions_update (GimpActionGroup *group, layers = gimp_image_get_selected_layers (image); n_layers = g_list_length (layers); + for (iter = layers; iter; iter = iter->next) + { + if (gimp_layer_get_mask (iter->data)) + have_masks = TRUE; + else + have_no_masks = TRUE; + + /* have_masks and have_no_masks are not opposite. 3 cases are + * possible: all layers have masks, none have masks, or some + * have masks, and some none. + */ + if (have_masks && have_no_masks) + break; + } + if (n_layers == 1) { + /* Special unique layer case. */ GimpLayerMode *modes; GimpLayerMode mode; const gchar *action = NULL; @@ -998,16 +1017,16 @@ layers_actions_update (GimpActionGroup *group, SET_SENSITIVE ("layers-composite-mode-clip-to-layer", layer && cm_mutable); SET_SENSITIVE ("layers-composite-mode-intersection", layer && cm_mutable); - SET_SENSITIVE ("layers-mask-add", layer && !fs && !ac && !mask); - SET_SENSITIVE ("layers-mask-add-button", layer && !fs && !ac); - SET_SENSITIVE ("layers-mask-add-last-values", layer && !fs && !ac && !mask); + SET_SENSITIVE ("layers-mask-add", n_layers > 0 && !fs && !ac && mask); + SET_SENSITIVE ("layers-mask-add-button", n_layers > 0 && !fs && !ac); + SET_SENSITIVE ("layers-mask-add-last-values", n_layers > 0 && !fs && !ac && have_no_masks); SET_SENSITIVE ("layers-mask-apply", writable && !fs && !ac && mask && !children); SET_SENSITIVE ("layers-mask-delete", layer && !fs && !ac && mask); - SET_SENSITIVE ("layers-mask-edit", layer && !fs && !ac && mask); - SET_SENSITIVE ("layers-mask-show", layer && !fs && !ac && mask); - SET_SENSITIVE ("layers-mask-disable", layer && !fs && !ac && mask); + SET_SENSITIVE ("layers-mask-edit", layer && !fs && !ac && mask); + SET_SENSITIVE ("layers-mask-show", layer && !fs && !ac && mask); + SET_SENSITIVE ("layers-mask-disable", layer && !fs && !ac && mask); SET_ACTIVE ("layers-mask-edit", mask && gimp_layer_get_edit_mask (layer)); SET_ACTIVE ("layers-mask-show", mask && gimp_layer_get_show_mask (layer)); diff --git a/app/actions/layers-commands.c b/app/actions/layers-commands.c index ad5c1f704a..f1d2ef1fb2 100644 --- a/app/actions/layers-commands.c +++ b/app/actions/layers-commands.c @@ -1062,17 +1062,15 @@ layers_mask_add_last_vals_cmd_callback (GimpAction *action, gpointer data) { GimpImage *image; - GimpLayer *layer; + GList *layers; + GList *iter; GtkWidget *widget; GimpDialogConfig *config; GimpChannel *channel = NULL; GimpLayerMask *mask; - return_if_no_layer (image, layer, data); + return_if_no_layers (image, layers, data); return_if_no_widget (widget, data); - if (gimp_layer_get_mask (layer)) - return; - config = GIMP_DIALOG_CONFIG (image->gimp->config); if (config->layer_add_mask_type == GIMP_ADD_MASK_CHANNEL) @@ -1093,14 +1091,35 @@ layers_mask_add_last_vals_cmd_callback (GimpAction *action, } } - mask = gimp_layer_create_mask (layer, - config->layer_add_mask_type, - channel); + for (iter = layers; iter; iter = iter->next) + { + if (! gimp_layer_get_mask (iter->data)) + break; + } + if (iter == NULL) + /* No layers or they all have masks already. */ + return; - if (config->layer_add_mask_invert) - gimp_channel_invert (GIMP_CHANNEL (mask), FALSE); + gimp_image_undo_group_start (image, + GIMP_UNDO_GROUP_LAYER_ADD, + _("Add Layer Masks")); + for (iter = layers; iter; iter = iter->next) + { + if (gimp_layer_get_mask (iter->data)) + continue; + + mask = gimp_layer_create_mask (iter->data, + config->layer_add_mask_type, + channel); + + if (config->layer_add_mask_invert) + gimp_channel_invert (GIMP_CHANNEL (mask), FALSE); + + gimp_layer_add_mask (iter->data, mask, TRUE, NULL); + } + + gimp_image_undo_group_end (image); - gimp_layer_add_mask (layer, mask, TRUE, NULL); gimp_image_flush (image); }