Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--release/scripts/ui/space_userpref.py111
-rw-r--r--source/blender/makesdna/DNA_windowmanager_types.h4
-rw-r--r--source/blender/makesrna/intern/rna_wm.c5
-rw-r--r--source/blender/makesrna/intern/rna_wm_api.c6
-rw-r--r--source/blender/windowmanager/WM_api.h2
-rw-r--r--source/blender/windowmanager/intern/wm_keymap.c21
-rw-r--r--source/blenderplayer/bad_level_call_stubs/stubs.c2
7 files changed, 133 insertions, 18 deletions
diff --git a/release/scripts/ui/space_userpref.py b/release/scripts/ui/space_userpref.py
index a8b49cafc47..52b8d6583ea 100644
--- a/release/scripts/ui/space_userpref.py
+++ b/release/scripts/ui/space_userpref.py
@@ -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 @@ class USERPREF_HT_header(bpy.types.Header):
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,10 +1308,13 @@ class USERPREF_PT_input(bpy.types.Panel):
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()
@@ -1465,7 +1470,62 @@ def _string_value(value):
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 @@ class WM_OT_keyconfig_export(bpy.types.Operator):
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 @@ class WM_OT_keyconfig_export(bpy.types.Operator):
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 @@ class WM_OT_keyconfig_export(bpy.types.Operator):
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 @@ class WM_OT_keyconfig_export(bpy.types.Operator):
f.write("\n")
- f.write("wm.active_keyconfig = wm.keyconfigs[\'%s\']\n" % name)
f.close()
return {'FINISHED'}
@@ -1640,8 +1700,31 @@ class WM_OT_keyitem_remove(bpy.types.Operator):
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)
diff --git a/source/blender/makesdna/DNA_windowmanager_types.h b/source/blender/makesdna/DNA_windowmanager_types.h
index 8e1042f3e12..4a7080034ee 100644
--- a/source/blender/makesdna/DNA_windowmanager_types.h
+++ b/source/blender/makesdna/DNA_windowmanager_types.h
@@ -259,9 +259,7 @@ typedef struct wmKeyConfig {
} 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 */
diff --git a/source/blender/makesrna/intern/rna_wm.c b/source/blender/makesrna/intern/rna_wm.c
index 9c52e2cb9e9..a44816a5585 100644
--- a/source/blender/makesrna/intern/rna_wm.c
+++ b/source/blender/makesrna/intern/rna_wm.c
@@ -1185,6 +1185,11 @@ static void rna_def_keyconfig(BlenderRNA *brna)
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 */
diff --git a/source/blender/makesrna/intern/rna_wm_api.c b/source/blender/makesrna/intern/rna_wm_api.c
index 3fa646598d6..9759e72165a 100644
--- a/source/blender/makesrna/intern/rna_wm_api.c
+++ b/source/blender/makesrna/intern/rna_wm_api.c
@@ -182,12 +182,16 @@ void RNA_api_wm(StructRNA *srna)
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.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+
/* invoke functions, for use with python */
func= RNA_def_function(srna, "invoke_props_popup", "WM_operator_props_popup");
RNA_def_function_ui_description(func, "Operator popup invoke.");
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index 2b0b5fa612d..e7521db462d 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -97,6 +97,8 @@ void WM_cursor_warp (struct wmWindow *win, int x, int y);
/* keyconfig and keymap */
wmKeyConfig *WM_keyconfig_add (struct wmWindowManager *wm, char *idname);
+wmKeyConfig *WM_keyconfig_add_user(struct wmWindowManager *wm, char *idname);
+void WM_keyconfig_remove (struct wmWindowManager *wm, struct wmKeyConfig *keyconf);
void WM_keyconfig_free (struct wmKeyConfig *keyconf);
void WM_keyconfig_userdef(struct wmWindowManager *wm);
diff --git a/source/blender/windowmanager/intern/wm_keymap.c b/source/blender/windowmanager/intern/wm_keymap.c
index 7f0f355403d..4dbc1730033 100644
--- a/source/blender/windowmanager/intern/wm_keymap.c
+++ b/source/blender/windowmanager/intern/wm_keymap.c
@@ -85,6 +85,27 @@ wmKeyConfig *WM_keyconfig_add(wmWindowManager *wm, char *idname)
return keyconf;
}
+wmKeyConfig *WM_keyconfig_add_user(wmWindowManager *wm, char *idname)
+{
+ wmKeyConfig *keyconf = WM_keyconfig_add(wm, idname);
+
+ keyconf->flag |= KEYCONF_USER;
+
+ return keyconf;
+}
+
+void WM_keyconfig_remove(wmWindowManager *wm, wmKeyConfig *keyconf)
+{
+ if (keyconf) {
+ if (BLI_streq(U.keyconfigstr, keyconf->idname)) {
+ BLI_strncpy(U.keyconfigstr, wm->defaultconf->idname, sizeof(U.keyconfigstr));
+ }
+
+ BLI_remlink(&wm->keyconfigs, keyconf);
+ WM_keyconfig_free(keyconf);
+ }
+}
+
void WM_keyconfig_free(wmKeyConfig *keyconf)
{
wmKeyMap *km;
diff --git a/source/blenderplayer/bad_level_call_stubs/stubs.c b/source/blenderplayer/bad_level_call_stubs/stubs.c
index cb5cd7bf284..546ebc6d51e 100644
--- a/source/blenderplayer/bad_level_call_stubs/stubs.c
+++ b/source/blenderplayer/bad_level_call_stubs/stubs.c
@@ -114,6 +114,8 @@ struct wmKeyMap *WM_keymap_add_item(struct wmKeyMap *keymap, char *idname, int t
struct wmKeyMap *WM_keymap_copy_to_user(struct wmKeyMap *kemap){return (struct wmKeyMap *) NULL;}
struct wmKeyMap *WM_keymap_list_find(struct ListBase *lb, char *idname, int spaceid, int regionid){return (struct wmKeyMap *) NULL;}
struct wmKeyConfig *WM_keyconfig_add(struct wmWindowManager *wm, char *idname){return (struct wmKeyConfig *) NULL;}
+struct wmKeyConfig *WM_keyconfig_add_user(struct wmWindowManager *wm, char *idname){return (struct wmKeyConfig *) NULL;}
+void WM_keyconfig_remove(struct wmWindowManager *wm, char *idname){}
void WM_keymap_remove_item(struct wmKeyMap *keymap, struct wmKeyMapItem *kmi){}
void WM_keymap_restore_to_default(struct wmKeyMap *keymap){}
void WM_keymap_restore_item_to_default(struct bContext *C, struct wmKeyMap *keymap, struct wmKeyMapItem *kmi){}