Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/space_node/node_select.c
| Show First 20 Lines • Show All 83 Lines • ▼ Show 20 Lines | for (node = ntree->nodes.last; node; node = node->prev) { | ||||
| if (node->typeinfo->tweak_area_func) { | if (node->typeinfo->tweak_area_func) { | ||||
| if (node->typeinfo->tweak_area_func(node, mx, my)) | if (node->typeinfo->tweak_area_func(node, mx, my)) | ||||
| return node; | return node; | ||||
| } | } | ||||
| } | } | ||||
| return NULL; | 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; | |||||
| } | |||||
| bNode *node; | |||||
| bNodeSocket *sock; | |||||
| if (node_find_indicated_socket(snode, &node, &sock, mouse, SOCK_IN | SOCK_OUT)) { | |||||
| return true; | |||||
| } | |||||
| 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); | |||||
| } | |||||
| static void node_toggle(bNode *node) | static void node_toggle(bNode *node) | ||||
| { | { | ||||
| nodeSetSelected(node, !(node->flag & SELECT)); | nodeSetSelected(node, !(node->flag & SELECT)); | ||||
| } | } | ||||
| void node_socket_select(bNode *node, bNodeSocket *sock) | void node_socket_select(bNode *node, bNodeSocket *sock) | ||||
| { | { | ||||
| sock->flag |= SELECT; | sock->flag |= SELECT; | ||||
| ▲ Show 20 Lines • Show All 454 Lines • ▼ Show 20 Lines | static int node_box_select_exec(bContext *C, wmOperator *op) | ||||
| return OPERATOR_FINISHED; | return OPERATOR_FINISHED; | ||||
| } | } | ||||
| static int node_box_select_invoke(bContext *C, wmOperator *op, const wmEvent *event) | 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) { | if (tweak && is_event_over_node_or_socket(C, event)) { | ||||
| /* prevent initiating the box select if the mouse is over a node or | |||||
| * node socket. this allows box select on empty space, but drag-translate | |||||
| * on nodes */ | |||||
| 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]); | |||||
| if (node_under_mouse_tweak(snode->edittree, mouse[0], mouse[1])) { | |||||
| return OPERATOR_CANCELLED | OPERATOR_PASS_THROUGH; | return OPERATOR_CANCELLED | OPERATOR_PASS_THROUGH; | ||||
| } | } | ||||
| bNode *node; | |||||
| bNodeSocket *sock; | |||||
| if (node_find_indicated_socket(snode, &node, &sock, mouse, SOCK_IN | SOCK_OUT)) { | |||||
| 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) | void NODE_OT_select_box(wmOperatorType *ot) | ||||
| { | { | ||||
| /* identifiers */ | /* identifiers */ | ||||
| ot->name = "Box Select"; | ot->name = "Box Select"; | ||||
| ot->idname = "NODE_OT_select_box"; | ot->idname = "NODE_OT_select_box"; | ||||
| ▲ Show 20 Lines • Show All 66 Lines • ▼ Show 20 Lines | void NODE_OT_select_circle(wmOperatorType *ot) | ||||
| ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; | ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; | ||||
| /* properties */ | /* properties */ | ||||
| WM_operator_properties_gesture_circle_select(ot); | WM_operator_properties_gesture_circle_select(ot); | ||||
| } | } | ||||
| /* ****** Lasso Select ****** */ | /* ****** Lasso Select ****** */ | ||||
| static int node_lasso_select_invoke(bContext *C, wmOperator *op, const wmEvent *event) | |||||
| { | |||||
| 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; | |||||
| } | |||||
| return WM_gesture_lasso_invoke(C, op, event); | |||||
| } | |||||
| static bool do_lasso_select_node(bContext *C, const int mcords[][2], short moves, bool select, bool extend) | static bool do_lasso_select_node(bContext *C, const int mcords[][2], short moves, bool select, bool extend) | ||||
| { | { | ||||
| SpaceNode *snode = CTX_wm_space_node(C); | SpaceNode *snode = CTX_wm_space_node(C); | ||||
| bNode *node; | bNode *node; | ||||
| ARegion *ar = CTX_wm_region(C); | ARegion *ar = CTX_wm_region(C); | ||||
| rcti rect; | rcti rect; | ||||
| ▲ Show 20 Lines • Show All 54 Lines • ▼ Show 20 Lines | |||||
| void NODE_OT_select_lasso(wmOperatorType *ot) | void NODE_OT_select_lasso(wmOperatorType *ot) | ||||
| { | { | ||||
| /* identifiers */ | /* identifiers */ | ||||
| ot->name = "Lasso Select"; | ot->name = "Lasso Select"; | ||||
| ot->description = "Select nodes using lasso selection"; | ot->description = "Select nodes using lasso selection"; | ||||
| ot->idname = "NODE_OT_select_lasso"; | ot->idname = "NODE_OT_select_lasso"; | ||||
| /* api callbacks */ | /* api callbacks */ | ||||
| ot->invoke = WM_gesture_lasso_invoke; | ot->invoke = node_lasso_select_invoke; | ||||
| ot->modal = WM_gesture_lasso_modal; | ot->modal = WM_gesture_lasso_modal; | ||||
| ot->exec = node_lasso_select_exec; | ot->exec = node_lasso_select_exec; | ||||
| ot->poll = ED_operator_node_active; | ot->poll = ED_operator_node_active; | ||||
| ot->cancel = WM_gesture_lasso_cancel; | ot->cancel = WM_gesture_lasso_cancel; | ||||
| /* flags */ | /* flags */ | ||||
| ot->flag = OPTYPE_UNDO; | ot->flag = OPTYPE_UNDO; | ||||
| /* properties */ | /* properties */ | ||||
| WM_operator_properties_gesture_lasso_select(ot); | WM_operator_properties_gesture_lasso_select(ot); | ||||
| RNA_def_boolean(ot->srna, "tweak", 0, "Tweak", "Only activate when mouse is not over a node - useful for tweak gesture"); | |||||
| } | } | ||||
| /* ****** Select/Deselect All ****** */ | /* ****** Select/Deselect All ****** */ | ||||
| static int node_select_all_exec(bContext *C, wmOperator *op) | static int node_select_all_exec(bContext *C, wmOperator *op) | ||||
| { | { | ||||
| SpaceNode *snode = CTX_wm_space_node(C); | SpaceNode *snode = CTX_wm_space_node(C); | ||||
| ListBase *node_lb = &snode->edittree->nodes; | ListBase *node_lb = &snode->edittree->nodes; | ||||
| ▲ Show 20 Lines • Show All 323 Lines • Show Last 20 Lines | |||||