| 
									
										
										
										
											2008-12-28 00:08:34 +00:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * $Id: | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * ***** BEGIN GPL LICENSE BLOCK ***** | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is free software; you can redistribute it and/or | 
					
						
							|  |  |  |  * modify it under the terms of the GNU General Public License | 
					
						
							|  |  |  |  * as published by the Free Software Foundation; either version 2 | 
					
						
							|  |  |  |  * of the License, or (at your option) any later version.  | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  |  * GNU General Public License for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * You should have received a copy of the GNU General Public License | 
					
						
							|  |  |  |  * along with this program; if not, write to the Free Software Foundation, | 
					
						
							|  |  |  |  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * The Original Code is Copyright (C) 2008 Blender Foundation. | 
					
						
							|  |  |  |  * All rights reserved. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * Contributor(s): Blender Foundation, Nathan Letwory | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * ***** END GPL LICENSE BLOCK ***** | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <stdio.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "DNA_node_types.h"
 | 
					
						
							| 
									
										
										
										
											2009-01-12 01:02:52 +00:00
										 |  |  | #include "DNA_material_types.h"
 | 
					
						
							|  |  |  | #include "DNA_texture_types.h"
 | 
					
						
							| 
									
										
										
										
											2008-12-28 00:08:34 +00:00
										 |  |  | #include "DNA_scene_types.h"
 | 
					
						
							|  |  |  | #include "DNA_screen_types.h"
 | 
					
						
							|  |  |  | #include "DNA_space_types.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "BKE_context.h"
 | 
					
						
							|  |  |  | #include "BKE_node.h"
 | 
					
						
							|  |  |  | #include "BKE_global.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "BLI_rect.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "ED_space_api.h"
 | 
					
						
							|  |  |  | #include "ED_screen.h"
 | 
					
						
							|  |  |  | #include "ED_types.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "RNA_access.h"
 | 
					
						
							|  |  |  | #include "RNA_define.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "WM_api.h"
 | 
					
						
							|  |  |  | #include "WM_types.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "UI_view2d.h"
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | #include "node_intern.h"
 | 
					
						
							|  |  |  |   | 
					
						
							| 
									
										
										
										
											2009-01-02 23:58:03 +00:00
										 |  |  | static void node_mouse_select(SpaceNode *snode, ARegion *ar, short *mval, short extend) | 
					
						
							| 
									
										
										
										
											2008-12-28 00:08:34 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	bNode *node; | 
					
						
							|  |  |  | 	float mx, my; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	mx= (float)mval[0]; | 
					
						
							|  |  |  | 	my= (float)mval[1]; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	UI_view2d_region_to_view(&ar->v2d, mval[0], mval[1], &mx, &my); | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	for(next_node(snode->edittree); (node=next_node(NULL));) { | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 		/* first check for the headers or scaling widget */ | 
					
						
							|  |  |  | 		/* XXX if(node->flag & NODE_HIDDEN) {
 | 
					
						
							|  |  |  | 			if(do_header_hidden_node(snode, node, mx, my)) | 
					
						
							|  |  |  | 				return 1; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		else { | 
					
						
							|  |  |  | 			if(do_header_node(snode, node, mx, my)) | 
					
						
							|  |  |  | 				return 1; | 
					
						
							|  |  |  | 		}*/ | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 		/* node body */ | 
					
						
							|  |  |  | 		if(BLI_in_rctf(&node->totr, mx, my)) | 
					
						
							|  |  |  | 			break; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if(node) { | 
					
						
							| 
									
										
										
										
											2009-01-02 23:58:03 +00:00
										 |  |  | 		if((extend & KM_SHIFT)==0) | 
					
						
							| 
									
										
										
										
											2008-12-28 20:49:37 +00:00
										 |  |  | 			node_deselectall(snode, 0); | 
					
						
							| 
									
										
										
										
											2008-12-28 00:08:34 +00:00
										 |  |  | 		 | 
					
						
							| 
									
										
										
										
											2009-01-02 23:58:03 +00:00
										 |  |  | 		if(extend & KM_SHIFT) { | 
					
						
							| 
									
										
										
										
											2008-12-28 00:08:34 +00:00
										 |  |  | 			if(node->flag & SELECT) | 
					
						
							|  |  |  | 				node->flag &= ~SELECT; | 
					
						
							|  |  |  | 			else | 
					
						
							|  |  |  | 				node->flag |= SELECT; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2008-12-28 20:49:37 +00:00
										 |  |  | 		else | 
					
						
							| 
									
										
										
										
											2008-12-28 00:08:34 +00:00
										 |  |  | 			node->flag |= SELECT; | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 		node_set_active(snode, node); | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 		/* viewer linking */ | 
					
						
							| 
									
										
										
										
											2009-01-02 23:58:03 +00:00
										 |  |  | 		if(extend & KM_CTRL) | 
					
						
							| 
									
										
										
										
											2008-12-28 20:49:37 +00:00
										 |  |  | 			;//	node_link_viewer(snode, node);
 | 
					
						
							| 
									
										
										
										
											2008-12-28 00:08:34 +00:00
										 |  |  | 		 | 
					
						
							|  |  |  | 		//std_rmouse_transform(node_transform_ext);	/* does undo push for select */
 | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int node_select_exec(bContext *C, wmOperator *op) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-01-14 16:37:52 +00:00
										 |  |  | 	// XXX wmWindow *window=  CTX_wm_window(C);
 | 
					
						
							| 
									
										
										
										
											2008-12-28 00:08:34 +00:00
										 |  |  | 	SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C); | 
					
						
							|  |  |  | 	ARegion *ar= CTX_wm_region(C); | 
					
						
							|  |  |  | 	int select_type; | 
					
						
							|  |  |  | 	short mval[2]; | 
					
						
							| 
									
										
										
										
											2009-01-02 23:58:03 +00:00
										 |  |  | 	short extend; | 
					
						
							| 
									
										
										
										
											2008-12-28 00:08:34 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	select_type = RNA_enum_get(op->ptr, "select_type"); | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	switch (select_type) { | 
					
						
							|  |  |  | 		case NODE_SELECT_MOUSE: | 
					
						
							| 
									
										
										
										
											2009-01-16 23:53:11 +00:00
										 |  |  | 			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"); | 
					
						
							| 
									
										
										
										
											2009-01-02 23:58:03 +00:00
										 |  |  | 			node_mouse_select(snode, ar, mval, extend); | 
					
						
							| 
									
										
										
										
											2008-12-28 00:08:34 +00:00
										 |  |  | 			break; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2009-01-07 16:49:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	WM_event_add_notifier(C, NC_SCENE|ND_NODES, NULL); /* Do we need to pass the scene? */ | 
					
						
							| 
									
										
										
										
											2009-01-12 00:00:59 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-28 15:39:39 +00:00
										 |  |  | 	/* allow tweak event to work too */ | 
					
						
							|  |  |  | 	return OPERATOR_PASS_THROUGH; | 
					
						
							| 
									
										
										
										
											2009-01-12 00:00:59 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int node_select_modal(bContext *C, wmOperator *op, wmEvent *event) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	/* execute the events */ | 
					
						
							|  |  |  | 	switch (event->type) { | 
					
						
							|  |  |  | 		case MOUSEMOVE: | 
					
						
							|  |  |  | 			printf("%d %d\n", event->x, event->y); | 
					
						
							|  |  |  | 			break; | 
					
						
							|  |  |  | 		case SELECTMOUSE: | 
					
						
							|  |  |  | 			//if (event->val==0) {
 | 
					
						
							|  |  |  | 				/* calculate overall delta mouse-movement for redo */ | 
					
						
							|  |  |  | 				printf("done translating\n"); | 
					
						
							|  |  |  | 				//WM_cursor_restore(CTX_wm_window(C));
 | 
					
						
							|  |  |  | 				 | 
					
						
							|  |  |  | 				return OPERATOR_FINISHED; | 
					
						
							|  |  |  | 			//}
 | 
					
						
							|  |  |  | 			break; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2009-01-07 16:49:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-12 00:00:59 +00:00
										 |  |  | 	return OPERATOR_RUNNING_MODAL; | 
					
						
							| 
									
										
										
										
											2008-12-28 00:08:34 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int node_select_invoke(bContext *C, wmOperator *op, wmEvent *event) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	ARegion *ar= CTX_wm_region(C); | 
					
						
							|  |  |  | 	short mval[2];	 | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	mval[0]= event->x - ar->winrct.xmin; | 
					
						
							|  |  |  | 	mval[1]= event->y - ar->winrct.ymin; | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2009-01-16 23:53:11 +00:00
										 |  |  | 	RNA_int_set(op->ptr, "mouse_x", mval[0]); | 
					
						
							|  |  |  | 	RNA_int_set(op->ptr, "mouse_y", mval[1]); | 
					
						
							| 
									
										
										
										
											2008-12-28 00:08:34 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return node_select_exec(C,op); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-28 20:49:37 +00:00
										 |  |  | static int node_extend_select_invoke(bContext *C, wmOperator *op, wmEvent *event) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-01-16 23:53:11 +00:00
										 |  |  | 	RNA_boolean_set(op->ptr, "extend", KM_SHIFT); | 
					
						
							| 
									
										
										
										
											2008-12-28 20:49:37 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return node_select_invoke(C, op, event); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-28 00:08:34 +00:00
										 |  |  | /* operators */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static EnumPropertyItem prop_select_items[] = { | 
					
						
							|  |  |  | 	{NODE_SELECT_MOUSE, "NORMAL", "Normal Select", "Select using the mouse"}, | 
					
						
							|  |  |  | 	{0, NULL, NULL, NULL}}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-28 20:49:37 +00:00
										 |  |  | void NODE_OT_extend_select(wmOperatorType *ot) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	/* identifiers */ | 
					
						
							|  |  |  | 	ot->name= "Activate/Select (Shift)"; | 
					
						
							|  |  |  | 	ot->idname= "NODE_OT_extend_select"; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	/* api callbacks */ | 
					
						
							|  |  |  | 	ot->invoke= node_extend_select_invoke; | 
					
						
							|  |  |  | 	ot->poll= ED_operator_node_active; | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2009-01-16 23:53:11 +00:00
										 |  |  | 	RNA_def_enum(ot->srna, "select_type", prop_select_items, 0, "Select Type", ""); | 
					
						
							| 
									
										
										
										
											2008-12-28 20:49:37 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2009-01-16 23:53:11 +00:00
										 |  |  | 	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", ""); | 
					
						
							| 
									
										
										
										
											2008-12-28 20:49:37 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-28 00:08:34 +00:00
										 |  |  | void NODE_OT_select(wmOperatorType *ot) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	/* identifiers */ | 
					
						
							|  |  |  | 	ot->name= "Activate/Select"; | 
					
						
							|  |  |  | 	ot->idname= "NODE_OT_select"; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	/* api callbacks */ | 
					
						
							|  |  |  | 	ot->invoke= node_select_invoke; | 
					
						
							|  |  |  | 	ot->poll= ED_operator_node_active; | 
					
						
							| 
									
										
										
										
											2009-01-12 00:00:59 +00:00
										 |  |  | 	ot->modal= node_select_modal; | 
					
						
							| 
									
										
										
										
											2008-12-28 00:08:34 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2009-01-16 23:53:11 +00:00
										 |  |  | 	RNA_def_enum(ot->srna, "select_type", prop_select_items, 0, "Select Type", ""); | 
					
						
							| 
									
										
										
										
											2008-12-28 00:08:34 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2009-01-16 23:53:11 +00:00
										 |  |  | 	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", ""); | 
					
						
							| 
									
										
										
										
											2008-12-28 00:08:34 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2009-01-05 23:53:04 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* ****** Border Select ****** */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static EnumPropertyItem prop_select_types[] = { | 
					
						
							|  |  |  | 	{NODE_EXCLUSIVE, "EXCLUSIVE", "Exclusive", ""}, /* right mouse */ | 
					
						
							|  |  |  | 	{NODE_EXTEND, "EXTEND", "Extend", ""}, /* left mouse */ | 
					
						
							|  |  |  | 	{0, NULL, NULL, NULL} | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int node_borderselect_exec(bContext *C, wmOperator *op) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C); | 
					
						
							|  |  |  | 	ARegion *ar= CTX_wm_region(C); | 
					
						
							|  |  |  | 	bNode *node; | 
					
						
							|  |  |  | 	rcti rect; | 
					
						
							|  |  |  | 	rctf rectf; | 
					
						
							|  |  |  | 	short val; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	val= RNA_int_get(op->ptr, "event_type"); | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	rect.xmin= RNA_int_get(op->ptr, "xmin"); | 
					
						
							|  |  |  | 	rect.ymin= RNA_int_get(op->ptr, "ymin"); | 
					
						
							|  |  |  | 	UI_view2d_region_to_view(&ar->v2d, rect.xmin, rect.ymin, &rectf.xmin, &rectf.ymin); | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	rect.xmax= RNA_int_get(op->ptr, "xmax"); | 
					
						
							|  |  |  | 	rect.ymax= RNA_int_get(op->ptr, "ymax"); | 
					
						
							|  |  |  | 	UI_view2d_region_to_view(&ar->v2d, rect.xmax, rect.ymax, &rectf.xmax, &rectf.ymax); | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
											
												Added back some functionality to the sequencer
- removed static vars _last_seq, last_imagename and last_sounddir, replacing them with with vars in the "Editing" struct. didnt manage to get the active sequence to load so currently thats lost when loading.
- removed flag SEQ_ACTIVE
- Added operators cut, mute, unmute, deselect_all, select_invert, select, select_more, select_less, select_pick_linked, select_linked and borderselect.
											
										 
											2009-01-19 21:42:18 +00:00
										 |  |  | 	if (snode->edittree == NULL) // XXX should this be in poll()? - campbell
 | 
					
						
							|  |  |  | 		return OPERATOR_FINISHED; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-05 23:53:04 +00:00
										 |  |  | 	for(node= snode->edittree->nodes.first; node; node= node->next) { | 
					
						
							|  |  |  | 		if(BLI_isect_rctf(&rectf, &node->totr, NULL)) { | 
					
						
							|  |  |  | 			if(val==NODE_EXTEND) | 
					
						
							|  |  |  | 				node->flag |= SELECT; | 
					
						
							|  |  |  | 			else | 
					
						
							|  |  |  | 				node->flag &= ~SELECT; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2009-01-07 16:49:11 +00:00
										 |  |  | 	WM_event_add_notifier(C, NC_SCENE|ND_NODES, NULL); /* Do we need to pass the scene? */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-05 23:53:04 +00:00
										 |  |  | 	return OPERATOR_FINISHED; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void NODE_OT_border_select(wmOperatorType *ot) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	/* identifiers */ | 
					
						
							|  |  |  | 	ot->name= "Border Select"; | 
					
						
							|  |  |  | 	ot->idname= "NODE_OT_border_select"; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	/* api callbacks */ | 
					
						
							|  |  |  | 	ot->invoke= WM_border_select_invoke; | 
					
						
							|  |  |  | 	ot->exec= node_borderselect_exec; | 
					
						
							|  |  |  | 	ot->modal= WM_border_select_modal; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	ot->poll= ED_operator_node_active; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	/* rna */ | 
					
						
							| 
									
										
										
										
											2009-01-16 23:53:11 +00:00
										 |  |  | 	RNA_def_int(ot->srna, "event_type", 0, INT_MIN, INT_MAX, "Event Type", "", INT_MIN, INT_MAX); | 
					
						
							|  |  |  | 	RNA_def_int(ot->srna, "xmin", 0, INT_MIN, INT_MAX, "X Min", "", INT_MIN, INT_MAX); | 
					
						
							|  |  |  | 	RNA_def_int(ot->srna, "xmax", 0, INT_MIN, INT_MAX, "X Max", "", INT_MIN, INT_MAX); | 
					
						
							|  |  |  | 	RNA_def_int(ot->srna, "ymin", 0, INT_MIN, INT_MAX, "Y Min", "", INT_MIN, INT_MAX); | 
					
						
							|  |  |  | 	RNA_def_int(ot->srna, "ymax", 0, INT_MIN, INT_MAX, "Y Max", "", INT_MIN, INT_MAX); | 
					
						
							| 
									
										
										
										
											2009-01-05 23:53:04 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-16 23:53:11 +00:00
										 |  |  | 	RNA_def_enum(ot->srna, "type", prop_select_types, 0, "Type", ""); | 
					
						
							|  |  |  | } |