diff --git a/source/blender/editors/space_node/node_select.c b/source/blender/editors/space_node/node_select.c index e2f3e7b51f2..3a92f90675f 100644 --- a/source/blender/editors/space_node/node_select.c +++ b/source/blender/editors/space_node/node_select.c @@ -419,6 +419,7 @@ static int node_mouse_select(Main *bmain, SpaceNode *snode, ARegion *ar, const i bNode *node, *tnode; bNodeSocket *sock, *tsock; float mx, my; + int selected = 0; /* get mouse coordinates in view2d space */ UI_view2d_region_to_view(&ar->v2d, mval[0], mval[1], &mx, &my); @@ -426,63 +427,61 @@ static int node_mouse_select(Main *bmain, SpaceNode *snode, ARegion *ar, const i snode->mx = mx; snode->my = my; - /* first do socket selection, these generally overlap with nodes */ - if (node_find_indicated_socket(snode, &node, &sock, SOCK_IN)) { - if (extend) { + if (extend) { + /* first do socket selection, these generally overlap with nodes. + * socket selection only in extend mode. + */ + if (node_find_indicated_socket(snode, &node, &sock, SOCK_IN)) { node_socket_toggle(node, sock, 1); + selected = 1; } - else { - node_deselect_all_input_sockets(snode, 1); - node_socket_select(node, sock); - } - - return 1; - } - else if (node_find_indicated_socket(snode, &node, &sock, SOCK_OUT)) { - if (extend) { + else if (node_find_indicated_socket(snode, &node, &sock, SOCK_OUT)) { if (sock->flag & SELECT) { node_socket_deselect(node, sock, 1); } else { - /* still only allow one selected output per node when extending, for sensible linking. - * extend allows selecting outputs from different nodes though. - */ + /* only allow one selected output per node, for sensible linking. + * allows selecting outputs from different nodes though. + */ if (node) { for (tsock=node->outputs.first; tsock; tsock=tsock->next) node_socket_deselect(node, tsock, 1); } node_socket_select(node, sock); } + selected = 1; } else { - node_deselect_all_output_sockets(snode, 1); - node_socket_select(node, sock); + /* find the closest visible node */ + node = node_under_mouse(snode->edittree, mx, my); + + if (node) { + node_toggle(node); + + ED_node_set_active(bmain, snode->edittree, node); + selected = 1; + } } - - return 1; } - else { + else { /* extend==0 */ + /* find the closest visible node */ node = node_under_mouse(snode->edittree, mx, my); if (node) { - if (extend == 0) { - for (tnode=snode->edittree->nodes.first; tnode; tnode=tnode->next) - if (tnode!=node) - node_deselect(tnode); - node_select(node); - } - else { - node_toggle(node); - } - + for (tnode=snode->edittree->nodes.first; tnode; tnode=tnode->next) + node_deselect(tnode); + node_select(node); ED_node_set_active(bmain, snode->edittree, node); - node_sort(snode->edittree); - return 1; + selected = 1; } - - return 0; } + + /* update node order */ + if (selected) + node_sort(snode->edittree); + + return selected; } static int node_select_exec(bContext *C, wmOperator *op)