[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [26377] trunk/blender: Keyconfig import and remove

Martin Poirier theeth at yahoo.com
Thu Jan 28 20:54:06 CET 2010


Revision: 26377
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=26377
Author:   theeth
Date:     2010-01-28 20:54:06 +0100 (Thu, 28 Jan 2010)

Log Message:
-----------
Keyconfig import and remove

- Keyconfig are now marked as user_defined when it is the case
- Import keyconfig operator: select an exported keyconfig .py file, copies it to the scripts folder (keep the original copy if wanted, default True), imports and select as active config. The active keyconfig is stored in the user default file, so that still has to be saved after import.
- Remove keyconfig operator and button next to the keyconfig name (poll False if not user_defined). Removes the keyconfig from the list and deletes the file from the folder.

Remaining bug: The file is copied in the user defined script folder (if present) or the /scripts/ui folder. The problem is that it might be imported before operators defined in python are imported themselves. One solution would be to use a separate folder for keyconfigs that is imported after all others.

Modified Paths:
--------------
    trunk/blender/release/scripts/ui/space_userpref.py
    trunk/blender/source/blender/makesdna/DNA_windowmanager_types.h
    trunk/blender/source/blender/makesrna/intern/rna_wm.c
    trunk/blender/source/blender/makesrna/intern/rna_wm_api.c
    trunk/blender/source/blender/windowmanager/WM_api.h
    trunk/blender/source/blender/windowmanager/intern/wm_keymap.c
    trunk/blender/source/blenderplayer/bad_level_call_stubs/stubs.c

Modified: trunk/blender/release/scripts/ui/space_userpref.py
===================================================================
--- trunk/blender/release/scripts/ui/space_userpref.py	2010-01-28 19:21:15 UTC (rev 26376)
+++ trunk/blender/release/scripts/ui/space_userpref.py	2010-01-28 19:54:06 UTC (rev 26377)
@@ -18,7 +18,7 @@
 
 # <pep8 compliant>
 import bpy
-import os.path
+import os, re, shutil
 
 # General UI Theme Settings (User Interface)
 def ui_items_general(col, context):
@@ -164,6 +164,8 @@
             layout.operator_context = 'INVOKE_DEFAULT'
             op = layout.operator("wm.keyconfig_export", "Export Key Configuration...")
             op.path = "keymap.py"
+            op = layout.operator("wm.keyconfig_import", "Import Key Configuration...")
+            op.path = "keymap.py"
 
 
 class USERPREF_PT_tabs(bpy.types.Panel):
@@ -1306,11 +1308,14 @@
 
         subsplit = sub.split()
         subcol = subsplit.column()
-        subcol.prop_object(wm, "active_keyconfig", wm, "keyconfigs", text="Configuration:")
+        row = subcol.row()
+        row.prop_object(wm, "active_keyconfig", wm, "keyconfigs", text="Configuration:")
 
-        subcol = subsplit.column()
-        subcol.prop(kc, "filter", icon="VIEWZOOM")
+        layout.set_context_pointer("keyconfig", wm.active_keyconfig) 
+        row.operator("wm.keyconfig_remove", text="", icon='X')
 
+        row.prop(kc, "filter", icon="VIEWZOOM")
+
         col.separator()
 
         if kc.filter != "":
@@ -1465,7 +1470,62 @@
 
     return result
 
+class WM_OT_keyconfig_import(bpy.types.Operator):
+    "Import key configuration from a python script."
+    bl_idname = "wm.keyconfig_import"
+    bl_label = "Import Key Configuration..."
 
+    path = bpy.props.StringProperty(name="File Path", description="File path to write file to.")
+    filename = bpy.props.StringProperty(name="File Name", description="Name of the file.")
+    directory = bpy.props.StringProperty(name="Directory", description="Directory of the file.")
+    filter_folder = bpy.props.BoolProperty(name="Filter folders", description="", default=True, hidden=True)
+    filter_text = bpy.props.BoolProperty(name="Filter text", description="", default=True, hidden=True)
+    filter_python = bpy.props.BoolProperty(name="Filter python", description="", default=True, hidden=True)
+
+    keep_original = bpy.props.BoolProperty(name="Keep original", description="Keep original file after copying to configuration folder", default=True)
+
+    def execute(self, context):
+        if not self.properties.path:
+            raise Exception("File path not set.")
+
+        f = open(self.properties.path, "r")
+        if not f:
+            raise Exception("Could not open file.")
+
+        name_pattern = re.compile("^kc = wm.add_keyconfig\('(.*)'\)$")
+
+        for line in f.readlines():
+            match = name_pattern.match(line)
+            
+            if match:
+                config_name = match.groups()[0]
+        
+        f.close()
+        
+        path = bpy.context.user_preferences.filepaths.python_scripts_directory
+        
+        if not path:
+            path = os.path.split(__file__)[0]
+            
+        path += os.path.sep + config_name + ".py"
+            
+        if self.properties.keep_original:
+            shutil.copy(self.properties.path, path)
+        else:
+            shutil.move(self.properties.path, path)
+        
+        __import__(config_name) 
+        
+        wm = bpy.data.window_managers[0]
+        wm.active_keyconfig = wm.keyconfigs[config_name]
+
+        return {'FINISHED'}
+
+    def invoke(self, context, event):
+        wm = context.manager
+        wm.add_fileselect(self)
+        return {'RUNNING_MODAL'}
+    
 class WM_OT_keyconfig_export(bpy.types.Operator):
     "Export key configuration to a python script."
     bl_idname = "wm.keyconfig_export"
@@ -1474,9 +1534,9 @@
     path = bpy.props.StringProperty(name="File Path", description="File path to write file to.")
     filename = bpy.props.StringProperty(name="File Name", description="Name of the file.")
     directory = bpy.props.StringProperty(name="Directory", description="Directory of the file.")
-    filter_folder = bpy.props.BoolProperty(name="Filter folders", description="", default=True)
-    filter_text = bpy.props.BoolProperty(name="Filter text", description="", default=True)
-    filter_python = bpy.props.BoolProperty(name="Filter python", description="", default=True)
+    filter_folder = bpy.props.BoolProperty(name="Filter folders", description="", default=True, hidden=True)
+    filter_text = bpy.props.BoolProperty(name="Filter text", description="", default=True, hidden=True)
+    filter_python = bpy.props.BoolProperty(name="Filter python", description="", default=True, hidden=True)
 
     def execute(self, context):
         if not self.properties.path:
@@ -1494,20 +1554,21 @@
         else:
             name = kc.name
 
-        f.write('# Configuration %s\n' % name)
+        f.write("# Configuration %s\n" % name)
 
+        f.write("import bpy\n\n")
         f.write("wm = bpy.data.window_managers[0]\n")
-        f.write("kc = wm.add_keyconfig(\'%s\')\n\n" % name)
+        f.write("kc = wm.add_keyconfig('%s')\n\n" % name)
 
         for km in kc.keymaps:
             km = km.active()
             f.write("# Map %s\n" % km.name)
-            f.write("km = kc.add_keymap(\'%s\', space_type=\'%s\', region_type=\'%s\', modal=%s)\n\n" % (km.name, km.space_type, km.region_type, km.modal))
+            f.write("km = kc.add_keymap('%s', space_type='%s', region_type='%s', modal=%s)\n\n" % (km.name, km.space_type, km.region_type, km.modal))
             for kmi in km.items:
                 if km.modal:
-                    f.write("kmi = km.add_modal_item(\'%s\', \'%s\', \'%s\'" % (kmi.propvalue, kmi.type, kmi.value))
+                    f.write("kmi = km.add_modal_item('%s', '%s', '%s'" % (kmi.propvalue, kmi.type, kmi.value))
                 else:
-                    f.write("kmi = km.add_item(\'%s\', \'%s\', \'%s\'" % (kmi.idname, kmi.type, kmi.value))
+                    f.write("kmi = km.add_item('%s', '%s', '%s'" % (kmi.idname, kmi.type, kmi.value))
                 if kmi.any:
                     f.write(", any=True")
                 else:
@@ -1520,7 +1581,7 @@
                     if kmi.oskey:
                         f.write(", oskey=True")
                 if kmi.key_modifier and kmi.key_modifier != 'NONE':
-                    f.write(", key_modifier=\'%s\'" % kmi.key_modifier)
+                    f.write(", key_modifier='%s'" % kmi.key_modifier)
                 f.write(")\n")
 
                 def export_properties(prefix, properties):
@@ -1541,7 +1602,6 @@
 
             f.write("\n")
 
-        f.write("wm.active_keyconfig = wm.keyconfigs[\'%s\']\n" % name)
         f.close()
 
         return {'FINISHED'}
@@ -1640,8 +1700,31 @@
         km.remove_item(kmi)
         return {'FINISHED'}
 
+class WM_OT_keyconfig_remove(bpy.types.Operator):
+    "Remove key config."
+    bl_idname = "wm.keyconfig_remove"
+    bl_label = "Remove Key Config"
+
+    def poll(self, context):
+        wm = context.manager
+        return wm.active_keyconfig.user_defined
+
+    def execute(self, context):
+        wm = context.manager
+        
+        keyconfig = wm.active_keyconfig
+        
+        module = __import__(keyconfig.name)
+        
+        os.remove(module.__file__)
+        
+        wm.remove_keyconfig(keyconfig)
+        return {'FINISHED'}
+
 bpy.types.register(WM_OT_keyconfig_export)
+bpy.types.register(WM_OT_keyconfig_import)
 bpy.types.register(WM_OT_keyconfig_test)
+bpy.types.register(WM_OT_keyconfig_remove)
 bpy.types.register(WM_OT_keymap_edit)
 bpy.types.register(WM_OT_keymap_restore)
 bpy.types.register(WM_OT_keyitem_add)

Modified: trunk/blender/source/blender/makesdna/DNA_windowmanager_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_windowmanager_types.h	2010-01-28 19:21:15 UTC (rev 26376)
+++ trunk/blender/source/blender/makesdna/DNA_windowmanager_types.h	2010-01-28 19:54:06 UTC (rev 26377)
@@ -259,9 +259,7 @@
 } wmKeyConfig;
 
 /* wmKeyConfig.flag */
-#define KEYCONF_TWOBUTTONMOUSE	(1 << 1)
-#define KEYCONF_LMOUSESELECT	(1 << 2)
-#define KEYCONF_NONUMPAD		(1 << 3)
+#define KEYCONF_USER			(1 << 1)
 
 /* this one is the operator itself, stored in files for macros etc */
 /* operator + operatortype should be able to redo entirely, but for different contextes */

Modified: trunk/blender/source/blender/makesrna/intern/rna_wm.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_wm.c	2010-01-28 19:21:15 UTC (rev 26376)
+++ trunk/blender/source/blender/makesrna/intern/rna_wm.c	2010-01-28 19:54:06 UTC (rev 26377)
@@ -1185,6 +1185,11 @@
 	RNA_def_property_struct_type(prop, "KeyMap");
 	RNA_def_property_ui_text(prop, "Key Maps", "Key maps configured as part of this configuration.");
 
+	prop= RNA_def_property(srna, "user_defined", PROP_BOOLEAN, PROP_NONE);
+	RNA_def_property_boolean_sdna(prop, NULL, "flag", KEYCONF_USER);
+	RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+	RNA_def_property_ui_text(prop, "User Defined", "Indicates that a keyconfig was defined by the user.");
+
 	RNA_api_keyconfig(srna);
 
 	/* KeyMap */

Modified: trunk/blender/source/blender/makesrna/intern/rna_wm_api.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_wm_api.c	2010-01-28 19:21:15 UTC (rev 26376)
+++ trunk/blender/source/blender/makesrna/intern/rna_wm_api.c	2010-01-28 19:54:06 UTC (rev 26377)
@@ -182,12 +182,16 @@
 	RNA_def_function_ui_description(func, "Show up the file selector.");
 	rna_generic_op_invoke(func, 0, 0);
 
-	func= RNA_def_function(srna, "add_keyconfig", "WM_keyconfig_add");
+	func= RNA_def_function(srna, "add_keyconfig", "WM_keyconfig_add_user");
 	parm= RNA_def_string(func, "name", "", 0, "Name", "");
 	RNA_def_property_flag(parm, PROP_REQUIRED);
 	parm= RNA_def_pointer(func, "keyconfig", "KeyConfig", "Key Configuration", "Added key configuration.");
 	RNA_def_function_return(func, parm);
 	
+	func= RNA_def_function(srna, "remove_keyconfig", "WM_keyconfig_remove");
+	parm= RNA_def_pointer(func, "keyconfig", "KeyConfig", "Key Configuration", "Removed key configuration.");

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list