app: layers-mask-show and layers-mask-disable multi-layer aware.

As for layers-mask-edit, it should only be sensitive in single layer
selection, and multiple selection of layers will get them out of
mask-edit mode.
This commit is contained in:
Jehan 2020-04-28 17:04:47 +02:00
parent 9c277e078c
commit a029ef3f97
4 changed files with 135 additions and 37 deletions

View File

@ -305,13 +305,13 @@ static const GimpToggleActionEntry layers_toggle_actions[] =
GIMP_HELP_LAYER_MASK_EDIT },
{ "layers-mask-show", GIMP_ICON_VISIBLE,
NC_("layers-action", "S_how Layer Mask"), NULL, NULL,
NC_("layers-action", "S_how Layer Masks"), NULL, NULL,
layers_mask_show_cmd_callback,
FALSE,
GIMP_HELP_LAYER_MASK_SHOW },
{ "layers-mask-disable", NULL,
NC_("layers-action", "_Disable Layer Mask"), NULL,
NC_("layers-action", "_Disable Layer Masks"), NULL,
NC_("layers-action", "Dismiss the effect of the layer mask"),
layers_mask_disable_cmd_callback,
FALSE,
@ -792,6 +792,10 @@ layers_actions_update (GimpActionGroup *group,
gboolean have_groups = FALSE; /* At least 1 selected layer is a group. */
gboolean have_no_groups = FALSE; /* At least 1 selected layer is not a group. */
gboolean have_writable = FALSE; /* At least 1 selected layer has no contents lock. */
gboolean all_masks_shown = TRUE;
gboolean all_masks_disabled = TRUE;
gint n_layers = 0;
if (image)
@ -811,9 +815,17 @@ layers_actions_update (GimpActionGroup *group,
* have masks, and some none.
*/
if (gimp_layer_get_mask (iter->data))
have_masks = TRUE;
{
have_masks = TRUE;
if (! gimp_layer_get_show_mask (iter->data))
all_masks_shown = FALSE;
if (gimp_layer_get_apply_mask (iter->data))
all_masks_disabled = FALSE;
}
else
have_no_masks = TRUE;
{
have_no_masks = TRUE;
}
if (gimp_viewable_get_children (GIMP_VIEWABLE (iter->data)))
have_groups = TRUE;
@ -823,9 +835,10 @@ layers_actions_update (GimpActionGroup *group,
if (! gimp_item_is_content_locked (GIMP_ITEM (iter->data)))
have_writable = TRUE;
if (have_masks && have_no_masks &&
have_groups && have_no_groups &&
have_writable)
if (have_masks && have_no_masks &&
have_groups && have_no_groups &&
have_writable && ! all_masks_shown &&
! all_masks_disabled)
break;
}
@ -1039,12 +1052,12 @@ layers_actions_update (GimpActionGroup *group,
SET_SENSITIVE ("layers-mask-delete", n_layers > 0 && !fs && !ac && have_masks);
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-show", n_layers > 0 && !fs && !ac && have_masks);
SET_SENSITIVE ("layers-mask-disable", n_layers > 0 && !fs && !ac && have_masks);
SET_ACTIVE ("layers-mask-edit", mask && gimp_layer_get_edit_mask (layer));
SET_ACTIVE ("layers-mask-show", mask && gimp_layer_get_show_mask (layer));
SET_ACTIVE ("layers-mask-disable", mask && !gimp_layer_get_apply_mask (layer));
SET_ACTIVE ("layers-mask-show", all_masks_shown);
SET_ACTIVE ("layers-mask-disable", all_masks_disabled);
SET_SENSITIVE ("layers-mask-selection-replace", layer && !fs && !ac && mask);
SET_SENSITIVE ("layers-mask-selection-add", layer && !fs && !ac && mask);

View File

@ -1215,16 +1215,45 @@ layers_mask_show_cmd_callback (GimpAction *action,
gpointer data)
{
GimpImage *image;
GimpLayer *layer;
return_if_no_layer (image, layer, data);
GList *layers;
GList *iter;
gboolean active = g_variant_get_boolean (value);
gboolean have_masks = FALSE;
return_if_no_layers (image, layers, data);
if (gimp_layer_get_mask (layer))
for (iter = layers; iter; iter = iter->next)
{
gboolean active = g_variant_get_boolean (value);
gimp_layer_set_show_mask (layer, active, TRUE);
gimp_image_flush (image);
if (gimp_layer_get_mask (iter->data))
{
have_masks = TRUE;
/* A bit of tricky to handle multiple and diverse layers with
* a toggle action (with only binary state).
* In non-active state, we will consider sets of both shown
* and hidden masks as ok and exits. This allows us to switch
* the action "active" state without actually changing
* individual masks state without explicit user request.
*/
if (! active && ! gimp_layer_get_show_mask (iter->data))
return;
}
}
if (! have_masks)
return;
gimp_image_undo_group_start (image,
GIMP_UNDO_GROUP_LAYER_ADD,
_("Show Layer Masks"));
for (iter = layers; iter; iter = iter->next)
{
if (gimp_layer_get_mask (iter->data))
{
gimp_layer_set_show_mask (iter->data, active, TRUE);
}
}
gimp_image_flush (image);
gimp_image_undo_group_end (image);
}
void
@ -1233,16 +1262,45 @@ layers_mask_disable_cmd_callback (GimpAction *action,
gpointer data)
{
GimpImage *image;
GimpLayer *layer;
return_if_no_layer (image, layer, data);
GList *layers;
GList *iter;
gboolean active = g_variant_get_boolean (value);
gboolean have_masks = FALSE;
return_if_no_layers (image, layers, data);
if (gimp_layer_get_mask (layer))
for (iter = layers; iter; iter = iter->next)
{
gboolean active = g_variant_get_boolean (value);
gimp_layer_set_apply_mask (layer, ! active, TRUE);
gimp_image_flush (image);
if (gimp_layer_get_mask (iter->data))
{
have_masks = TRUE;
/* A bit of tricky to handle multiple and diverse layers with
* a toggle action (with only binary state).
* In non-active state, we will consider sets of both enabled
* and disabled masks as ok and exits. This allows us to
* switch the action "active" state without actually changing
* individual masks state without explicit user request.
*/
if (! active && gimp_layer_get_apply_mask (iter->data))
return;
}
}
if (! have_masks)
return;
gimp_image_undo_group_start (image,
GIMP_UNDO_GROUP_LAYER_ADD,
_("Disable Layer Masks"));
for (iter = layers; iter; iter = iter->next)
{
if (gimp_layer_get_mask (iter->data))
{
gimp_layer_set_apply_mask (iter->data, ! active, TRUE);
}
}
gimp_image_flush (image);
gimp_image_undo_group_end (image);
}
void

View File

@ -4614,6 +4614,16 @@ gimp_image_set_selected_layers (GimpImage *image,
gimp_drawable_invalidate_boundary (GIMP_DRAWABLE (selected_layers->data));
gimp_item_tree_set_selected_items (private->layers, layers2);
/* We cannot edit masks with multiple selected layers. */
if (g_list_length (layers2) > 1)
{
for (iter = layers2; iter; iter = iter->next)
{
if (gimp_layer_get_mask (iter->data))
gimp_layer_set_edit_mask (iter->data, FALSE);
}
}
}
else
{

View File

@ -148,7 +148,7 @@ static void gimp_layer_tree_view_layer_signal_handler (GimpLayer
static void gimp_layer_tree_view_update_options (GimpLayerTreeView *view,
GimpLayer *layer);
static void gimp_layer_tree_view_update_menu (GimpLayerTreeView *view,
GimpLayer *layer);
GList *layers);
static void gimp_layer_tree_view_update_highlight (GimpLayerTreeView *view);
static void gimp_layer_tree_view_mask_update (GimpLayerTreeView *view,
GtkTreeIter *iter,
@ -594,10 +594,13 @@ gimp_layer_tree_view_select_item (GimpContainerView *view,
{
if (success)
{
GList *layers = g_list_prepend (NULL, item);
gimp_layer_tree_view_update_borders (layer_view,
(GtkTreeIter *) insert_data);
gimp_layer_tree_view_update_options (layer_view, GIMP_LAYER (item));
gimp_layer_tree_view_update_menu (layer_view, GIMP_LAYER (item));
gimp_layer_tree_view_update_menu (layer_view, layers);
g_list_free (layers);
}
}
@ -638,8 +641,8 @@ gimp_layer_tree_view_select_items (GimpContainerView *view,
gtk_tree_model_get_iter (tree_view->model, &iter, path->data);
gimp_layer_tree_view_update_borders (layer_view, &iter);
gimp_layer_tree_view_update_options (layer_view, GIMP_LAYER (layers->data));
gimp_layer_tree_view_update_menu (layer_view, GIMP_LAYER (layers->data));
}
gimp_layer_tree_view_update_menu (layer_view, items);
}
}
@ -1226,25 +1229,39 @@ gimp_layer_tree_view_update_options (GimpLayerTreeView *view,
static void
gimp_layer_tree_view_update_menu (GimpLayerTreeView *layer_view,
GimpLayer *layer)
GList *layers)
{
GimpUIManager *ui_manager = gimp_editor_get_ui_manager (GIMP_EDITOR (layer_view));
GimpActionGroup *group;
GimpLayerMask *mask;
GList *iter;
gboolean have_masks = FALSE;
gboolean all_masks_shown = TRUE;
gboolean all_masks_disabled = TRUE;
group = gimp_ui_manager_get_action_group (ui_manager, "layers");
mask = gimp_layer_get_mask (layer);
for (iter = layers; iter; iter = iter->next)
{
if (gimp_layer_get_mask (iter->data))
{
have_masks = TRUE;
if (! gimp_layer_get_show_mask (iter->data))
all_masks_shown = FALSE;
if (gimp_layer_get_apply_mask (iter->data))
all_masks_disabled = FALSE;
}
}
gimp_action_group_set_action_active (group, "layers-mask-show",
mask &&
gimp_layer_get_show_mask (layer));
have_masks && all_masks_shown);
gimp_action_group_set_action_active (group, "layers-mask-disable",
mask &&
! gimp_layer_get_apply_mask (layer));
have_masks && all_masks_disabled);
/* Only one layer mask at a time can be edited. */
gimp_action_group_set_action_active (group, "layers-mask-edit",
mask &&
gimp_layer_get_edit_mask (layer));
g_list_length (layers) == 1 &&
gimp_layer_get_mask (layers->data) &&
gimp_layer_get_edit_mask (layers->data));
}
static void