[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [33496] trunk/blender: [#25047] Deletion of any custom key map item remove always first one

Martin Poirier theeth at yahoo.com
Mon Dec 6 03:42:59 CET 2010


Revision: 33496
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=33496
Author:   theeth
Date:     2010-12-06 03:42:59 +0100 (Mon, 06 Dec 2010)

Log Message:
-----------
[#25047] Deletion of any custom key map item remove always first one

keymap item id for user defined keymaps wasn't defined properly. This is really old, I'm surprised with didn't catch this before.

Modified Paths:
--------------
    trunk/blender/release/scripts/ui/space_userpref_keymap.py
    trunk/blender/source/blender/makesdna/DNA_windowmanager_types.h
    trunk/blender/source/blender/makesrna/intern/rna_wm.c
    trunk/blender/source/blender/windowmanager/intern/wm_keymap.c

Modified: trunk/blender/release/scripts/ui/space_userpref_keymap.py
===================================================================
--- trunk/blender/release/scripts/ui/space_userpref_keymap.py	2010-12-06 02:32:16 UTC (rev 33495)
+++ trunk/blender/release/scripts/ui/space_userpref_keymap.py	2010-12-06 02:42:59 UTC (rev 33496)
@@ -279,7 +279,7 @@
         else:
             row.label()
 
-        if kmi.id:
+        if not kmi.is_user_defined:
             op = row.operator("wm.keyitem_restore", text="", icon='BACK')
             op.item_id = kmi.id
         op = row.operator("wm.keyitem_remove", text="", icon='X')
@@ -708,12 +708,18 @@
 
     item_id = IntProperty(name="Item Identifier", description="Identifier of the item to remove")
 
+    @classmethod
+    def poll(cls, context):
+        km = context.keymap
+        return km.is_user_defined
+
     def execute(self, context):
         wm = context.window_manager
         km = context.keymap
         kmi = km.items.from_id(self.item_id)
 
-        km.restore_item_to_default(kmi)
+        if not kmi.is_user_defined:
+            km.restore_item_to_default(kmi)
 
         return {'FINISHED'}
 
@@ -749,8 +755,12 @@
 
     item_id = IntProperty(name="Item Identifier", description="Identifier of the item to remove")
 
+    @classmethod
+    def poll(cls, context):
+        km = context.keymap
+        return km.is_user_defined
+
     def execute(self, context):
-        wm = context.window_manager
         km = context.keymap
         kmi = km.items.from_id(self.item_id)
         km.items.remove(kmi)

Modified: trunk/blender/source/blender/makesdna/DNA_windowmanager_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_windowmanager_types.h	2010-12-06 02:32:16 UTC (rev 33495)
+++ trunk/blender/source/blender/makesdna/DNA_windowmanager_types.h	2010-12-06 02:42:59 UTC (rev 33496)
@@ -228,7 +228,7 @@
 
 	/* runtime */
 	short maptype;					/* keymap editor */
-	short id;						/* unique identifier */
+	short id;						/* unique identifier. Positive for kmi that override builtins, negative otherwise */
 	short pad;
 	struct PointerRNA *ptr;			/* rna pointer to access properties */
 } wmKeyMapItem;

Modified: trunk/blender/source/blender/makesrna/intern/rna_wm.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_wm.c	2010-12-06 02:32:16 UTC (rev 33495)
+++ trunk/blender/source/blender/makesrna/intern/rna_wm.c	2010-12-06 02:42:59 UTC (rev 33496)
@@ -612,6 +612,12 @@
 		return 0;
 }
 
+static int rna_KeyMapItem_userdefined_get(PointerRNA *ptr)
+{
+	wmKeyMapItem *kmi= ptr->data;
+	return kmi->id < 0;
+}
+
 static void rna_wmClipboard_get(PointerRNA *ptr, char *value)
 {
 	char *pbuf;
@@ -1679,6 +1685,11 @@
 	RNA_def_property_ui_text(prop, "Active", "Activate or deactivate item");
 	RNA_def_property_ui_icon(prop, ICON_CHECKBOX_DEHLT, 1);
 
+	prop= RNA_def_property(srna, "is_user_defined", PROP_BOOLEAN, PROP_NONE);
+	RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+	RNA_def_property_ui_text(prop, "User Defined", "Is this keymap item user defined (doesn't just override a builtin item)");
+	RNA_def_property_boolean_funcs(prop, "rna_KeyMapItem_userdefined_get", NULL);
+
 	RNA_api_keymapitem(srna);
 }
 

Modified: trunk/blender/source/blender/windowmanager/intern/wm_keymap.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_keymap.c	2010-12-06 02:32:16 UTC (rev 33495)
+++ trunk/blender/source/blender/windowmanager/intern/wm_keymap.c	2010-12-06 02:42:59 UTC (rev 33496)
@@ -196,6 +196,16 @@
 	}
 }
 
+static void keymap_item_set_id(wmKeyMap *keymap, wmKeyMapItem *kmi)
+{
+	keymap->kmi_id++;
+	if ((keymap->flag & KEYMAP_USER) == 0) {
+		kmi->id = keymap->kmi_id;
+	} else {
+		kmi->id = -keymap->kmi_id; // User defined keymap entries have negative ids
+	}
+}
+
 /* if item was added, then bail out */
 wmKeyMapItem *WM_keymap_verify_item(wmKeyMap *keymap, const char *idname, int type, int val, int modifier, int keymodifier)
 {
@@ -210,10 +220,7 @@
 		BLI_addtail(&keymap->items, kmi);
 		BLI_strncpy(kmi->idname, idname, OP_MAX_TYPENAME);
 		
-		if ((keymap->flag & KEYMAP_USER) == 0) {
-			keymap->kmi_id++;
-			kmi->id = keymap->kmi_id;
-		}
+		keymap_item_set_id(keymap, kmi);
 
 		keymap_event_set(kmi, type, val, modifier, keymodifier);
 		keymap_properties_set(kmi);
@@ -232,10 +239,7 @@
 	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;
-	}
+	keymap_item_set_id(keymap, kmi);
 
 	return kmi;
 }
@@ -354,10 +358,7 @@
 	
 	keymap_event_set(kmi, type, val, modifier, keymodifier);
 
-	if ((km->flag & KEYMAP_USER) == 0) {
-		km->kmi_id++;
-		kmi->id = km->kmi_id;
-	}
+	keymap_item_set_id(km, kmi);
 
 	return kmi;
 }





More information about the Bf-blender-cvs mailing list