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:
-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;
}