From d60acd05e809dcb4d542bed11f735b259ebcddb8 Mon Sep 17 00:00:00 2001 From: Alexander Revkov Date: Sun, 2 Apr 2023 15:56:42 +0500 Subject: [PATCH 1/2] added own keymaps for each node editor --- .../bl_keymap_utils/keymap_hierarchy.py | 4 ++++ source/blender/editors/space_node/node_ops.cc | 5 +++++ .../blender/editors/space_node/space_node.cc | 8 ++++++++ .../windowmanager/intern/wm_keymap_utils.c | 18 +++++++++++++++++- 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/scripts/modules/bl_keymap_utils/keymap_hierarchy.py b/scripts/modules/bl_keymap_utils/keymap_hierarchy.py index 21d80a1ed71..c54c537ad6d 100644 --- a/scripts/modules/bl_keymap_utils/keymap_hierarchy.py +++ b/scripts/modules/bl_keymap_utils/keymap_hierarchy.py @@ -155,6 +155,10 @@ _km_hierarchy = [ ('Node Editor', 'NODE_EDITOR', 'WINDOW', [ ('Node Generic', 'NODE_EDITOR', 'WINDOW', []), + ('Shader Nodes', 'NODE_EDITOR', 'WINDOW', []), + ('Texture Nodes', 'NODE_EDITOR', 'WINDOW', []), + ('Geometry Nodes', 'NODE_EDITOR', 'WINDOW', []), + ('Compositor Nodes', 'NODE_EDITOR', 'WINDOW', []), ]), ('SequencerCommon', 'SEQUENCE_EDITOR', 'WINDOW', [ ('Sequencer', 'SEQUENCE_EDITOR', 'WINDOW', [ diff --git a/source/blender/editors/space_node/node_ops.cc b/source/blender/editors/space_node/node_ops.cc index f79bb78d1f8..160127a7ab7 100644 --- a/source/blender/editors/space_node/node_ops.cc +++ b/source/blender/editors/space_node/node_ops.cc @@ -123,6 +123,11 @@ void node_keymap(wmKeyConfig *keyconf) /* Main Region only ----------------- */ WM_keymap_ensure(keyconf, "Node Editor", SPACE_NODE, 0); + WM_keymap_ensure(keyconf, "Shader Nodes", SPACE_NODE, 0); + WM_keymap_ensure(keyconf, "Texture Nodes", SPACE_NODE, 0); + WM_keymap_ensure(keyconf, "Geometry Nodes", SPACE_NODE, 0); + WM_keymap_ensure(keyconf, "Compositor Nodes", SPACE_NODE, 0); + node_link_modal_keymap(keyconf); } diff --git a/source/blender/editors/space_node/space_node.cc b/source/blender/editors/space_node/space_node.cc index 05a7a60fc7e..c39e4c9c7af 100644 --- a/source/blender/editors/space_node/space_node.cc +++ b/source/blender/editors/space_node/space_node.cc @@ -46,6 +46,8 @@ using blender::float2; +static char G_tree_idname[64] = {}; + /* ******************** tree path ********************* */ void ED_node_tree_start(SpaceNode *snode, bNodeTree *ntree, ID *id, ID *from) @@ -324,6 +326,9 @@ static void node_init(wmWindowManager * /*wm*/, ScrArea *area) if (snode->runtime == nullptr) { snode->runtime = MEM_new(__func__); } + + BLI_strncpy( + G_tree_idname, snode->tree_idname, strlen(snode->tree_idname) - strlen("NodeTree") + 1); } static bool any_node_uses_id(const bNodeTree *ntree, const ID *id) @@ -640,6 +645,9 @@ static void node_main_region_init(wmWindowManager *wm, ARegion *region) keymap = WM_keymap_ensure(wm->defaultconf, "Node Editor", SPACE_NODE, 0); WM_event_add_keymap_handler_v2d_mask(®ion->handlers, keymap); + keymap = WM_keymap_ensure(wm->defaultconf, strcat(G_tree_idname, " Nodes"), SPACE_NODE, 0); + WM_event_add_keymap_handler_v2d_mask(®ion->handlers, keymap); + /* add drop boxes */ lb = WM_dropboxmap_find("Node Editor", SPACE_NODE, RGN_TYPE_WINDOW); diff --git a/source/blender/windowmanager/intern/wm_keymap_utils.c b/source/blender/windowmanager/intern/wm_keymap_utils.c index 3126a06b134..79473f4c374 100644 --- a/source/blender/windowmanager/intern/wm_keymap_utils.c +++ b/source/blender/windowmanager/intern/wm_keymap_utils.c @@ -347,7 +347,23 @@ wmKeyMap *WM_keymap_guess_opname(const bContext *C, const char *opname) } /* Node Editor */ else if (STRPREFIX(opname, "NODE_OT")) { - km = WM_keymap_find_all(wm, "Node Editor", sl->spacetype, 0); + SpaceNode *snode = (SpaceNode *)sl; + + if (STRPREFIX(snode->tree_idname, "Shader")) { + km = WM_keymap_find_all(wm, "Shader Nodes", sl->spacetype, 0); + } + else if (STRPREFIX(snode->tree_idname, "Texture")) { + km = WM_keymap_find_all(wm, "Texture Nodes", sl->spacetype, 0); + } + else if (STRPREFIX(snode->tree_idname, "Geometry")) { + km = WM_keymap_find_all(wm, "Geometry Nodes", sl->spacetype, 0); + } + else if (STRPREFIX(snode->tree_idname, "Compositor")) { + km = WM_keymap_find_all(wm, "Compositor Nodes", sl->spacetype, 0); + } + else { + km = WM_keymap_find_all(wm, "Node Editor", sl->spacetype, 0); + } } /* Animation Editor Channels */ else if (STRPREFIX(opname, "ANIM_OT_channels")) { -- 2.30.2 From c5a3146fd0a21284f54b86546167cada59c77cde Mon Sep 17 00:00:00 2001 From: Alexander Revkov Date: Wed, 12 Apr 2023 23:02:40 +0500 Subject: [PATCH 2/2] Added handling of the situation when the user changes the subtype of the node editor --- source/blender/editors/space_node/node_ops.cc | 8 ++-- .../blender/editors/space_node/space_node.cc | 37 +++++++++++++++++-- .../windowmanager/intern/wm_keymap_utils.c | 8 ++-- 3 files changed, 41 insertions(+), 12 deletions(-) diff --git a/source/blender/editors/space_node/node_ops.cc b/source/blender/editors/space_node/node_ops.cc index 160127a7ab7..c473561e773 100644 --- a/source/blender/editors/space_node/node_ops.cc +++ b/source/blender/editors/space_node/node_ops.cc @@ -123,10 +123,10 @@ void node_keymap(wmKeyConfig *keyconf) /* Main Region only ----------------- */ WM_keymap_ensure(keyconf, "Node Editor", SPACE_NODE, 0); - WM_keymap_ensure(keyconf, "Shader Nodes", SPACE_NODE, 0); - WM_keymap_ensure(keyconf, "Texture Nodes", SPACE_NODE, 0); - WM_keymap_ensure(keyconf, "Geometry Nodes", SPACE_NODE, 0); - WM_keymap_ensure(keyconf, "Compositor Nodes", SPACE_NODE, 0); + WM_keymap_ensure(keyconf, "Shader Nodes", SPACE_NODE, RGN_TYPE_WINDOW); + WM_keymap_ensure(keyconf, "Texture Nodes", SPACE_NODE, RGN_TYPE_WINDOW); + WM_keymap_ensure(keyconf, "Geometry Nodes", SPACE_NODE, RGN_TYPE_WINDOW); + WM_keymap_ensure(keyconf, "Compositor Nodes", SPACE_NODE, RGN_TYPE_WINDOW); node_link_modal_keymap(keyconf); } diff --git a/source/blender/editors/space_node/space_node.cc b/source/blender/editors/space_node/space_node.cc index c39e4c9c7af..a3254c01507 100644 --- a/source/blender/editors/space_node/space_node.cc +++ b/source/blender/editors/space_node/space_node.cc @@ -46,8 +46,6 @@ using blender::float2; -static char G_tree_idname[64] = {}; - /* ******************** tree path ********************* */ void ED_node_tree_start(SpaceNode *snode, bNodeTree *ntree, ID *id, ID *from) @@ -318,6 +316,8 @@ static void node_free(SpaceLink *sl) } } +static char G_tree_idname[64] = {}; + /* spacetype; init callback */ static void node_init(wmWindowManager * /*wm*/, ScrArea *area) { @@ -630,6 +630,34 @@ static void node_cursor(wmWindow *win, ScrArea *area, ARegion *region) snode->runtime->cursor[1] /= UI_SCALE_FAC; } +static void node_remove_all_private_keymaps(wmWindowManager *wm, ARegion *region) +{ + wmKeyMap *keymap; + const char *keymap_ids[4]{"Shader Nodes", "Texture Nodes", "Geometry Nodes", "Compositor Nodes"}; + + for (int i = 0; i < 4; i++) { + keymap = WM_keymap_list_find( + &wm->defaultconf->keymaps, keymap_ids[i], SPACE_NODE, RGN_TYPE_WINDOW); + if (keymap != NULL) { + WM_event_remove_keymap_handler(®ion->handlers, keymap); + } + } +} + +static void node_add_private_keymaps(wmWindowManager *wm, ARegion *region) +{ + node_remove_all_private_keymaps(wm, region); + + char spec_keymap_id[64] = {}; + STRNCPY(spec_keymap_id, G_tree_idname); + size_t slen = BLI_strnlen(spec_keymap_id, 64); + STR_CONCAT(spec_keymap_id, slen, " Nodes"); + + wmKeyMap *keymap = WM_keymap_ensure( + wm->defaultconf, spec_keymap_id, SPACE_NODE, RGN_TYPE_WINDOW); + WM_event_add_keymap_handler_v2d_mask(®ion->handlers, keymap); +} + /* Initialize main region, setting handlers. */ static void node_main_region_init(wmWindowManager *wm, ARegion *region) { @@ -645,8 +673,7 @@ static void node_main_region_init(wmWindowManager *wm, ARegion *region) keymap = WM_keymap_ensure(wm->defaultconf, "Node Editor", SPACE_NODE, 0); WM_event_add_keymap_handler_v2d_mask(®ion->handlers, keymap); - keymap = WM_keymap_ensure(wm->defaultconf, strcat(G_tree_idname, " Nodes"), SPACE_NODE, 0); - WM_event_add_keymap_handler_v2d_mask(®ion->handlers, keymap); + node_add_private_keymaps(wm, region); /* add drop boxes */ lb = WM_dropboxmap_find("Node Editor", SPACE_NODE, RGN_TYPE_WINDOW); @@ -1033,6 +1060,8 @@ static void node_space_subtype_set(ScrArea *area, int value) { SpaceNode *snode = (SpaceNode *)area->spacedata.first; ED_node_set_tree_type(snode, rna_node_tree_type_from_enum(value)); + + WM_main_add_notifier(NC_SCREEN | NA_EDITED, nullptr); } static void node_space_subtype_item_extend(bContext *C, EnumPropertyItem **item, int *totitem) diff --git a/source/blender/windowmanager/intern/wm_keymap_utils.c b/source/blender/windowmanager/intern/wm_keymap_utils.c index 79473f4c374..0f7f6abd686 100644 --- a/source/blender/windowmanager/intern/wm_keymap_utils.c +++ b/source/blender/windowmanager/intern/wm_keymap_utils.c @@ -350,16 +350,16 @@ wmKeyMap *WM_keymap_guess_opname(const bContext *C, const char *opname) SpaceNode *snode = (SpaceNode *)sl; if (STRPREFIX(snode->tree_idname, "Shader")) { - km = WM_keymap_find_all(wm, "Shader Nodes", sl->spacetype, 0); + km = WM_keymap_find_all(wm, "Shader Nodes", sl->spacetype, RGN_TYPE_WINDOW); } else if (STRPREFIX(snode->tree_idname, "Texture")) { - km = WM_keymap_find_all(wm, "Texture Nodes", sl->spacetype, 0); + km = WM_keymap_find_all(wm, "Texture Nodes", sl->spacetype, RGN_TYPE_WINDOW); } else if (STRPREFIX(snode->tree_idname, "Geometry")) { - km = WM_keymap_find_all(wm, "Geometry Nodes", sl->spacetype, 0); + km = WM_keymap_find_all(wm, "Geometry Nodes", sl->spacetype, RGN_TYPE_WINDOW); } else if (STRPREFIX(snode->tree_idname, "Compositor")) { - km = WM_keymap_find_all(wm, "Compositor Nodes", sl->spacetype, 0); + km = WM_keymap_find_all(wm, "Compositor Nodes", sl->spacetype, RGN_TYPE_WINDOW); } else { km = WM_keymap_find_all(wm, "Node Editor", sl->spacetype, 0); -- 2.30.2