diff --git a/source/blender/editors/space_node/add_node_search.cc b/source/blender/editors/space_node/add_node_search.cc index ba060ab3925..78e52c82517 100644 --- a/source/blender/editors/space_node/add_node_search.cc +++ b/source/blender/editors/space_node/add_node_search.cc @@ -247,7 +247,7 @@ static void add_node_search_exec_fn(bContext *C, void *arg1, void *arg2) return; } - node_deselect_all(snode); + node_deselect_all(node_tree); bNode *new_node = nodeAddNode(C, &node_tree, item->identifier.c_str()); BLI_assert(new_node != nullptr); diff --git a/source/blender/editors/space_node/link_drag_search.cc b/source/blender/editors/space_node/link_drag_search.cc index 8e156f409af..08d9f6ecc4f 100644 --- a/source/blender/editors/space_node/link_drag_search.cc +++ b/source/blender/editors/space_node/link_drag_search.cc @@ -349,17 +349,18 @@ static void link_drag_search_exec_fn(bContext *C, void *arg1, void *arg2) { Main &bmain = *CTX_data_main(C); SpaceNode &snode = *CTX_wm_space_node(C); + bNodeTree &node_tree = *snode.edittree; LinkDragSearchStorage &storage = *static_cast(arg1); SocketLinkOperation *item = static_cast(arg2); if (item == nullptr) { return; } - node_deselect_all(snode); + node_deselect_all(node_tree); Vector new_nodes; nodes::LinkSearchOpParams params{ - *C, *snode.edittree, storage.from_node, storage.from_socket, new_nodes}; + *C, node_tree, storage.from_node, storage.from_socket, new_nodes}; item->fn(params); if (new_nodes.is_empty()) { return; @@ -376,11 +377,11 @@ static void link_drag_search_exec_fn(bContext *C, void *arg1, void *arg2) } nodeSetSelected(new_node, true); - nodeSetActive(snode.edittree, new_node); + nodeSetActive(&node_tree, new_node); /* Ideally it would be possible to tag the node tree in some way so it updates only after the * translate operation is finished, but normally moving nodes around doesn't cause updates. */ - ED_node_tree_propagate_change(C, &bmain, snode.edittree); + ED_node_tree_propagate_change(C, &bmain, &node_tree); /* Start translation operator with the new node. */ wmOperatorType *ot = WM_operatortype_find("NODE_OT_translate_attach_remove_on_cancel", true); diff --git a/source/blender/editors/space_node/node_add.cc b/source/blender/editors/space_node/node_add.cc index 4bb550a553f..ce1fe118281 100644 --- a/source/blender/editors/space_node/node_add.cc +++ b/source/blender/editors/space_node/node_add.cc @@ -63,20 +63,21 @@ bNode *add_node(const bContext &C, const StringRef idname, const float2 &locatio { SpaceNode &snode = *CTX_wm_space_node(&C); Main &bmain = *CTX_data_main(&C); + bNodeTree &node_tree = *snode.edittree; - node_deselect_all(snode); + node_deselect_all(node_tree); const std::string idname_str = idname; - bNode *node = nodeAddNode(&C, snode.edittree, idname_str.c_str()); + bNode *node = nodeAddNode(&C, &node_tree, idname_str.c_str()); BLI_assert(node && node->typeinfo); position_node_based_on_mouse(*node, location); nodeSetSelected(node, true); - ED_node_set_active(&bmain, &snode, snode.edittree, node, nullptr); + ED_node_set_active(&bmain, &snode, &node_tree, node, nullptr); - ED_node_tree_propagate_change(&C, &bmain, snode.edittree); + ED_node_tree_propagate_change(&C, &bmain, &node_tree); return node; } @@ -84,18 +85,19 @@ bNode *add_static_node(const bContext &C, int type, const float2 &location) { SpaceNode &snode = *CTX_wm_space_node(&C); Main &bmain = *CTX_data_main(&C); + bNodeTree &node_tree = *snode.edittree; - node_deselect_all(snode); + node_deselect_all(node_tree); - bNode *node = nodeAddStaticNode(&C, snode.edittree, type); + bNode *node = nodeAddStaticNode(&C, &node_tree, type); BLI_assert(node && node->typeinfo); position_node_based_on_mouse(*node, location); nodeSetSelected(node, true); - ED_node_set_active(&bmain, &snode, snode.edittree, node, nullptr); + ED_node_set_active(&bmain, &snode, &node_tree, node, nullptr); - ED_node_tree_propagate_change(&C, &bmain, snode.edittree); + ED_node_tree_propagate_change(&C, &bmain, &node_tree); return node; } @@ -152,11 +154,12 @@ static int add_reroute_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED | OPERATOR_PASS_THROUGH; } + node_deselect_all(ntree); + ntree.ensure_topology_cache(); const Vector frame_nodes = ntree.nodes_by_type("NodeFrame"); ED_preview_kill_jobs(CTX_wm_manager(C), CTX_data_main(C)); - node_deselect_all(snode); /* All link "cuts" that start at a particular output socket. Deduplicating new reroutes per * output socket is useful because it allows reusing reroutes for connected intersections. diff --git a/source/blender/editors/space_node/node_edit.cc b/source/blender/editors/space_node/node_edit.cc index 1bf5b938ee3..7fdc2db9fdb 100644 --- a/source/blender/editors/space_node/node_edit.cc +++ b/source/blender/editors/space_node/node_edit.cc @@ -2335,7 +2335,7 @@ static int node_clipboard_paste_exec(bContext *C, wmOperator *op) ED_preview_kill_jobs(CTX_wm_manager(C), CTX_data_main(C)); /* deselect old nodes */ - node_deselect_all(*snode); + node_deselect_all(*ntree); /* calculate "barycenter" for placing on mouse cursor */ float2 center = {0.0f, 0.0f}; diff --git a/source/blender/editors/space_node/node_group.cc b/source/blender/editors/space_node/node_group.cc index 45aeaa41ad5..6fb8ff54988 100644 --- a/source/blender/editors/space_node/node_group.cc +++ b/source/blender/editors/space_node/node_group.cc @@ -441,10 +441,7 @@ void NODE_OT_group_ungroup(wmOperatorType *ot) static bool node_group_separate_selected( Main &bmain, bNodeTree &ntree, bNodeTree &ngroup, const float2 &offset, const bool make_copy) { - /* deselect all nodes in the target tree */ - for (bNode *node : ntree.all_nodes()) { - nodeSetSelected(node, false); - } + node_deselect_all(ntree); ListBase anim_basepaths = {nullptr, nullptr}; @@ -809,10 +806,7 @@ static void node_group_make_insert_selected(const bContext &C, static const float offsetx = 200; static const float offsety = 0.0f; - /* deselect all nodes in the target tree */ - for (bNode *node : ngroup->all_nodes()) { - nodeSetSelected(node, false); - } + node_deselect_all(*ngroup); /* auto-add interface for "solo" nodes */ const bool expose_visible = nodes_to_move.size() == 1; diff --git a/source/blender/editors/space_node/node_intern.hh b/source/blender/editors/space_node/node_intern.hh index a4eb0c12713..9b2d55ab107 100644 --- a/source/blender/editors/space_node/node_intern.hh +++ b/source/blender/editors/space_node/node_intern.hh @@ -182,11 +182,11 @@ void node_keymap(wmKeyConfig *keyconf); rctf node_frame_rect_inside(const bNode &node); bool node_or_socket_isect_event(const bContext &C, const wmEvent &event); -void node_deselect_all(SpaceNode &snode); +void node_deselect_all(bNodeTree &node_tree); void node_socket_select(bNode *node, bNodeSocket &sock); void node_socket_deselect(bNode *node, bNodeSocket &sock, bool deselect_node); -void node_deselect_all_input_sockets(SpaceNode &snode, bool deselect_nodes); -void node_deselect_all_output_sockets(SpaceNode &snode, bool deselect_nodes); +void node_deselect_all_input_sockets(bNodeTree &node_tree, bool deselect_nodes); +void node_deselect_all_output_sockets(bNodeTree &node_tree, bool deselect_nodes); void node_select_single(bContext &C, bNode &node); void NODE_OT_select(wmOperatorType *ot); diff --git a/source/blender/editors/space_node/node_relationships.cc b/source/blender/editors/space_node/node_relationships.cc index 360f713e1a7..08b054f3d7d 100644 --- a/source/blender/editors/space_node/node_relationships.cc +++ b/source/blender/editors/space_node/node_relationships.cc @@ -1261,6 +1261,7 @@ static int node_make_link_exec(bContext *C, wmOperator *op) { Main &bmain = *CTX_data_main(C); SpaceNode &snode = *CTX_wm_space_node(C); + bNodeTree &node_tree = *snode.edittree; const bool replace = RNA_boolean_get(op->ptr, "replace"); ED_preview_kill_jobs(CTX_wm_manager(C), &bmain); @@ -1268,10 +1269,10 @@ static int node_make_link_exec(bContext *C, wmOperator *op) snode_autoconnect(snode, true, replace); /* deselect sockets after linking */ - node_deselect_all_input_sockets(snode, false); - node_deselect_all_output_sockets(snode, false); + node_deselect_all_input_sockets(node_tree, false); + node_deselect_all_output_sockets(node_tree, false); - ED_node_tree_propagate_change(C, &bmain, snode.edittree); + ED_node_tree_propagate_change(C, &bmain, &node_tree); return OPERATOR_FINISHED; } diff --git a/source/blender/editors/space_node/node_select.cc b/source/blender/editors/space_node/node_select.cc index 7ecacde3874..67ed9a34c7d 100644 --- a/source/blender/editors/space_node/node_select.cc +++ b/source/blender/editors/space_node/node_select.cc @@ -246,21 +246,21 @@ static void node_socket_toggle(bNode *node, bNodeSocket &sock, bool deselect_nod } } -void node_deselect_all(SpaceNode &snode) +void node_deselect_all(bNodeTree &node_tree) { - for (bNode *node : snode.edittree->all_nodes()) { + for (bNode *node : node_tree.all_nodes()) { nodeSetSelected(node, false); } } -void node_deselect_all_input_sockets(SpaceNode &snode, const bool deselect_nodes) +void node_deselect_all_input_sockets(bNodeTree &node_tree, const bool deselect_nodes) { /* XXX not calling node_socket_deselect here each time, because this does iteration * over all node sockets internally to check if the node stays selected. * We can do that more efficiently here. */ - for (bNode *node : snode.edittree->all_nodes()) { + for (bNode *node : node_tree.all_nodes()) { bool sel = false; LISTBASE_FOREACH (bNodeSocket *, socket, &node->inputs) { @@ -283,14 +283,14 @@ void node_deselect_all_input_sockets(SpaceNode &snode, const bool deselect_nodes } } -void node_deselect_all_output_sockets(SpaceNode &snode, const bool deselect_nodes) +void node_deselect_all_output_sockets(bNodeTree &node_tree, const bool deselect_nodes) { /* XXX not calling node_socket_deselect here each time, because this does iteration * over all node sockets internally to check if the node stays selected. * We can do that more efficiently here. */ - for (bNode *node : snode.edittree->all_nodes()) { + for (bNode *node : node_tree.all_nodes()) { bool sel = false; LISTBASE_FOREACH (bNodeSocket *, socket, &node->outputs) { @@ -422,7 +422,7 @@ static int node_select_grouped_exec(bContext *C, wmOperator *op) const int type = RNA_enum_get(op->ptr, "type"); if (!extend) { - node_deselect_all(snode); + node_deselect_all(node_tree); } nodeSetSelected(node_act, true); @@ -527,11 +527,12 @@ static bool node_mouse_select(bContext *C, { Main &bmain = *CTX_data_main(C); SpaceNode &snode = *CTX_wm_space_node(C); + bNodeTree &node_tree = *snode.edittree; ARegion ®ion = *CTX_wm_region(C); const Object *ob = CTX_data_active_object(C); const Scene *scene = CTX_data_scene(C); const wmWindowManager *wm = CTX_wm_manager(C); - bNode *node, *tnode; + bNode *node; bNodeSocket *sock = nullptr; bNodeSocket *tsock; @@ -582,7 +583,7 @@ static bool node_mouse_select(bContext *C, } } if (!extend) { - for (tnode = (bNode *)snode.edittree->nodes.first; tnode; tnode = tnode->next) { + for (bNode *tnode : node_tree.all_nodes()) { if (tnode == node) { continue; } @@ -601,7 +602,7 @@ static bool node_mouse_select(bContext *C, if (!sock) { /* find the closest visible node */ - node = node_under_mouse_select(*snode.edittree, cursor); + node = node_under_mouse_select(node_tree, cursor); found = (node != nullptr); node_was_selected = node && (node->flag & SELECT); @@ -611,7 +612,7 @@ static bool node_mouse_select(bContext *C, } else if (found || params->deselect_all) { /* Deselect everything. */ - node_deselect_all(snode); + node_deselect_all(node_tree); changed = true; } } @@ -669,7 +670,7 @@ static bool node_mouse_select(bContext *C, viewer_path::activate_geometry_node(bmain, snode, *node); } ED_node_set_active_viewer_key(&snode); - node_sort(*snode.edittree); + node_sort(node_tree); if ((active_texture_changed && has_workbench_in_texture_color(wm, scene, ob)) || viewer_node_changed) { DEG_id_tag_update(&snode.edittree->id, ID_RECALC_COPY_ON_WRITE); @@ -769,7 +770,7 @@ static int node_box_select_exec(bContext *C, wmOperator *op) const eSelectOp sel_op = (eSelectOp)RNA_enum_get(op->ptr, "mode"); const bool select = (sel_op != SEL_OP_SUB); if (SEL_OP_USE_PRE_DESELECT(sel_op)) { - node_deselect_all(snode); + node_deselect_all(node_tree); } for (bNode *node : node_tree.all_nodes()) { @@ -855,7 +856,7 @@ static int node_circleselect_exec(bContext *C, wmOperator *op) { SpaceNode *snode = CTX_wm_space_node(C); ARegion *region = CTX_wm_region(C); - bNode *node; + bNodeTree &node_tree = *snode->edittree; int x, y, radius; float2 offset; @@ -867,7 +868,7 @@ static int node_circleselect_exec(bContext *C, wmOperator *op) WM_gesture_is_modal_first((const wmGesture *)op->customdata)); const bool select = (sel_op != SEL_OP_SUB); if (SEL_OP_USE_PRE_DESELECT(sel_op)) { - node_deselect_all(*snode); + node_deselect_all(node_tree); } /* get operator properties */ @@ -877,7 +878,7 @@ static int node_circleselect_exec(bContext *C, wmOperator *op) UI_view2d_region_to_view(®ion->v2d, x, y, &offset.x, &offset.y); - for (node = (bNode *)snode->edittree->nodes.first; node; node = node->next) { + for (bNode *node : node_tree.all_nodes()) { switch (node->type) { case NODE_FRAME: { /* Frame nodes are selectable by their borders (including their whole rect - as for other @@ -950,7 +951,7 @@ static bool do_lasso_select_node(bContext *C, eSelectOp sel_op) { SpaceNode *snode = CTX_wm_space_node(C); - bNode *node; + bNodeTree &node_tree = *snode->edittree; ARegion *region = CTX_wm_region(C); @@ -959,7 +960,7 @@ static bool do_lasso_select_node(bContext *C, const bool select = (sel_op != SEL_OP_SUB); if (SEL_OP_USE_PRE_DESELECT(sel_op)) { - node_deselect_all(*snode); + node_deselect_all(node_tree); changed = true; } @@ -967,8 +968,7 @@ static bool do_lasso_select_node(bContext *C, BLI_lasso_boundbox(&rect, mcoords, mcoords_len); /* do actual selection */ - for (node = (bNode *)snode->edittree->nodes.first; node; node = node->next) { - + for (bNode *node : node_tree.all_nodes()) { if (select && (node->flag & NODE_SELECT)) { continue; } @@ -1098,7 +1098,7 @@ static int node_select_all_exec(bContext *C, wmOperator *op) } break; case SEL_DESELECT: - node_deselect_all(snode); + node_deselect_all(node_tree); break; case SEL_INVERT: for (bNode *node : node_tree.all_nodes()) { @@ -1107,7 +1107,7 @@ static int node_select_all_exec(bContext *C, wmOperator *op) break; } - node_sort(*snode.edittree); + node_sort(node_tree); WM_event_add_notifier(C, NC_NODE | NA_SELECTED, nullptr); return OPERATOR_FINISHED;