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:
Diffstat (limited to 'source/blender/editors/space_node/node_select.c')
-rw-r--r--source/blender/editors/space_node/node_select.c1670
1 files changed, 846 insertions, 824 deletions
diff --git a/source/blender/editors/space_node/node_select.c b/source/blender/editors/space_node/node_select.c
index a027481ff27..58531ec32b1 100644
--- a/source/blender/editors/space_node/node_select.c
+++ b/source/blender/editors/space_node/node_select.c
@@ -36,7 +36,7 @@
#include "BKE_main.h"
#include "BKE_node.h"
-#include "ED_node.h" /* own include */
+#include "ED_node.h" /* own include */
#include "ED_screen.h"
#include "ED_select_utils.h"
@@ -52,7 +52,7 @@
#include "MEM_guardedalloc.h"
-#include "node_intern.h" /* own include */
+#include "node_intern.h" /* own include */
/* -------------------------------------------------------------------- */
/** \name Public Node Selection API
@@ -60,182 +60,182 @@
static bNode *node_under_mouse_select(bNodeTree *ntree, int mx, int my)
{
- bNode *node;
-
- for (node = ntree->nodes.last; node; node = node->prev) {
- if (node->typeinfo->select_area_func) {
- if (node->typeinfo->select_area_func(node, mx, my)) {
- return node;
- }
- }
- }
- return NULL;
+ bNode *node;
+
+ for (node = ntree->nodes.last; node; node = node->prev) {
+ if (node->typeinfo->select_area_func) {
+ if (node->typeinfo->select_area_func(node, mx, my)) {
+ return node;
+ }
+ }
+ }
+ return NULL;
}
static bNode *node_under_mouse_tweak(bNodeTree *ntree, int mx, int my)
{
- bNode *node;
-
- for (node = ntree->nodes.last; node; node = node->prev) {
- if (node->typeinfo->tweak_area_func) {
- if (node->typeinfo->tweak_area_func(node, mx, my)) {
- return node;
- }
- }
- }
- return NULL;
+ bNode *node;
+
+ for (node = ntree->nodes.last; node; node = node->prev) {
+ if (node->typeinfo->tweak_area_func) {
+ if (node->typeinfo->tweak_area_func(node, mx, my)) {
+ return node;
+ }
+ }
+ }
+ return NULL;
}
static bool is_position_over_node_or_socket(SpaceNode *snode, float mouse[2])
{
- if (node_under_mouse_tweak(snode->edittree, mouse[0], mouse[1])) {
- return true;
- }
+ if (node_under_mouse_tweak(snode->edittree, mouse[0], mouse[1])) {
+ return true;
+ }
- bNode *node;
- bNodeSocket *sock;
- if (node_find_indicated_socket(snode, &node, &sock, mouse, SOCK_IN | SOCK_OUT)) {
- return true;
- }
+ bNode *node;
+ bNodeSocket *sock;
+ if (node_find_indicated_socket(snode, &node, &sock, mouse, SOCK_IN | SOCK_OUT)) {
+ return true;
+ }
- return false;
+ return false;
}
static bool is_event_over_node_or_socket(bContext *C, const wmEvent *event)
{
- SpaceNode *snode = CTX_wm_space_node(C);
- ARegion *ar = CTX_wm_region(C);
- float mouse[2];
- UI_view2d_region_to_view(&ar->v2d, event->mval[0], event->mval[1], &mouse[0], &mouse[1]);
- return is_position_over_node_or_socket(snode, mouse);
+ SpaceNode *snode = CTX_wm_space_node(C);
+ ARegion *ar = CTX_wm_region(C);
+ float mouse[2];
+ UI_view2d_region_to_view(&ar->v2d, event->mval[0], event->mval[1], &mouse[0], &mouse[1]);
+ return is_position_over_node_or_socket(snode, mouse);
}
static void node_toggle(bNode *node)
{
- nodeSetSelected(node, !(node->flag & SELECT));
+ nodeSetSelected(node, !(node->flag & SELECT));
}
void node_socket_select(bNode *node, bNodeSocket *sock)
{
- sock->flag |= SELECT;
+ sock->flag |= SELECT;
- /* select node too */
- if (node) {
- node->flag |= SELECT;
- }
+ /* select node too */
+ if (node) {
+ node->flag |= SELECT;
+ }
}
void node_socket_deselect(bNode *node, bNodeSocket *sock, const bool deselect_node)
{
- sock->flag &= ~SELECT;
-
- if (node && deselect_node) {
- bool sel = 0;
-
- /* if no selected sockets remain, also deselect the node */
- for (sock = node->inputs.first; sock; sock = sock->next) {
- if (sock->flag & SELECT) {
- sel = 1;
- break;
- }
- }
- for (sock = node->outputs.first; sock; sock = sock->next) {
- if (sock->flag & SELECT) {
- sel = 1;
- break;
- }
- }
-
- if (!sel) {
- node->flag &= ~SELECT;
- }
- }
+ sock->flag &= ~SELECT;
+
+ if (node && deselect_node) {
+ bool sel = 0;
+
+ /* if no selected sockets remain, also deselect the node */
+ for (sock = node->inputs.first; sock; sock = sock->next) {
+ if (sock->flag & SELECT) {
+ sel = 1;
+ break;
+ }
+ }
+ for (sock = node->outputs.first; sock; sock = sock->next) {
+ if (sock->flag & SELECT) {
+ sel = 1;
+ break;
+ }
+ }
+
+ if (!sel) {
+ node->flag &= ~SELECT;
+ }
+ }
}
static void node_socket_toggle(bNode *node, bNodeSocket *sock, int deselect_node)
{
- if (sock->flag & SELECT) {
- node_socket_deselect(node, sock, deselect_node);
- }
- else {
- node_socket_select(node, sock);
- }
+ if (sock->flag & SELECT) {
+ node_socket_deselect(node, sock, deselect_node);
+ }
+ else {
+ node_socket_select(node, sock);
+ }
}
/* no undo here! */
void node_deselect_all(SpaceNode *snode)
{
- bNode *node;
+ bNode *node;
- for (node = snode->edittree->nodes.first; node; node = node->next) {
- nodeSetSelected(node, false);
- }
+ for (node = snode->edittree->nodes.first; node; node = node->next) {
+ nodeSetSelected(node, false);
+ }
}
void node_deselect_all_input_sockets(SpaceNode *snode, const bool deselect_nodes)
{
- bNode *node;
- bNodeSocket *sock;
-
- /* 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 (node = snode->edittree->nodes.first; node; node = node->next) {
- int sel = 0;
-
- for (sock = node->inputs.first; sock; sock = sock->next) {
- sock->flag &= ~SELECT;
- }
-
- /* if no selected sockets remain, also deselect the node */
- if (deselect_nodes) {
- for (sock = node->outputs.first; sock; sock = sock->next) {
- if (sock->flag & SELECT) {
- sel = 1;
- break;
- }
- }
-
- if (!sel) {
- node->flag &= ~SELECT;
- }
- }
- }
+ bNode *node;
+ bNodeSocket *sock;
+
+ /* 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 (node = snode->edittree->nodes.first; node; node = node->next) {
+ int sel = 0;
+
+ for (sock = node->inputs.first; sock; sock = sock->next) {
+ sock->flag &= ~SELECT;
+ }
+
+ /* if no selected sockets remain, also deselect the node */
+ if (deselect_nodes) {
+ for (sock = node->outputs.first; sock; sock = sock->next) {
+ if (sock->flag & SELECT) {
+ sel = 1;
+ break;
+ }
+ }
+
+ if (!sel) {
+ node->flag &= ~SELECT;
+ }
+ }
+ }
}
void node_deselect_all_output_sockets(SpaceNode *snode, const bool deselect_nodes)
{
- bNode *node;
- bNodeSocket *sock;
-
- /* 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 (node = snode->edittree->nodes.first; node; node = node->next) {
- bool sel = false;
-
- for (sock = node->outputs.first; sock; sock = sock->next) {
- sock->flag &= ~SELECT;
- }
-
- /* if no selected sockets remain, also deselect the node */
- if (deselect_nodes) {
- for (sock = node->inputs.first; sock; sock = sock->next) {
- if (sock->flag & SELECT) {
- sel = 1;
- break;
- }
- }
-
- if (!sel) {
- node->flag &= ~SELECT;
- }
- }
- }
+ bNode *node;
+ bNodeSocket *sock;
+
+ /* 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 (node = snode->edittree->nodes.first; node; node = node->next) {
+ bool sel = false;
+
+ for (sock = node->outputs.first; sock; sock = sock->next) {
+ sock->flag &= ~SELECT;
+ }
+
+ /* if no selected sockets remain, also deselect the node */
+ if (deselect_nodes) {
+ for (sock = node->inputs.first; sock; sock = sock->next) {
+ if (sock->flag & SELECT) {
+ sel = 1;
+ break;
+ }
+ }
+
+ if (!sel) {
+ node->flag &= ~SELECT;
+ }
+ }
+ }
}
/** \} */
@@ -248,152 +248,158 @@ void node_deselect_all_output_sockets(SpaceNode *snode, const bool deselect_node
static bool node_select_grouped_type(SpaceNode *snode, bNode *node_act)
{
- bNode *node;
- bool changed = false;
-
- for (node = snode->edittree->nodes.first; node; node = node->next) {
- if ((node->flag & SELECT) == 0) {
- if (node->type == node_act->type) {
- nodeSetSelected(node, true);
- changed = true;
- }
- }
- }
-
- return changed;
+ bNode *node;
+ bool changed = false;
+
+ for (node = snode->edittree->nodes.first; node; node = node->next) {
+ if ((node->flag & SELECT) == 0) {
+ if (node->type == node_act->type) {
+ nodeSetSelected(node, true);
+ changed = true;
+ }
+ }
+ }
+
+ return changed;
}
static bool node_select_grouped_color(SpaceNode *snode, bNode *node_act)
{
- bNode *node;
- bool changed = false;
-
- for (node = snode->edittree->nodes.first; node; node = node->next) {
- if ((node->flag & SELECT) == 0) {
- if (compare_v3v3(node->color, node_act->color, 0.005f)) {
- nodeSetSelected(node, true);
- changed = true;
- }
- }
- }
-
- return changed;
+ bNode *node;
+ bool changed = false;
+
+ for (node = snode->edittree->nodes.first; node; node = node->next) {
+ if ((node->flag & SELECT) == 0) {
+ if (compare_v3v3(node->color, node_act->color, 0.005f)) {
+ nodeSetSelected(node, true);
+ changed = true;
+ }
+ }
+ }
+
+ return changed;
}
static bool node_select_grouped_name(SpaceNode *snode, bNode *node_act, const bool from_right)
{
- bNode *node;
- bool changed = false;
- const unsigned int delims[] = {'.', '-', '_', '\0'};
- size_t pref_len_act, pref_len_curr;
- const char *sep, *suf_act, *suf_curr;
-
- pref_len_act = BLI_str_partition_ex_utf8(node_act->name, NULL, delims, &sep, &suf_act, from_right);
-
- /* Note: in case we are searching for suffix, and found none, use whole name as suffix. */
- if (from_right && !(sep && suf_act)) {
- pref_len_act = 0;
- suf_act = node_act->name;
- }
-
- for (node = snode->edittree->nodes.first; node; node = node->next) {
- if (node->flag & SELECT) {
- continue;
- }
- pref_len_curr = BLI_str_partition_ex_utf8(node->name, NULL, delims, &sep, &suf_curr, from_right);
-
- /* Same as with active node name! */
- if (from_right && !(sep && suf_curr)) {
- pref_len_curr = 0;
- suf_curr = node->name;
- }
-
- if ((from_right && STREQ(suf_act, suf_curr)) ||
- (!from_right && (pref_len_act == pref_len_curr) && STREQLEN(node_act->name, node->name, pref_len_act)))
- {
- nodeSetSelected(node, true);
- changed = true;
- }
- }
-
- return changed;
+ bNode *node;
+ bool changed = false;
+ const unsigned int delims[] = {'.', '-', '_', '\0'};
+ size_t pref_len_act, pref_len_curr;
+ const char *sep, *suf_act, *suf_curr;
+
+ pref_len_act = BLI_str_partition_ex_utf8(
+ node_act->name, NULL, delims, &sep, &suf_act, from_right);
+
+ /* Note: in case we are searching for suffix, and found none, use whole name as suffix. */
+ if (from_right && !(sep && suf_act)) {
+ pref_len_act = 0;
+ suf_act = node_act->name;
+ }
+
+ for (node = snode->edittree->nodes.first; node; node = node->next) {
+ if (node->flag & SELECT) {
+ continue;
+ }
+ pref_len_curr = BLI_str_partition_ex_utf8(
+ node->name, NULL, delims, &sep, &suf_curr, from_right);
+
+ /* Same as with active node name! */
+ if (from_right && !(sep && suf_curr)) {
+ pref_len_curr = 0;
+ suf_curr = node->name;
+ }
+
+ if ((from_right && STREQ(suf_act, suf_curr)) ||
+ (!from_right && (pref_len_act == pref_len_curr) &&
+ STREQLEN(node_act->name, node->name, pref_len_act))) {
+ nodeSetSelected(node, true);
+ changed = true;
+ }
+ }
+
+ return changed;
}
enum {
- NODE_SELECT_GROUPED_TYPE = 0,
- NODE_SELECT_GROUPED_COLOR = 1,
- NODE_SELECT_GROUPED_PREFIX = 2,
- NODE_SELECT_GROUPED_SUFIX = 3,
+ NODE_SELECT_GROUPED_TYPE = 0,
+ NODE_SELECT_GROUPED_COLOR = 1,
+ NODE_SELECT_GROUPED_PREFIX = 2,
+ NODE_SELECT_GROUPED_SUFIX = 3,
};
static int node_select_grouped_exec(bContext *C, wmOperator *op)
{
- SpaceNode *snode = CTX_wm_space_node(C);
- bNode *node_act = nodeGetActive(snode->edittree);
- bNode *node;
- bool changed = false;
- const bool extend = RNA_boolean_get(op->ptr, "extend");
- const int type = RNA_enum_get(op->ptr, "type");
-
- if (!extend) {
- for (node = snode->edittree->nodes.first; node; node = node->next) {
- nodeSetSelected(node, false);
- }
- }
- nodeSetSelected(node_act, true);
-
- switch (type) {
- case NODE_SELECT_GROUPED_TYPE:
- changed = node_select_grouped_type(snode, node_act);
- break;
- case NODE_SELECT_GROUPED_COLOR:
- changed = node_select_grouped_color(snode, node_act);
- break;
- case NODE_SELECT_GROUPED_PREFIX:
- changed = node_select_grouped_name(snode, node_act, false);
- break;
- case NODE_SELECT_GROUPED_SUFIX:
- changed = node_select_grouped_name(snode, node_act, true);
- break;
- default:
- break;
- }
-
- if (changed) {
- ED_node_sort(snode->edittree);
- WM_event_add_notifier(C, NC_NODE | NA_SELECTED, NULL);
- return OPERATOR_FINISHED;
- }
-
- return OPERATOR_CANCELLED;
+ SpaceNode *snode = CTX_wm_space_node(C);
+ bNode *node_act = nodeGetActive(snode->edittree);
+ bNode *node;
+ bool changed = false;
+ const bool extend = RNA_boolean_get(op->ptr, "extend");
+ const int type = RNA_enum_get(op->ptr, "type");
+
+ if (!extend) {
+ for (node = snode->edittree->nodes.first; node; node = node->next) {
+ nodeSetSelected(node, false);
+ }
+ }
+ nodeSetSelected(node_act, true);
+
+ switch (type) {
+ case NODE_SELECT_GROUPED_TYPE:
+ changed = node_select_grouped_type(snode, node_act);
+ break;
+ case NODE_SELECT_GROUPED_COLOR:
+ changed = node_select_grouped_color(snode, node_act);
+ break;
+ case NODE_SELECT_GROUPED_PREFIX:
+ changed = node_select_grouped_name(snode, node_act, false);
+ break;
+ case NODE_SELECT_GROUPED_SUFIX:
+ changed = node_select_grouped_name(snode, node_act, true);
+ break;
+ default:
+ break;
+ }
+
+ if (changed) {
+ ED_node_sort(snode->edittree);
+ WM_event_add_notifier(C, NC_NODE | NA_SELECTED, NULL);
+ return OPERATOR_FINISHED;
+ }
+
+ return OPERATOR_CANCELLED;
}
void NODE_OT_select_grouped(wmOperatorType *ot)
{
- static const EnumPropertyItem prop_select_grouped_types[] = {
- {NODE_SELECT_GROUPED_TYPE, "TYPE", 0, "Type", ""},
- {NODE_SELECT_GROUPED_COLOR, "COLOR", 0, "Color", ""},
- {NODE_SELECT_GROUPED_PREFIX, "PREFIX", 0, "Prefix", ""},
- {NODE_SELECT_GROUPED_SUFIX, "SUFFIX", 0, "Suffix", ""},
- {0, NULL, 0, NULL, NULL},
- };
-
- /* identifiers */
- ot->name = "Select Grouped";
- ot->description = "Select nodes with similar properties";
- ot->idname = "NODE_OT_select_grouped";
-
- /* api callbacks */
- ot->invoke = WM_menu_invoke;
- ot->exec = node_select_grouped_exec;
- ot->poll = ED_operator_node_active;
-
- /* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
-
- /* properties */
- RNA_def_boolean(ot->srna, "extend", false, "Extend", "Extend selection instead of deselecting everything first");
- ot->prop = RNA_def_enum(ot->srna, "type", prop_select_grouped_types, 0, "Type", "");
+ static const EnumPropertyItem prop_select_grouped_types[] = {
+ {NODE_SELECT_GROUPED_TYPE, "TYPE", 0, "Type", ""},
+ {NODE_SELECT_GROUPED_COLOR, "COLOR", 0, "Color", ""},
+ {NODE_SELECT_GROUPED_PREFIX, "PREFIX", 0, "Prefix", ""},
+ {NODE_SELECT_GROUPED_SUFIX, "SUFFIX", 0, "Suffix", ""},
+ {0, NULL, 0, NULL, NULL},
+ };
+
+ /* identifiers */
+ ot->name = "Select Grouped";
+ ot->description = "Select nodes with similar properties";
+ ot->idname = "NODE_OT_select_grouped";
+
+ /* api callbacks */
+ ot->invoke = WM_menu_invoke;
+ ot->exec = node_select_grouped_exec;
+ ot->poll = ED_operator_node_active;
+
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+
+ /* properties */
+ RNA_def_boolean(ot->srna,
+ "extend",
+ false,
+ "Extend",
+ "Extend selection instead of deselecting everything first");
+ ot->prop = RNA_def_enum(ot->srna, "type", prop_select_grouped_types, 0, "Type", "");
}
/** \} */
@@ -404,175 +410,175 @@ void NODE_OT_select_grouped(wmOperatorType *ot)
void node_select_single(bContext *C, bNode *node)
{
- Main *bmain = CTX_data_main(C);
- SpaceNode *snode = CTX_wm_space_node(C);
- bNode *tnode;
+ Main *bmain = CTX_data_main(C);
+ SpaceNode *snode = CTX_wm_space_node(C);
+ bNode *tnode;
- for (tnode = snode->edittree->nodes.first; tnode; tnode = tnode->next) {
- if (tnode != node) {
- nodeSetSelected(tnode, false);
- }
- }
- nodeSetSelected(node, true);
+ for (tnode = snode->edittree->nodes.first; tnode; tnode = tnode->next) {
+ if (tnode != node) {
+ nodeSetSelected(tnode, false);
+ }
+ }
+ nodeSetSelected(node, true);
- ED_node_set_active(bmain, snode->edittree, node);
- ED_node_set_active_viewer_key(snode);
+ ED_node_set_active(bmain, snode->edittree, node);
+ ED_node_set_active_viewer_key(snode);
- ED_node_sort(snode->edittree);
+ ED_node_sort(snode->edittree);
- WM_event_add_notifier(C, NC_NODE | NA_SELECTED, NULL);
+ 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], bool extend, bool socket_select)
+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 = NULL;
- bNodeSocket *tsock;
- float cursor[2];
- bool selected = false;
-
- /* get mouse coordinates in view2d space */
- UI_view2d_region_to_view(&ar->v2d, mval[0], mval[1], &cursor[0], &cursor[1]);
-
- /* 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 = 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);
- }
- else {
- selected = true;
- }
- }
- else {
- /* 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);
- }
- }
- 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;
- }
- }
- }
-
- 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 */
- ED_node_set_active(bmain, snode->edittree, node);
- }
- else {
- 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) {
- 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;
- }
- }
- }
-
- /* update node order */
- if (selected) {
- ED_node_set_active_viewer_key(snode);
- ED_node_sort(snode->edittree);
- }
-
- return selected;
+ bNode *node, *tnode;
+ bNodeSocket *sock = NULL;
+ bNodeSocket *tsock;
+ float cursor[2];
+ bool selected = false;
+
+ /* get mouse coordinates in view2d space */
+ UI_view2d_region_to_view(&ar->v2d, mval[0], mval[1], &cursor[0], &cursor[1]);
+
+ /* 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 = 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);
+ }
+ else {
+ selected = true;
+ }
+ }
+ else {
+ /* 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);
+ }
+ }
+ 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;
+ }
+ }
+ }
+
+ 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 */
+ ED_node_set_active(bmain, snode->edittree, node);
+ }
+ else {
+ 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) {
+ 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;
+ }
+ }
+ }
+
+ /* update node order */
+ if (selected) {
+ ED_node_set_active_viewer_key(snode);
+ ED_node_sort(snode->edittree);
+ }
+
+ return selected;
}
static int node_select_exec(bContext *C, wmOperator *op)
{
- Main *bmain = CTX_data_main(C);
- SpaceNode *snode = CTX_wm_space_node(C);
- 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, socket_select)) {
- /* send notifiers */
- WM_event_add_notifier(C, NC_NODE | NA_SELECTED, NULL);
-
- /* allow tweak event to work too */
- return OPERATOR_FINISHED | OPERATOR_PASS_THROUGH;
- }
- else {
- /* allow tweak event to work too */
- return OPERATOR_CANCELLED | OPERATOR_PASS_THROUGH;
- }
+ Main *bmain = CTX_data_main(C);
+ SpaceNode *snode = CTX_wm_space_node(C);
+ 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, socket_select)) {
+ /* send notifiers */
+ WM_event_add_notifier(C, NC_NODE | NA_SELECTED, NULL);
+
+ /* allow tweak event to work too */
+ return OPERATOR_FINISHED | OPERATOR_PASS_THROUGH;
+ }
+ else {
+ /* allow tweak event to work too */
+ return OPERATOR_CANCELLED | OPERATOR_PASS_THROUGH;
+ }
}
static int node_select_invoke(bContext *C, wmOperator *op, const wmEvent *event)
{
- RNA_int_set(op->ptr, "mouse_x", event->mval[0]);
- RNA_int_set(op->ptr, "mouse_y", event->mval[1]);
+ RNA_int_set(op->ptr, "mouse_x", event->mval[0]);
+ RNA_int_set(op->ptr, "mouse_y", event->mval[1]);
- return node_select_exec(C, op);
+ return node_select_exec(C, op);
}
-
void NODE_OT_select(wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Select";
- ot->idname = "NODE_OT_select";
- ot->description = "Select the node under the cursor";
-
- /* api callbacks */
- ot->invoke = node_select_invoke;
- ot->exec = node_select_exec;
- ot->poll = ED_operator_node_active;
-
- /* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
-
- /* 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", false, "Extend", "");
- RNA_def_boolean(ot->srna, "socket_select", false, "Socket Select", "");
+ /* identifiers */
+ ot->name = "Select";
+ ot->idname = "NODE_OT_select";
+ ot->description = "Select the node under the cursor";
+
+ /* api callbacks */
+ ot->invoke = node_select_invoke;
+ ot->exec = node_select_exec;
+ ot->poll = ED_operator_node_active;
+
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+
+ /* 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", false, "Extend", "");
+ RNA_def_boolean(ot->srna, "socket_select", false, "Socket Select", "");
}
/** \} */
@@ -583,74 +589,78 @@ void NODE_OT_select(wmOperatorType *ot)
static int node_box_select_exec(bContext *C, wmOperator *op)
{
- SpaceNode *snode = CTX_wm_space_node(C);
- ARegion *ar = CTX_wm_region(C);
- rctf rectf;
-
- WM_operator_properties_border_to_rctf(op, &rectf);
- UI_view2d_region_to_view_rctf(&ar->v2d, &rectf, &rectf);
-
- const eSelectOp sel_op = RNA_enum_get(op->ptr, "mode");
- const bool select = (sel_op != SEL_OP_SUB);
- if (SEL_OP_USE_PRE_DESELECT(sel_op)) {
- ED_node_select_all(&snode->edittree->nodes, SEL_DESELECT);
- }
-
- for (bNode *node = snode->edittree->nodes.first; node; node = node->next) {
- bool is_inside;
- if (node->type == NODE_FRAME) {
- is_inside = BLI_rctf_inside_rctf(&rectf, &node->totr);
- }
- else {
- is_inside = BLI_rctf_isect(&rectf, &node->totr, NULL);
- }
-
- if (is_inside) {
- nodeSetSelected(node, select);
- }
- }
-
- ED_node_sort(snode->edittree);
-
- WM_event_add_notifier(C, NC_NODE | NA_SELECTED, NULL);
-
- return OPERATOR_FINISHED;
+ SpaceNode *snode = CTX_wm_space_node(C);
+ ARegion *ar = CTX_wm_region(C);
+ rctf rectf;
+
+ WM_operator_properties_border_to_rctf(op, &rectf);
+ UI_view2d_region_to_view_rctf(&ar->v2d, &rectf, &rectf);
+
+ const eSelectOp sel_op = RNA_enum_get(op->ptr, "mode");
+ const bool select = (sel_op != SEL_OP_SUB);
+ if (SEL_OP_USE_PRE_DESELECT(sel_op)) {
+ ED_node_select_all(&snode->edittree->nodes, SEL_DESELECT);
+ }
+
+ for (bNode *node = snode->edittree->nodes.first; node; node = node->next) {
+ bool is_inside;
+ if (node->type == NODE_FRAME) {
+ is_inside = BLI_rctf_inside_rctf(&rectf, &node->totr);
+ }
+ else {
+ is_inside = BLI_rctf_isect(&rectf, &node->totr, NULL);
+ }
+
+ if (is_inside) {
+ nodeSetSelected(node, select);
+ }
+ }
+
+ ED_node_sort(snode->edittree);
+
+ WM_event_add_notifier(C, NC_NODE | NA_SELECTED, NULL);
+
+ return OPERATOR_FINISHED;
}
static int node_box_select_invoke(bContext *C, wmOperator *op, const wmEvent *event)
{
- const bool tweak = RNA_boolean_get(op->ptr, "tweak");
+ const bool tweak = RNA_boolean_get(op->ptr, "tweak");
- if (tweak && is_event_over_node_or_socket(C, event)) {
- return OPERATOR_CANCELLED | OPERATOR_PASS_THROUGH;
- }
+ if (tweak && is_event_over_node_or_socket(C, event)) {
+ return OPERATOR_CANCELLED | OPERATOR_PASS_THROUGH;
+ }
- return WM_gesture_box_invoke(C, op, event);
+ return WM_gesture_box_invoke(C, op, event);
}
void NODE_OT_select_box(wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Box Select";
- ot->idname = "NODE_OT_select_box";
- ot->description = "Use box selection to select nodes";
-
- /* api callbacks */
- ot->invoke = node_box_select_invoke;
- ot->exec = node_box_select_exec;
- ot->modal = WM_gesture_box_modal;
- ot->cancel = WM_gesture_box_cancel;
-
- ot->poll = ED_operator_node_active;
-
- /* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
-
- /* properties */
- RNA_def_boolean(ot->srna, "tweak", 0, "Tweak", "Only activate when mouse is not over a node - useful for tweak gesture");
-
- WM_operator_properties_gesture_box(ot);
- WM_operator_properties_select_operation_simple(ot);
+ /* identifiers */
+ ot->name = "Box Select";
+ ot->idname = "NODE_OT_select_box";
+ ot->description = "Use box selection to select nodes";
+
+ /* api callbacks */
+ ot->invoke = node_box_select_invoke;
+ ot->exec = node_box_select_exec;
+ ot->modal = WM_gesture_box_modal;
+ ot->cancel = WM_gesture_box_cancel;
+
+ ot->poll = ED_operator_node_active;
+
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+
+ /* properties */
+ RNA_def_boolean(ot->srna,
+ "tweak",
+ 0,
+ "Tweak",
+ "Only activate when mouse is not over a node - useful for tweak gesture");
+
+ WM_operator_properties_gesture_box(ot);
+ WM_operator_properties_select_operation_simple(ot);
}
/** \} */
@@ -661,60 +671,60 @@ void NODE_OT_select_box(wmOperatorType *ot)
static int node_circleselect_exec(bContext *C, wmOperator *op)
{
- SpaceNode *snode = CTX_wm_space_node(C);
- ARegion *ar = CTX_wm_region(C);
- bNode *node;
+ SpaceNode *snode = CTX_wm_space_node(C);
+ ARegion *ar = CTX_wm_region(C);
+ bNode *node;
- int x, y, radius;
- float offset[2];
+ int x, y, radius;
+ float offset[2];
- float zoom = (float)(BLI_rcti_size_x(&ar->winrct)) / (float)(BLI_rctf_size_x(&ar->v2d.cur));
+ float zoom = (float)(BLI_rcti_size_x(&ar->winrct)) / (float)(BLI_rctf_size_x(&ar->v2d.cur));
- const eSelectOp sel_op = ED_select_op_modal(
- RNA_enum_get(op->ptr, "mode"), WM_gesture_is_modal_first(op->customdata));
- const bool select = (sel_op != SEL_OP_SUB);
- if (SEL_OP_USE_PRE_DESELECT(sel_op)) {
- ED_node_select_all(&snode->edittree->nodes, SEL_DESELECT);
- }
+ const eSelectOp sel_op = ED_select_op_modal(RNA_enum_get(op->ptr, "mode"),
+ WM_gesture_is_modal_first(op->customdata));
+ const bool select = (sel_op != SEL_OP_SUB);
+ if (SEL_OP_USE_PRE_DESELECT(sel_op)) {
+ ED_node_select_all(&snode->edittree->nodes, SEL_DESELECT);
+ }
- /* get operator properties */
- x = RNA_int_get(op->ptr, "x");
- y = RNA_int_get(op->ptr, "y");
- radius = RNA_int_get(op->ptr, "radius");
+ /* get operator properties */
+ x = RNA_int_get(op->ptr, "x");
+ y = RNA_int_get(op->ptr, "y");
+ radius = RNA_int_get(op->ptr, "radius");
- UI_view2d_region_to_view(&ar->v2d, x, y, &offset[0], &offset[1]);
+ UI_view2d_region_to_view(&ar->v2d, x, y, &offset[0], &offset[1]);
- for (node = snode->edittree->nodes.first; node; node = node->next) {
- if (BLI_rctf_isect_circle(&node->totr, offset, radius / zoom)) {
- nodeSetSelected(node, select);
- }
- }
+ for (node = snode->edittree->nodes.first; node; node = node->next) {
+ if (BLI_rctf_isect_circle(&node->totr, offset, radius / zoom)) {
+ nodeSetSelected(node, select);
+ }
+ }
- WM_event_add_notifier(C, NC_NODE | NA_SELECTED, NULL);
+ WM_event_add_notifier(C, NC_NODE | NA_SELECTED, NULL);
- return OPERATOR_FINISHED;
+ return OPERATOR_FINISHED;
}
void NODE_OT_select_circle(wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Circle Select";
- ot->idname = "NODE_OT_select_circle";
- ot->description = "Use circle selection to select nodes";
+ /* identifiers */
+ ot->name = "Circle Select";
+ ot->idname = "NODE_OT_select_circle";
+ ot->description = "Use circle selection to select nodes";
- /* api callbacks */
- ot->invoke = WM_gesture_circle_invoke;
- ot->exec = node_circleselect_exec;
- ot->modal = WM_gesture_circle_modal;
+ /* api callbacks */
+ ot->invoke = WM_gesture_circle_invoke;
+ ot->exec = node_circleselect_exec;
+ ot->modal = WM_gesture_circle_modal;
- ot->poll = ED_operator_node_active;
+ ot->poll = ED_operator_node_active;
- /* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
- /* properties */
- WM_operator_properties_gesture_circle(ot);
- WM_operator_properties_select_operation_simple(ot);
+ /* properties */
+ WM_operator_properties_gesture_circle(ot);
+ WM_operator_properties_select_operation_simple(ot);
}
/** \} */
@@ -725,101 +735,103 @@ void NODE_OT_select_circle(wmOperatorType *ot)
static int node_lasso_select_invoke(bContext *C, wmOperator *op, const wmEvent *event)
{
- const bool tweak = RNA_boolean_get(op->ptr, "tweak");
+ const bool tweak = RNA_boolean_get(op->ptr, "tweak");
- if (tweak && is_event_over_node_or_socket(C, event)) {
- return OPERATOR_CANCELLED | OPERATOR_PASS_THROUGH;
- }
+ if (tweak && is_event_over_node_or_socket(C, event)) {
+ return OPERATOR_CANCELLED | OPERATOR_PASS_THROUGH;
+ }
- return WM_gesture_lasso_invoke(C, op, event);
+ return WM_gesture_lasso_invoke(C, op, event);
}
static bool do_lasso_select_node(bContext *C, const int mcords[][2], short moves, eSelectOp sel_op)
{
- SpaceNode *snode = CTX_wm_space_node(C);
- bNode *node;
+ SpaceNode *snode = CTX_wm_space_node(C);
+ bNode *node;
- ARegion *ar = CTX_wm_region(C);
+ ARegion *ar = CTX_wm_region(C);
- rcti rect;
- bool changed = false;
+ rcti rect;
+ bool changed = false;
- const bool select = (sel_op != SEL_OP_SUB);
- if (SEL_OP_USE_PRE_DESELECT(sel_op)) {
- ED_node_select_all(&snode->edittree->nodes, SEL_DESELECT);
- changed = true;
- }
+ const bool select = (sel_op != SEL_OP_SUB);
+ if (SEL_OP_USE_PRE_DESELECT(sel_op)) {
+ ED_node_select_all(&snode->edittree->nodes, SEL_DESELECT);
+ changed = true;
+ }
- /* get rectangle from operator */
- BLI_lasso_boundbox(&rect, mcords, moves);
+ /* get rectangle from operator */
+ BLI_lasso_boundbox(&rect, mcords, moves);
- /* do actual selection */
- for (node = snode->edittree->nodes.first; node; node = node->next) {
+ /* do actual selection */
+ for (node = snode->edittree->nodes.first; node; node = node->next) {
- if (select && (node->flag & NODE_SELECT)) {
- continue;
- }
+ if (select && (node->flag & NODE_SELECT)) {
+ continue;
+ }
- int screen_co[2];
- const float cent[2] = {BLI_rctf_cent_x(&node->totr),
- BLI_rctf_cent_y(&node->totr)};
+ int screen_co[2];
+ const float cent[2] = {BLI_rctf_cent_x(&node->totr), BLI_rctf_cent_y(&node->totr)};
- /* marker in screen coords */
- if (UI_view2d_view_to_region_clip(&ar->v2d, cent[0], cent[1], &screen_co[0], &screen_co[1]) &&
- BLI_rcti_isect_pt(&rect, screen_co[0], screen_co[1]) &&
- BLI_lasso_is_point_inside(mcords, moves, screen_co[0], screen_co[1], INT_MAX))
- {
- nodeSetSelected(node, select);
- changed = true;
- }
- }
+ /* marker in screen coords */
+ if (UI_view2d_view_to_region_clip(&ar->v2d, cent[0], cent[1], &screen_co[0], &screen_co[1]) &&
+ BLI_rcti_isect_pt(&rect, screen_co[0], screen_co[1]) &&
+ BLI_lasso_is_point_inside(mcords, moves, screen_co[0], screen_co[1], INT_MAX)) {
+ nodeSetSelected(node, select);
+ changed = true;
+ }
+ }
- if (changed) {
- WM_event_add_notifier(C, NC_NODE | NA_SELECTED, NULL);
- }
+ if (changed) {
+ WM_event_add_notifier(C, NC_NODE | NA_SELECTED, NULL);
+ }
- return changed;
+ return changed;
}
static int node_lasso_select_exec(bContext *C, wmOperator *op)
{
- int mcords_tot;
- const int (*mcords)[2] = WM_gesture_lasso_path_to_array(C, op, &mcords_tot);
+ int mcords_tot;
+ const int(*mcords)[2] = WM_gesture_lasso_path_to_array(C, op, &mcords_tot);
- if (mcords) {
- const eSelectOp sel_op = RNA_enum_get(op->ptr, "mode");
+ if (mcords) {
+ const eSelectOp sel_op = RNA_enum_get(op->ptr, "mode");
- do_lasso_select_node(C, mcords, mcords_tot, sel_op);
+ do_lasso_select_node(C, mcords, mcords_tot, sel_op);
- MEM_freeN((void *)mcords);
+ MEM_freeN((void *)mcords);
- return OPERATOR_FINISHED;
- }
- return OPERATOR_PASS_THROUGH;
+ return OPERATOR_FINISHED;
+ }
+ return OPERATOR_PASS_THROUGH;
}
void NODE_OT_select_lasso(wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Lasso Select";
- ot->description = "Select nodes using lasso selection";
- ot->idname = "NODE_OT_select_lasso";
-
- /* api callbacks */
- ot->invoke = node_lasso_select_invoke;
- ot->modal = WM_gesture_lasso_modal;
- ot->exec = node_lasso_select_exec;
- ot->poll = ED_operator_node_active;
- ot->cancel = WM_gesture_lasso_cancel;
-
- /* flags */
- ot->flag = OPTYPE_UNDO;
-
- /* properties */
- RNA_def_boolean(ot->srna, "tweak", 0, "Tweak", "Only activate when mouse is not over a node - useful for tweak gesture");
-
- WM_operator_properties_gesture_lasso(ot);
- WM_operator_properties_select_operation_simple(ot);
+ /* identifiers */
+ ot->name = "Lasso Select";
+ ot->description = "Select nodes using lasso selection";
+ ot->idname = "NODE_OT_select_lasso";
+
+ /* api callbacks */
+ ot->invoke = node_lasso_select_invoke;
+ ot->modal = WM_gesture_lasso_modal;
+ ot->exec = node_lasso_select_exec;
+ ot->poll = ED_operator_node_active;
+ ot->cancel = WM_gesture_lasso_cancel;
+
+ /* flags */
+ ot->flag = OPTYPE_UNDO;
+
+ /* properties */
+ RNA_def_boolean(ot->srna,
+ "tweak",
+ 0,
+ "Tweak",
+ "Only activate when mouse is not over a node - useful for tweak gesture");
+
+ WM_operator_properties_gesture_lasso(ot);
+ WM_operator_properties_select_operation_simple(ot);
}
/** \} */
@@ -830,33 +842,33 @@ void NODE_OT_select_lasso(wmOperatorType *ot)
static int node_select_all_exec(bContext *C, wmOperator *op)
{
- SpaceNode *snode = CTX_wm_space_node(C);
- ListBase *node_lb = &snode->edittree->nodes;
- int action = RNA_enum_get(op->ptr, "action");
+ SpaceNode *snode = CTX_wm_space_node(C);
+ ListBase *node_lb = &snode->edittree->nodes;
+ int action = RNA_enum_get(op->ptr, "action");
- ED_node_select_all(node_lb, action);
+ ED_node_select_all(node_lb, action);
- ED_node_sort(snode->edittree);
+ ED_node_sort(snode->edittree);
- WM_event_add_notifier(C, NC_NODE | NA_SELECTED, NULL);
- return OPERATOR_FINISHED;
+ WM_event_add_notifier(C, NC_NODE | NA_SELECTED, NULL);
+ return OPERATOR_FINISHED;
}
void NODE_OT_select_all(wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "(De)select All";
- ot->description = "(De)select all nodes";
- ot->idname = "NODE_OT_select_all";
+ /* identifiers */
+ ot->name = "(De)select All";
+ ot->description = "(De)select all nodes";
+ ot->idname = "NODE_OT_select_all";
- /* api callbacks */
- ot->exec = node_select_all_exec;
- ot->poll = ED_operator_node_active;
+ /* api callbacks */
+ ot->exec = node_select_all_exec;
+ ot->poll = ED_operator_node_active;
- /* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
- WM_operator_properties_select_all(ot);
+ WM_operator_properties_select_all(ot);
}
/** \} */
@@ -867,48 +879,48 @@ void NODE_OT_select_all(wmOperatorType *ot)
static int node_select_linked_to_exec(bContext *C, wmOperator *UNUSED(op))
{
- SpaceNode *snode = CTX_wm_space_node(C);
- bNodeLink *link;
- bNode *node;
-
- for (node = snode->edittree->nodes.first; node; node = node->next) {
- node->flag &= ~NODE_TEST;
- }
-
- for (link = snode->edittree->links.first; link; link = link->next) {
- if (nodeLinkIsHidden(link)) {
- continue;
- }
- if (link->fromnode && link->tonode && (link->fromnode->flag & NODE_SELECT)) {
- link->tonode->flag |= NODE_TEST;
- }
- }
-
- for (node = snode->edittree->nodes.first; node; node = node->next) {
- if (node->flag & NODE_TEST) {
- nodeSetSelected(node, true);
- }
- }
-
- ED_node_sort(snode->edittree);
-
- WM_event_add_notifier(C, NC_NODE | NA_SELECTED, NULL);
- return OPERATOR_FINISHED;
+ SpaceNode *snode = CTX_wm_space_node(C);
+ bNodeLink *link;
+ bNode *node;
+
+ for (node = snode->edittree->nodes.first; node; node = node->next) {
+ node->flag &= ~NODE_TEST;
+ }
+
+ for (link = snode->edittree->links.first; link; link = link->next) {
+ if (nodeLinkIsHidden(link)) {
+ continue;
+ }
+ if (link->fromnode && link->tonode && (link->fromnode->flag & NODE_SELECT)) {
+ link->tonode->flag |= NODE_TEST;
+ }
+ }
+
+ for (node = snode->edittree->nodes.first; node; node = node->next) {
+ if (node->flag & NODE_TEST) {
+ nodeSetSelected(node, true);
+ }
+ }
+
+ ED_node_sort(snode->edittree);
+
+ WM_event_add_notifier(C, NC_NODE | NA_SELECTED, NULL);
+ return OPERATOR_FINISHED;
}
void NODE_OT_select_linked_to(wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Select Linked To";
- ot->description = "Select nodes linked to the selected ones";
- ot->idname = "NODE_OT_select_linked_to";
+ /* identifiers */
+ ot->name = "Select Linked To";
+ ot->description = "Select nodes linked to the selected ones";
+ ot->idname = "NODE_OT_select_linked_to";
- /* api callbacks */
- ot->exec = node_select_linked_to_exec;
- ot->poll = ED_operator_node_active;
+ /* api callbacks */
+ ot->exec = node_select_linked_to_exec;
+ ot->poll = ED_operator_node_active;
- /* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
/** \} */
@@ -919,48 +931,48 @@ void NODE_OT_select_linked_to(wmOperatorType *ot)
static int node_select_linked_from_exec(bContext *C, wmOperator *UNUSED(op))
{
- SpaceNode *snode = CTX_wm_space_node(C);
- bNodeLink *link;
- bNode *node;
-
- for (node = snode->edittree->nodes.first; node; node = node->next) {
- node->flag &= ~NODE_TEST;
- }
-
- for (link = snode->edittree->links.first; link; link = link->next) {
- if (nodeLinkIsHidden(link)) {
- continue;
- }
- if (link->fromnode && link->tonode && (link->tonode->flag & NODE_SELECT)) {
- link->fromnode->flag |= NODE_TEST;
- }
- }
-
- for (node = snode->edittree->nodes.first; node; node = node->next) {
- if (node->flag & NODE_TEST) {
- nodeSetSelected(node, true);
- }
- }
-
- ED_node_sort(snode->edittree);
-
- WM_event_add_notifier(C, NC_NODE | NA_SELECTED, NULL);
- return OPERATOR_FINISHED;
+ SpaceNode *snode = CTX_wm_space_node(C);
+ bNodeLink *link;
+ bNode *node;
+
+ for (node = snode->edittree->nodes.first; node; node = node->next) {
+ node->flag &= ~NODE_TEST;
+ }
+
+ for (link = snode->edittree->links.first; link; link = link->next) {
+ if (nodeLinkIsHidden(link)) {
+ continue;
+ }
+ if (link->fromnode && link->tonode && (link->tonode->flag & NODE_SELECT)) {
+ link->fromnode->flag |= NODE_TEST;
+ }
+ }
+
+ for (node = snode->edittree->nodes.first; node; node = node->next) {
+ if (node->flag & NODE_TEST) {
+ nodeSetSelected(node, true);
+ }
+ }
+
+ ED_node_sort(snode->edittree);
+
+ WM_event_add_notifier(C, NC_NODE | NA_SELECTED, NULL);
+ return OPERATOR_FINISHED;
}
void NODE_OT_select_linked_from(wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Select Linked From";
- ot->description = "Select nodes linked from the selected ones";
- ot->idname = "NODE_OT_select_linked_from";
+ /* identifiers */
+ ot->name = "Select Linked From";
+ ot->description = "Select nodes linked from the selected ones";
+ ot->idname = "NODE_OT_select_linked_from";
- /* api callbacks */
- ot->exec = node_select_linked_from_exec;
- ot->poll = ED_operator_node_active;
+ /* api callbacks */
+ ot->exec = node_select_linked_from_exec;
+ ot->poll = ED_operator_node_active;
- /* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
/** \} */
@@ -971,106 +983,104 @@ void NODE_OT_select_linked_from(wmOperatorType *ot)
static int node_select_same_type_step_exec(bContext *C, wmOperator *op)
{
- SpaceNode *snode = CTX_wm_space_node(C);
- ARegion *ar = CTX_wm_region(C);
- bNode **node_array;
- bNode *active = nodeGetActive(snode->edittree);
- int totnodes;
- const bool revert = RNA_boolean_get(op->ptr, "prev");
- const bool same_type = 1;
-
- ntreeGetDependencyList(snode->edittree, &node_array, &totnodes);
-
- if (totnodes > 1) {
- int a;
-
- for (a = 0; a < totnodes; a++) {
- if (node_array[a] == active) {
- break;
- }
- }
-
- if (same_type) {
- bNode *node = NULL;
-
- while (node == NULL) {
- if (revert) {
- a--;
- }
- else {
- a++;
- }
-
- if (a < 0 || a >= totnodes) {
- break;
- }
-
- node = node_array[a];
-
- if (node->type == active->type) {
- break;
- }
- else {
- node = NULL;
- }
- }
- if (node) {
- active = node;
- }
- }
- else {
- if (revert) {
- if (a == 0) {
- active = node_array[totnodes - 1];
- }
- else {
- active = node_array[a - 1];
- }
- }
- else {
- if (a == totnodes - 1) {
- active = node_array[0];
- }
- else {
- active = node_array[a + 1];
- }
- }
- }
-
- node_select_single(C, active);
-
- /* is note outside view? */
- if (active->totr.xmax < ar->v2d.cur.xmin || active->totr.xmin > ar->v2d.cur.xmax ||
- active->totr.ymax < ar->v2d.cur.ymin || active->totr.ymin > ar->v2d.cur.ymax)
- {
- const int smooth_viewtx = WM_operator_smooth_viewtx_get(op);
- space_node_view_flag(C, snode, ar, NODE_SELECT, smooth_viewtx);
- }
- }
-
- if (node_array) {
- MEM_freeN(node_array);
- }
-
- return OPERATOR_FINISHED;
+ SpaceNode *snode = CTX_wm_space_node(C);
+ ARegion *ar = CTX_wm_region(C);
+ bNode **node_array;
+ bNode *active = nodeGetActive(snode->edittree);
+ int totnodes;
+ const bool revert = RNA_boolean_get(op->ptr, "prev");
+ const bool same_type = 1;
+
+ ntreeGetDependencyList(snode->edittree, &node_array, &totnodes);
+
+ if (totnodes > 1) {
+ int a;
+
+ for (a = 0; a < totnodes; a++) {
+ if (node_array[a] == active) {
+ break;
+ }
+ }
+
+ if (same_type) {
+ bNode *node = NULL;
+
+ while (node == NULL) {
+ if (revert) {
+ a--;
+ }
+ else {
+ a++;
+ }
+
+ if (a < 0 || a >= totnodes) {
+ break;
+ }
+
+ node = node_array[a];
+
+ if (node->type == active->type) {
+ break;
+ }
+ else {
+ node = NULL;
+ }
+ }
+ if (node) {
+ active = node;
+ }
+ }
+ else {
+ if (revert) {
+ if (a == 0) {
+ active = node_array[totnodes - 1];
+ }
+ else {
+ active = node_array[a - 1];
+ }
+ }
+ else {
+ if (a == totnodes - 1) {
+ active = node_array[0];
+ }
+ else {
+ active = node_array[a + 1];
+ }
+ }
+ }
+
+ node_select_single(C, active);
+
+ /* is note outside view? */
+ if (active->totr.xmax < ar->v2d.cur.xmin || active->totr.xmin > ar->v2d.cur.xmax ||
+ active->totr.ymax < ar->v2d.cur.ymin || active->totr.ymin > ar->v2d.cur.ymax) {
+ const int smooth_viewtx = WM_operator_smooth_viewtx_get(op);
+ space_node_view_flag(C, snode, ar, NODE_SELECT, smooth_viewtx);
+ }
+ }
+
+ if (node_array) {
+ MEM_freeN(node_array);
+ }
+
+ return OPERATOR_FINISHED;
}
void NODE_OT_select_same_type_step(wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Activate Same Type Next/Prev";
- ot->description = "Activate and view same node type, step by step";
- ot->idname = "NODE_OT_select_same_type_step";
-
- /* api callbacks */
- ot->exec = node_select_same_type_step_exec;
- ot->poll = ED_operator_node_active;
+ /* identifiers */
+ ot->name = "Activate Same Type Next/Prev";
+ ot->description = "Activate and view same node type, step by step";
+ ot->idname = "NODE_OT_select_same_type_step";
- /* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+ /* api callbacks */
+ ot->exec = node_select_same_type_step_exec;
+ ot->poll = ED_operator_node_active;
- RNA_def_boolean(ot->srna, "prev", 0, "Previous", "");
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+ RNA_def_boolean(ot->srna, "prev", 0, "Previous", "");
}
/** \} */
@@ -1080,96 +1090,108 @@ void NODE_OT_select_same_type_step(wmOperatorType *ot)
* \{ */
/* generic search invoke */
-static void node_find_cb(const struct bContext *C, void *UNUSED(arg), const char *str, uiSearchItems *items)
+static void node_find_cb(const struct bContext *C,
+ void *UNUSED(arg),
+ const char *str,
+ uiSearchItems *items)
{
- SpaceNode *snode = CTX_wm_space_node(C);
- bNode *node;
-
- for (node = snode->edittree->nodes.first; node; node = node->next) {
-
- if (BLI_strcasestr(node->name, str) || BLI_strcasestr(node->label, str)) {
- char name[256];
-
- if (node->label[0]) {
- BLI_snprintf(name, 256, "%s (%s)", node->name, node->label);
- }
- else {
- BLI_strncpy(name, node->name, 256);
- }
- if (false == UI_search_item_add(items, name, node, 0)) {
- break;
- }
- }
- }
+ SpaceNode *snode = CTX_wm_space_node(C);
+ bNode *node;
+
+ for (node = snode->edittree->nodes.first; node; node = node->next) {
+
+ if (BLI_strcasestr(node->name, str) || BLI_strcasestr(node->label, str)) {
+ char name[256];
+
+ if (node->label[0]) {
+ BLI_snprintf(name, 256, "%s (%s)", node->name, node->label);
+ }
+ else {
+ BLI_strncpy(name, node->name, 256);
+ }
+ if (false == UI_search_item_add(items, name, node, 0)) {
+ break;
+ }
+ }
+ }
}
static void node_find_call_cb(struct bContext *C, void *UNUSED(arg1), void *arg2)
{
- SpaceNode *snode = CTX_wm_space_node(C);
- bNode *active = arg2;
-
- if (active) {
- ARegion *ar = CTX_wm_region(C);
- node_select_single(C, active);
-
- /* is note outside view? */
- if (active->totr.xmax < ar->v2d.cur.xmin || active->totr.xmin > ar->v2d.cur.xmax ||
- active->totr.ymax < ar->v2d.cur.ymin || active->totr.ymin > ar->v2d.cur.ymax)
- {
- space_node_view_flag(C, snode, ar, NODE_SELECT, U.smooth_viewtx);
- }
-
- }
+ SpaceNode *snode = CTX_wm_space_node(C);
+ bNode *active = arg2;
+
+ if (active) {
+ ARegion *ar = CTX_wm_region(C);
+ node_select_single(C, active);
+
+ /* is note outside view? */
+ if (active->totr.xmax < ar->v2d.cur.xmin || active->totr.xmin > ar->v2d.cur.xmax ||
+ active->totr.ymax < ar->v2d.cur.ymin || active->totr.ymin > ar->v2d.cur.ymax) {
+ space_node_view_flag(C, snode, ar, NODE_SELECT, U.smooth_viewtx);
+ }
+ }
}
static uiBlock *node_find_menu(bContext *C, ARegion *ar, void *arg_op)
{
- static char search[256] = "";
- uiBlock *block;
- uiBut *but;
- wmOperator *op = (wmOperator *)arg_op;
-
- block = UI_block_begin(C, ar, "_popup", UI_EMBOSS);
- UI_block_flag_enable(block, UI_BLOCK_LOOP | UI_BLOCK_MOVEMOUSE_QUIT | UI_BLOCK_SEARCH_MENU);
- UI_block_theme_style_set(block, UI_BLOCK_THEME_STYLE_POPUP);
-
- but = uiDefSearchBut(block, search, 0, ICON_VIEWZOOM, sizeof(search), 10, 10, 9 * UI_UNIT_X, UI_UNIT_Y, 0, 0, "");
- UI_but_func_search_set(but, NULL, node_find_cb, op->type, false, node_find_call_cb, NULL);
- UI_but_flag_enable(but, UI_BUT_ACTIVATE_ON_INIT);
-
- /* fake button, it holds space for search items */
- uiDefBut(block, UI_BTYPE_LABEL, 0, "", 10, 10 - UI_searchbox_size_y(), UI_searchbox_size_x(), UI_searchbox_size_y(), NULL, 0, 0, 0, 0, NULL);
-
- /* Move it downwards, mouse over button. */
- UI_block_bounds_set_popup(block, 6, (const int[2]){0, -UI_UNIT_Y});
-
- return block;
+ static char search[256] = "";
+ uiBlock *block;
+ uiBut *but;
+ wmOperator *op = (wmOperator *)arg_op;
+
+ block = UI_block_begin(C, ar, "_popup", UI_EMBOSS);
+ UI_block_flag_enable(block, UI_BLOCK_LOOP | UI_BLOCK_MOVEMOUSE_QUIT | UI_BLOCK_SEARCH_MENU);
+ UI_block_theme_style_set(block, UI_BLOCK_THEME_STYLE_POPUP);
+
+ but = uiDefSearchBut(
+ block, search, 0, ICON_VIEWZOOM, sizeof(search), 10, 10, 9 * UI_UNIT_X, UI_UNIT_Y, 0, 0, "");
+ UI_but_func_search_set(but, NULL, node_find_cb, op->type, false, node_find_call_cb, NULL);
+ UI_but_flag_enable(but, UI_BUT_ACTIVATE_ON_INIT);
+
+ /* fake button, it holds space for search items */
+ uiDefBut(block,
+ UI_BTYPE_LABEL,
+ 0,
+ "",
+ 10,
+ 10 - UI_searchbox_size_y(),
+ UI_searchbox_size_x(),
+ UI_searchbox_size_y(),
+ NULL,
+ 0,
+ 0,
+ 0,
+ 0,
+ NULL);
+
+ /* Move it downwards, mouse over button. */
+ UI_block_bounds_set_popup(block, 6, (const int[2]){0, -UI_UNIT_Y});
+
+ return block;
}
-
static int node_find_node_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
{
- UI_popup_block_invoke(C, node_find_menu, op);
- return OPERATOR_CANCELLED;
+ UI_popup_block_invoke(C, node_find_menu, op);
+ return OPERATOR_CANCELLED;
}
-
void NODE_OT_find_node(wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Find Node";
- ot->description = "Search for named node and allow to select and activate it";
- ot->idname = "NODE_OT_find_node";
-
- /* api callbacks */
- ot->invoke = node_find_node_invoke;
- ot->poll = ED_operator_node_active;
+ /* identifiers */
+ ot->name = "Find Node";
+ ot->description = "Search for named node and allow to select and activate it";
+ ot->idname = "NODE_OT_find_node";
- /* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+ /* api callbacks */
+ ot->invoke = node_find_node_invoke;
+ ot->poll = ED_operator_node_active;
- RNA_def_boolean(ot->srna, "prev", 0, "Previous", "");
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+ RNA_def_boolean(ot->srna, "prev", 0, "Previous", "");
}
/** \} */