L0Lock / GizmoTools

Allows you to increase or decrease the Gizmo size from the viewport using keyboard shortcuts and more.
https://blenderartists.org/t/gizmo-tools-make-the-gizmo-greater-than-ever/1226756
GNU General Public License v3.0
29 stars 1 forks source link

Shortcuts settings in the addon's preferences #3

Open L0Lock opened 3 weeks ago

L0Lock commented 3 weeks ago

have the shortcuts settings in the addon's preferences

L0Lock commented 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)