rig_picker/ui.py
2025-12-05 10:05:33 +01:00

199 lines
6.6 KiB
Python

import bpy
from bpy.types import UIList
# import collections
# import inspect
from .core.addon_utils import get_operator_from_id, get_picker_collection
from .core.bl_utils import get_mat
import re
# class RP_UL_picker_source(UIList):
# def draw_item(self, context, layout, data, item, _icon, _active_data, _active_propname, _index):
# ob = context.object
# row = layout.row(align=True)
# is_packed = ('picker' in ob.data.rig_picker.keys())
# sub_row = row.row(align=True)
# sub_row.prop(item, 'source', text='')
# sub_row.enabled = not is_packed
# #row.operator('rigpicker.pack_picker', icon='PACKAGE' if is_packed else 'UGLYPACKAGE', text='')
class RP_PT_picker_maker_panel(bpy.types.Panel):
bl_label = "Rig Picker"
bl_category = "Rigging"
bl_space_type = "VIEW_3D"
bl_region_type = "UI"
@classmethod
def poll(cls, context):
return context.object
def draw_header_preset(self, context):
self.layout.operator(
"rigpicker.add_picker_collection", text="", icon="ADD", emboss=False
)
def draw(self, context):
ob = context.object
scn = context.scene
collection = get_picker_collection(ob)
layout = self.layout
col = layout.column(align=False)
if collection:
col.prop_search(collection.rig_picker, "rig", scn, "objects", text="Rig ")
col.prop_search(
collection.rig_picker, "canvas", scn, "objects", text="Canvas "
)
col.prop_search(
collection.rig_picker, "symmetry", scn, "objects", text="Symmetry "
)
if ob.type == "ARMATURE":
box = col.box()
box.enabled = not ob.data.library
col = box.column(align=False)
row = col.row(align=True)
row.separator(factor=0.5)
row.label(text="Sources")
is_packed = "pickers" in ob.data.rig_picker.keys()
row.operator(
"rigpicker.pack_picker",
icon="PACKAGE" if is_packed else "UGLYPACKAGE",
text="",
emboss=False,
)
row.operator(
"rigpicker.add_picker_source", icon="ADD", text="", emboss=False
)
for i, item in enumerate(ob.data.rig_picker.sources):
row = col.row(align=True)
row.enabled = not is_packed
row.prop(item, "source", text="")
row.operator(
"rigpicker.remove_picker_source",
icon="PANEL_CLOSE",
text="",
emboss=False,
).index = i
if collection:
# layout.separator()
layout.prop(collection.rig_picker, "destination", text="Filepath")
layout.operator(
"rigpicker.save_picker", icon="PASTEDOWN", text="Save Picker"
)
class RP_PT_shape(bpy.types.Panel):
bl_label = "Shape"
bl_category = "Rigging"
bl_space_type = "VIEW_3D"
bl_region_type = "UI"
bl_parent_id = "RP_PT_picker_maker_panel"
def draw(self, context):
ob = context.object
scn = context.scene
collection = get_picker_collection(ob)
layout = self.layout
col = layout.column(align=False)
if collection:
# if context.collection and context.collection.rig_picker.enabled:
col = layout.column(align=True)
row = col.row(align=True)
row.operator(
"rigpicker.create_shape", icon="MESH_DATA", text="Create Shape"
)
row.operator(
"rigpicker.mirror_shape", icon="MOD_MIRROR", text="Mirror Shape"
)
col.prop(
scn.rig_picker,
"use_pick_bone",
icon="EYEDROPPER",
text="Auto Bone Assign",
)
col.operator(
"rigpicker.name_from_bone", icon="SORTALPHA", text="Name From Bones"
)
else:
col = layout.column(align=True)
row = col.row(align=True)
row.operator(
"rigpicker.create_shape", icon="MESH_DATA", text="Create Shape"
)
if ob.type != "ARMATURE":
box = layout.box()
col = box.column(align=False)
material_row = col.row(align=True)
material_row.operator("rigpicker.remove_mat", icon="REMOVE", text="")
material_row.operator("rigpicker.add_mat", icon="ADD", text="")
mat = False
if ob.type in ("MESH", "CURVE", "FONT") and ob.data.materials:
mat = get_mat(ob)
if mat and mat.node_tree:
emission_nodes = [
n for n in mat.node_tree.nodes if n.type == "EMISSION"
]
if emission_nodes:
material_row.prop(
emission_nodes[0].inputs[0], "default_value", text=""
)
mat = True
if not mat:
material_row.label(text="No Material")
material_row.operator(
"rigpicker.eyedropper_mat", icon="EYEDROPPER", text=""
)
shape_type_row = col.row(align=True)
shape_type_row.prop(ob.rig_picker, "shape_type", expand=True)
shape_type_row.operator(
"rigpicker.select_shape_type", text="", icon="RESTRICT_SELECT_OFF"
)
if ob.rig_picker.shape_type == "OPERATOR":
op_row = col.row(align=True)
op_row.prop(ob.rig_picker, "operator", text="")
op_row.operator(
"rigpicker.operator_selector", text="", icon="COLLAPSEMENU"
)
if ob.rig_picker.operator:
col.prop(ob.rig_picker, "name", text="Tooltip")
col.prop(ob.rig_picker, "shortcut", text="Shortcut")
else:
col.prop(ob.rig_picker, "name", text="Tooltip")
elif ob.rig_picker.shape_type == "BONE":
if collection and collection.rig_picker.rig:
col.prop_search(
ob.rig_picker,
"name",
collection.rig_picker.rig.pose,
"bones",
text="Bone",
)
classes = (
# RP_UL_picker_source,
RP_PT_picker_maker_panel,
RP_PT_shape,
)
register, unregister = bpy.utils.register_classes_factory(classes)