Cleanup: Simplify arguments to deselect all nodes function

Take the node tree as an argument directly instead of retrieving it from
the editor struct. Then use the utility function in two more places.
This commit is contained in:
Hans Goudey 2022-12-20 17:14:34 -06:00
parent d0348bcb8a
commit 8bbf823716
8 changed files with 50 additions and 51 deletions

View File

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

View File

@ -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<LinkDragSearchStorage *>(arg1);
SocketLinkOperation *item = static_cast<SocketLinkOperation *>(arg2);
if (item == nullptr) {
return;
}
node_deselect_all(snode);
node_deselect_all(node_tree);
Vector<bNode *> 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);

View File

@ -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<bNode *> 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.

View File

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

View File

@ -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;

View File

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

View File

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

View File

@ -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 &region = *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(&region->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;