[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [25426] trunk/blender: keymap editor

Martin Poirier theeth at yahoo.com
Thu Dec 17 04:32:36 CET 2009


Revision: 25426
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=25426
Author:   theeth
Date:     2009-12-17 04:32:33 +0100 (Thu, 17 Dec 2009)

Log Message:
-----------
keymap editor

New unique ID per keymap item (unique inside their keymap) for default and configuration keymaps.
This allows restoring a single user defined kmi to its previous (default or config) values instead of having to restore the whole keymap.
The restore item button is disabled for kmi added by the users (they don't have an ID).

Also fixes a bug in the rna function for add keymap item (parameter order was incorrect, messing adding back saved configurations).

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

Modified: trunk/blender/release/scripts/ui/space_userpref.py
===================================================================
--- trunk/blender/release/scripts/ui/space_userpref.py	2009-12-17 01:21:55 UTC (rev 25425)
+++ trunk/blender/release/scripts/ui/space_userpref.py	2009-12-17 03:32:33 UTC (rev 25426)
@@ -1365,6 +1365,7 @@
         else:
             row.label()
 
+        row.operator("wm.keyitem_restore", text="", icon='BACK')
         row.operator("wm.keyitem_remove", text="", icon='X')
 
         # Expanded, additional event settings
@@ -1666,7 +1667,25 @@
 
         return ('FINISHED',)
 
+class WM_OT_keyitem_restore(bpy.types.Operator):
+    "Restore key map item."
+    bl_idname = "wm.keyitem_restore"
+    bl_label = "Restore Key Map Item"
 
+    def poll(self, context):
+        kmi = context.keyitem
+        km = context.keymap
+        return km and kmi and kmi.id != 0
+
+    def execute(self, context):
+        wm = context.manager
+        kmi = context.keyitem
+        km = context.keymap
+
+        km.restore_item_to_default(kmi)
+
+        return ('FINISHED',)
+    
 class WM_OT_keyitem_add(bpy.types.Operator):
     "Add key map item."
     bl_idname = "wm.keyitem_add"
@@ -1699,4 +1718,4 @@
 bpy.ops.add(WM_OT_keymap_restore)
 bpy.ops.add(WM_OT_keyitem_add)
 bpy.ops.add(WM_OT_keyitem_remove)
-
+bpy.ops.add(WM_OT_keyitem_restore)

Modified: trunk/blender/source/blender/makesdna/DNA_windowmanager_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_windowmanager_types.h	2009-12-17 01:21:55 UTC (rev 25425)
+++ trunk/blender/source/blender/makesdna/DNA_windowmanager_types.h	2009-12-17 03:32:33 UTC (rev 25426)
@@ -262,7 +262,9 @@
 	short flag;
 
 	/* runtime */
-	short maptype, pad[2];			/* keymap editor */
+	short maptype;					/* keymap editor */
+	short id;						/* unique identifier */
+	short pad;
 	struct PointerRNA *ptr;			/* rna pointer to access properties */
 } wmKeyMapItem;
 
@@ -281,7 +283,7 @@
 	short regionid;		/* see above */
 	
 	short flag;			/* general flags */
-	short pad;
+	short kmi_id;		/* last kmi id */
 	
 	/* runtime */
 	int (*poll)(struct bContext *);	/* verify if enabled in the current context */

Modified: trunk/blender/source/blender/makesrna/intern/rna_wm.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_wm.c	2009-12-17 01:21:55 UTC (rev 25425)
+++ trunk/blender/source/blender/makesrna/intern/rna_wm.c	2009-12-17 03:32:33 UTC (rev 25426)
@@ -944,6 +944,11 @@
 	RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_KeyMapItem_value_itemf");
 	RNA_def_property_ui_text(prop, "Value", "");
 
+	prop= RNA_def_property(srna, "id", PROP_INT, PROP_NONE);
+	RNA_def_property_int_sdna(prop, NULL, "id");
+	RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+	RNA_def_property_ui_text(prop, "id", "ID of the item.");
+
 	prop= RNA_def_property(srna, "any", PROP_BOOLEAN, PROP_NONE);
 	RNA_def_property_boolean_funcs(prop, "rna_KeyMapItem_any_getf", "rna_KeyMapItem_any_setf");
 	RNA_def_property_ui_text(prop, "Any", "Any modifier keys pressed.");

Modified: trunk/blender/source/blender/makesrna/intern/rna_wm_api.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_wm_api.c	2009-12-17 01:21:55 UTC (rev 25425)
+++ trunk/blender/source/blender/makesrna/intern/rna_wm_api.c	2009-12-17 03:32:33 UTC (rev 25426)
@@ -113,8 +113,13 @@
 	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)
+static void rna_keymap_restore_item_to_default(wmKeyMap *km, bContext *C, wmKeyMapItem *kmi)
 {
+	WM_keymap_restore_item_to_default(C, km, kmi);
+}
+
+static wmKeyMapItem *rna_KeyMap_add_item(wmKeyMap *km, ReportList *reports, char *idname, 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;
 
@@ -276,6 +281,11 @@
 	RNA_def_function_return(func, parm);
 
 	func= RNA_def_function(srna, "restore_to_default", "WM_keymap_restore_to_default");
+
+	func= RNA_def_function(srna, "restore_item_to_default", "rna_keymap_restore_item_to_default");
+	RNA_def_function_flag(func, FUNC_USE_CONTEXT);
+	parm= RNA_def_pointer(func, "item", "KeyMapItem", "Item", "");
+	RNA_def_property_flag(parm, PROP_REQUIRED);
 }
 
 #endif

Modified: trunk/blender/source/blender/windowmanager/WM_api.h
===================================================================
--- trunk/blender/source/blender/windowmanager/WM_api.h	2009-12-17 01:21:55 UTC (rev 25425)
+++ trunk/blender/source/blender/windowmanager/WM_api.h	2009-12-17 03:32:33 UTC (rev 25426)
@@ -114,6 +114,7 @@
 wmKeyMap	*WM_keymap_copy_to_user(struct wmKeyMap *keymap);
 void		WM_keymap_restore_to_default(struct wmKeyMap *keymap);
 void		WM_keymap_properties_reset(struct wmKeyMapItem *kmi);
+void		WM_keymap_restore_item_to_default(struct bContext *C, struct wmKeyMap *keymap, struct wmKeyMapItem *kmi);
 
 wmKeyMap	*WM_modalkeymap_add(struct wmKeyConfig *keyconf, char *idname, struct EnumPropertyItem *items);
 wmKeyMap	*WM_modalkeymap_get(struct wmKeyConfig *keyconf, char *idname);

Modified: trunk/blender/source/blender/windowmanager/intern/wm_keymap.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_keymap.c	2009-12-17 01:21:55 UTC (rev 25425)
+++ trunk/blender/source/blender/windowmanager/intern/wm_keymap.c	2009-12-17 03:32:33 UTC (rev 25426)
@@ -201,6 +201,12 @@
 
 	keymap_event_set(kmi, type, val, modifier, keymodifier);
 	keymap_properties_set(kmi);
+
+	if ((keymap->flag & KEYMAP_USER) == 0) {
+		keymap->kmi_id++;
+		kmi->id = keymap->kmi_id;
+	}
+
 	return kmi;
 }
 
@@ -291,6 +297,11 @@
 	
 	keymap_event_set(kmi, type, val, modifier, keymodifier);
 
+	if ((km->flag & KEYMAP_USER) == 0) {
+		km->kmi_id++;
+		kmi->id = km->kmi_id;
+	}
+
 	return kmi;
 }
 
@@ -545,6 +556,55 @@
 	return usermap;
 }
 
+void WM_keymap_restore_item_to_default(bContext *C, wmKeyMap *keymap, wmKeyMapItem *kmi)
+{
+	wmWindowManager *wm = CTX_wm_manager(C);
+	wmKeyConfig *keyconf;
+	wmKeyMap *km = NULL;
+
+	/* look in user key config */
+	keyconf= wm_keyconfig_list_find(&wm->keyconfigs, U.keyconfigstr);
+	if(keyconf) {
+		km= WM_keymap_list_find(&keyconf->keymaps, keymap->idname, keymap->spaceid, keymap->regionid);
+	}
+
+	if (!km) {
+		/* or from default */
+		km= WM_keymap_list_find(&wm->defaultconf->keymaps, keymap->idname, keymap->spaceid, keymap->regionid);
+	}
+
+	if (km) {
+		wmKeyMapItem *orig;
+
+		for (orig = km->items.first; orig; orig = orig->next) {
+			if (orig->id == kmi->id)
+				break;
+		}
+
+		if (orig) {
+			if(strcmp(orig->idname, kmi->idname) != 0) {
+				BLI_strncpy(kmi->idname, orig->idname, sizeof(kmi->idname));
+
+				WM_keymap_properties_reset(kmi);
+			}
+			kmi->properties= IDP_CopyProperty(orig->properties);
+			kmi->ptr->data= kmi->properties;
+
+			kmi->propvalue = orig->propvalue;
+			kmi->type = orig->type;
+			kmi->val = orig->val;
+			kmi->shift = orig->shift;
+			kmi->ctrl = orig->ctrl;
+			kmi->alt = orig->alt;
+			kmi->oskey = orig->oskey;
+			kmi->keymodifier = orig->keymodifier;
+			kmi->maptype = orig->maptype;
+
+		}
+
+	}
+}
+
 void WM_keymap_restore_to_default(wmKeyMap *keymap)
 {
 	wmKeyMap *usermap;





More information about the Bf-blender-cvs mailing list