diff options
-rw-r--r-- | release/scripts/ui/space_userpref_keymap.py | 16 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_windowmanager_types.h | 2 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_wm.c | 11 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_keymap.c | 25 |
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; } |