From 69a3f4c8cfa87ed785b5a5acff43e1979159e0bb Mon Sep 17 00:00:00 2001 From: cheesequake Date: Sat, 6 Jul 2024 04:33:59 +0530 Subject: [PATCH] actions: Fix multi-layer selection raise and lower actions This patch fixes raise operation by reversing the list of layers to be raised, allowing the action to not overlap. It also prevents raise/lower if any top/bottom item is selected. A safety else condition has been added to prevent race conditions. Resolves: #11732 --- app/actions/layers-actions.c | 12 ++++++++++-- app/actions/layers-commands.c | 22 ++++++++++++++++++++-- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/app/actions/layers-actions.c b/app/actions/layers-actions.c index 491fe334052..ee8b7431ce1 100644 --- a/app/actions/layers-actions.c +++ b/app/actions/layers-actions.c @@ -737,6 +737,9 @@ layers_actions_update (GimpActionGroup *group, gboolean last_mode = FALSE; gboolean first_mode = FALSE; + gboolean first_selected = FALSE; /* First layer is selected */ + gboolean last_selected = FALSE; /* Last layer is selected */ + 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. */ gboolean have_groups = FALSE; /* At least 1 selected layer is a group. */ @@ -834,6 +837,11 @@ layers_actions_update (GimpActionGroup *group, layer_list = gimp_item_get_container_iter (GIMP_ITEM (iter->data)); iter2 = g_list_find (layer_list, iter->data); + if (gimp_item_get_index (iter2->data) == 0) + first_selected = TRUE; + if (gimp_item_get_index (iter2->data) == n_layers - 1) + last_selected = TRUE; + if (iter2) { GList *next_visible; @@ -982,9 +990,9 @@ layers_actions_update (GimpActionGroup *group, SET_SENSITIVE ("layers-select-previous", n_selected_layers > 0 && !fs && !ac && have_prev); SET_SENSITIVE ("layers-select-next", n_selected_layers > 0 && !fs && !ac && have_next); - SET_SENSITIVE ("layers-raise", n_selected_layers > 0 && !fs && !ac && have_prev); + SET_SENSITIVE ("layers-raise", n_selected_layers > 0 && !fs && !ac && have_prev && !first_selected); SET_SENSITIVE ("layers-raise-to-top", n_selected_layers > 0 && !fs && !ac && have_prev); - SET_SENSITIVE ("layers-lower", n_selected_layers > 0 && !fs && !ac && have_next); + SET_SENSITIVE ("layers-lower", n_selected_layers > 0 && !fs && !ac && have_next && !last_selected); SET_SENSITIVE ("layers-lower-to-bottom", n_selected_layers > 0 && !fs && !ac && have_next); SET_VISIBLE ("layers-anchor", fs && !ac); diff --git a/app/actions/layers-commands.c b/app/actions/layers-commands.c index 689cb901a38..be04868a6f6 100644 --- a/app/actions/layers-commands.c +++ b/app/actions/layers-commands.c @@ -657,7 +657,15 @@ layers_raise_cmd_callback (GimpAction *action, index = gimp_item_get_index (iter->data); if (index > 0) - raised_layers = g_list_prepend (raised_layers, iter->data); + { + raised_layers = g_list_prepend (raised_layers, iter->data); + } + else + { + gimp_image_flush (image); + g_list_free (raised_layers); + return; + } } gimp_image_undo_group_start (image, @@ -665,6 +673,8 @@ layers_raise_cmd_callback (GimpAction *action, ngettext ("Raise Layer", "Raise Layers", g_list_length (raised_layers))); + + raised_layers = g_list_reverse (raised_layers); for (iter = raised_layers; iter; iter = iter->next) gimp_image_raise_item (image, iter->data, NULL); @@ -728,7 +738,15 @@ layers_lower_cmd_callback (GimpAction *action, layer_list = gimp_item_get_container_iter (GIMP_ITEM (iter->data)); index = gimp_item_get_index (iter->data); if (index < g_list_length (layer_list) - 1) - lowered_layers = g_list_prepend (lowered_layers, iter->data); + { + lowered_layers = g_list_prepend (lowered_layers, iter->data); + } + else + { + gimp_image_flush (image); + g_list_free (lowered_layers); + return; + } } gimp_image_undo_group_start (image, -- GitLab