Keymap: move builtin keymaps from C to Python

This should be purely an implementation change,
for end users there should be no functional difference.

The entire key configuration is in one file with ~5000 lines of code.
Mostly avoiding code duplication and preserve comments and utility
functions from the C code.
It's a bit long but for searching and editing it's also convenient to
have it all in one file.

Notes:

- Actual keymap is shared by blender / blender_legacy
  and stored in `keymap_data/blender_default.py`

  This only generates JSON-like data to be passed into
  `keyconfig_import_from_data`, allowing other presets to load and
  manipulate the default keymap.

- Each preset defines 'keyconfig_data'
  which can be shared between presets.

- Some of the utility functions for generating keymap items still
  need to be ported over to Python.

- Some keymap items can be made into loops (marked as TODO).

See: D3907
This commit is contained in:
2018-11-08 15:59:51 +11:00
committed by Campbell Barton
parent b43ce7908f
commit 3064da1200
60 changed files with 5161 additions and 13556 deletions

View File

@@ -21,6 +21,7 @@
__all__ = (
"keyconfig_export_as_data",
"keyconfig_import_from_data",
"keyconfig_module_from_preset",
)
@@ -242,3 +243,22 @@ def keyconfig_import_from_data(name, keyconfig_data):
kmi_props = kmi.properties
for attr, value in kmi_props_data:
kmi_props_setattr(kmi_props, attr, value)
def keyconfig_module_from_preset(name, preset_reference_filename=None):
import os
import importlib.util
if preset_reference_filename is not None:
preset_path = os.path.join(os.path.dirname(preset_reference_filename), name + ".py")
else:
preset_path = None
# External presets may want to re-use other presets too.
if not (preset_path and os.path.exists(preset_path)):
preset_path = bpy.utils.preset_find(name, "keyconfig")
# module name isn't used or added to 'sys.modules'.
mod_spec = importlib.util.spec_from_file_location("__bl_keymap__", preset_path)
mod = importlib.util.module_from_spec(mod_spec)
mod_spec.loader.exec_module(mod)
return mod