[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [31926] trunk/blender: keyconfig updates/ changes
Campbell Barton
ideasman42 at gmail.com
Tue Sep 14 18:45:24 CEST 2010
Revision: 31926
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=31926
Author: campbellbarton
Date: 2010-09-14 18:45:24 +0200 (Tue, 14 Sep 2010)
Log Message:
-----------
keyconfig updates/changes
- use preset subclass with funcs for updating the keyconfig
- keyconfig filenames are used for the UI names as with presets (so separation anymore)
- keyconfig's are stored in the preset dir (scripts/cfg dir removed)
- only the active keyconfig script is loaded
- some bugfixes for saving keymaps
- user interactions no longer saves keyconfigs too, I think this needs to be re-worked.
developer note...
multiple keyconfigs at once are not really needed now that they are stored & accessed directly in python.
for now I left it alone but we could consider to remove this capability in the future.
Modified Paths:
--------------
trunk/blender/release/scripts/modules/bpy/utils.py
trunk/blender/release/scripts/op/presets.py
trunk/blender/release/scripts/op/wm.py
trunk/blender/release/scripts/ui/space_userpref.py
trunk/blender/release/scripts/ui/space_userpref_keymap.py
trunk/blender/source/blender/makesrna/intern/rna_userdef.c
Added Paths:
-----------
trunk/blender/release/scripts/presets/keyconfig/
Removed Paths:
-------------
trunk/blender/release/scripts/cfg/
Modified: trunk/blender/release/scripts/modules/bpy/utils.py
===================================================================
--- trunk/blender/release/scripts/modules/bpy/utils.py 2010-09-14 12:35:02 UTC (rev 31925)
+++ trunk/blender/release/scripts/modules/bpy/utils.py 2010-09-14 16:45:24 UTC (rev 31926)
@@ -182,7 +182,7 @@
user_path = user_script_path()
for base_path in script_paths():
- for path_subdir in ("", "ui", "op", "io", "cfg", "keyingsets", "modules"):
+ for path_subdir in ("", "ui", "op", "io", "keyingsets", "modules"):
path = _os.path.join(base_path, path_subdir)
if _os.path.isdir(path):
_sys_path_ensure(path)
@@ -202,6 +202,13 @@
# deal with addons seperately
addon_reset_all()
+
+ # run the active integration preset
+ filepath = preset_find(_bpy.context.user_preferences.inputs.active_keyconfig, "keyconfig")
+ if filepath:
+ keyconfig_set(filepath)
+
+
if reload_scripts:
import gc
print("gc.collect() -> %d" % gc.collect())
@@ -474,6 +481,9 @@
addon_disable(mod_name)
def preset_find(name, preset_path, display_name=False):
+ if not name:
+ return None
+
for directory in preset_paths(preset_path):
if display_name:
@@ -488,4 +498,38 @@
if filename:
filepath = _os.path.join(directory, filename)
if _os.path.exists(filepath):
- return filepath\
+ return filepath
+
+
+def keyconfig_set(filepath):
+ from os.path import basename, splitext
+
+ print("loading preset:", filepath)
+ keyconfigs = _bpy.context.window_manager.keyconfigs
+ kc_orig = keyconfigs.active
+
+ keyconfigs_old = keyconfigs[:]
+
+ try:
+ exec(compile(open(filepath).read(), filepath, 'exec'), {"__file__": filepath})
+ except:
+ import traceback
+ traceback.print_exc()
+
+ kc_new = [kc for kc in keyconfigs if kc not in keyconfigs_old][0]
+
+ kc_new.name = ""
+
+ # remove duplicates
+ name = splitext(basename(filepath))[0]
+ while True:
+ kc_dupe = keyconfigs.get(name)
+ if kc_dupe:
+ keyconfigs.remove(kc_dupe)
+ else:
+ break
+
+ kc_new.name = name
+ keyconfigs.active = kc_new
+
+
Modified: trunk/blender/release/scripts/op/presets.py
===================================================================
--- trunk/blender/release/scripts/op/presets.py 2010-09-14 12:35:02 UTC (rev 31925)
+++ trunk/blender/release/scripts/op/presets.py 2010-09-14 16:45:24 UTC (rev 31926)
@@ -33,13 +33,18 @@
name = bpy.props.StringProperty(name="Name", description="Name of the preset, used to make the path name", maxlen=64, default="")
remove_active = bpy.props.BoolProperty(default=False, options={'HIDDEN'})
- def _as_filename(self, name): # could reuse for other presets
- for char in " !@#$%^&*(){}:\";'[]<>,./?":
+ @staticmethod
+ def as_filename(name): # could reuse for other presets
+ for char in " !@#$%^&*(){}:\";'[]<>,.\\/?":
name = name.replace(char, '_')
return name.lower().strip()
def execute(self, context):
import os
+
+ if hasattr(self, "pre_cb"):
+ self.pre_cb(context)
+
preset_menu_class = getattr(bpy.types, self.preset_menu)
if not self.remove_active:
@@ -47,24 +52,23 @@
if not self.name:
return {'FINISHED'}
- filename = self._as_filename(self.name) + ".py"
+ filename = self.as_filename(self.name)
target_path = bpy.utils.preset_paths(self.preset_subdir)[0] # we need some way to tell the user and system preset path
- filepath = os.path.join(target_path, filename)
- if getattr(self, "save_keyconfig", False):
- bpy.ops.wm.keyconfig_export(filepath=filepath, kc_name=self.name)
- file_preset = open(filepath, 'a')
- file_preset.write("wm.keyconfigs.active = kc\n\n")
+ filepath = os.path.join(target_path, filename) + ".py"
+
+ if hasattr(self, "add"):
+ self.add(context, filepath)
else:
file_preset = open(filepath, 'w')
file_preset.write("import bpy\n")
- for rna_path in self.preset_values:
- value = eval(rna_path)
- file_preset.write("%s = %s\n" % (rna_path, repr(value)))
+ for rna_path in self.preset_values:
+ value = eval(rna_path)
+ file_preset.write("%s = %s\n" % (rna_path, repr(value)))
- file_preset.close()
+ file_preset.close()
preset_menu_class.bl_label = bpy.path.display_name(self.name)
@@ -73,21 +77,28 @@
# fairly sloppy but convenient.
filepath = bpy.utils.preset_find(preset_active, self.preset_subdir)
+
if not filepath:
filepath = bpy.utils.preset_find(preset_active, self.preset_subdir, display_name=True)
if not filepath:
return {'CANCELLED'}
- try:
- os.remove(filepath)
- except:
- import traceback
- traceback.print_exc()
+ if hasattr(self, "remove"):
+ self.remove(context, filepath)
+ else:
+ try:
+ os.remove(filepath)
+ except:
+ import traceback
+ traceback.print_exc()
# XXX, stupid!
- preset_menu_class.bl_label = bpy.path.display_name(self.preset_menu.replace("_MT_", " ").lower())
+ preset_menu_class.bl_label = "Presets"
+ if hasattr(self, "post_cb"):
+ self.post_cb(context)
+
return {'FINISHED'}
def invoke(self, context, event):
@@ -218,7 +229,6 @@
bl_idname = "wm.interaction_preset_add"
bl_label = "Add Interaction Preset"
preset_menu = "USERPREF_MT_interaction_presets"
- save_keyconfig = True
preset_values = [
"bpy.context.user_preferences.edit.use_drag_immediately",
@@ -236,6 +246,29 @@
preset_subdir = "interaction"
+class AddPresetKeyconfig(AddPresetBase, bpy.types.Operator):
+ '''Add a Keyconfig Preset'''
+ bl_idname = "wm.keyconfig_preset_add"
+ bl_label = "Add Keyconfig Preset"
+ preset_menu = "PREFS_MT_keyconfigs"
+ preset_subdir = "keyconfig"
+
+ def add(self, context, filepath):
+ bpy.ops.wm.keyconfig_export(filepath=filepath)
+ bpy.utils.keyconfig_set(filepath)
+
+ def pre_cb(self, context):
+ keyconfigs = bpy.context.window_manager.keyconfigs
+ if self.remove_active:
+ preset_menu_class = getattr(bpy.types, self.preset_menu)
+ preset_menu_class.bl_label = keyconfigs.active.name
+
+ def post_cb(self, context):
+ keyconfigs = bpy.context.window_manager.keyconfigs
+ if self.remove_active:
+ keyconfigs.remove(keyconfigs.active)
+
+
def register():
pass
Modified: trunk/blender/release/scripts/op/wm.py
===================================================================
--- trunk/blender/release/scripts/op/wm.py 2010-09-14 12:35:02 UTC (rev 31925)
+++ trunk/blender/release/scripts/op/wm.py 2010-09-14 16:45:24 UTC (rev 31926)
@@ -768,6 +768,17 @@
return {'FINISHED'}
+class WM_OT_keyconfig_activate(bpy.types.Operator):
+ bl_idname = "wm.keyconfig_activate"
+ bl_label = "Activate Keyconfig"
+
+ filepath = StringProperty(name="File Path", maxlen=1024)
+
+ def execute(self, context):
+ bpy.utils.keyconfig_set(self.filepath)
+ return {'FINISHED'}
+
+
def register():
pass
Modified: trunk/blender/release/scripts/ui/space_userpref.py
===================================================================
--- trunk/blender/release/scripts/ui/space_userpref.py 2010-09-14 12:35:02 UTC (rev 31925)
+++ trunk/blender/release/scripts/ui/space_userpref.py 2010-09-14 16:45:24 UTC (rev 31926)
@@ -725,6 +725,7 @@
sub = col.column()
sub.label(text="Presets:")
subrow = sub.row(align=True)
+
subrow.menu("USERPREF_MT_interaction_presets", text=bpy.types.USERPREF_MT_interaction_presets.bl_label)
subrow.operator("wm.interaction_preset_add", text="", icon='ZOOMIN')
subrow.operator("wm.interaction_preset_add", text="", icon='ZOOMOUT').remove_active = True
Modified: trunk/blender/release/scripts/ui/space_userpref_keymap.py
===================================================================
--- trunk/blender/release/scripts/ui/space_userpref_keymap.py 2010-09-14 12:35:02 UTC (rev 31925)
+++ trunk/blender/release/scripts/ui/space_userpref_keymap.py 2010-09-14 16:45:24 UTC (rev 31926)
@@ -124,6 +124,19 @@
return merged_keymaps
+class PREFS_MT_keyconfigs(bpy.types.Menu):
+ bl_label = "KeyPresets"
+ preset_subdir = "keyconfig"
+ preset_operator = "wm.keyconfig_activate"
+ def draw(self, context):
+ props = self.layout.operator("wm.context_set_value", text="Blender (default)")
+ props.data_path = "window_manager.keyconfigs.active"
+ props.value = "context.window_manager.keyconfigs.default"
+
+ # now draw the presets
+ bpy.types.Menu.draw_preset(self, context)
+
+
class InputKeyMapPanel(bpy.types.Panel):
bl_space_type = 'USER_PREFERENCES'
bl_label = "Input"
@@ -365,10 +378,18 @@
subsplit = sub.split()
subcol = subsplit.column()
- row = subcol.row()
- row.prop_search(wm.keyconfigs, "active", wm, "keyconfigs", text="Key Config:")
- layout.context_pointer_set("keyconfig", wm.keyconfigs.active)
- row.operator("wm.keyconfig_remove", text="", icon='X')
+ row = subcol.row(align=True)
+
+ #row.prop_search(wm.keyconfigs, "active", wm, "keyconfigs", text="Key Config:")
+ text = bpy.path.display_name(context.window_manager.keyconfigs.active.name)
+ if not text:
+ text = "Blender (default)"
+ row.menu("PREFS_MT_keyconfigs", text=text)
+ row.operator("wm.keyconfig_preset_add", text="", icon="ZOOMIN")
+ row.operator("wm.keyconfig_preset_add", text="", icon="ZOOMOUT").remove_active = True
+
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list