Open L0Lock opened 3 weeks ago
example in the keymesh extension:
preferences.py
import bpy
from . import ui
#### ------------------------------ FUNCTIONS ------------------------------ ####
panel_classes = [
ui.VIEW3D_PT_keymesh,
ui.VIEW3D_PT_keymesh_frame_picker,
ui.VIEW3D_PT_keymesh_tools,
]
def update_sidebar_category(self, context):
for cls in panel_classes:
try:
bpy.utils.unregister_class(cls)
except:
pass
cls.bl_category = self.category
bpy.utils.register_class(cls)
# Keymaps
def get_hotkey_entry_item(km, kmi_name, kmi_prop=None, kmi_value=None):
"""Returns keymap with given operator name and `path` property value"""
for i, km_item in enumerate(km.keymap_items):
if km.keymap_items.keys()[i] == kmi_name:
if kmi_prop:
if getattr(km.keymap_items[i].properties, kmi_prop) == kmi_value:
return km_item
else:
return km_item
return None
def draw_kmi(kmi, layout):
map_type = kmi.map_type
col = layout.column()
if kmi.show_expanded:
col = col.column()
box = col.box()
else:
box = col.column()
box.use_property_split = False
split = box.split(align=True)
# Header
row = split.row(align=True)
row.prop(kmi, "show_expanded", text="", emboss=False)
row.prop(kmi, "active", text="", emboss=False)
name = kmi.name.replace(" Keymesh", "")
row.label(text=name + " (" + kmi.properties.path.capitalize() + ")")
row = split.row()
row.prop(kmi, "map_type", text="")
if map_type == 'KEYBOARD':
row.prop(kmi, "type", text="", full_event=True)
elif map_type == 'MOUSE':
row.prop(kmi, "type", text="", full_event=True)
elif map_type == 'NDOF':
row.prop(kmi, "type", text="", full_event=True)
elif map_type == 'TWEAK':
subrow = row.row()
subrow.prop(kmi, "type", text="")
subrow.prop(kmi, "value", text="")
elif map_type == 'TIMER':
row.prop(kmi, "type", text="")
else:
row.label()
# NOTE: there is a bug that always shows next icon in list instead of defined,
# NOTE: so 'REMOVE' is used instead of 'PANEL_CLOSE'
row.prop(kmi, "active", text="", icon='REMOVE' if kmi.active else 'TRACKING_CLEAR_BACKWARDS', emboss=False)
# Body
if kmi.show_expanded:
split = box.split(factor=0.5)
split.prop(kmi, "idname", text="")
if map_type not in {'TEXTINPUT', 'TIMER'}:
sub = split.column()
subrow = sub.row(align=True)
if map_type == 'KEYBOARD':
subrow.prop(kmi, "type", text="", event=True)
subrow.prop(kmi, "value", text="")
subrow_repeat = subrow.row(align=True)
subrow_repeat.prop(kmi, "repeat", text="Repeat")
subrow_repeat.active = kmi.value in {'ANY', 'PRESS'}
elif map_type in {'MOUSE', 'NDOF'}:
subrow.prop(kmi, "type", text="")
subrow.prop(kmi, "value", text="")
if map_type in {'KEYBOARD', 'MOUSE'} and kmi.value == 'CLICK_DRAG':
subrow = sub.row()
subrow.prop(kmi, "direction")
subrow = sub.row()
subrow.scale_x = 0.75
subrow.prop(kmi, "any", toggle=True)
subrow.prop(kmi, "shift_ui", toggle=True)
subrow.prop(kmi, "ctrl_ui", toggle=True)
subrow.prop(kmi, "alt_ui", toggle=True)
subrow.prop(kmi, "oskey_ui", text="Cmd", toggle=True)
subrow.prop(kmi, "key_modifier", text="", event=True)
# Properties
box.template_keymap_item_properties(kmi)
#### ------------------------------ PREFERENCES ------------------------------ ####
class KeymeshAddonPreferences(bpy.types.AddonPreferences):
bl_idname = __package__
### bunch of unrelated custom properties ###
def draw(self, context):
layout = self.layout
layout.use_property_split = True
layout.use_property_decorate = False
column = layout.column()
row = column.row(align=True)
row.prop(self, "frame_skip_count", text="Default Frame Step")
row.separator()
row.prop(self, "keyframe_after_skip", text="")
row = column.row(align=True)
row.prop(self, "naming_method", expand=True)
row = column.row(align=True)
row.prop(self, "persistent_settings")
layout.separator()
col = layout.column()
col.prop(self, "category")
col.prop(self, "enable_edit_mode")
col.prop(self, "enable_shape_keys")
col.separator()
col.prop(self, "versioning")
col.prop(self, "debug")
# Keymaps
layout.separator()
box = layout.box()
box.label(text="Hotkeys:")
kc = bpy.context.window_manager.keyconfigs.user
# insert_shortcuts
kmi = []
km = kc.keymaps["3D View"]
kmi.append(get_hotkey_entry_item(km, "object.keyframe_object_data", 'path', 'FORWARD'))
kmi.append(get_hotkey_entry_item(km, "object.keyframe_object_data", 'path', 'BACKWARD'))
for kmi in kmi:
if kmi:
box.context_pointer_set("keymap", km)
draw_kmi(kmi, box)
# jump_shortcuts
kmi = []
km = kc.keymaps["Frames"]
kmi.append(get_hotkey_entry_item(km, "timeline.keymesh_frame_jump", 'path', 'FORWARD'))
kmi.append(get_hotkey_entry_item(km, "timeline.keymesh_frame_jump", 'path', 'BACKWARD'))
for kmi in kmi:
if kmi:
box.context_pointer_set("keymap", km)
draw_kmi(kmi, box)
#### ------------------------------ REGISTRATION ------------------------------ ####
classes = [
KeymeshAddonPreferences,
]
def register():
for cls in classes:
bpy.utils.register_class(cls)
def unregister():
for cls in reversed(classes):
bpy.utils.unregister_class(cls)
have the shortcuts settings in the addon's preferences