[#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.
This commit is contained in:
parent
a724918cf3
commit
a1fed1e268
@ -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)
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user