[gimp] app: layers-alpha-add|remove multi-layer aware.



commit 62eedd41b4098c54ebd9aca0455feed2ac45eac8
Author: Jehan <jehan girinstud io>
Date:   Thu Jul 30 21:01:10 2020 +0200

    app: layers-alpha-add|remove multi-layer aware.

 app/actions/layers-actions.c  | 20 +++++++++++---------
 app/actions/layers-commands.c | 38 ++++++++++++++++++++++++--------------
 app/core/core-enums.h         |  2 ++
 3 files changed, 37 insertions(+), 23 deletions(-)
---
diff --git a/app/actions/layers-actions.c b/app/actions/layers-actions.c
index 3fff0a0fa4..b2349ee872 100644
--- a/app/actions/layers-actions.c
+++ b/app/actions/layers-actions.c
@@ -769,14 +769,12 @@ layers_actions_update (GimpActionGroup *group,
   gboolean       fs             = FALSE;    /*  floating sel           */
   gboolean       ac             = FALSE;    /*  active channel         */
   gboolean       sel            = FALSE;
-  gboolean       alpha          = FALSE;    /*  alpha channel present  */
   gboolean       indexed        = FALSE;    /*  is indexed             */
   gboolean       lock_alpha     = TRUE;
   gboolean       can_lock_alpha = FALSE;
   gboolean       text_layer     = FALSE;
   gboolean       writable       = FALSE;
   gboolean       movable        = FALSE;
-  gboolean       children       = FALSE;
   gboolean       bs_mutable     = FALSE; /* At least 1 selected layers' blend space is mutable.     */
   gboolean       cs_mutable     = FALSE; /* At least 1 selected layers' composite space is mutable. */
   gboolean       cm_mutable     = FALSE; /* At least 1 selected layers' composite mode is mutable.  */
@@ -792,6 +790,8 @@ layers_actions_update (GimpActionGroup *group,
   gboolean       have_writable  = FALSE; /* At least 1 selected layer has no contents lock.   */
   gboolean       have_prev      = FALSE; /* At least 1 selected layer has a previous sibling. */
   gboolean       have_next      = FALSE; /* At least 1 selected layer has a next sibling.     */
+  gboolean       have_alpha     = FALSE; /* At least 1 selected layer has an alpha channel.   */
+  gboolean       have_no_alpha  = FALSE; /* At least 1 selected layer has no alpha channel.   */
 
   gboolean       all_visible        = TRUE;
   gboolean       all_next_visible   = TRUE;
@@ -918,6 +918,11 @@ layers_actions_update (GimpActionGroup *group,
           if (! gimp_item_get_visible (iter->data))
             all_visible = FALSE;
 
+          if (gimp_drawable_has_alpha (iter->data))
+            have_alpha    = TRUE;
+          else
+            have_no_alpha = TRUE;
+
           if (have_masks && have_no_masks            &&
               have_groups && have_no_groups          &&
               have_writable && ! all_writable        &&
@@ -928,7 +933,8 @@ layers_actions_update (GimpActionGroup *group,
               ! prev_mode && ! next_mode             &&
               have_prev && have_next                 &&
               bs_mutable && cs_mutable && cm_mutable &&
-              ! all_visible && ! all_next_visible)
+              ! all_visible && ! all_next_visible    &&
+              have_alpha && have_no_alpha)
             break;
         }
 
@@ -985,13 +991,9 @@ layers_actions_update (GimpActionGroup *group,
           gimp_action_group_set_action_active (group, action, TRUE);
 
           mask           = gimp_layer_get_mask (layer);
-          alpha          = gimp_drawable_has_alpha (GIMP_DRAWABLE (layer));
           writable       = ! gimp_item_is_content_locked (GIMP_ITEM (layer));
           movable        = ! gimp_item_is_position_locked (GIMP_ITEM (layer));
 
-          if (gimp_viewable_get_children (GIMP_VIEWABLE (layer)))
-            children = TRUE;
-
           text_layer = gimp_item_is_text_layer (GIMP_ITEM (layer));
         }
     }
@@ -1064,8 +1066,8 @@ layers_actions_update (GimpActionGroup *group,
   SET_SENSITIVE ("layers-crop-to-selection", all_writable && all_movable && sel);
   SET_SENSITIVE ("layers-crop-to-content",   all_writable && all_movable);
 
-  SET_SENSITIVE ("layers-alpha-add",    writable && !children && !fs && !alpha);
-  SET_SENSITIVE ("layers-alpha-remove", writable && !children && !fs &&  alpha);
+  SET_SENSITIVE ("layers-alpha-add",    all_writable && have_no_groups && !fs && have_no_alpha);
+  SET_SENSITIVE ("layers-alpha-remove", all_writable && have_no_groups && !fs && have_alpha);
 
   SET_SENSITIVE ("layers-lock-alpha", can_lock_alpha);
   SET_ACTIVE    ("layers-lock-alpha", lock_alpha);
diff --git a/app/actions/layers-commands.c b/app/actions/layers-commands.c
index 831c67d45b..926e85447c 100644
--- a/app/actions/layers-commands.c
+++ b/app/actions/layers-commands.c
@@ -1651,14 +1651,19 @@ layers_alpha_add_cmd_callback (GimpAction *action,
                                gpointer    data)
 {
   GimpImage *image;
-  GimpLayer *layer;
-  return_if_no_layer (image, layer, data);
+  GList     *layers;
+  GList     *iter;
+  return_if_no_layers (image, layers, data);
 
-  if (! gimp_drawable_has_alpha (GIMP_DRAWABLE (layer)))
-    {
-      gimp_layer_add_alpha (layer);
-      gimp_image_flush (image);
-    }
+  gimp_image_undo_group_start (image, GIMP_UNDO_GROUP_LAYER_ADD_ALPHA,
+                               _("Add Alpha Channel"));
+
+  for (iter = layers; iter; iter = iter->next)
+    if (! gimp_drawable_has_alpha (iter->data))
+      gimp_layer_add_alpha (iter->data);
+
+  gimp_image_undo_group_end (image);
+  gimp_image_flush (image);
 }
 
 void
@@ -1667,14 +1672,19 @@ layers_alpha_remove_cmd_callback (GimpAction *action,
                                   gpointer    data)
 {
   GimpImage *image;
-  GimpLayer *layer;
-  return_if_no_layer (image, layer, data);
+  GList     *layers;
+  GList     *iter;
+  return_if_no_layers (image, layers, data);
 
-  if (gimp_drawable_has_alpha (GIMP_DRAWABLE (layer)))
-    {
-      gimp_layer_remove_alpha (layer, action_data_get_context (data));
-      gimp_image_flush (image);
-    }
+  gimp_image_undo_group_start (image, GIMP_UNDO_GROUP_LAYER_ADD_ALPHA,
+                               _("Remove Alpha Channel"));
+
+  for (iter = layers; iter; iter = iter->next)
+    if (gimp_drawable_has_alpha (iter->data))
+      gimp_layer_remove_alpha (iter->data, action_data_get_context (data));
+
+  gimp_image_undo_group_end (image);
+  gimp_image_flush (image);
 }
 
 void
diff --git a/app/core/core-enums.h b/app/core/core-enums.h
index 01226bd5d9..2b988c1ed7 100644
--- a/app/core/core-enums.h
+++ b/app/core/core-enums.h
@@ -526,8 +526,10 @@ typedef enum /*< pdb-skip >*/
   GIMP_UNDO_GROUP_ITEM_SCALE,            /*< desc="Scale item"                     >*/
   GIMP_UNDO_GROUP_ITEM_RESIZE,           /*< desc="Resize item"                    >*/
   GIMP_UNDO_GROUP_LAYER_ADD,             /*< desc="Add layer"                      >*/
+  GIMP_UNDO_GROUP_LAYER_ADD_ALPHA,       /*< desc="Add alpha channel"              >*/
   GIMP_UNDO_GROUP_LAYER_ADD_MASK,        /*< desc="Add layer mask"                 >*/
   GIMP_UNDO_GROUP_LAYER_APPLY_MASK,      /*< desc="Apply layer mask"               >*/
+  GIMP_UNDO_GROUP_LAYER_REMOVE_ALPHA,    /*< desc="Remove alpha channel"           >*/
   GIMP_UNDO_GROUP_LAYER_LOCK_ALPHA,      /*< desc="Lock/Unlock alpha channels"     >*/
   GIMP_UNDO_GROUP_LAYER_OPACITY,         /*< desc="Set layers opacity"             >*/
   GIMP_UNDO_GROUP_LAYER_MODE,            /*< desc="Set layers mode"                >*/


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]