Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/space_node/node_select.c
| Show First 20 Lines • Show All 404 Lines • ▼ Show 20 Lines | void node_select_single(bContext *C, bNode *node) | ||||
| ED_node_set_active(bmain, snode->edittree, node); | ED_node_set_active(bmain, snode->edittree, node); | ||||
| ED_node_set_active_viewer_key(snode); | 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], 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; | bNode *node, *tnode; | ||||
| bNodeSocket *sock, *tsock; | bNodeSocket *sock = NULL; | ||||
| bNodeSocket *tsock; | |||||
| float cursor[2]; | float cursor[2]; | ||||
| int selected = 0; | bool selected = false; | ||||
| /* get mouse coordinates in view2d space */ | /* get mouse coordinates in view2d space */ | ||||
| UI_view2d_region_to_view(&ar->v2d, mval[0], mval[1], &cursor[0], &cursor[1]); | 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. */ | ||||
| /* first do socket selection, these generally overlap with nodes. | if (socket_select) { | ||||
| * socket selection only in extend mode. | |||||
| */ | |||||
| if (node_find_indicated_socket(snode, &node, &sock, cursor, SOCK_IN)) { | if (node_find_indicated_socket(snode, &node, &sock, cursor, SOCK_IN)) { | ||||
| node_socket_toggle(node, sock, 1); | node_socket_toggle(node, sock, 1); | ||||
| selected = 1; | selected = true; | ||||
| } | } | ||||
| else if (node_find_indicated_socket(snode, &node, &sock, cursor, SOCK_OUT)) { | else if (node_find_indicated_socket(snode, &node, &sock, cursor, SOCK_OUT)) { | ||||
| if (sock->flag & SELECT) { | if (sock->flag & SELECT) { | ||||
| if (extend) { | |||||
| node_socket_deselect(node, sock, 1); | node_socket_deselect(node, sock, 1); | ||||
| } | } | ||||
| else { | else { | ||||
| selected = true; | |||||
| } | |||||
| } | |||||
| else { | |||||
| /* only allow one selected output per node, for sensible linking. | /* 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) { | if (node) { | ||||
| for (tsock = node->outputs.first; tsock; tsock = tsock->next) | for (tsock = node->outputs.first; tsock; tsock = tsock->next) | ||||
| node_socket_deselect(node, tsock, 1); | 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); | node_socket_select(node, sock); | ||||
| selected = true; | |||||
| } | } | ||||
| selected = 1; | |||||
| } | } | ||||
| else { | } | ||||
| if (!sock) { | |||||
| if (extend) { | |||||
| /* find the closest visible node */ | /* find the closest visible node */ | ||||
| node = node_under_mouse_select(snode->edittree, cursor[0], cursor[1]); | node = node_under_mouse_select(snode->edittree, cursor[0], cursor[1]); | ||||
| if (node) { | if (node) { | ||||
| if ((node->flag & SELECT) && (node->flag & NODE_ACTIVE) == 0) { | if ((node->flag & SELECT) && (node->flag & NODE_ACTIVE) == 0) { | ||||
| /* if node is selected but not active make it active | /* if node is selected but not active make it active */ | ||||
| * before it'll be desleected | |||||
| */ | |||||
| ED_node_set_active(bmain, snode->edittree, node); | ED_node_set_active(bmain, snode->edittree, node); | ||||
| } | } | ||||
| else { | else { | ||||
| node_toggle(node); | node_toggle(node); | ||||
| ED_node_set_active(bmain, snode->edittree, node); | ED_node_set_active(bmain, snode->edittree, node); | ||||
| } | } | ||||
| selected = true; | |||||
| selected = 1; | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| else { /* extend == 0 */ | else { | ||||
| /* find the closest visible node */ | /* find the closest visible node */ | ||||
| node = node_under_mouse_select(snode->edittree, cursor[0], cursor[1]); | node = node_under_mouse_select(snode->edittree, cursor[0], cursor[1]); | ||||
| if (node) { | if (node) { | ||||
| for (tnode = snode->edittree->nodes.first; tnode; tnode = tnode->next) { | for (tnode = snode->edittree->nodes.first; tnode; tnode = tnode->next) { | ||||
| nodeSetSelected(tnode, false); | nodeSetSelected(tnode, false); | ||||
| } | } | ||||
| nodeSetSelected(node, true); | nodeSetSelected(node, true); | ||||
| ED_node_set_active(bmain, snode->edittree, node); | ED_node_set_active(bmain, snode->edittree, node); | ||||
| selected = 1; | selected = true; | ||||
| } | |||||
| } | } | ||||
| } | } | ||||
| /* update node order */ | /* update node order */ | ||||
| if (selected) { | if (selected) { | ||||
| ED_node_set_active_viewer_key(snode); | ED_node_set_active_viewer_key(snode); | ||||
| ED_node_sort(snode->edittree); | ED_node_sort(snode->edittree); | ||||
| } | } | ||||
| return selected; | return selected; | ||||
| } | } | ||||
| static int node_select_exec(bContext *C, wmOperator *op) | static int node_select_exec(bContext *C, wmOperator *op) | ||||
| { | { | ||||
| Main *bmain = CTX_data_main(C); | Main *bmain = CTX_data_main(C); | ||||
| SpaceNode *snode = CTX_wm_space_node(C); | SpaceNode *snode = CTX_wm_space_node(C); | ||||
| ARegion *ar = CTX_wm_region(C); | ARegion *ar = CTX_wm_region(C); | ||||
| int mval[2]; | int mval[2]; | ||||
| short extend; | short extend; | ||||
| bool socket_select; | |||||
| /* get settings from RNA properties for operator */ | /* get settings from RNA properties for operator */ | ||||
| mval[0] = RNA_int_get(op->ptr, "mouse_x"); | mval[0] = RNA_int_get(op->ptr, "mouse_x"); | ||||
| mval[1] = RNA_int_get(op->ptr, "mouse_y"); | mval[1] = RNA_int_get(op->ptr, "mouse_y"); | ||||
| extend = RNA_boolean_get(op->ptr, "extend"); | extend = RNA_boolean_get(op->ptr, "extend"); | ||||
| /* always do socket_select when extending selection. */ | |||||
| socket_select = extend || RNA_boolean_get(op->ptr, "socket_select"); | |||||
brecht: Use `||` instead of `|` for booleans. | |||||
| /* perform the 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 */ | /* send notifiers */ | ||||
| WM_event_add_notifier(C, NC_NODE | NA_SELECTED, NULL); | WM_event_add_notifier(C, NC_NODE | NA_SELECTED, NULL); | ||||
| /* allow tweak event to work too */ | /* allow tweak event to work too */ | ||||
| return OPERATOR_FINISHED | OPERATOR_PASS_THROUGH; | return OPERATOR_FINISHED | OPERATOR_PASS_THROUGH; | ||||
| } | } | ||||
| else { | else { | ||||
| /* allow tweak event to work too */ | /* allow tweak event to work too */ | ||||
| Show All 23 Lines | void NODE_OT_select(wmOperatorType *ot) | ||||
| ot->poll = ED_operator_node_active; | ot->poll = ED_operator_node_active; | ||||
| /* flags */ | /* flags */ | ||||
| ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; | ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; | ||||
| /* properties */ | /* 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_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_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", ""); | |||||
| } | } | ||||
| /** \} */ | /** \} */ | ||||
| /* -------------------------------------------------------------------- */ | /* -------------------------------------------------------------------- */ | ||||
| /** \name Box Select Operator | /** \name Box Select Operator | ||||
| * \{ */ | * \{ */ | ||||
| ▲ Show 20 Lines • Show All 566 Lines • Show Last 20 Lines | |||||
Use || instead of | for booleans.