From a602ea766201e05b5203fba994b16390ac10e4ae Mon Sep 17 00:00:00 2001 From: Jehan Date: Tue, 10 Jan 2023 19:06:42 +0100 Subject: [PATCH] app: lock contents of items multi-item aware. --- app/actions/channels-commands.c | 8 +++--- app/actions/items-commands.c | 49 ++++++++++++++++++++++++--------- app/actions/items-commands.h | 2 +- app/actions/layers-commands.c | 39 +------------------------- app/actions/vectors-commands.c | 8 +++--- 5 files changed, 46 insertions(+), 60 deletions(-) diff --git a/app/actions/channels-commands.c b/app/actions/channels-commands.c index 86e6386a6d..b2d9cbfb62 100644 --- a/app/actions/channels-commands.c +++ b/app/actions/channels-commands.c @@ -501,11 +501,11 @@ channels_lock_content_cmd_callback (GimpAction *action, GVariant *value, gpointer data) { - GimpImage *image; - GimpChannel *channel; - return_if_no_channel (image, channel, data); + GimpImage *image; + GList *channels; + return_if_no_channels (image, channels, data); - items_lock_content_cmd_callback (action, value, image, GIMP_ITEM (channel)); + items_lock_content_cmd_callback (action, value, image, channels); } void diff --git a/app/actions/items-commands.c b/app/actions/items-commands.c index 5fcf6f7b78..4e3707a70b 100644 --- a/app/actions/items-commands.c +++ b/app/actions/items-commands.c @@ -127,24 +127,47 @@ void items_lock_content_cmd_callback (GimpAction *action, GVariant *value, GimpImage *image, - GimpItem *item) + GList *items) { - gboolean locked = g_variant_get_boolean (value); + GList *locked_items = NULL; + GList *iter; + gchar *undo_label; + gboolean locked = g_variant_get_boolean (value); - if (locked != gimp_item_get_lock_content (item)) - { - GimpUndo *undo; - gboolean push_undo = TRUE; + for (iter = items; iter; iter = iter->next) + if (gimp_item_can_lock_content (iter->data)) + { + if (! locked && ! gimp_item_get_lock_content (iter->data)) + { + /* When unlocking, we expect all selected items to be locked. */ + g_list_free (locked_items); + return; + } + else if (locked != gimp_item_get_lock_content (iter->data)) + { + locked_items = g_list_prepend (locked_items, iter->data); + } + } - undo = gimp_image_undo_can_compress (image, GIMP_TYPE_ITEM_UNDO, - GIMP_UNDO_ITEM_LOCK_CONTENT); + if (! locked_items) + return; - if (undo && GIMP_ITEM_UNDO (undo)->item == item) - push_undo = FALSE; + if (locked) + undo_label = _("Lock content"); + else + undo_label = _("Unlock content"); - gimp_item_set_lock_content (item, locked, push_undo); - gimp_image_flush (image); - } + gimp_image_undo_group_start (image, + GIMP_UNDO_GROUP_ITEM_LOCK_CONTENTS, + undo_label); + + for (iter = locked_items; iter; iter = iter->next) + gimp_item_set_lock_content (iter->data, locked, TRUE); + + gimp_image_flush (image); + gimp_image_undo_group_end (image); + + g_list_free (locked_items); } void diff --git a/app/actions/items-commands.h b/app/actions/items-commands.h index 26c7cdb68b..8a284f5d2f 100644 --- a/app/actions/items-commands.h +++ b/app/actions/items-commands.h @@ -26,7 +26,7 @@ void items_visible_cmd_callback (GimpAction *action, void items_lock_content_cmd_callback (GimpAction *action, GVariant *value, GimpImage *image, - GimpItem *item); + GList *items); void items_lock_position_cmd_callback (GimpAction *action, GVariant *value, GimpImage *image, diff --git a/app/actions/layers-commands.c b/app/actions/layers-commands.c index 239fc44860..38709cbe15 100644 --- a/app/actions/layers-commands.c +++ b/app/actions/layers-commands.c @@ -2033,46 +2033,9 @@ layers_lock_content_cmd_callback (GimpAction *action, { GimpImage *image; GList *layers; - GList *iter; - GList *locked_layers = NULL; - gboolean locked = g_variant_get_boolean (value); - gchar *undo_label; return_if_no_layers (image, layers, data); - for (iter = layers; iter; iter = iter->next) - if (gimp_item_can_lock_content (iter->data)) - { - if (! locked && ! gimp_item_get_lock_content (iter->data)) - { - /* When unlocking, we expect all selected layers to be locked. */ - g_list_free (locked_layers); - return; - } - else if (locked != gimp_item_get_lock_content (iter->data)) - { - locked_layers = g_list_prepend (locked_layers, iter->data); - } - } - - if (! locked_layers) - return; - - if (locked) - undo_label = _("Lock content"); - else - undo_label = _("Unlock content"); - - gimp_image_undo_group_start (image, - GIMP_UNDO_GROUP_ITEM_LOCK_CONTENTS, - undo_label); - - for (iter = locked_layers; iter; iter = iter->next) - gimp_item_set_lock_content (iter->data, locked, TRUE); - - gimp_image_flush (image); - gimp_image_undo_group_end (image); - - g_list_free (locked_layers); + items_lock_content_cmd_callback (action, value, image, layers); } void diff --git a/app/actions/vectors-commands.c b/app/actions/vectors-commands.c index 70925de29d..603e368e38 100644 --- a/app/actions/vectors-commands.c +++ b/app/actions/vectors-commands.c @@ -733,11 +733,11 @@ vectors_lock_content_cmd_callback (GimpAction *action, GVariant *value, gpointer data) { - GimpImage *image; - GimpVectors *vectors; - return_if_no_vectors (image, vectors, data); + GimpImage *image; + GList *vectors; + return_if_no_vectors_list (image, vectors, data); - items_lock_content_cmd_callback (action, value, image, GIMP_ITEM (vectors)); + items_lock_content_cmd_callback (action, value, image, vectors); } void