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:
authorJeroen Bakker <j.bakker@atmind.nl>2019-03-22 19:03:02 +0300
committerJeroen Bakker <j.bakker@atmind.nl>2019-03-22 19:03:28 +0300
commita96ccf20b6c30a44873cca817b8fa23de5e44a05 (patch)
treeccf4fcb72f927b54e4121c1b74c52b57f8035df1 /source/blender/editors/space_node
parent530e7cc799e3f70e346bbcaf428575c35232775d (diff)
NodeEditor: Connect Viewer To Socket Selection
Request from the Spring team. When compositing the CTRL-Shift Click on a node cycles the viewnode with an output socket. When you have many render layers you spend time cycling to the desired socket. This patch allows the user to CTRL-Shift Click on a socket to connect directly to that socket. Reviewed By: brecht Maniphest Tasks: T62785 Differential Revision: https://developer.blender.org/D4564
Diffstat (limited to 'source/blender/editors/space_node')
-rw-r--r--source/blender/editors/space_node/node_ops.c4
-rw-r--r--source/blender/editors/space_node/node_relationships.c11
-rw-r--r--source/blender/editors/space_node/node_select.c77
3 files changed, 60 insertions, 32 deletions
diff --git a/source/blender/editors/space_node/node_ops.c b/source/blender/editors/space_node/node_ops.c
index ed3190b06fe..517e4df1dc1 100644
--- a/source/blender/editors/space_node/node_ops.c
+++ b/source/blender/editors/space_node/node_ops.c
@@ -136,7 +136,9 @@ void ED_operatormacros_node(void)
ot = WM_operatortype_append_macro("NODE_OT_select_link_viewer", "Link Viewer",
"Select node and link it to a viewer node",
OPTYPE_UNDO);
- WM_operatortype_macro_define(ot, "NODE_OT_select");
+ mot = WM_operatortype_macro_define(ot, "NODE_OT_select");
+ RNA_boolean_set(mot->ptr, "extend", false);
+ RNA_boolean_set(mot->ptr, "socket_select", true);
WM_operatortype_macro_define(ot, "NODE_OT_link_viewer");
ot = WM_operatortype_append_macro("NODE_OT_translate_attach", "Move and Attach",
diff --git a/source/blender/editors/space_node/node_relationships.c b/source/blender/editors/space_node/node_relationships.c
index d81c764af81..1aaf0baae6d 100644
--- a/source/blender/editors/space_node/node_relationships.c
+++ b/source/blender/editors/space_node/node_relationships.c
@@ -438,6 +438,17 @@ static int node_link_viewer(const bContext *C, bNode *tonode)
}
}
+ if (tonode) {
+ /* Find a selected socket that overrides the socket to connect to */
+ for (bNodeSocket *sock2 = tonode->outputs.first; sock2; sock2 = sock2->next) {
+ if (!nodeSocketIsHidden(sock2) && sock2->flag & SELECT) {
+ sock = sock2;
+ break;
+ }
+ }
+ }
+
+
/* find a socket starting from the first socket */
if (!sock) {
for (sock = tonode->outputs.first; sock; sock = sock->next)
diff --git a/source/blender/editors/space_node/node_select.c b/source/blender/editors/space_node/node_select.c
index fc80d20dcba..a329958db5e 100644
--- a/source/blender/editors/space_node/node_select.c
+++ b/source/blender/editors/space_node/node_select.c
@@ -410,72 +410,83 @@ void node_select_single(bContext *C, bNode *node)
WM_event_add_notifier(C, NC_NODE | NA_SELECTED, NULL);
}
-static int node_mouse_select(Main *bmain, SpaceNode *snode, ARegion *ar, const int mval[2], short extend)
+static int node_mouse_select(Main *bmain, SpaceNode *snode, ARegion *ar, const int mval[2], bool extend, bool socket_select)
{
bNode *node, *tnode;
- bNodeSocket *sock, *tsock;
+ bNodeSocket *sock = NULL;
+ bNodeSocket *tsock;
float cursor[2];
- int selected = 0;
+ bool selected = false;
/* get mouse coordinates in view2d space */
UI_view2d_region_to_view(&ar->v2d, mval[0], mval[1], &cursor[0], &cursor[1]);
- if (extend) {
- /* first do socket selection, these generally overlap with nodes.
- * socket selection only in extend mode.
- */
+ /* 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);
- selected = 1;
+ selected = true;
}
else if (node_find_indicated_socket(snode, &node, &sock, cursor, SOCK_OUT)) {
if (sock->flag & SELECT) {
- node_socket_deselect(node, sock, 1);
+ if (extend) {
+ node_socket_deselect(node, sock, 1);
+ }
+ else {
+ selected = true;
+ }
}
else {
/* only allow one selected output per node, for sensible linking.
- * allows selecting outputs from different nodes though.
- */
+ * allows selecting outputs from different nodes though. */
if (node) {
for (tsock = node->outputs.first; tsock; tsock = tsock->next)
node_socket_deselect(node, tsock, 1);
}
+ 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);
+ }
+ }
+ }
node_socket_select(node, sock);
+ selected = true;
}
- selected = 1;
}
- else {
+ }
+
+ if (!sock) {
+ if (extend) {
/* find the closest visible node */
node = node_under_mouse_select(snode->edittree, cursor[0], cursor[1]);
if (node) {
if ((node->flag & SELECT) && (node->flag & NODE_ACTIVE) == 0) {
- /* if node is selected but not active make it active
- * before it'll be desleected
- */
+ /* if node is selected but not active make it active */
ED_node_set_active(bmain, snode->edittree, node);
}
else {
node_toggle(node);
ED_node_set_active(bmain, snode->edittree, node);
}
-
- selected = 1;
+ selected = true;
}
}
- }
- else { /* extend == 0 */
-
- /* find the closest visible node */
- node = node_under_mouse_select(snode->edittree, cursor[0], cursor[1]);
+ else {
+ /* find the closest visible node */
+ node = node_under_mouse_select(snode->edittree, cursor[0], cursor[1]);
- if (node) {
- for (tnode = snode->edittree->nodes.first; tnode; tnode = tnode->next) {
- nodeSetSelected(tnode, false);
+ if (node) {
+ for (tnode = snode->edittree->nodes.first; tnode; tnode = tnode->next) {
+ nodeSetSelected(tnode, false);
+ }
+ nodeSetSelected(node, true);
+ ED_node_set_active(bmain, snode->edittree, node);
+ selected = true;
}
- nodeSetSelected(node, true);
- ED_node_set_active(bmain, snode->edittree, node);
- selected = 1;
}
}
@@ -495,15 +506,18 @@ static int node_select_exec(bContext *C, wmOperator *op)
ARegion *ar = CTX_wm_region(C);
int mval[2];
short extend;
+ bool socket_select;
/* get settings from RNA properties for operator */
mval[0] = RNA_int_get(op->ptr, "mouse_x");
mval[1] = RNA_int_get(op->ptr, "mouse_y");
extend = RNA_boolean_get(op->ptr, "extend");
+ /* always do socket_select when extending selection. */
+ socket_select = extend || RNA_boolean_get(op->ptr, "socket_select");
/* perform the select */
- if (node_mouse_select(bmain, snode, ar, mval, extend)) {
+ if (node_mouse_select(bmain, snode, ar, mval, extend, socket_select)) {
/* send notifiers */
WM_event_add_notifier(C, NC_NODE | NA_SELECTED, NULL);
@@ -543,7 +557,8 @@ void NODE_OT_select(wmOperatorType *ot)
/* properties */
RNA_def_int(ot->srna, "mouse_x", 0, INT_MIN, INT_MAX, "Mouse X", "", INT_MIN, INT_MAX);
RNA_def_int(ot->srna, "mouse_y", 0, INT_MIN, INT_MAX, "Mouse Y", "", INT_MIN, INT_MAX);
- RNA_def_boolean(ot->srna, "extend", 0, "Extend", "");
+ RNA_def_boolean(ot->srna, "extend", false, "Extend", "");
+ RNA_def_boolean(ot->srna, "socket_select", false, "Socket Select", "");
}
/** \} */