widgets: Add conditional mask delete button

GimpLayerTreeView's delete button always deletes
the selected layer(s), even if a mask is selected.
This patch adds a new action button for deleting masks
(using the "layers-mask-delete" action) and conditionally
shows/hides it and the existing delete button based on
whether the mask or the layer is selected.

Note that after 3.2, we may replace this commit with a
single new action that conditionally deletes either the
mask or layer, depending on the selected item.
This commit is contained in:
Alx Sa 2025-12-18 12:25:28 +00:00
parent dae814ab21
commit 31e4c79933

View file

@ -76,6 +76,7 @@ struct _GimpLayerTreeViewPrivate
GtkWidget *layer_mode_box;
GtkAdjustment *opacity_adjustment;
GtkWidget *anchor_button;
GtkWidget *delete_mask_button;
gint model_column_mask;
gint model_column_mask_visible;
@ -401,6 +402,11 @@ gimp_layer_tree_view_constructed (GObject *object)
gtk_box_reorder_child (gimp_editor_get_button_box (GIMP_EDITOR (layer_view)),
button, 7);
button = gimp_editor_add_action_button (GIMP_EDITOR (layer_view), "layers",
"layers-mask-delete", NULL);
layer_view->priv->delete_mask_button = button;
gtk_widget_set_visible (layer_view->priv->delete_mask_button, FALSE);
/* Lock alpha toggle */
gimp_item_tree_view_add_lock (GIMP_ITEM_TREE_VIEW (tree_view),
@ -1352,12 +1358,14 @@ static void
gimp_layer_tree_view_update_borders (GimpLayerTreeView *layer_view,
GtkTreeIter *iter)
{
GimpContainerTreeView *tree_view = GIMP_CONTAINER_TREE_VIEW (layer_view);
GimpContainerTreeView *tree_view = GIMP_CONTAINER_TREE_VIEW (layer_view);
GimpViewRenderer *layer_renderer;
GimpViewRenderer *mask_renderer;
GimpLayer *layer = NULL;
GimpLayerMask *mask = NULL;
GimpViewBorderType layer_type = GIMP_VIEW_BORDER_BLACK;
GimpLayer *layer = NULL;
GimpLayerMask *mask = NULL;
GimpViewBorderType layer_type = GIMP_VIEW_BORDER_BLACK;
GtkWidget *delete_button;
gboolean mask_active = FALSE;
gtk_tree_model_get (tree_view->model, iter,
GIMP_CONTAINER_TREE_STORE_COLUMN_RENDERER, &layer_renderer,
@ -1375,6 +1383,9 @@ gimp_layer_tree_view_update_borders (GimpLayerTreeView *layer_view,
g_return_if_fail (layer != NULL);
delete_button =
gimp_item_tree_view_get_delete_button (GIMP_ITEM_TREE_VIEW (layer_view));
if (mask_renderer && GIMP_IS_LAYER_MASK (mask_renderer->viewable))
mask = GIMP_LAYER_MASK (mask_renderer->viewable);
@ -1409,6 +1420,13 @@ gimp_layer_tree_view_update_borders (GimpLayerTreeView *layer_view,
gimp_view_renderer_set_border_type (mask_renderer, GIMP_VIEW_BORDER_WHITE);
}
/* Swap delete button based on mask or layer selection */
if (mask && gimp_layer_get_edit_mask (layer))
mask_active = TRUE;
gtk_widget_set_visible (delete_button, ! mask_active);
gtk_widget_set_visible (layer_view->priv->delete_mask_button, mask_active);
if (layer_renderer)
g_object_unref (layer_renderer);