[Bf-blender-cvs] [358a584985c] master: Keymap: add support for versioning keymaps

Campbell Barton noreply at git.blender.org
Thu Oct 22 03:30:40 CEST 2020


Commit: 358a584985c01689726f0953f84f002fcdb4d2ed
Author: Campbell Barton
Date:   Thu Oct 22 12:29:42 2020 +1100
Branches: master
https://developer.blender.org/rB358a584985c01689726f0953f84f002fcdb4d2ed

Keymap: add support for versioning keymaps

Write the Blender version into the keymap
so we can change defaults without breaking existing keymaps.

Based on patch by @erik85 with own additions.

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

M	release/scripts/modules/bl_keymap_utils/io.py
A	release/scripts/modules/bl_keymap_utils/versioning.py

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

diff --git a/release/scripts/modules/bl_keymap_utils/io.py b/release/scripts/modules/bl_keymap_utils/io.py
index 8cddbd37ea3..96f45cd9875 100644
--- a/release/scripts/modules/bl_keymap_utils/io.py
+++ b/release/scripts/modules/bl_keymap_utils/io.py
@@ -161,6 +161,13 @@ def keyconfig_export_as_data(wm, kc, filepath, *, all_keymaps=False):
 
     with open(filepath, "w") as fh:
         fw = fh.write
+
+        # Use the file version since it includes the sub-version
+        # which we can bump multiple times between releases.
+        from bpy.app import version_file
+        fw(f"keyconfig_version = {version_file!r}\n")
+        del version_file
+
         fw("keyconfig_data = \\\n[")
 
         for km, _kc_x in export_keymaps:
@@ -212,7 +219,11 @@ def keyconfig_export_as_data(wm, kc, filepath, *, all_keymaps=False):
         fw("if __name__ == \"__main__\":\n")
         fw("    import os\n")
         fw("    from bl_keymap_utils.io import keyconfig_import_from_data\n")
-        fw("    keyconfig_import_from_data(os.path.splitext(os.path.basename(__file__))[0], keyconfig_data)\n")
+        fw("    keyconfig_import_from_data(\n")
+        fw("        os.path.splitext(os.path.basename(__file__))[0],\n")
+        fw("        keyconfig_data,\n")
+        fw("        keyconfig_version=keyconfig_version,\n")
+        fw("    )\n")
 
 
 # -----------------------------------------------------------------------------
@@ -264,7 +275,7 @@ def keyconfig_init_from_data(kc, keyconfig_data):
         keymap_init_from_data(km, km_items, is_modal=km_args.get("modal", False))
 
 
-def keyconfig_import_from_data(name, keyconfig_data):
+def keyconfig_import_from_data(name, keyconfig_data, *, keyconfig_version=(0, 0, 0)):
     # Load data in the format defined above.
     #
     # Runs at load time, keep this fast!
@@ -272,6 +283,9 @@ def keyconfig_import_from_data(name, keyconfig_data):
     import bpy
     wm = bpy.context.window_manager
     kc = wm.keyconfigs.new(name)
+    if keyconfig_version is not None:
+        from .versioning import keyconfig_update
+        keyconfig_data = keyconfig_update(keyconfig_data, keyconfig_version)
     keyconfig_init_from_data(kc, keyconfig_data)
     return kc
 
diff --git a/release/scripts/modules/bl_keymap_utils/versioning.py b/release/scripts/modules/bl_keymap_utils/versioning.py
new file mode 100644
index 00000000000..4c2e8ed7f54
--- /dev/null
+++ b/release/scripts/modules/bl_keymap_utils/versioning.py
@@ -0,0 +1,49 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+#  This program is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU General Public License
+#  as published by the Free Software Foundation; either version 2
+#  of the License, or (at your option) any later version.
+#
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+#
+#  You should have received a copy of the GNU General Public License
+#  along with this program; if not, write to the Free Software Foundation,
+#  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+
+# Update Blender version this key-map was written in:
+#
+# When the version is ``(0, 0, 0)``, the key-map being loaded didn't contain any versioning information.
+# This will older than ``(2, 92, 0)``.
+
+def keyconfig_update(keyconfig_data, keyconfig_version):
+    from bpy.app import version_file as blender_version
+    if keyconfig_version >= blender_version:
+        return keyconfig_data
+
+    # Version the key-map.
+    import copy
+    has_copy = False
+
+    # Default repeat to false.
+    if keyconfig_version <= (2, 92, 0):
+        # Only copy once.
+        if not has_copy:
+            keyconfig_data = copy.deepcopy(keyconfig_data)
+            has_copy = True
+
+        for _km_name, _km_parms, km_items_data in keyconfig_data:
+            for (_item_op, item_event, _item_prop) in km_items_data["items"]:
+                if item_event.get("value") == 'PRESS':
+                    # Unfortunately we don't know the 'map_type' at this point.
+                    # Setting repeat true on other kinds of events is harmless.
+                    item_event["repeat"] = True
+
+    return keyconfig_data



More information about the Bf-blender-cvs mailing list