Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBastien Montagne <montagne29@wanadoo.fr>2019-05-06 21:34:01 +0300
committerBastien Montagne <montagne29@wanadoo.fr>2019-05-06 21:37:12 +0300
commit0f064144f3952bf9208f84d0587d4c65ac552641 (patch)
tree9181440e2527a8c7c370fd0b0b8f84b17ecbf043 /source/blender/editors/space_node/node_select.c
parent6da953ad1dbc1c0fb13ffb50ac896e9fcee3801b (diff)
Node select: refactor, fix some inconsistent behaviors in socket selection.
Refactor a bit node selection code, mostly in the socket selection in one place 'extend' logic usage was inverted, deselection of other sockets/nodes was not working properly. Also now make node active when selecting a socket, this makes more sense and makes the NODE_OT_link_viewer macro much more useful (this is the only user of the 'socket select' feature currently, afaics).
Diffstat (limited to 'source/blender/editors/space_node/node_select.c')
-rw-r--r--source/blender/editors/space_node/node_select.c52
1 files changed, 27 insertions, 25 deletions
diff --git a/source/blender/editors/space_node/node_select.c b/source/blender/editors/space_node/node_select.c
index b52d1d3b78f..07b01e576bc 100644
--- a/source/blender/editors/space_node/node_select.c
+++ b/source/blender/editors/space_node/node_select.c
@@ -449,32 +449,38 @@ static int node_mouse_select(Main *bmain,
/* first do socket selection, these generally overlap with nodes. */
if (socket_select) {
if (node_find_indicated_socket(snode, &node, &sock, cursor, SOCK_IN)) {
- node_socket_toggle(node, sock, 1);
+ /* NOTE: SOCK_IN does not take into account the extend case...
+ * This feature is not really used anyway currently? */
+ node_socket_toggle(node, sock, true);
selected = true;
}
else if (node_find_indicated_socket(snode, &node, &sock, cursor, SOCK_OUT)) {
if (sock->flag & SELECT) {
if (extend) {
- node_socket_deselect(node, sock, 1);
+ node_socket_deselect(node, sock, true);
}
else {
selected = true;
}
}
else {
- /* only allow one selected output per node, for sensible linking.
- * allows selecting outputs from different nodes though. */
+ /* Only allow one selected output per node, for sensible linking.
+ * Allow selecting outputs from different nodes though, if extend is true. */
if (node) {
for (tsock = node->outputs.first; tsock; tsock = tsock->next) {
- node_socket_deselect(node, tsock, 1);
+ if (tsock == sock) {
+ continue;
+ }
+ node_socket_deselect(node, tsock, true);
}
}
- if (extend) {
- /* only allow one selected output per node, for sensible linking.
- * allows selecting outputs from different nodes though. */
- for (tsock = node->outputs.first; tsock; tsock = tsock->next) {
- if (tsock != sock) {
- node_socket_deselect(node, tsock, 1);
+ if (!extend) {
+ for (tnode = snode->edittree->nodes.first; tnode; tnode = tnode->next) {
+ if (tnode == node) {
+ continue;
+ }
+ for (tsock = tnode->outputs.first; tsock; tsock = tsock->next) {
+ node_socket_deselect(tnode, tsock, true);
}
}
}
@@ -485,26 +491,20 @@ static int node_mouse_select(Main *bmain,
}
if (!sock) {
- if (extend) {
- /* find the closest visible node */
- node = node_under_mouse_select(snode->edittree, cursor[0], cursor[1]);
+ /* find the closest visible node */
+ node = node_under_mouse_select(snode->edittree, (int)cursor[0], (int)cursor[1]);
- if (node) {
- if ((node->flag & SELECT) && (node->flag & NODE_ACTIVE) == 0) {
- /* if node is selected but not active make it active */
- ED_node_set_active(bmain, snode->edittree, node);
- }
- else {
+ if (extend) {
+ if (node != NULL) {
+ /* If node is selected but not active, we want to make it active,
+ * but not toggle (deselect) it. */
+ if (!((node->flag & SELECT) && (node->flag & NODE_ACTIVE) == 0)) {
node_toggle(node);
- ED_node_set_active(bmain, snode->edittree, node);
}
selected = true;
}
}
else {
- /* find the closest visible node */
- node = node_under_mouse_select(snode->edittree, cursor[0], cursor[1]);
-
if (node != NULL || deselect_all) {
for (tnode = snode->edittree->nodes.first; tnode; tnode = tnode->next) {
nodeSetSelected(tnode, false);
@@ -512,7 +512,6 @@ static int node_mouse_select(Main *bmain,
selected = true;
if (node != NULL) {
nodeSetSelected(node, true);
- ED_node_set_active(bmain, snode->edittree, node);
}
}
}
@@ -520,6 +519,9 @@ static int node_mouse_select(Main *bmain,
/* update node order */
if (selected) {
+ if (node != NULL) {
+ ED_node_set_active(bmain, snode->edittree, node);
+ }
ED_node_set_active_viewer_key(snode);
ED_node_sort(snode->edittree);
}