Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/space_node/node_select.c
| Show All 30 Lines | |||||
| #include "BLI_math.h" | #include "BLI_math.h" | ||||
| #include "BLI_string.h" | #include "BLI_string.h" | ||||
| #include "BLI_string_utf8.h" | #include "BLI_string_utf8.h" | ||||
| #include "BKE_context.h" | #include "BKE_context.h" | ||||
| #include "BKE_main.h" | #include "BKE_main.h" | ||||
| #include "BKE_node.h" | #include "BKE_node.h" | ||||
| #include "RE_engine.h" | |||||
| #include "ED_node.h" /* own include */ | #include "ED_node.h" /* own include */ | ||||
| #include "ED_screen.h" | #include "ED_screen.h" | ||||
| #include "ED_select_utils.h" | #include "ED_select_utils.h" | ||||
| #include "RNA_access.h" | #include "RNA_access.h" | ||||
| #include "RNA_define.h" | #include "RNA_define.h" | ||||
| #include "WM_api.h" | #include "WM_api.h" | ||||
| ▲ Show 20 Lines • Show All 344 Lines • ▼ Show 20 Lines | |||||
| /** \name Select (Cursor Pick) Operator | /** \name Select (Cursor Pick) Operator | ||||
| * \{ */ | * \{ */ | ||||
| void node_select_single(bContext *C, bNode *node) | void node_select_single(bContext *C, bNode *node) | ||||
| { | { | ||||
| 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); | ||||
| bNode *tnode; | bNode *tnode; | ||||
| RenderEngineType *re_type = CTX_data_engine_type(C); | |||||
| for (tnode = snode->edittree->nodes.first; tnode; tnode = tnode->next) | for (tnode = snode->edittree->nodes.first; tnode; tnode = tnode->next) | ||||
| if (tnode != node) | if (tnode != node) | ||||
| 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, re_type); | ||||
| 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(bContext *C, SpaceNode *snode, ARegion *ar, const int mval[2], short extend) | ||||
| { | { | ||||
| Main *bmain = CTX_data_main(C); | |||||
| RenderEngineType *re_type = CTX_data_engine_type(C); | |||||
| bNode *node, *tnode; | bNode *node, *tnode; | ||||
| bNodeSocket *sock, *tsock; | bNodeSocket *sock, *tsock; | ||||
| float cursor[2]; | float cursor[2]; | ||||
| int selected = 0; | int selected = 0; | ||||
| /* 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]); | ||||
| Show All 25 Lines | 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) { | ||||
| 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 | * before it'll be desleected | ||||
| */ | */ | ||||
| ED_node_set_active(bmain, snode->edittree, node); | ED_node_set_active(bmain, snode->edittree, node, re_type); | ||||
| } | } | ||||
| else { | else { | ||||
| node_toggle(node); | node_toggle(node); | ||||
| ED_node_set_active(bmain, snode->edittree, node); | ED_node_set_active(bmain, snode->edittree, node, re_type); | ||||
| } | } | ||||
| selected = 1; | selected = 1; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| else { /* extend == 0 */ | else { /* extend == 0 */ | ||||
| /* 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, re_type); | ||||
| selected = 1; | selected = 1; | ||||
| } | } | ||||
| } | } | ||||
| /* 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); | |||||
| 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; | ||||
| /* 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"); | ||||
| /* perform the select */ | /* perform the select */ | ||||
| if (node_mouse_select(bmain, snode, ar, mval, extend)) { | if (node_mouse_select(C, snode, ar, mval, extend)) { | ||||
| /* 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 20 Lines • Show All 614 Lines • Show Last 20 Lines | |||||