mirror of https://github.com/GNOME/gimp.git
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:
parent
9c277e078c
commit
a029ef3f97
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue