132 lines
4.5 KiB
Python
132 lines
4.5 KiB
Python
import bpy
|
|
import bpy.utils.previews
|
|
from .functions import (
|
|
recurLayerCollection,
|
|
preview_collections,
|
|
createPreviewCollection,
|
|
get_preview_default,
|
|
)
|
|
|
|
from .menus import BONEWIDGET_MT_bw_specials
|
|
|
|
|
|
class BONEWIDGET_PT_bw_panel:
|
|
"""BoneWidget Addon UI"""
|
|
bl_space_type = 'VIEW_3D'
|
|
bl_region_type = 'UI'
|
|
bl_category = "Rigging"
|
|
bl_label = "Bone Widget"
|
|
|
|
class BONEWIDGET_PT_bw_panel_main(BONEWIDGET_PT_bw_panel, bpy.types.Panel):
|
|
bl_idname = 'BONEWIDGET_PT_bw_panel_main'
|
|
bl_label = "Bone Widget"
|
|
|
|
|
|
createPreviewCollection()
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
|
|
# preview toggle checkbox
|
|
row = layout.row(align=True)
|
|
row.prop(context.window_manager, "toggle_preview")
|
|
|
|
# preview view
|
|
if context.window_manager.toggle_preview:
|
|
row = layout.row(align=True)
|
|
preview_panel_size = context.preferences.addons[__package__].preferences.preview_panel_size
|
|
preview_popup_size = context.preferences.addons[__package__].preferences.preview_popup_size
|
|
row.template_icon_view(context.window_manager, "widget_list", show_labels=True,
|
|
scale=preview_panel_size, scale_popup=preview_popup_size)
|
|
|
|
# dropdown list
|
|
row = layout.row(align=True)
|
|
row.prop(context.window_manager, "widget_list", expand=False, text="")
|
|
|
|
row = layout.row(align=True)
|
|
row.menu("BONEWIDGET_MT_bw_specials", icon='DOWNARROW_HLT', text="")
|
|
row.operator("bonewidget.create_widget", icon="OBJECT_DATAMODE")
|
|
|
|
if bpy.context.mode == "POSE":
|
|
row.operator("bonewidget.edit_widget", icon="OUTLINER_DATA_MESH")
|
|
else:
|
|
row.operator("bonewidget.return_to_armature", icon="LOOP_BACK", text='To bone')
|
|
|
|
layout = self.layout
|
|
layout.separator()
|
|
layout.operator("bonewidget.symmetrize_shape", icon='MOD_MIRROR', text="Symmetrize Shape")
|
|
layout.operator("bonewidget.match_bone_transforms",
|
|
icon='GROUP_BONE', text="Match Bone Transforms")
|
|
layout.operator("bonewidget.resync_widget_names",
|
|
icon='FILE_REFRESH', text="Resync Widget Names")
|
|
layout.separator()
|
|
layout.operator("bonewidget.clear_widgets",
|
|
icon='X', text="Clear Bone Widget")
|
|
layout.operator("bonewidget.delete_unused_widgets",
|
|
icon='TRASH', text="Delete Unused Widgets")
|
|
|
|
if bpy.context.mode == 'POSE':
|
|
layout.operator("bonewidget.add_as_widget",
|
|
text="Use Selected Object",
|
|
icon='RESTRICT_SELECT_OFF')
|
|
|
|
# if the bw collection exists, show the visibility toggle
|
|
if not context.preferences.addons[__package__].preferences.use_rigify_defaults: #rigify
|
|
bw_collection_name = context.preferences.addons[__package__].preferences.bonewidget_collection_name
|
|
|
|
elif context.active_object: # active object
|
|
bw_collection_name = 'WGTS_' + context.active_object.name
|
|
|
|
else: # this is needed because sometimes there is no active object
|
|
bw_collection_name = None
|
|
|
|
bw_collection = recurLayerCollection(bpy.context.view_layer.layer_collection, bw_collection_name)
|
|
|
|
if bw_collection is not None:
|
|
if bw_collection.hide_viewport:
|
|
icon = "HIDE_ON"
|
|
text = "Show Collection"
|
|
else:
|
|
icon = "HIDE_OFF"
|
|
text = "Hide Collection"
|
|
row = layout.row()
|
|
row.separator()
|
|
row = layout.row()
|
|
row.operator("bonewidget.toggle_collection_visibilty",
|
|
icon=icon, text=text)
|
|
|
|
classes = (
|
|
BONEWIDGET_PT_bw_panel_main,
|
|
)
|
|
|
|
|
|
def register():
|
|
bpy.types.WindowManager.toggle_preview = bpy.props.BoolProperty(
|
|
name="Preview Panel",
|
|
default=get_preview_default(),
|
|
description="Show thumbnail previews"
|
|
)
|
|
|
|
from bpy.utils import register_class
|
|
for cls in classes:
|
|
try:
|
|
register_class(cls)
|
|
except:
|
|
pass
|
|
|
|
|
|
def unregister():
|
|
del bpy.types.WindowManager.widget_list
|
|
del bpy.types.WindowManager.toggle_preview
|
|
|
|
for pcoll in preview_collections.values():
|
|
bpy.utils.previews.remove(pcoll)
|
|
preview_collections.clear()
|
|
|
|
from bpy.utils import unregister_class
|
|
for cls in classes:
|
|
try:
|
|
unregister_class(cls)
|
|
except:
|
|
pass
|