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:
authorMartin Poirier <theeth@yahoo.com>2010-12-06 05:42:59 +0300
committerMartin Poirier <theeth@yahoo.com>2010-12-06 05:42:59 +0300
commita1fed1e268aa3bd6ad32acf751022e5f12db0233 (patch)
tree0fd6fe1efdd219d2ceef62bf906996435fe41f1d
parenta724918cf3997cbd1fc33c663d1a76441c2deeb0 (diff)
[#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.
-rw-r--r--release/scripts/ui/space_userpref_keymap.py16
-rw-r--r--source/blender/makesdna/DNA_windowmanager_types.h2
-rw-r--r--source/blender/makesrna/intern/rna_wm.c11
-rw-r--r--source/blender/windowmanager/intern/wm_keymap.c25
4 files changed, 38 insertions, 16 deletions
diff --git a/release/scripts/ui/space_userpref_keymap.py b/release/scripts/ui/space_userpref_keymap.py
index 70fb2c57e9b..4569020efd9 100644
--- a/release/scripts/ui/space_userpref_keymap.py
+++ b/release/scripts/ui/space_userpref_keymap.py
@@ -279,7 +279,7 @@ class InputKeyMapPanel(bpy.types.Panel):
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 @@ class WM_OT_keyitem_restore(bpy.types.Operator):
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 @@ class WM_OT_keyitem_remove(bpy.types.Operator):
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)
diff --git a/source/blender/makesdna/DNA_windowmanager_types.h b/source/blender/makesdna/DNA_windowmanager_types.h
index 78acd1327e7..e2eba140a55 100644
--- a/source/blender/makesdna/DNA_windowmanager_types.h
+++ b/source/blender/makesdna/DNA_windowmanager_types.h
@@ -228,7 +228,7 @@ typedef struct wmKeyMapItem {
/* 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;
diff --git a/source/blender/makesrna/intern/rna_wm.c b/source/blender/makesrna/intern/rna_wm.c
index bf00f625f42..11aed2127a8 100644
--- a/source/blender/makesrna/intern/rna_wm.c
+++ b/source/blender/makesrna/intern/rna_wm.c
@@ -612,6 +612,12 @@ static int rna_wmKeyMapItem_name_length(PointerRNA *ptr)
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 @@ static void rna_def_keyconfig(BlenderRNA *brna)
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);
}
diff --git a/source/blender/windowmanager/intern/wm_keymap.c b/source/blender/windowmanager/intern/wm_keymap.c
index 24aeaae4a0e..df635c0ccb2 100644
--- a/source/blender/windowmanager/intern/wm_keymap.c
+++ b/source/blender/windowmanager/intern/wm_keymap.c
@@ -196,6 +196,16 @@ static void keymap_event_set(wmKeyMapItem *kmi, short type, short val, int modif
}
}
+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 @@ wmKeyMapItem *WM_keymap_verify_item(wmKeyMap *keymap, const char *idname, int ty
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 @@ wmKeyMapItem *WM_keymap_add_item(wmKeyMap *keymap, const char *idname, int type,
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 @@ wmKeyMapItem *WM_modalkeymap_add_item(wmKeyMap *km, int type, int val, int modif
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;
}