Nodes: Show node editor context path also without a node tree

This provides context for where the node tree will be added when clicking New.

Ref #139634

Pull Request: https://projects.blender.org/blender/blender/pulls/146852
This commit is contained in:
Brecht Van Lommel
2025-10-02 17:39:30 +02:00
committed by Brecht Van Lommel
parent 83595a41bb
commit be61366801
4 changed files with 19 additions and 11 deletions

View File

@@ -628,7 +628,7 @@ bool modifier_copy_to_object(Main *bmain,
return false;
}
WM_main_add_notifier(NC_OBJECT | ND_MODIFIER, ob_dst);
WM_main_add_notifier(NC_OBJECT | ND_MODIFIER | NA_ADDED, ob_dst);
DEG_id_tag_update(&ob_dst->id, ID_RECALC_GEOMETRY | ID_RECALC_ANIMATION);
DEG_relations_tag_update(bmain);
return true;
@@ -1428,7 +1428,7 @@ static wmOperatorStatus modifier_add_exec(bContext *C, wmOperator *op)
continue;
}
changed = true;
WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob);
WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER | NA_ADDED, ob);
}
if (!changed) {
return OPERATOR_CANCELLED;
@@ -1709,7 +1709,7 @@ static wmOperatorStatus modifier_remove_exec(bContext *C, wmOperator *op)
changed = true;
WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob);
WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER | NA_REMOVED, ob);
/* if cloth/softbody was removed, particle mode could be cleared */
if (mode_orig & OB_MODE_PARTICLE_EDIT) {
@@ -2280,7 +2280,7 @@ static wmOperatorStatus modifier_copy_exec(bContext *C, wmOperator *op)
changed = true;
DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY);
DEG_relations_tag_update(bmain);
WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob);
WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER | NA_ADDED, ob);
}
if (!changed) {

View File

@@ -19,6 +19,7 @@
#include "RNA_access.hh"
#include "RNA_prototypes.hh"
#include "ED_node_c.hh"
#include "ED_screen.hh"
#include "SEQ_modifier.hh"
@@ -90,6 +91,9 @@ static void context_path_add_node_tree_and_node_groups(const SpaceNode &snode,
if (skip_base && path_item == snode.treepath.first) {
continue;
}
if (path_item->nodetree == nullptr) {
continue;
}
int icon = ICON_NODETREE;
if (ID_IS_PACKED(&path_item->nodetree->id)) {
@@ -175,6 +179,7 @@ static void get_context_path_node_compositor(const bContext &C,
context_path_add_node_tree_and_node_groups(snode, path);
return;
}
ui::context_path_add_generic(path, RNA_Scene, sequencer_scene, ICON_SCENE);
Editing *ed = seq::editing_get(sequencer_scene);
if (!ed) {
context_path_add_node_tree_and_node_groups(snode, path);
@@ -185,6 +190,7 @@ static void get_context_path_node_compositor(const bContext &C,
context_path_add_node_tree_and_node_groups(snode, path);
return;
}
ui::context_path_add_generic(path, RNA_Strip, strip, ICON_SEQ_STRIP_DUPLICATE);
StripModifierData *smd = seq::modifier_get_active(strip);
if (!smd) {
context_path_add_node_tree_and_node_groups(snode, path);
@@ -200,8 +206,6 @@ static void get_context_path_node_compositor(const bContext &C,
context_path_add_node_tree_and_node_groups(snode, path);
return;
}
ui::context_path_add_generic(path, RNA_Scene, sequencer_scene, ICON_SCENE);
ui::context_path_add_generic(path, RNA_Strip, strip, ICON_SEQ_STRIP_DUPLICATE);
ui::context_path_add_generic(path, RNA_NodeTree, scmd->node_group);
context_path_add_node_tree_and_node_groups(snode, path, true);
}
@@ -238,13 +242,13 @@ Vector<ui::ContextPathItem> context_path_for_space_node(const bContext &C)
Vector<ui::ContextPathItem> context_path;
if (snode->edittree->type == NTREE_GEOMETRY) {
if (ED_node_is_geometry(snode)) {
get_context_path_node_geometry(C, *snode, context_path);
}
else if (snode->edittree->type == NTREE_SHADER) {
else if (ED_node_is_shader(snode)) {
get_context_path_node_shader(C, *snode, context_path);
}
else if (snode->edittree->type == NTREE_COMPOSIT) {
else if (ED_node_is_compositor(snode)) {
get_context_path_node_compositor(C, *snode, context_path);
}

View File

@@ -4996,7 +4996,7 @@ void node_draw_space(const bContext &C, ARegion &region)
}
/* Draw context path. */
if (snode.overlay.flag & SN_OVERLAY_SHOW_PATH && snode.edittree) {
if (snode.overlay.flag & SN_OVERLAY_SHOW_PATH) {
draw_tree_path(C, region);
}
}

View File

@@ -760,11 +760,15 @@ static void node_area_listener(const wmSpaceTypeListenerParams *params)
}
}
else if (ED_node_is_geometry(snode)) {
/* Rather strict check: only redraw when the reference matches the current editor's ID. */
if (wmn->data == ND_MODIFIER) {
/* Rather strict check: only redraw when the reference matches current editor's ID, */
if (wmn->reference == snode->id || snode->id == nullptr) {
node_area_tag_tree_recalc(snode, area);
}
/* Redraw context path if modifier was added or removed. */
if (ELEM(wmn->action, NA_ADDED, NA_REMOVED)) {
ED_area_tag_redraw(area);
}
}
}
break;