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.
This commit is contained in:
2020-10-22 12:29:42 +11:00
parent b9c8eb3b0c
commit 358a584985
2 changed files with 65 additions and 2 deletions

View File

@@ -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

View File

@@ -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