[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [24596] trunk/blender: Fixing keymap export:

Martin Poirier theeth at yahoo.com
Mon Nov 16 21:50:02 CET 2009


Revision: 24596
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=24596
Author:   theeth
Date:     2009-11-16 21:50:02 +0100 (Mon, 16 Nov 2009)

Log Message:
-----------
Fixing keymap export:
- Didn't support new userdef keymaps (new "active" rna function to get the active version of a keymap)
- Didn't support modal keymaps (new "modal" param to add_keymap function, new "add_modal_item" function on keymaps (both functions now make sure the keymap is of the right type))

Modified Paths:
--------------
    trunk/blender/release/scripts/ui/space_userpref.py
    trunk/blender/source/blender/makesrna/RNA_enum_types.h
    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

Modified: trunk/blender/release/scripts/ui/space_userpref.py
===================================================================
--- trunk/blender/release/scripts/ui/space_userpref.py	2009-11-16 20:16:45 UTC (rev 24595)
+++ trunk/blender/release/scripts/ui/space_userpref.py	2009-11-16 20:50:02 UTC (rev 24596)
@@ -1325,18 +1325,25 @@
         f.write("kc = wm.add_keyconfig(\'%s\')\n\n" % kc.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\')\n\n" % (km.name, km.space_type, km.region_type))
+            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:
-                f.write("kmi = km.add_item(\'%s\', \'%s\', \'%s\'" % (kmi.idname, kmi.type, kmi.value))
-                if kmi.shift:
-                    f.write(", shift=True")
-                if kmi.ctrl:
-                    f.write(", ctrl=True")
-                if kmi.alt:
-                    f.write(", alt=True")
-                if kmi.oskey:
-                    f.write(", oskey=True")
+                if km.modal:
+                    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))
+                if kmi.any:
+                    f.write(", any=True")
+                else:
+                    if kmi.shift:
+                        f.write(", shift=True")
+                    if kmi.ctrl:
+                        f.write(", ctrl=True")
+                    if kmi.alt:
+                        f.write(", alt=True")
+                    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(")\n")
@@ -1403,7 +1410,10 @@
     def execute(self, context):
         wm = context.manager
         km = wm.active_keymap
-        km.add_item("", 'A', 'PRESS') # kmi
+        if km.modal:
+            km.add_modal_item("", 'A', 'PRESS') # kmi
+        else:
+            km.add_item("", 'A', 'PRESS') # kmi
         return ('FINISHED',)
 
 

Modified: trunk/blender/source/blender/makesrna/RNA_enum_types.h
===================================================================
--- trunk/blender/source/blender/makesrna/RNA_enum_types.h	2009-11-16 20:16:45 UTC (rev 24595)
+++ trunk/blender/source/blender/makesrna/RNA_enum_types.h	2009-11-16 20:50:02 UTC (rev 24596)
@@ -67,6 +67,8 @@
 
 extern EnumPropertyItem space_type_items[];
 
+extern EnumPropertyItem keymap_propvalue_items[];
+
 struct bContext;
 struct PointerRNA;
 EnumPropertyItem *rna_TransformOrientation_itemf(struct bContext *C, struct PointerRNA *ptr, int *free);

Modified: trunk/blender/source/blender/makesrna/intern/rna_wm_api.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_wm_api.c	2009-11-16 20:16:45 UTC (rev 24595)
+++ trunk/blender/source/blender/makesrna/intern/rna_wm_api.c	2009-11-16 20:50:02 UTC (rev 24596)
@@ -43,15 +43,79 @@
 #include "WM_api.h"
 #include "WM_types.h"
 
-static wmKeyMapItem *rna_KeyMap_add_item(wmKeyMap *km, char *idname, int type, int value, int shift, int ctrl, int alt, int oskey, int keymodifier)
+static wmKeyMap *rna_keymap_add(wmKeyConfig *keyconf, char *idname, int spaceid, int regionid, int modal)
 {
+	if (modal == 0) {
+		return WM_keymap_find(keyconf, idname, spaceid, regionid);
+	} else {
+		return WM_modalkeymap_add(keyconf, idname, NULL); /* items will be lazy init */
+	}
+}
+
+static wmKeyMap *rna_keymap_active(wmKeyMap *km, bContext *C)
+{
+	wmWindowManager *wm = CTX_wm_manager(C);
+	return WM_keymap_active(wm, km);
+}
+
+
+static wmKeyMapItem *rna_KeyMap_add_modal_item(wmKeyMap *km, bContext *C, ReportList *reports, char* propvalue_str, int type, int value, int any, int shift, int ctrl, int alt, int oskey, int keymodifier)
+{
+	wmWindowManager *wm = CTX_wm_manager(C);
 	int modifier= 0;
+	int propvalue = 0;
 
+	/* only modal maps */
+	if ((km->flag & KEYMAP_MODAL) == 0) {
+		BKE_report(reports, RPT_ERROR, "Not a modal keymap.");
+		return NULL;
+	}
+
+	if (!km->modal_items) {
+		if(!WM_keymap_user_init(wm, km)) {
+			BKE_report(reports, RPT_ERROR, "User defined keymap doesn't correspond to a system keymap.");
+			return NULL;
+		}
+	}
+
+	if (!km->modal_items) {
+		BKE_report(reports, RPT_ERROR, "No property values defined.");
+		return NULL;
+	}
+
+
+	if(RNA_enum_value_from_id(km->modal_items, propvalue_str, &propvalue)==0) {
+		BKE_report(reports, RPT_WARNING, "Property value not in enumeration.");
+	}
+
 	if(shift) modifier |= KM_SHIFT;
 	if(ctrl) modifier |= KM_CTRL;
 	if(alt) modifier |= KM_ALT;
 	if(oskey) modifier |= KM_OSKEY;
 
+	if(any) modifier = KM_ANY;
+
+	return WM_modalkeymap_add_item(km, type, value, modifier, keymodifier, propvalue);
+}
+
+static wmKeyMapItem *rna_KeyMap_add_item(wmKeyMap *km, ReportList *reports, char *idname, int type, int any, int value, int shift, int ctrl, int alt, int oskey, int keymodifier)
+{
+//	wmWindowManager *wm = CTX_wm_manager(C);
+	int modifier= 0;
+
+	/* only on non-modal maps */
+	if (km->flag & KEYMAP_MODAL) {
+		BKE_report(reports, RPT_ERROR, "Not a non-modal keymap.");
+		return NULL;
+	}
+
+	if(shift) modifier |= KM_SHIFT;
+	if(ctrl) modifier |= KM_CTRL;
+	if(alt) modifier |= KM_ALT;
+	if(oskey) modifier |= KM_OSKEY;
+
+	if(any) modifier = KM_ANY;
+
 	return WM_keymap_add_item(km, idname, type, value, modifier, keymodifier);
 }
 
@@ -90,11 +154,12 @@
 	FunctionRNA *func;
 	PropertyRNA *parm;
 
-	func= RNA_def_function(srna, "add_keymap", "WM_keymap_find");
+	func= RNA_def_function(srna, "add_keymap", "rna_keymap_add");
 	parm= RNA_def_string(func, "name", "", 0, "Name", "");
 	RNA_def_property_flag(parm, PROP_REQUIRED);
 	RNA_def_enum(func, "space_type", space_type_items, SPACE_EMPTY, "Space Type", "");
 	RNA_def_enum(func, "region_type", region_type_items, RGN_TYPE_WINDOW, "Region Type", "");
+	RNA_def_boolean(func, "modal", 0, "Modal", "");
 	parm= RNA_def_pointer(func, "keymap", "KeyMap", "Key Map", "Added key map.");
 	RNA_def_function_return(func, parm);
 }
@@ -105,12 +170,14 @@
 	PropertyRNA *parm;
 
 	func= RNA_def_function(srna, "add_item", "rna_KeyMap_add_item");
+	RNA_def_function_flag(func, FUNC_USE_REPORTS);
 	parm= RNA_def_string(func, "idname", "", 0, "Operator Identifier", "");
 	RNA_def_property_flag(parm, PROP_REQUIRED);
 	parm= RNA_def_enum(func, "type", event_type_items, 0, "Type", "");
 	RNA_def_property_flag(parm, PROP_REQUIRED);
 	parm= RNA_def_enum(func, "value", event_value_items, 0, "Value", "");
 	RNA_def_property_flag(parm, PROP_REQUIRED);
+	RNA_def_boolean(func, "any", 0, "Any", "");
 	RNA_def_boolean(func, "shift", 0, "Shift", "");
 	RNA_def_boolean(func, "ctrl", 0, "Ctrl", "");
 	RNA_def_boolean(func, "alt", 0, "Alt", "");
@@ -119,6 +186,28 @@
 	parm= RNA_def_pointer(func, "item", "KeyMapItem", "Item", "Added key map item.");
 	RNA_def_function_return(func, parm);
 
+	func= RNA_def_function(srna, "add_modal_item", "rna_KeyMap_add_modal_item");
+	RNA_def_function_flag(func, FUNC_USE_CONTEXT|FUNC_USE_REPORTS);
+	parm= RNA_def_string(func, "propvalue", "", 0, "Property Value", "");
+	RNA_def_property_flag(parm, PROP_REQUIRED);
+	parm= RNA_def_enum(func, "type", event_type_items, 0, "Type", "");
+	RNA_def_property_flag(parm, PROP_REQUIRED);
+	parm= RNA_def_enum(func, "value", event_value_items, 0, "Value", "");
+	RNA_def_property_flag(parm, PROP_REQUIRED);
+	RNA_def_boolean(func, "any", 0, "Any", "");
+	RNA_def_boolean(func, "shift", 0, "Shift", "");
+	RNA_def_boolean(func, "ctrl", 0, "Ctrl", "");
+	RNA_def_boolean(func, "alt", 0, "Alt", "");
+	RNA_def_boolean(func, "oskey", 0, "OS Key", "");
+	RNA_def_enum(func, "key_modifier", event_type_items, 0, "Key Modifier", "");
+	parm= RNA_def_pointer(func, "item", "KeyMapItem", "Item", "Added key map item.");
+	RNA_def_function_return(func, parm);
+
+	func= RNA_def_function(srna, "active", "rna_keymap_active");
+	RNA_def_function_flag(func, FUNC_USE_CONTEXT);
+	parm= RNA_def_pointer(func, "keymap", "KeyMap", "Key Map", "Active key map.");
+	RNA_def_function_return(func, parm);
+
 	func= RNA_def_function(srna, "remove_item", "WM_keymap_remove_item");
 	parm= RNA_def_pointer(func, "item", "KeyMapItem", "Item", "");
 	RNA_def_property_flag(parm, PROP_REQUIRED);

Modified: trunk/blender/source/blender/windowmanager/WM_api.h
===================================================================
--- trunk/blender/source/blender/windowmanager/WM_api.h	2009-11-16 20:16:45 UTC (rev 24595)
+++ trunk/blender/source/blender/windowmanager/WM_api.h	2009-11-16 20:50:02 UTC (rev 24596)
@@ -111,7 +111,7 @@
 
 wmKeyMap	*WM_modalkeymap_add(struct wmKeyConfig *keyconf, char *idname, struct EnumPropertyItem *items);
 wmKeyMap	*WM_modalkeymap_get(struct wmKeyConfig *keyconf, char *idname);
-void		WM_modalkeymap_add_item(struct wmKeyMap *km, int type, int val, int modifier, int keymodifier, int value);
+wmKeyMapItem *WM_modalkeymap_add_item(struct wmKeyMap *km, int type, int val, int modifier, int keymodifier, int value);
 void		WM_modalkeymap_assign(struct wmKeyMap *km, char *opname);
 
 const char	*WM_key_event_string(short type);

Modified: trunk/blender/source/blender/windowmanager/intern/wm_keymap.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_keymap.c	2009-11-16 20:16:45 UTC (rev 24595)
+++ trunk/blender/source/blender/windowmanager/intern/wm_keymap.c	2009-11-16 20:50:02 UTC (rev 24596)
@@ -263,7 +263,7 @@
 }
 
 
-void WM_modalkeymap_add_item(wmKeyMap *km, int type, int val, int modifier, int keymodifier, int value)
+wmKeyMapItem *WM_modalkeymap_add_item(wmKeyMap *km, int type, int val, int modifier, int keymodifier, int value)
 {
 	wmKeyMapItem *kmi= MEM_callocN(sizeof(wmKeyMapItem), "keymap entry");
 	
@@ -271,6 +271,8 @@
 	kmi->propvalue= value;
 	
 	keymap_event_set(kmi, type, val, modifier, keymodifier);
+
+	return kmi;
 }
 
 void WM_modalkeymap_assign(wmKeyMap *km, char *opname)





More information about the Bf-blender-cvs mailing list