Fix #93403: Own keymap sets for each type of node editor. #106902
|
@ -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', [
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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(®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)
|
||||
{
|
||||
|
@ -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(®ion->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)
|
||||
|
|
|
@ -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")) {
|
||||
|
|
Loading…
Reference in New Issue