Fix #93403: Own keymap sets for each type of node editor. #106902
|
@ -155,6 +155,10 @@ _km_hierarchy = [
|
||||||
|
|
||||||
('Node Editor', 'NODE_EDITOR', 'WINDOW', [
|
('Node Editor', 'NODE_EDITOR', 'WINDOW', [
|
||||||
('Node Generic', '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', [
|
('SequencerCommon', 'SEQUENCE_EDITOR', 'WINDOW', [
|
||||||
('Sequencer', 'SEQUENCE_EDITOR', 'WINDOW', [
|
('Sequencer', 'SEQUENCE_EDITOR', 'WINDOW', [
|
||||||
|
|
|
@ -123,6 +123,11 @@ void node_keymap(wmKeyConfig *keyconf)
|
||||||
/* Main Region only ----------------- */
|
/* Main Region only ----------------- */
|
||||||
WM_keymap_ensure(keyconf, "Node Editor", SPACE_NODE, 0);
|
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);
|
node_link_modal_keymap(keyconf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -316,6 +316,8 @@ static void node_free(SpaceLink *sl)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char G_tree_idname[64] = {};
|
||||||
|
|
||||||
/* spacetype; init callback */
|
/* spacetype; init callback */
|
||||||
static void node_init(wmWindowManager * /*wm*/, ScrArea *area)
|
static void node_init(wmWindowManager * /*wm*/, ScrArea *area)
|
||||||
{
|
{
|
||||||
|
@ -324,6 +326,9 @@ static void node_init(wmWindowManager * /*wm*/, ScrArea *area)
|
||||||
if (snode->runtime == nullptr) {
|
if (snode->runtime == nullptr) {
|
||||||
snode->runtime = MEM_new<SpaceNode_Runtime>(__func__);
|
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)
|
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;
|
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. */
|
/* Initialize main region, setting handlers. */
|
||||||
static void node_main_region_init(wmWindowManager *wm, ARegion *region)
|
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);
|
keymap = WM_keymap_ensure(wm->defaultconf, "Node Editor", SPACE_NODE, 0);
|
||||||
WM_event_add_keymap_handler_v2d_mask(®ion->handlers, keymap);
|
WM_event_add_keymap_handler_v2d_mask(®ion->handlers, keymap);
|
||||||
|
|
||||||
|
node_add_private_keymaps(wm, region);
|
||||||
|
|
||||||
/* add drop boxes */
|
/* add drop boxes */
|
||||||
lb = WM_dropboxmap_find("Node Editor", SPACE_NODE, RGN_TYPE_WINDOW);
|
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;
|
SpaceNode *snode = (SpaceNode *)area->spacedata.first;
|
||||||
ED_node_set_tree_type(snode, rna_node_tree_type_from_enum(value));
|
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)
|
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 */
|
/* Node Editor */
|
||||||
else if (STRPREFIX(opname, "NODE_OT")) {
|
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 */
|
/* Animation Editor Channels */
|
||||||
else if (STRPREFIX(opname, "ANIM_OT_channels")) {
|
else if (STRPREFIX(opname, "ANIM_OT_channels")) {
|
||||||
|
|
Loading…
Reference in New Issue