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