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

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to