bone_widget/ui.py

326 lines
10 KiB
Python
Raw Normal View History

2022-10-28 23:23:06 +02:00
import bpy
from bpy.types import Menu, Panel, UIList
from bpy.props import EnumProperty, StringProperty
from bone_widget import ctx
from pathlib import Path
def add_row(layout, prop, data=None, name='', icon=None, operator=None, properties={}):
data = data or ctx.prefs
split = layout.split(factor=0.33, align=True)
split.alignment= 'RIGHT'
split.label(text=name+':' if name else '')
row = split.row(align=True)
row.prop(data, prop, text='')
if icon and not operator:
row.label(icon=icon)
row.separator()
if operator:
op = row.operator(operator, icon=icon, text='', emboss=False)
for k, v in properties.items():
setattr(op, k, v)
else:
row.label(icon='BLANK1')
def add_bool_row(layout, prop, data=None, name='', icon=None):
data = data or ctx.prefs
row = layout.row(align=True)
row.label(icon=icon)
row.prop(data, prop, text=name)
'''
def add_color_row(layout, data=None, name='', index=0):
data = data or ctx.prefs.colors
#split = layout.split(factor=0.25, align=True)
#split.alignment= 'RIGHT'
#split.label(text=name+':' if name else '')
split = layout.split(factor=0.66, align=True)
row = split.row(align=True)
row.prop(data, 'name', text='')
row = split.row(align=True)
row.prop(data, 'value', text='')
row.separator()
#row = split.row(align=True)
row.operator('bonewidget.remove_color', icon='REMOVE', text='', emboss=False).index = index
'''
def draw_prefs(layout):
2023-01-18 16:02:42 +01:00
box = layout.box()
col = box.column(align=False)
2022-10-28 23:23:06 +02:00
2023-01-18 16:02:42 +01:00
add_row(col, 'category', name='Tab', icon='COPY_ID')
add_row(col, 'collection', name='Collection', icon='OUTLINER_COLLECTION')
2023-01-22 00:35:21 +01:00
add_row(col, 'use_custom_collection', name='Custom Collection', icon='OUTLINER_COLLECTION')
2023-01-18 16:02:42 +01:00
add_row(col, 'prefix', name='Prefix', icon='SYNTAX_OFF')
col.separator()
2022-10-28 23:23:06 +02:00
2023-01-18 16:02:42 +01:00
add_row(col, 'path', data=ctx.prefs.default_folder, name='Folders',
2022-10-28 23:23:06 +02:00
icon='ADD', operator='bonewidget.add_folder')
for i, f in enumerate(ctx.prefs.folders):
2023-01-18 16:02:42 +01:00
add_row(col, 'path', icon='REMOVE',
2022-10-28 23:23:06 +02:00
operator='bonewidget.remove_folder', data=f, properties={'index': i})
2023-01-18 16:02:42 +01:00
col.separator()
2022-10-28 23:23:06 +02:00
2023-01-18 16:02:42 +01:00
split = col.split(factor=0.33, align=True)
2022-10-28 23:23:06 +02:00
split.alignment= 'RIGHT'
split.label(text='Auto:')
col = split.column(align=True)
2023-01-24 22:54:40 +01:00
add_bool_row(col, 'auto_symmetrize', name='Symmetrize', icon='MOD_MIRROR')
add_bool_row(col, 'auto_separate', name='Separate', icon='UNLINKED')
2022-10-28 23:23:06 +02:00
#col = row.column(align=True)
2023-01-24 22:54:40 +01:00
add_bool_row(col, 'auto_match_transform', name='Match Transform', icon='TRANSFORM_ORIGINS')
add_bool_row(col, 'auto_rename', name='Rename', icon='SYNTAX_OFF')
2022-10-28 23:23:06 +02:00
2023-01-18 16:02:42 +01:00
#bpy.ops.wm.save_userpref()
prefs_unsaved = bpy.context.preferences.is_dirty
layout.operator('wm.save_userpref', text="Save Preferences" + (" *" if prefs_unsaved else ""))
2022-10-28 23:23:06 +02:00
#col.prop(ctx.prefs, 'symmetrize', text='Symetrize', icon='MOD_MIRROR')
#col.prop(ctx.prefs, 'separate', text='Separate', icon='UNLINKED')
#col.prop(ctx.prefs, 'match_transform', text='Match Transform', icon='TRANSFORM_ORIGINS')
#col.prop(ctx.prefs, 'rename', text='Rename', icon='SYNTAX_OFF')
'''
layout.separator()
split = layout.split(factor=0.33, align=True)
split.alignment= 'RIGHT'
split.label(text='Bone Colors:')
#split.prop(ctx.prefs, 'use_custom_colors')
col = split.column(align=True)
row = col.row(align=True)
row.prop(ctx.prefs, 'select_color', text='')
row.prop(ctx.prefs, 'active_color', text='')
row.separator()
row.operator("bonewidget.add_color", icon='ADD', text='', emboss=False)
#if ctx.prefs.use_custom_colors:
col.separator()
for i, c in enumerate(ctx.prefs.colors):
add_color_row(col, data=c, index=i)
'''
class BW_UL_widget(UIList):
def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index, flt_flag):
2023-01-18 16:02:42 +01:00
icon = data.get_widget_icon(item)
2022-10-28 23:23:06 +02:00
icon_id = icon.icon_id if icon else -1
#layout.scale_x = 1.5
2023-01-18 16:02:42 +01:00
row = layout.row(align=True)
row.use_property_split = False
2022-10-28 23:23:06 +02:00
2023-01-18 16:02:42 +01:00
row.prop(item, 'name', text="", emboss=False, icon_value=icon_id)
2022-10-28 23:23:06 +02:00
class BW_MT_folder(Menu):
bl_label = "Folder Special Menu"
def draw(self, context):
layout = self.layout
#layout.operator("bonewidget.add_folder", icon='ADD')
#layout.operator("bonewidget.remove_folder", icon='REMOVE')
#layout.operator("bonewidget.rename_folder", icon='SYNTAX_OFF')
layout.operator('bonewidget.refresh_folders', icon='FILE_REFRESH')
layout.operator('bonewidget.remove_unused_shape', icon='TRASH')
2023-01-22 00:35:21 +01:00
#layout.operator('bonewidget.show_preferences', icon='PREFERENCES')
2022-10-28 23:23:06 +02:00
layout.operator('bonewidget.copy_widgets', icon='COPYDOWN')
layout.operator('bonewidget.paste_widgets', icon='PASTEDOWN')
2023-01-18 16:02:42 +01:00
#layout.prop(ctx.prefs, 'grid_view')
2022-10-28 23:23:06 +02:00
class BW_PT_transforms(Panel):
bl_label = "Transforms"
bl_category = ctx.category
bl_space_type = 'VIEW_3D'
bl_region_type = 'UI'
bl_parent_id = 'BW_PT_main'
bl_options = {'DEFAULT_CLOSED'}
@classmethod
def poll(cls, context):
return ctx.show_transforms
def draw_header(self, context):
layout = self.layout
layout.label(icon='EMPTY_ARROWS')
def draw(self, context):
layout = self.layout
col = layout.column()
transforms = ctx.prefs.transforms
col.prop(transforms, "loc")
col.prop(transforms, "rot")
col.prop(transforms, "scale")
class BW_PT_main(Panel):
bl_label = "Bone Widget"
bl_category = ctx.category
bl_space_type = 'VIEW_3D'
bl_region_type = 'UI'
def get_nb_col(self, context) :
icon_size = 35
if context.region.width < 100:
return 1
_, y0 = context.region.view2d.region_to_view(0, 0)
_, y1 = context.region.view2d.region_to_view(0, 10)
region_scale = 10 / abs(y1 - y0)
ui_scale = context.preferences.view.ui_scale
cols = int((context.region.width - 48) / (ui_scale*region_scale*icon_size))
return max(1, cols)
def draw(self, context):
layout = self.layout
row = layout.row()
tool_col = row.column(align=True)
tool_col.scale_x = 1.05
tool_col.scale_y = 1.05
tool_col.menu('BW_MT_folder', icon='TRIA_DOWN', text='')
#tool_col.separator()
tool_col.operator('bonewidget.add_widget', icon='ADD', text='')
tool_col.operator('bonewidget.remove_widget', icon='REMOVE', text='')
tool_col.separator()
tool_col.separator()
#if ctx.prefs.auto_symmetrize:
# tool_col.operator('bonewidget.symmetrize_widget', icon='MOD_MIRROR', text='')
op_col = tool_col.column(align=True)
op_col.scale_y = 1.5
op_col.operator('bonewidget.transform_widget', icon='EMPTY_ARROWS', text='') #
op_col.operator('bonewidget.clean_widget', icon='SHADERFX', text='')
2023-01-22 00:35:21 +01:00
op_col.separator()
tool_col.prop(ctx.prefs, 'show_preferences', icon='PREFERENCES', text='')
2022-10-28 23:23:06 +02:00
folder = ctx.active_folder
widget_col = row.column(align=True)
folder_row = widget_col.row(align=True)
folder_row.scale_y = 1.05
#folder_row.scale_y = 1.15
#folder_row.scale_x = 1.25
if len(ctx.folder_items) <= 3:
folder_row.prop(ctx.prefs, 'folder_enum', expand=True)
else:
folder_row.prop(ctx.prefs, 'folder_enum', text='', icon='FILE_FOLDER')
if folder:
widget_col.template_list('BW_UL_widget', 'BW_widgets', folder, 'widgets', folder, 'widget_index',
2023-01-22 00:35:21 +01:00
rows=6, columns=self.get_nb_col(context), type='DEFAULT')
2022-10-28 23:23:06 +02:00
#widget_col.template_list('UI_UL_list', 'BW_widgets', folder, 'widgets', folder, 'widget_index', rows=4)
#layout.prop(self, 'folder_enum')
edit_row = widget_col.row(align=True)
if context.mode in ('EDIT_MESH', 'OBJECT') and ctx.bone:
edit_row.operator('bonewidget.return_to_rig', text='Return', icon='LOOP_BACK')
else:
edit_row.operator('bonewidget.create_widget', text='Create')
edit_row.operator('bonewidget.edit_widget', text='Edit')
2023-01-22 00:35:21 +01:00
2023-02-06 15:10:00 +01:00
# Draw Active Bone Shape
if context.active_pose_bone:
widget_col.separator()
col = widget_col.column(align=False)
col.use_property_split = True
col.prop(context.active_pose_bone, 'name', text='Bone Name')
col.prop(context.active_pose_bone, 'custom_shape', text='Widget')
2023-01-22 00:35:21 +01:00
if ctx.prefs.use_custom_collection and ctx.rig:
widget_col.separator()
row = widget_col.row()
row.use_property_split = True
row.prop(ctx.rig.data, 'widget_collection', text='Widget Collection')
2022-10-28 23:23:06 +02:00
if ctx.show_transforms:
data = context.window_manager.operators[-1].properties
layout.separator()
#opt_box = layout.box()
opt_col = layout.column(align=True)
#opt_col.operator("bonewidget.match_transform",icon = 'GROUP_BONE')
row = opt_col.row(align =True)
row.label(text='Size :')
row.operator("bonewidget.match_transform", text='Relative').relative = True
row.operator("bonewidget.match_transform", text='Absolute').relative = False
opt_col.separator()
transforms = ctx.prefs.transforms
opt_col.prop(transforms, "size")
opt_col.prop(transforms, "xz_scale")
opt_col.prop(transforms, "slide")
elif ctx.clean_widget_op:
data = ctx.clean_widget_op.properties
#layout.separator()
#opt_col = layout.column()
2023-01-22 00:35:21 +01:00
elif ctx.prefs.show_preferences:
2023-01-18 16:02:42 +01:00
#layout.separator()
2022-10-28 23:23:06 +02:00
draw_prefs(layout)
classes = (
BW_UL_widget,
BW_MT_folder,
BW_PT_main,
BW_PT_transforms,
)
def update_tab():
panels = (bpy.types.BW_PT_main, bpy.types.BW_PT_transforms)
for p in panels:
p.bl_category = ctx.prefs.category
bpy.utils.unregister_class(p)
for p in panels:
bpy.utils.register_class(p)
def register():
for cls in classes:
bpy.utils.register_class(cls)
update_tab()
def unregister():
for cls in reversed(classes):
bpy.utils.unregister_class(cls)