[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