Fix #93403: Own keymap sets for each type of node editor. #106902

Open
Alexander Revkov wants to merge 2 commits from arevkov/blender:node_editor_shortcuts into main

When changing the target branch, be careful to rebase the branch in your fork to match. See documentation.
4 changed files with 63 additions and 1 deletions

View File

@ -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', [

View File

@ -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, 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);
}

View File

@ -316,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)
{
@ -324,6 +326,9 @@ static void node_init(wmWindowManager * /*wm*/, ScrArea *area)
if (snode->runtime == nullptr) {
snode->runtime = MEM_new<SpaceNode_Runtime>(__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)
@ -625,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(&region->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(&region->handlers, keymap);
}
/* Initialize main region, setting handlers. */
static void node_main_region_init(wmWindowManager *wm, ARegion *region)
{
@ -640,6 +673,8 @@ 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(&region->handlers, keymap);
node_add_private_keymaps(wm, region);
/* add drop boxes */
lb = WM_dropboxmap_find("Node Editor", SPACE_NODE, RGN_TYPE_WINDOW);
@ -1025,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)

View File

@ -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, RGN_TYPE_WINDOW);
}
else if (STRPREFIX(snode->tree_idname, "Texture")) {
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, RGN_TYPE_WINDOW);
}
else if (STRPREFIX(snode->tree_idname, "Compositor")) {
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);
}
}
/* Animation Editor Channels */
else if (STRPREFIX(opname, "ANIM_OT_channels")) {