[Bf-blender-cvs] [9a1796797e8] blender2.8: Keymap: update addon register/unregister utilities

Campbell Barton noreply at git.blender.org
Tue Nov 20 02:37:18 CET 2018


Commit: 9a1796797e87b1effe3230a8b937ded1629046e4
Author: Campbell Barton
Date:   Tue Nov 20 12:33:47 2018 +1100
Branches: blender2.8
https://developer.blender.org/rB9a1796797e87b1effe3230a8b937ded1629046e4

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.

===================================================================

M	release/scripts/modules/bpy_extras/keyconfig_utils.py

===================================================================

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!



More information about the Bf-blender-cvs mailing list