11-15-2024, 04:46 AM 
(This post was last modified: 11-17-2024, 08:27 AM by Ofnuts.
 Edit Reason: modified parenting code. if same parent then layers nest inside that and not the main stack.
)
	
	
	
		Plug-in: group-selected-layers
Description: nests all currently selected layers inside a new group layer.
Tested and working on version 2.99.19 - commit fe6e1d7
Any feedback welcome
Edit: a better version of the script is posted later on in this thread
	
	
	
Description: nests all currently selected layers inside a new group layer.
Tested and working on version 2.99.19 - commit fe6e1d7
Any feedback welcome

Code:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
#  SAMPLE PLUG-IN USED AS REFERENCE/TEMPLATE: test-file-plug-ins.py 2021-2024 Jacob Boerema
# 
# Tested and working on version 2.99.19 - commit fe6e1d7
# 
# Script path: 
# ~/.config/GIMP/2.99/plug-ins/group_selected_layers/group_selected_layers.py
import sys
import gi
gi.require_version('Gimp', '3.0')
from gi.repository import Gimp
from gi.repository import GLib
VERSION = "0.2"
AUTHORS = "newinput"
COPYRIGHT = "newinput"
YEARS   = "2023-2024"
class GroupSelectedLayers (Gimp.PlugIn):
   def __init__(self):
       Gimp.PlugIn.__init__(self)
       self.test_cfg = None
       self.log = None
   ## GimpPlugIn virtual methods ##
   def do_set_i18n(self, _name):
       # We don't support internationalization here...
       return False
   def do_query_procedures(self):
       return [ 'group-selected-layers' ]
   def do_create_procedure(self, name):
       if name == 'group-selected-layers':
           procedure = Gimp.ImageProcedure.new(self, name,
                                               Gimp.PDBProcType.PLUGIN,
                                               self.group_selected_layers, None)
           procedure.set_image_types("*")
           procedure.set_sensitivity_mask(Gimp.ProcedureSensitivityMask.ALWAYS)
           procedure.set_menu_label('group-selected-layers-label')
           procedure.add_menu_path('<Image>/Filters/Development/Python-Fu/')
           procedure.set_documentation('Run group-selected-layers',
                                       'Run group-selected-layers',
                                       name)
       else:
           return None
       procedure.set_attribution(AUTHORS, COPYRIGHT, YEARS)
       return procedure
   def group_selected_layers(self, procedure, run_mode, image,
                        n_drawables, config, run_data):
       # => create new group
       new_group = Gimp.GroupLayer.new(image, "my-new-group")
       # => record currently selected layers
       #
       #    (is needed since inserting a new layer replaces the current selection with just the newly inserted layer)
       #  
       selected_layers = image.get_selected_layers()
       parents = []
       for layer in selected_layers:
           parent = layer.get_parent()
           if parent not in parents:
               parents.append(parent)
       # if same parents
       #     if all selected layers are under the same parent layer, nest the new group layer inside of it
       if len(parents) == 1:                
           new_group_parent = parents[0]
           topmost_position = min([image.get_item_position(layer) for layer in selected_layers])
       # if different parents
       #     if selected layers are nested under different parent layers, insert group layer in the main stack, unnested
       elif len(parents) > 1:               
           new_group_parent = None
           topmost_position = 0
       # if no parents found (should not happen)
       #     use main stack as default here to try and not break anything. should not be able to reach this point ever though. 
       else:
           new_group_parent = None
           topmost_position = 0
           print("ERROR: could not get any parents from selected layers")
       # => insert new group into image
       image.insert_layer(
               new_group,           # group to insert
               new_group_parent,    # parent nest group inside of. None = unnested
               topmost_position     # index/stack-postition within parent (0 = insert as topmost layer within parent)
       )
       for selected_layer in selected_layers:
           image.reorder_item(
                   selected_layer,  # layer to reorder
                   new_group,       # parent to nest inside
                   -1               # index/stack-postition within parent (-1 = insert as bottommost layer within parent)
           )
       return procedure.new_return_values(Gimp.PDBStatusType.SUCCESS, GLib.Error())
Gimp.main(GroupSelectedLayers.__gtype__, sys.argv)Edit: a better version of the script is posted later on in this thread

 

 


