From 670bf72cb6978ff2f26a23bf2b5bb83b6e631e10 Mon Sep 17 00:00:00 2001
From: Nathan Vegdahl <cessen@cessen.com>
Date: Sun, 19 Jun 2011 19:53:01 +0000
Subject: [PATCH] Rig layers can now be organized into rows by the user, for
 nicer layout.

---
 rigify/__init__.py        | 38 ++++++-------------------------------
 rigify/generate.py        | 16 +++++++++-------
 rigify/metarigs/human.py  | 40 ++++++++++++++++++++++++++-------------
 rigify/rig_ui_template.py | 39 ++++++++++++++++++++++++++++----------
 rigify/ui.py              | 16 ++++++++--------
 5 files changed, 79 insertions(+), 70 deletions(-)

diff --git a/rigify/__init__.py b/rigify/__init__.py
index fe9511cf2..cbd93abd5 100644
--- a/rigify/__init__.py
+++ b/rigify/__init__.py
@@ -115,35 +115,9 @@ class RigifyParameters(bpy.types.PropertyGroup):
     name = bpy.props.StringProperty()
 
 
-class RigifyArmatureProps(bpy.types.PropertyGroup):
-    layer_name_01 = bpy.props.StringProperty(name="Layer 1 Name", default="1")
-    layer_name_02 = bpy.props.StringProperty(name="Layer 2 Name", default="2")
-    layer_name_03 = bpy.props.StringProperty(name="Layer 3 Name", default="3")
-    layer_name_04 = bpy.props.StringProperty(name="Layer 4 Name", default="4")
-    layer_name_05 = bpy.props.StringProperty(name="Layer 5 Name", default="5")
-    layer_name_06 = bpy.props.StringProperty(name="Layer 6 Name", default="6")
-    layer_name_07 = bpy.props.StringProperty(name="Layer 7 Name", default="7")
-    layer_name_08 = bpy.props.StringProperty(name="Layer 8 Name", default="8")
-    layer_name_09 = bpy.props.StringProperty(name="Layer 9 Name", default="9")
-    layer_name_10 = bpy.props.StringProperty(name="Layer 10 Name", default="10")
-    layer_name_11 = bpy.props.StringProperty(name="Layer 11 Name", default="11")
-    layer_name_12 = bpy.props.StringProperty(name="Layer 12 Name", default="12")
-    layer_name_13 = bpy.props.StringProperty(name="Layer 13 Name", default="13")
-    layer_name_14 = bpy.props.StringProperty(name="Layer 14 Name", default="14")
-    layer_name_15 = bpy.props.StringProperty(name="Layer 15 Name", default="15")
-    layer_name_16 = bpy.props.StringProperty(name="Layer 16 Name", default="16")
-    layer_name_17 = bpy.props.StringProperty(name="Layer 17 Name", default="17")
-    layer_name_18 = bpy.props.StringProperty(name="Layer 18 Name", default="18")
-    layer_name_19 = bpy.props.StringProperty(name="Layer 19 Name", default="19")
-    layer_name_20 = bpy.props.StringProperty(name="Layer 20 Name", default="20")
-    layer_name_21 = bpy.props.StringProperty(name="Layer 21 Name", default="21")
-    layer_name_22 = bpy.props.StringProperty(name="Layer 22 Name", default="22")
-    layer_name_23 = bpy.props.StringProperty(name="Layer 23 Name", default="23")
-    layer_name_24 = bpy.props.StringProperty(name="Layer 24 Name", default="24")
-    layer_name_25 = bpy.props.StringProperty(name="Layer 25 Name", default="25")
-    layer_name_26 = bpy.props.StringProperty(name="Layer 26 Name", default="26")
-    layer_name_27 = bpy.props.StringProperty(name="Layer 27 Name", default="27")
-    layer_name_28 = bpy.props.StringProperty(name="Layer 28 Name", default="28")
+class RigifyArmatureLayer(bpy.types.PropertyGroup):
+    name = bpy.props.StringProperty(name="Layer Name", default=" ")
+    row = bpy.props.IntProperty(name="Layer Row", default=1, min=1, max=32)
 
 
 ##### REGISTER #####
@@ -154,12 +128,12 @@ def register():
 
     bpy.utils.register_class(RigifyName)
     bpy.utils.register_class(RigifyParameters)
-    bpy.utils.register_class(RigifyArmatureProps)
+    bpy.utils.register_class(RigifyArmatureLayer)
 
     bpy.types.PoseBone.rigify_type = bpy.props.StringProperty(name="Rigify Type", description="Rig type for this bone.")
     bpy.types.PoseBone.rigify_parameters = bpy.props.CollectionProperty(type=RigifyParameters)
 
-    bpy.types.Armature.rigify_props = bpy.props.CollectionProperty(type=RigifyArmatureProps)
+    bpy.types.Armature.rigify_layers = bpy.props.CollectionProperty(type=RigifyArmatureLayer)
 
     IDStore = bpy.types.WindowManager
     IDStore.rigify_collection = bpy.props.EnumProperty(items=col_enum_list, default="All", name="Rigify Active Collection", description="The selected rig collection")
@@ -187,7 +161,7 @@ def unregister():
 
     bpy.utils.unregister_class(RigifyName)
     bpy.utils.unregister_class(RigifyParameters)
-    bpy.utils.unregister_class(RigifyArmatureProps)
+    bpy.utils.unregister_class(RigifyArmatureLayer)
 
     metarig_menu.unregister()
     ui.unregister()
diff --git a/rigify/generate.py b/rigify/generate.py
index 3de8fe233..96a6d68d6 100644
--- a/rigify/generate.py
+++ b/rigify/generate.py
@@ -282,12 +282,14 @@ def generate_rig(context, metarig):
         vis_layers[i] = vis_layers[i] and not (ORG_LAYER[i] or MCH_LAYER[i] or DEF_LAYER[i])
     obj.data.layers = vis_layers
 
-    # Create list of layer names
-    if len(metarig.data.rigify_props) < 1:
-        metarig.data.rigify_props.add()
-    layer_names = []
-    for i in range(28):
-        layer_names += [getattr(metarig.data.rigify_props[0], "layer_name_%s" % str(i+1).rjust(2, "0"))]
+    # Ensure the collection of layer names exists
+    for i in range(1 + len(metarig.data.rigify_layers), 29):
+        layer = metarig.data.rigify_layers.add()
+
+    # Create list of layer name/row pairs
+    layer_layout = []
+    for l in metarig.data.rigify_layers:
+        layer_layout += [(l.name, l.row)]
 
     # Generate the UI script
     if "rig_ui.py" in bpy.data.texts:
@@ -298,7 +300,7 @@ def generate_rig(context, metarig):
     script.write(UI_SLIDERS % rig_id)
     for s in ui_scripts:
         script.write("\n        " + s.replace("\n", "\n        ") + "\n")
-    script.write(layers_ui(vis_layers, layer_names))
+    script.write(layers_ui(vis_layers, layer_layout))
     script.write(UI_REGISTER)
     script.use_module = True
 
diff --git a/rigify/metarigs/human.py b/rigify/metarigs/human.py
index d0744066c..cfc9f0380 100644
--- a/rigify/metarigs/human.py
+++ b/rigify/metarigs/human.py
@@ -24,19 +24,33 @@ def create(obj):
     bpy.ops.object.mode_set(mode='EDIT')
     arm = obj.data
 
-    props = arm.rigify_props.add()
-    props.layer_name_01 = "Torso"
-    props.layer_name_03 = "Head"
-    props.layer_name_05 = "Fingers"
-    props.layer_name_06 = "Fingers (tweak)"
-    props.layer_name_07 = "Arm.L (FK)"
-    props.layer_name_08 = "Arm.L (IK)"
-    props.layer_name_09 = "Arm.R (FK)"
-    props.layer_name_10 = "Arm.R (IK)"
-    props.layer_name_11 = "Leg.L (FK)"
-    props.layer_name_12 = "Leg.L (IK)"
-    props.layer_name_13 = "Leg.R (FK)"
-    props.layer_name_14 = "Leg.R (IK)"
+    for i in range(28):
+        arm.rigify_layers.add()
+
+    arm.rigify_layers[0].name = "Torso"
+    arm.rigify_layers[0].row = 2
+    arm.rigify_layers[2].name = "Head"
+    arm.rigify_layers[2].row = 1
+    arm.rigify_layers[4].name = "Fingers"
+    arm.rigify_layers[4].row = 3
+    arm.rigify_layers[5].name = "(Tweak)"
+    arm.rigify_layers[5].row = 3
+    arm.rigify_layers[6].name = "Arm.L (FK)"
+    arm.rigify_layers[6].row = 4
+    arm.rigify_layers[7].name = "Arm.L (IK)"
+    arm.rigify_layers[7].row = 5
+    arm.rigify_layers[8].name = "Arm.R (FK)"
+    arm.rigify_layers[8].row = 4
+    arm.rigify_layers[9].name = "Arm.R (IK)"
+    arm.rigify_layers[9].row = 5
+    arm.rigify_layers[10].name = "Leg.L (FK)"
+    arm.rigify_layers[10].row = 6
+    arm.rigify_layers[11].name = "Leg.L (IK)"
+    arm.rigify_layers[11].row = 7
+    arm.rigify_layers[12].name = "Leg.R (FK)"
+    arm.rigify_layers[12].row = 6
+    arm.rigify_layers[13].name = "Leg.R (IK)"
+    arm.rigify_layers[13].row = 7
 
     bones = {}
 
diff --git a/rigify/rig_ui_template.py b/rigify/rig_ui_template.py
index 35df1ec2a..a54ab1757 100644
--- a/rigify/rig_ui_template.py
+++ b/rigify/rig_ui_template.py
@@ -493,7 +493,7 @@ class RigUI(bpy.types.Panel):
 '''
 
 
-def layers_ui(layers, names):
+def layers_ui(layers, layout):
     """ Turn a list of booleans + a list of names into a layer UI.
     """
 
@@ -515,15 +515,34 @@ class RigLayers(bpy.types.Panel):
         layout = self.layout
         col = layout.column()
 '''
-    i = 0
-    for layer in layers:
-        if layer:
-            code += "\n        row = col.row()\n"
-            if i == 28:
-                code += "        row.prop(context.active_object.data, 'layers', index=%s, toggle=True, text='Root')\n" % (str(i))
-            else:
-                code += "        row.prop(context.active_object.data, 'layers', index=%s, toggle=True, text='%s')\n" % (str(i), names[i])
-        i += 1
+    rows = {}
+    for i in range(28):
+        if layers[i]:
+            if layout[i][1] not in rows:
+                rows[layout[i][1]] = []
+            rows[layout[i][1]] += [(layout[i][0], i)]
+
+    keys = list(rows.keys())
+    keys.sort()
+
+    for key in keys:
+        code += "\n        row = col.row()\n"
+        i = 0
+        for l in rows[key]:
+            if i > 3:
+                code += "\n        row = col.row()\n"
+                i = 0
+            code += "        row.prop(context.active_object.data, 'layers', index=%s, toggle=True, text='%s')\n" % (str(l[1]), l[0])
+            i += 1
+
+    # Root layer
+    code += "\n        row = col.row()"
+    code += "\n        row.separator()"
+    code += "\n        row = col.row()"
+    code += "\n        row.separator()\n"
+    code += "\n        row = col.row()\n"
+    code += "        row.prop(context.active_object.data, 'layers', index=28, toggle=True, text='Root')\n"
+
 
     return code
 
diff --git a/rigify/ui.py b/rigify/ui.py
index eafa96796..3a2e89e3d 100644
--- a/rigify/ui.py
+++ b/rigify/ui.py
@@ -92,10 +92,6 @@ class DATA_PT_rigify_layer_names(bpy.types.Panel):
     def poll(cls, context):
         if not context.armature:
             return False
-        #obj = context.object
-        #if obj:
-        #    return (obj.mode in ('POSE', 'OBJECT', 'EDIT'))
-        #return False
         return True
 
     def draw(self, context):
@@ -103,9 +99,11 @@ class DATA_PT_rigify_layer_names(bpy.types.Panel):
         layout = self.layout
         obj = context.object
 
-        if len(obj.data.rigify_props) < 1:
-            obj.data.rigify_props.add()
+        # Ensure that the layers exist
+        for i in range(1 + len(obj.data.rigify_layers), 29):
+            layer = obj.data.rigify_layers.add()
 
+        # UI
         for i in range(28):
             if (i % 16) == 0:
                 col = layout.column()
@@ -117,8 +115,10 @@ class DATA_PT_rigify_layer_names(bpy.types.Panel):
                 col = layout.column(align=True)
             row = col.row()
             row.prop(obj.data, "layers", index=i, text="", toggle=True)
-            row.prop(obj.data.rigify_props[0], "layer_name_%s" % str(i+1).rjust(2, "0"), text="Layer %d" % (i + 1))
-
+            split = row.split(percentage=0.8)
+            split.prop(obj.data.rigify_layers[i], "name", text="Layer %d" % (i + 1))
+            split.prop(obj.data.rigify_layers[i], "row", text="")
+            #split.prop(obj.data.rigify_layers[i], "column", text="")
 
 
 class BONE_PT_rigify_buttons(bpy.types.Panel):
-- 
GitLab