diff options
author | Campbell Barton <ideasman42@gmail.com> | 2018-11-20 04:33:47 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2018-11-20 04:37:04 +0300 |
commit | 9a1796797e87b1effe3230a8b937ded1629046e4 (patch) | |
tree | b944397694cb274e1f90b955268aece08a087d04 /release/scripts/modules | |
parent | 916446e83f63e0789fc1f5db4e6535340ef0be16 (diff) |
Keymap: update addon register/unregister utilities
Use the same data format and loader that the default key-maps use.
This supports nested properties (needed for macros)
and fixes modal key-maps which weren't supported.
This format still needs to be documented.
Diffstat (limited to 'release/scripts/modules')
-rw-r--r-- | release/scripts/modules/bpy_extras/keyconfig_utils.py | 94 |
1 files changed, 42 insertions, 52 deletions
diff --git a/release/scripts/modules/bpy_extras/keyconfig_utils.py b/release/scripts/modules/bpy_extras/keyconfig_utils.py index b7342adcee7..8eea2ede425 100644 --- a/release/scripts/modules/bpy_extras/keyconfig_utils.py +++ b/release/scripts/modules/bpy_extras/keyconfig_utils.py @@ -22,71 +22,61 @@ # ----------------------------------------------------------------------------- # Add-on helpers to properly (un)register their own keymaps. -# Example of keymaps_description: -keymaps_description_doc = """ -keymaps_description is a tuple (((keymap_description), (tuple of keymap_item_descriptions))). -keymap_description is a tuple (name, space_type, region_type, is_modal). -keymap_item_description is a tuple ({kw_args_for_keymap_new}, (tuple of properties)). -kw_args_for_keymap_new is a mapping which keywords match parameters of keymap.new() function. -tuple of properties is a tuple of pairs (prop_name, prop_value) (properties being those of called operator). - -Example: - -KEYMAPS = ( - # First, keymap identifiers (last bool is True for modal km). - (('Sequencer', 'SEQUENCE_EDITOR', 'WINDOW', False), ( - # Then a tuple of keymap items, defined by a dict of kwargs for the km new func, and a tuple of tuples (name, val) - # for ops properties, if needing non-default values. - ({"idname": export_strips.SEQExportStrip.bl_idname, "type": 'P', "value": 'PRESS', "shift": True, "ctrl": True}, - ()), - )), -) -""" - - -def addon_keymap_register(wm, keymaps_description): +def addon_keymap_register(keymap_data): """ - Register a set of keymaps for addons. + Register a set of keymaps for addons using a list of keymaps. + + See 'blender_defaults.py' for examples of the format this takes. + """ + import bpy + wm = bpy.context.window_manager + + from bl_keymap_utils.io import keymap_init_from_data - """ + keymaps_description_doc kconf = wm.keyconfigs.addon if not kconf: return # happens in background mode... - for km_info, km_items in keymaps_description: - km_name, km_sptype, km_regtype, km_ismodal = km_info - kmap = [k for k in kconf.keymaps - if k.name == km_name and k.region_type == km_regtype and - k.space_type == km_sptype and k.is_modal == km_ismodal] - if kmap: - kmap = kmap[0] - else: - kmap = kconf.keymaps.new(km_name, region_type=km_regtype, space_type=km_sptype, modal=km_ismodal) - for kmi_kwargs, props in km_items: - kmi = kmap.keymap_items.new(**kmi_kwargs) - kmi.active = True - for prop, val in props: - setattr(kmi.properties, prop, val) - - -def addon_keymap_unregister(wm, keymaps_description): + for km_name, km_args, km_content in keymap_data: + km_space_type = km_args["space_type"] + km_region_type = km_args["region_type"] + km_modal = km_args.get("modal", False) + kmap = next(iter( + k for k in kconf.keymaps + if k.name == km_name and + k.region_type == km_region_type and + k.space_type == km_space_type and + k.is_modal == km_modal + ), None) + if kmap is None: + kmap = kconf.keymaps.new(km_name, **km_args) + keymap_init_from_data(kmap, km_content["items"], is_modal=km_modal) + +def addon_keymap_unregister(keymap_data): """ Unregister a set of keymaps for addons. - - """ + keymaps_description_doc + """ # NOTE: We must also clean up user keyconfig, else, if user has customized one of add-on's shortcut, this # customization remains in memory, and comes back when re-enabling the addon, causing a segfault... :/ + import bpy + wm = bpy.context.window_manager + kconfs = wm.keyconfigs for kconf in (kconfs.user, kconfs.addon): - for km_info, km_items in keymaps_description: - km_name, km_sptype, km_regtype, km_ismodal = km_info - kmaps = (k for k in kconf.keymaps - if k.name == km_name and k.region_type == km_regtype and - k.space_type == km_sptype and k.is_modal == km_ismodal) + for km_name, km_args, km_content in keymap_data: + km_space_type = km_args["space_type"] + km_region_type = km_args["region_type"] + km_modal = km_args.get("modal", False) + kmaps = ( + k for k in kconf.keymaps + if k.name == km_name and + k.region_type == km_region_type and + k.space_type == km_space_type and + k.is_modal == km_modal + ) for kmap in kmaps: - for kmi_kwargs, props in km_items: - idname = kmi_kwargs["idname"] + for kmi_idname, _, _ in km_content["items"]: for kmi in kmap.keymap_items: - if kmi.idname == idname: + if kmi.idname == kmi_idname: kmap.keymap_items.remove(kmi) # NOTE: We won't remove addons keymaps themselves, other addons might also use them! |