| 
									
										
										
										
											2011-02-23 10:52:22 +00:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2009-01-06 14:42:54 +00:00
										 |  |  |  * ***** 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, | 
					
						
							| 
									
										
										
										
											2010-02-12 13:34:04 +00:00
										 |  |  |  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | 
					
						
							| 
									
										
										
										
											2009-01-06 14:42:54 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * The Original Code is Copyright (C) 2008 Blender Foundation. | 
					
						
							|  |  |  |  * All rights reserved. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * Contributor(s): Andrea Weikert (c) 2008 Blender Foundation | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * ***** END GPL LICENSE BLOCK ***** | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-27 20:29:51 +00:00
										 |  |  | /** \file blender/editors/space_file/file_ops.c
 | 
					
						
							|  |  |  |  *  \ingroup spfile | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-06 14:42:54 +00:00
										 |  |  | #include "BKE_context.h"
 | 
					
						
							|  |  |  | #include "BKE_screen.h"
 | 
					
						
							|  |  |  | #include "BKE_global.h"
 | 
					
						
							| 
									
										
										
										
											2009-12-07 23:47:37 +00:00
										 |  |  | #include "BKE_report.h"
 | 
					
						
							| 
									
										
										
										
											2010-10-18 06:41:16 +00:00
										 |  |  | #include "BKE_main.h"
 | 
					
						
							| 
									
										
										
										
											2009-01-06 14:42:54 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "BLI_blenlib.h"
 | 
					
						
							| 
									
										
										
										
											2011-01-07 18:36:47 +00:00
										 |  |  | #include "BLI_utildefines.h"
 | 
					
						
							| 
									
										
										
										
											2012-04-15 07:54:07 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-06 14:42:54 +00:00
										 |  |  | #ifdef WIN32
 | 
					
						
							| 
									
										
										
										
											2012-04-15 07:54:07 +00:00
										 |  |  | #  include "BLI_winstuff.h"
 | 
					
						
							| 
									
										
										
										
											2009-01-06 14:42:54 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "ED_screen.h"
 | 
					
						
							|  |  |  | #include "ED_fileselect.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-29 20:23:40 +00:00
										 |  |  | #include "MEM_guardedalloc.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-21 19:28:28 +00:00
										 |  |  | #include "RNA_access.h"
 | 
					
						
							|  |  |  | #include "RNA_define.h"
 | 
					
						
							| 
									
										
										
										
											2009-01-06 14:42:54 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-06 16:15:43 +00:00
										 |  |  | #include "UI_view2d.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-21 19:28:28 +00:00
										 |  |  | #include "WM_api.h"
 | 
					
						
							|  |  |  | #include "WM_types.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-06 14:42:54 +00:00
										 |  |  | #include "file_intern.h"
 | 
					
						
							|  |  |  | #include "filelist.h"
 | 
					
						
							|  |  |  | #include "fsmenu.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <stdlib.h>
 | 
					
						
							|  |  |  | #include <string.h>
 | 
					
						
							|  |  |  | #include <stdio.h>
 | 
					
						
							| 
									
										
										
										
											2011-08-05 06:06:15 +00:00
										 |  |  | #include <ctype.h>
 | 
					
						
							| 
									
										
										
										
											2009-01-06 14:42:54 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* for events */ | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | #define NOTACTIVEFILE       0
 | 
					
						
							|  |  |  | #define ACTIVATE            1
 | 
					
						
							|  |  |  | #define INACTIVATE          2
 | 
					
						
							| 
									
										
										
										
											2009-01-06 14:42:54 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-21 19:28:28 +00:00
										 |  |  | /* ---------- FILE SELECTION ------------ */ | 
					
						
							| 
									
										
										
										
											2012-07-26 22:47:05 +00:00
										 |  |  | static FileSelection find_file_mouse_rect(SpaceFile *sfile, ARegion *ar, const rcti *rect) | 
					
						
							| 
									
										
										
										
											2009-01-06 14:42:54 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-14 19:56:13 +00:00
										 |  |  | 	FileSelection sel; | 
					
						
							| 
									
										
										
										
											2012-04-29 15:47:02 +00:00
										 |  |  | 	float fxmin, fymin, fxmax, fymax; | 
					
						
							| 
									
										
										
										
											2011-03-14 19:56:13 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	View2D *v2d = &ar->v2d; | 
					
						
							| 
									
										
										
										
											2011-03-14 19:56:13 +00:00
										 |  |  | 	rcti rect_view; | 
					
						
							| 
									
										
										
										
											2009-01-21 19:28:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-14 19:56:13 +00:00
										 |  |  | 	UI_view2d_region_to_view(v2d, rect->xmin, rect->ymin, &fxmin, &fymin); | 
					
						
							|  |  |  | 	UI_view2d_region_to_view(v2d, rect->xmax, rect->ymax, &fxmax, &fymax); | 
					
						
							| 
									
										
										
										
											2009-01-21 19:28:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-12 08:31:23 +00:00
										 |  |  | 	BLI_rcti_init(&rect_view, (int)(v2d->tot.xmin + fxmin), (int)(v2d->tot.xmin + fxmax), (int)(v2d->tot.ymax - fymin), (int)(v2d->tot.ymax - fymax)); | 
					
						
							| 
									
										
										
										
											2011-03-14 19:56:13 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	sel  = ED_fileselect_layout_offset_rect(sfile->layout, &rect_view); | 
					
						
							| 
									
										
										
										
											2009-06-09 07:28:15 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2011-03-14 19:56:13 +00:00
										 |  |  | 	return sel; | 
					
						
							| 
									
										
										
										
											2009-01-06 14:42:54 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | static void file_deselect_all(SpaceFile *sfile, unsigned int flag) | 
					
						
							| 
									
										
										
										
											2009-01-06 14:42:54 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-20 15:15:05 +00:00
										 |  |  | 	FileSelection sel; | 
					
						
							|  |  |  | 	sel.first = 0; | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	sel.last = filelist_numfiles(sfile->files) - 1; | 
					
						
							| 
									
										
										
										
											2011-03-20 15:15:05 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	filelist_select(sfile->files, &sel, FILE_SEL_REMOVE, flag, CHECK_ALL); | 
					
						
							| 
									
										
										
										
											2009-01-06 14:42:54 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-14 19:56:13 +00:00
										 |  |  | typedef enum FileSelect {  | 
					
						
							|  |  |  | 	FILE_SELECT_NOTHING = 0, | 
					
						
							|  |  |  | 	FILE_SELECT_DIR = 1,  | 
					
						
							|  |  |  | 	FILE_SELECT_FILE = 2  | 
					
						
							|  |  |  | } FileSelect; | 
					
						
							| 
									
										
										
										
											2009-07-26 19:23:07 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | static void clamp_to_filelist(int numfiles, FileSelection *sel) | 
					
						
							| 
									
										
										
										
											2009-09-20 15:02:14 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	/* border select before the first file */ | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	if ( (sel->first < 0) && (sel->last >= 0) ) { | 
					
						
							| 
									
										
										
										
											2011-03-14 19:56:13 +00:00
										 |  |  | 		sel->first = 0; | 
					
						
							| 
									
										
										
										
											2009-09-20 15:02:14 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	/* don't select if everything is outside filelist */ | 
					
						
							| 
									
										
										
										
											2011-03-14 19:56:13 +00:00
										 |  |  | 	if ( (sel->first >= numfiles) && ((sel->last < 0) || (sel->last >= numfiles)) ) { | 
					
						
							|  |  |  | 		sel->first = -1; | 
					
						
							|  |  |  | 		sel->last = -1; | 
					
						
							| 
									
										
										
										
											2009-09-20 15:02:14 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	/* fix if last file invalid */ | 
					
						
							| 
									
										
										
										
											2011-03-14 19:56:13 +00:00
										 |  |  | 	if ( (sel->first > 0) && (sel->last < 0) ) | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 		sel->last = numfiles - 1; | 
					
						
							| 
									
										
										
										
											2009-09-20 15:02:14 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* clamp */ | 
					
						
							| 
									
										
										
										
											2011-03-14 19:56:13 +00:00
										 |  |  | 	if ( (sel->first >= numfiles) ) { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 		sel->first = numfiles - 1; | 
					
						
							| 
									
										
										
										
											2009-09-20 15:02:14 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2011-03-14 19:56:13 +00:00
										 |  |  | 	if ( (sel->last >= numfiles) ) { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 		sel->last = numfiles - 1; | 
					
						
							| 
									
										
										
										
											2009-09-20 15:02:14 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | static FileSelection file_selection_get(bContext *C, const rcti *rect, short fill) | 
					
						
							| 
									
										
										
										
											2009-01-06 14:42:54 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	ARegion *ar = CTX_wm_region(C); | 
					
						
							|  |  |  | 	SpaceFile *sfile = CTX_wm_space_file(C); | 
					
						
							| 
									
										
										
										
											2011-03-14 19:56:13 +00:00
										 |  |  | 	int numfiles = filelist_numfiles(sfile->files); | 
					
						
							|  |  |  | 	FileSelection sel; | 
					
						
							| 
									
										
										
										
											2009-07-26 19:23:07 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-14 19:56:13 +00:00
										 |  |  | 	sel = find_file_mouse_rect(sfile, ar, rect); | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	if (!((sel.first == -1) && (sel.last == -1)) ) { | 
					
						
							| 
									
										
										
										
											2011-03-14 19:56:13 +00:00
										 |  |  | 		clamp_to_filelist(numfiles, &sel); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2009-01-21 19:28:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-20 15:02:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-14 19:56:13 +00:00
										 |  |  | 	/* if desired, fill the selection up from the last selected file to the current one */ | 
					
						
							|  |  |  | 	if (fill && (sel.last >= 0) && (sel.last < numfiles) ) { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 		int f = sel.last; | 
					
						
							| 
									
										
										
										
											2010-04-19 19:29:40 +00:00
										 |  |  | 		while (f >= 0) { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 			if (filelist_is_selected(sfile->files, f, CHECK_ALL) ) | 
					
						
							| 
									
										
										
										
											2010-04-19 19:29:40 +00:00
										 |  |  | 				break; | 
					
						
							|  |  |  | 			f--; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if (f >= 0) { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 			sel.first = f + 1; | 
					
						
							| 
									
										
										
										
											2009-01-21 19:28:28 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2011-03-14 19:56:13 +00:00
										 |  |  | 	return sel; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2009-03-08 13:14:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | static FileSelect file_select_do(bContext *C, int selected_idx) | 
					
						
							| 
									
										
										
										
											2011-03-14 19:56:13 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	FileSelect retval = FILE_SELECT_NOTHING; | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	SpaceFile *sfile = CTX_wm_space_file(C); | 
					
						
							| 
									
										
										
										
											2011-03-14 19:56:13 +00:00
										 |  |  | 	FileSelectParams *params = ED_fileselect_get_params(sfile); | 
					
						
							|  |  |  | 	int numfiles = filelist_numfiles(sfile->files); | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	struct direntry *file; | 
					
						
							| 
									
										
										
										
											2009-09-20 15:02:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-14 19:56:13 +00:00
										 |  |  | 	/* make the selected file active */ | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	if ((selected_idx >= 0) && | 
					
						
							|  |  |  | 	    (selected_idx < numfiles) && | 
					
						
							|  |  |  | 	    (file = filelist_file(sfile->files, selected_idx))) | 
					
						
							| 
									
										
										
										
											2011-09-16 06:47:01 +00:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2011-03-14 19:56:13 +00:00
										 |  |  | 		params->active_file = selected_idx; | 
					
						
							| 
									
										
										
										
											2009-01-21 19:28:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 		if (S_ISDIR(file->type)) { | 
					
						
							| 
									
										
										
										
											2009-07-28 16:46:14 +00:00
										 |  |  | 			/* the path is too long and we are not going up! */ | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 			if (strcmp(file->relname, "..") && strlen(params->dir) + strlen(file->relname) >= FILE_MAX) { | 
					
						
							| 
									
										
										
										
											2009-01-21 19:28:28 +00:00
										 |  |  | 				// XXX error("Path too long, cannot enter this directory");
 | 
					
						
							| 
									
										
										
										
											2011-09-16 06:47:01 +00:00
										 |  |  | 			} | 
					
						
							|  |  |  | 			else { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 				if (strcmp(file->relname, "..") == 0) { | 
					
						
							| 
									
										
										
										
											2011-09-16 06:47:01 +00:00
										 |  |  | 					/* avoids /../../ */ | 
					
						
							|  |  |  | 					BLI_parent_dir(params->dir); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				else { | 
					
						
							| 
									
										
										
										
											2010-10-18 06:41:16 +00:00
										 |  |  | 					BLI_cleanup_dir(G.main->name, params->dir); | 
					
						
							| 
									
										
										
										
											2009-07-28 16:46:14 +00:00
										 |  |  | 					strcat(params->dir, file->relname); | 
					
						
							|  |  |  | 					BLI_add_slash(params->dir); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-10 19:30:20 +00:00
										 |  |  | 				file_change_dir(C, 0); | 
					
						
							| 
									
										
										
										
											2009-07-26 19:23:07 +00:00
										 |  |  | 				retval = FILE_SELECT_DIR; | 
					
						
							| 
									
										
										
										
											2009-01-21 19:28:28 +00:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2012-04-21 12:51:47 +00:00
										 |  |  | 		else { | 
					
						
							| 
									
										
										
										
											2009-01-21 19:28:28 +00:00
										 |  |  | 			if (file->relname) { | 
					
						
							|  |  |  | 				BLI_strncpy(params->file, file->relname, FILE_MAXFILE); | 
					
						
							| 
									
										
										
										
											2009-01-06 14:42:54 +00:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2011-03-14 19:56:13 +00:00
										 |  |  | 			retval = FILE_SELECT_FILE; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2010-09-17 09:27:31 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2011-03-14 19:56:13 +00:00
										 |  |  | 	return retval; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | static FileSelect file_select(bContext *C, const rcti *rect, FileSelType select, short fill) | 
					
						
							| 
									
										
										
										
											2011-03-14 19:56:13 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	SpaceFile *sfile = CTX_wm_space_file(C); | 
					
						
							| 
									
										
										
										
											2011-03-14 19:56:13 +00:00
										 |  |  | 	FileSelect retval = FILE_SELECT_NOTHING; | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	FileSelection sel = file_selection_get(C, rect, fill); /* get the selection */ | 
					
						
							|  |  |  | 	const FileCheckType check_type = (sfile->params->flag & FILE_DIRSEL_ONLY) ? CHECK_DIRS : CHECK_ALL; | 
					
						
							| 
									
										
										
										
											2011-03-14 19:56:13 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	/* flag the files as selected in the filelist */ | 
					
						
							| 
									
										
										
										
											2011-06-16 15:01:22 +00:00
										 |  |  | 	filelist_select(sfile->files, &sel, select, SELECTED_FILE, check_type); | 
					
						
							| 
									
										
										
										
											2011-03-14 19:56:13 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	/* Don't act on multiple selected files */ | 
					
						
							|  |  |  | 	if (sel.first != sel.last) select = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-20 11:16:59 +00:00
										 |  |  | 	/* Do we have a valid selection and are we actually selecting */ | 
					
						
							| 
									
										
										
										
											2012-03-06 18:40:15 +00:00
										 |  |  | 	if ((sel.last >= 0) && ((select == FILE_SEL_ADD) || (select == FILE_SEL_TOGGLE))) { | 
					
						
							| 
									
										
										
										
											2011-03-20 11:16:59 +00:00
										 |  |  | 		/* Check last selection, if selected, act on the file or dir */ | 
					
						
							| 
									
										
										
										
											2011-06-16 15:01:22 +00:00
										 |  |  | 		if (filelist_is_selected(sfile->files, sel.last, check_type)) { | 
					
						
							| 
									
										
										
										
											2011-03-20 11:16:59 +00:00
										 |  |  | 			retval = file_select_do(C, sel.last); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2011-03-20 10:22:51 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-17 09:27:31 +00:00
										 |  |  | 	/* update operator for name change event */ | 
					
						
							|  |  |  | 	file_draw_check_cb(C, NULL, NULL); | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2009-07-26 19:23:07 +00:00
										 |  |  | 	return retval; | 
					
						
							| 
									
										
										
										
											2009-01-21 19:28:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-20 00:34:08 +00:00
										 |  |  | static int file_border_select_modal(bContext *C, wmOperator *op, wmEvent *event) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	ARegion *ar = CTX_wm_region(C); | 
					
						
							|  |  |  | 	SpaceFile *sfile = CTX_wm_space_file(C); | 
					
						
							| 
									
										
										
										
											2011-03-20 00:34:08 +00:00
										 |  |  | 	FileSelectParams *params = ED_fileselect_get_params(sfile); | 
					
						
							|  |  |  | 	FileSelection sel; | 
					
						
							|  |  |  | 	rcti rect; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	int result; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	result = WM_border_select_modal(C, op, event); | 
					
						
							| 
									
										
										
										
											2011-03-20 00:34:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-19 13:55:54 +00:00
										 |  |  | 	if (result == OPERATOR_RUNNING_MODAL) { | 
					
						
							| 
									
										
										
										
											2011-03-20 00:34:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-24 02:51:46 +00:00
										 |  |  | 		rect.xmin = RNA_int_get(op->ptr, "xmin"); | 
					
						
							|  |  |  | 		rect.ymin = RNA_int_get(op->ptr, "ymin"); | 
					
						
							|  |  |  | 		rect.xmax = RNA_int_get(op->ptr, "xmax"); | 
					
						
							|  |  |  | 		rect.ymax = RNA_int_get(op->ptr, "ymax"); | 
					
						
							| 
									
										
										
										
											2011-03-20 00:34:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-15 00:29:56 +00:00
										 |  |  | 		BLI_rcti_isect(&(ar->v2d.mask), &rect, &rect); | 
					
						
							| 
									
										
										
										
											2011-03-20 00:34:08 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		sel = file_selection_get(C, &rect, 0); | 
					
						
							|  |  |  | 		if ( (sel.first != params->sel_first) || (sel.last != params->sel_last) ) { | 
					
						
							|  |  |  | 			file_deselect_all(sfile, HILITED_FILE); | 
					
						
							| 
									
										
										
										
											2011-03-20 15:15:05 +00:00
										 |  |  | 			filelist_select(sfile->files, &sel, FILE_SEL_ADD, HILITED_FILE, CHECK_ALL); | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 			WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_PARAMS, NULL); | 
					
						
							| 
									
										
										
										
											2011-03-20 00:34:08 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		params->sel_first = sel.first; params->sel_last = sel.last; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	else { | 
					
						
							| 
									
										
										
										
											2011-03-20 00:34:08 +00:00
										 |  |  | 		params->active_file = -1; | 
					
						
							|  |  |  | 		params->sel_first = params->sel_last = -1; | 
					
						
							|  |  |  | 		file_deselect_all(sfile, HILITED_FILE); | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 		WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_PARAMS, NULL); | 
					
						
							| 
									
										
										
										
											2011-03-20 00:34:08 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return result; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2009-01-21 19:28:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | static int file_border_select_exec(bContext *C, wmOperator *op) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	ARegion *ar = CTX_wm_region(C); | 
					
						
							| 
									
										
										
										
											2009-01-21 19:28:28 +00:00
										 |  |  | 	rcti rect; | 
					
						
							| 
									
										
										
										
											2011-03-14 19:56:13 +00:00
										 |  |  | 	FileSelect ret; | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	int extend = RNA_boolean_get(op->ptr, "extend"); | 
					
						
							|  |  |  | 	short select = (RNA_int_get(op->ptr, "gesture_mode") == GESTURE_MODAL_SELECT); | 
					
						
							| 
									
										
										
										
											2011-11-16 19:22:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-24 02:51:46 +00:00
										 |  |  | 	rect.xmin = RNA_int_get(op->ptr, "xmin"); | 
					
						
							|  |  |  | 	rect.ymin = RNA_int_get(op->ptr, "ymin"); | 
					
						
							|  |  |  | 	rect.xmax = RNA_int_get(op->ptr, "xmax"); | 
					
						
							|  |  |  | 	rect.ymax = RNA_int_get(op->ptr, "ymax"); | 
					
						
							| 
									
										
										
										
											2009-01-21 19:28:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 	if (!extend) { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 		SpaceFile *sfile = CTX_wm_space_file(C); | 
					
						
							| 
									
										
										
										
											2011-11-16 19:22:14 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		file_deselect_all(sfile, SELECTED_FILE); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-15 00:29:56 +00:00
										 |  |  | 	BLI_rcti_isect(&(ar->v2d.mask), &rect, &rect); | 
					
						
							| 
									
										
										
										
											2011-03-14 19:56:13 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-20 10:22:51 +00:00
										 |  |  | 	ret = file_select(C, &rect, select ? FILE_SEL_ADD : FILE_SEL_REMOVE, 0); | 
					
						
							| 
									
										
										
										
											2011-03-14 19:56:13 +00:00
										 |  |  | 	if (FILE_SELECT_DIR == ret) { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 		WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_LIST, NULL); | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	else if (FILE_SELECT_FILE == ret) { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 		WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_PARAMS, NULL); | 
					
						
							| 
									
										
										
										
											2009-07-26 19:23:07 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2009-01-21 19:28:28 +00:00
										 |  |  | 	return OPERATOR_FINISHED; | 
					
						
							| 
									
										
										
										
											2009-01-06 14:42:54 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-29 02:15:13 +00:00
										 |  |  | void FILE_OT_select_border(wmOperatorType *ot) | 
					
						
							| 
									
										
										
										
											2009-01-06 14:42:54 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-01-21 19:28:28 +00:00
										 |  |  | 	/* identifiers */ | 
					
						
							| 
									
										
										
										
											2012-03-22 07:26:09 +00:00
										 |  |  | 	ot->name = "Activate/Select File"; | 
					
						
							|  |  |  | 	ot->description = "Activate/select the file(s) contained in the border"; | 
					
						
							|  |  |  | 	ot->idname = "FILE_OT_select_border"; | 
					
						
							| 
									
										
										
										
											2009-01-21 19:28:28 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	/* api callbacks */ | 
					
						
							| 
									
										
										
										
											2012-03-22 07:26:09 +00:00
										 |  |  | 	ot->invoke = WM_border_select_invoke; | 
					
						
							|  |  |  | 	ot->exec = file_border_select_exec; | 
					
						
							|  |  |  | 	ot->modal = file_border_select_modal; | 
					
						
							|  |  |  | 	ot->poll = ED_operator_file_active; | 
					
						
							|  |  |  | 	ot->cancel = WM_border_select_cancel; | 
					
						
							| 
									
										
										
										
											2009-01-21 19:28:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* rna */ | 
					
						
							| 
									
										
										
										
											2011-11-16 19:22:14 +00:00
										 |  |  | 	WM_operator_properties_gesture_border(ot, 1); | 
					
						
							| 
									
										
										
										
											2009-01-06 14:42:54 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int file_select_invoke(bContext *C, wmOperator *op, wmEvent *event) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	ARegion *ar = CTX_wm_region(C); | 
					
						
							|  |  |  | 	SpaceFile *sfile = CTX_wm_space_file(C); | 
					
						
							| 
									
										
										
										
											2011-03-20 10:22:51 +00:00
										 |  |  | 	FileSelect ret; | 
					
						
							| 
									
										
										
										
											2009-01-21 19:28:28 +00:00
										 |  |  | 	rcti rect; | 
					
						
							| 
									
										
										
										
											2009-11-22 22:23:58 +00:00
										 |  |  | 	int extend = RNA_boolean_get(op->ptr, "extend"); | 
					
						
							| 
									
										
										
										
											2010-04-19 19:29:40 +00:00
										 |  |  | 	int fill = RNA_boolean_get(op->ptr, "fill"); | 
					
						
							| 
									
										
										
										
											2009-01-21 19:28:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 	if (ar->regiontype != RGN_TYPE_WINDOW) | 
					
						
							| 
									
										
										
										
											2009-07-28 16:46:14 +00:00
										 |  |  | 		return OPERATOR_CANCELLED; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-20 07:40:05 +00:00
										 |  |  | 	rect.xmin = rect.xmax = event->mval[0]; | 
					
						
							|  |  |  | 	rect.ymin = rect.ymax = event->mval[1]; | 
					
						
							| 
									
										
										
										
											2009-01-21 19:28:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 	if (!BLI_in_rcti(&ar->v2d.mask, rect.xmin, rect.ymin)) | 
					
						
							| 
									
										
										
										
											2009-07-28 16:46:14 +00:00
										 |  |  | 		return OPERATOR_CANCELLED; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* single select, deselect all selected first */ | 
					
						
							| 
									
										
										
										
											2011-03-20 11:16:59 +00:00
										 |  |  | 	if (!extend) file_deselect_all(sfile, SELECTED_FILE); | 
					
						
							| 
									
										
										
										
											2009-07-28 16:46:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-20 10:22:51 +00:00
										 |  |  | 	ret = file_select(C, &rect, extend ? FILE_SEL_TOGGLE : FILE_SEL_ADD, fill); | 
					
						
							|  |  |  | 	if (FILE_SELECT_DIR == ret) | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 		WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_LIST, NULL); | 
					
						
							| 
									
										
										
										
											2011-03-20 10:22:51 +00:00
										 |  |  | 	else if (FILE_SELECT_FILE == ret) | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 		WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_PARAMS, NULL); | 
					
						
							| 
									
										
										
										
											2009-07-28 16:46:14 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	WM_event_add_mousemove(C); /* for directory changes */ | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_PARAMS, NULL); | 
					
						
							| 
									
										
										
										
											2009-03-10 23:14:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-06 14:42:54 +00:00
										 |  |  | 	return OPERATOR_FINISHED; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-14 14:25:48 +00:00
										 |  |  | void FILE_OT_select(wmOperatorType *ot) | 
					
						
							| 
									
										
										
										
											2009-01-06 14:42:54 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	/* identifiers */ | 
					
						
							| 
									
										
										
										
											2012-03-22 07:26:09 +00:00
										 |  |  | 	ot->name = "Activate/Select File"; | 
					
						
							|  |  |  | 	ot->description = "Activate/select file"; | 
					
						
							|  |  |  | 	ot->idname = "FILE_OT_select"; | 
					
						
							| 
									
										
										
										
											2009-01-06 14:42:54 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	/* api callbacks */ | 
					
						
							| 
									
										
										
										
											2012-03-22 07:26:09 +00:00
										 |  |  | 	ot->invoke = file_select_invoke; | 
					
						
							|  |  |  | 	ot->poll = ED_operator_file_active; | 
					
						
							| 
									
										
										
										
											2009-01-21 19:28:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* rna */ | 
					
						
							| 
									
										
										
										
											2011-09-19 12:26:20 +00:00
										 |  |  | 	RNA_def_boolean(ot->srna, "extend", 0, "Extend", "Extend selection instead of deselecting everything first"); | 
					
						
							|  |  |  | 	RNA_def_boolean(ot->srna, "fill", 0, "Fill", "Select everything beginning with the last selection"); | 
					
						
							| 
									
										
										
										
											2009-01-06 14:42:54 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-15 01:36:14 +00:00
										 |  |  | static int file_select_all_exec(bContext *C, wmOperator *UNUSED(op)) | 
					
						
							| 
									
										
										
										
											2009-01-21 19:28:28 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	ScrArea *sa = CTX_wm_area(C); | 
					
						
							|  |  |  | 	SpaceFile *sfile = CTX_wm_space_file(C); | 
					
						
							| 
									
										
										
										
											2011-03-20 15:15:05 +00:00
										 |  |  | 	FileSelection sel; | 
					
						
							| 
									
										
										
										
											2009-01-21 19:28:28 +00:00
										 |  |  | 	int numfiles = filelist_numfiles(sfile->files); | 
					
						
							|  |  |  | 	int i; | 
					
						
							| 
									
										
										
										
											2011-03-20 15:15:05 +00:00
										 |  |  | 	int is_selected = 0; | 
					
						
							| 
									
										
										
										
											2011-04-21 13:11:51 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-20 15:15:05 +00:00
										 |  |  | 	sel.first = 0;  | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	sel.last = numfiles - 1; | 
					
						
							| 
									
										
										
										
											2009-01-21 19:28:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-20 15:15:05 +00:00
										 |  |  | 	/* Is any file selected ? */ | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	for (i = 0; i < numfiles; ++i) { | 
					
						
							| 
									
										
										
										
											2011-03-21 03:22:33 +00:00
										 |  |  | 		if (filelist_is_selected(sfile->files, i, CHECK_ALL)) { | 
					
						
							| 
									
										
										
										
											2011-03-20 15:15:05 +00:00
										 |  |  | 			is_selected = 1; | 
					
						
							|  |  |  | 			break; | 
					
						
							| 
									
										
										
										
											2009-01-21 19:28:28 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	/* select all only if previously no file was selected */ | 
					
						
							| 
									
										
										
										
											2011-03-20 15:15:05 +00:00
										 |  |  | 	if (is_selected) { | 
					
						
							|  |  |  | 		filelist_select(sfile->files, &sel, FILE_SEL_REMOVE, SELECTED_FILE, CHECK_ALL); | 
					
						
							| 
									
										
										
										
											2011-06-16 15:01:22 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	else { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 		const FileCheckType check_type = (sfile->params->flag & FILE_DIRSEL_ONLY) ? CHECK_DIRS : CHECK_FILES; | 
					
						
							| 
									
										
										
										
											2011-06-16 15:01:22 +00:00
										 |  |  | 		filelist_select(sfile->files, &sel, FILE_SEL_ADD, SELECTED_FILE, check_type); | 
					
						
							| 
									
										
										
										
											2009-01-21 19:28:28 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2011-03-20 15:15:05 +00:00
										 |  |  | 	ED_area_tag_redraw(sa); | 
					
						
							| 
									
										
										
										
											2009-01-21 19:28:28 +00:00
										 |  |  | 	return OPERATOR_FINISHED; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-29 02:15:13 +00:00
										 |  |  | void FILE_OT_select_all_toggle(wmOperatorType *ot) | 
					
						
							| 
									
										
										
										
											2009-01-21 19:28:28 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	/* identifiers */ | 
					
						
							| 
									
										
										
										
											2012-03-22 07:26:09 +00:00
										 |  |  | 	ot->name = "(De)select All Files"; | 
					
						
							|  |  |  | 	ot->description = "Select or deselect all files"; | 
					
						
							|  |  |  | 	ot->idname = "FILE_OT_select_all_toggle"; | 
					
						
							| 
									
										
										
										
											2009-01-21 19:28:28 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	/* api callbacks */ | 
					
						
							| 
									
										
										
										
											2012-03-22 07:26:09 +00:00
										 |  |  | 	ot->exec = file_select_all_exec; | 
					
						
							|  |  |  | 	ot->poll = ED_operator_file_active; | 
					
						
							| 
									
										
										
										
											2009-01-21 19:28:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* rna */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-14 19:56:13 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2009-01-21 19:28:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ---------- BOOKMARKS ----------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-22 22:23:58 +00:00
										 |  |  | static int bookmark_select_exec(bContext *C, wmOperator *op) | 
					
						
							| 
									
										
										
										
											2009-01-06 14:42:54 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	SpaceFile *sfile = CTX_wm_space_file(C); | 
					
						
							| 
									
										
										
										
											2009-01-21 19:28:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 	if (RNA_struct_find_property(op->ptr, "dir")) { | 
					
						
							| 
									
										
										
										
											2009-06-29 20:23:40 +00:00
										 |  |  | 		char entry[256]; | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 		FileSelectParams *params = sfile->params; | 
					
						
							| 
									
										
										
										
											2009-01-21 19:28:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-29 20:23:40 +00:00
										 |  |  | 		RNA_string_get(op->ptr, "dir", entry); | 
					
						
							|  |  |  | 		BLI_strncpy(params->dir, entry, sizeof(params->dir)); | 
					
						
							| 
									
										
										
										
											2010-10-18 06:41:16 +00:00
										 |  |  | 		BLI_cleanup_dir(G.main->name, params->dir); | 
					
						
							| 
									
										
										
										
											2010-03-10 19:30:20 +00:00
										 |  |  | 		file_change_dir(C, 1); | 
					
						
							| 
									
										
										
										
											2009-01-21 19:28:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 		WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_LIST, NULL); | 
					
						
							| 
									
										
										
										
											2009-06-29 20:23:40 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2009-01-06 14:42:54 +00:00
										 |  |  | 	return OPERATOR_FINISHED; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-14 14:25:48 +00:00
										 |  |  | void FILE_OT_select_bookmark(wmOperatorType *ot) | 
					
						
							| 
									
										
										
										
											2009-01-06 14:42:54 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	/* identifiers */ | 
					
						
							| 
									
										
										
										
											2012-03-22 07:26:09 +00:00
										 |  |  | 	ot->name = "Select Directory"; | 
					
						
							|  |  |  | 	ot->description = "Select a bookmarked directory"; | 
					
						
							|  |  |  | 	ot->idname = "FILE_OT_select_bookmark"; | 
					
						
							| 
									
										
										
										
											2009-01-06 14:42:54 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	/* api callbacks */ | 
					
						
							| 
									
										
										
										
											2012-03-22 07:26:09 +00:00
										 |  |  | 	ot->exec = bookmark_select_exec; | 
					
						
							|  |  |  | 	ot->poll = ED_operator_file_active; | 
					
						
							| 
									
										
										
										
											2009-06-29 20:23:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	RNA_def_string(ot->srna, "dir", "", 256, "Dir", ""); | 
					
						
							| 
									
										
										
										
											2009-01-18 18:24:11 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-15 01:36:14 +00:00
										 |  |  | static int bookmark_add_exec(bContext *C, wmOperator *UNUSED(op)) | 
					
						
							| 
									
										
										
										
											2009-06-29 22:16:48 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	ScrArea *sa = CTX_wm_area(C); | 
					
						
							|  |  |  | 	SpaceFile *sfile = CTX_wm_space_file(C); | 
					
						
							|  |  |  | 	struct FSMenu *fsmenu = fsmenu_get(); | 
					
						
							|  |  |  | 	struct FileSelectParams *params = ED_fileselect_get_params(sfile); | 
					
						
							| 
									
										
										
										
											2009-06-29 22:16:48 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (params->dir[0] != '\0') { | 
					
						
							|  |  |  | 		char name[FILE_MAX]; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 		fsmenu_insert_entry(fsmenu, FS_CATEGORY_BOOKMARKS, params->dir, 0, 1); | 
					
						
							| 
									
										
										
										
											2010-07-04 15:35:23 +00:00
										 |  |  | 		BLI_make_file_string("/", name, BLI_get_folder_create(BLENDER_USER_CONFIG, NULL), BLENDER_BOOKMARK_FILE); | 
					
						
							| 
									
										
										
										
											2009-06-29 22:16:48 +00:00
										 |  |  | 		fsmenu_write_file(fsmenu, name); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ED_area_tag_redraw(sa); | 
					
						
							|  |  |  | 	return OPERATOR_FINISHED; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-28 14:37:21 +00:00
										 |  |  | void FILE_OT_bookmark_add(wmOperatorType *ot) | 
					
						
							| 
									
										
										
										
											2009-06-29 22:16:48 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	/* identifiers */ | 
					
						
							| 
									
										
										
										
											2012-03-22 07:26:09 +00:00
										 |  |  | 	ot->name = "Add Bookmark"; | 
					
						
							|  |  |  | 	ot->description = "Add a bookmark for the selected/active directory"; | 
					
						
							|  |  |  | 	ot->idname = "FILE_OT_bookmark_add"; | 
					
						
							| 
									
										
										
										
											2009-06-29 22:16:48 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	/* api callbacks */ | 
					
						
							| 
									
										
										
										
											2012-03-22 07:26:09 +00:00
										 |  |  | 	ot->exec = bookmark_add_exec; | 
					
						
							|  |  |  | 	ot->poll = ED_operator_file_active; | 
					
						
							| 
									
										
										
										
											2009-06-29 22:16:48 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-22 22:23:58 +00:00
										 |  |  | static int bookmark_delete_exec(bContext *C, wmOperator *op) | 
					
						
							| 
									
										
										
										
											2009-06-29 22:16:48 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	ScrArea *sa = CTX_wm_area(C); | 
					
						
							|  |  |  | 	struct FSMenu *fsmenu = fsmenu_get(); | 
					
						
							| 
									
										
										
										
											2009-06-29 22:16:48 +00:00
										 |  |  | 	int nentries = fsmenu_get_nentries(fsmenu, FS_CATEGORY_BOOKMARKS); | 
					
						
							| 
									
										
										
										
											2009-07-09 15:40:04 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 	if (RNA_struct_find_property(op->ptr, "index")) { | 
					
						
							| 
									
										
										
										
											2009-06-29 22:16:48 +00:00
										 |  |  | 		int index = RNA_int_get(op->ptr, "index"); | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 		if ( (index > -1) && (index < nentries)) { | 
					
						
							| 
									
										
										
										
											2009-06-29 22:16:48 +00:00
										 |  |  | 			char name[FILE_MAX]; | 
					
						
							|  |  |  | 			 | 
					
						
							|  |  |  | 			fsmenu_remove_entry(fsmenu, FS_CATEGORY_BOOKMARKS, index); | 
					
						
							| 
									
										
										
										
											2010-07-04 15:35:23 +00:00
										 |  |  | 			BLI_make_file_string("/", name, BLI_get_folder_create(BLENDER_USER_CONFIG, NULL), BLENDER_BOOKMARK_FILE); | 
					
						
							| 
									
										
										
										
											2009-06-29 22:16:48 +00:00
										 |  |  | 			fsmenu_write_file(fsmenu, name); | 
					
						
							|  |  |  | 			ED_area_tag_redraw(sa); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return OPERATOR_FINISHED; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void FILE_OT_delete_bookmark(wmOperatorType *ot) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	/* identifiers */ | 
					
						
							| 
									
										
										
										
											2012-03-22 07:26:09 +00:00
										 |  |  | 	ot->name = "Delete Bookmark"; | 
					
						
							|  |  |  | 	ot->description = "Delete selected bookmark"; | 
					
						
							|  |  |  | 	ot->idname = "FILE_OT_delete_bookmark"; | 
					
						
							| 
									
										
										
										
											2009-06-29 22:16:48 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	/* api callbacks */ | 
					
						
							| 
									
										
										
										
											2012-03-22 07:26:09 +00:00
										 |  |  | 	ot->exec = bookmark_delete_exec; | 
					
						
							|  |  |  | 	ot->poll = ED_operator_file_active; | 
					
						
							| 
									
										
										
										
											2009-06-29 22:16:48 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	RNA_def_int(ot->srna, "index", -1, -1, 20000, "Index", "", -1, 20000); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-04 15:04:38 +00:00
										 |  |  | int file_highlight_set(SpaceFile *sfile, ARegion *ar, int mx, int my) | 
					
						
							| 
									
										
										
										
											2009-01-21 19:28:28 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	View2D *v2d = &ar->v2d; | 
					
						
							|  |  |  | 	FileSelectParams *params; | 
					
						
							| 
									
										
										
										
											2011-03-14 19:56:13 +00:00
										 |  |  | 	int numfiles, origfile;	 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	if (sfile == NULL || sfile->files == NULL) return 0; | 
					
						
							| 
									
										
										
										
											2009-07-28 16:46:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-21 19:28:28 +00:00
										 |  |  | 	numfiles = filelist_numfiles(sfile->files); | 
					
						
							|  |  |  | 	params = ED_fileselect_get_params(sfile); | 
					
						
							| 
									
										
										
										
											2009-03-14 18:15:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	origfile = params->active_file; | 
					
						
							| 
									
										
										
										
											2009-07-28 16:46:14 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	mx -= ar->winrct.xmin; | 
					
						
							|  |  |  | 	my -= ar->winrct.ymin; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 	if (BLI_in_rcti(&ar->v2d.mask, mx, my)) { | 
					
						
							| 
									
										
										
										
											2011-03-14 19:56:13 +00:00
										 |  |  | 		float fx, fy; | 
					
						
							|  |  |  | 		int active_file; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		UI_view2d_region_to_view(v2d, mx, my, &fx, &fy); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-10 09:37:04 +00:00
										 |  |  | 		active_file = ED_fileselect_layout_offset(sfile->layout, (int)(v2d->tot.xmin + fx), (int)(v2d->tot.ymax - fy)); | 
					
						
							| 
									
										
										
										
											2009-07-28 16:46:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 		if ((active_file >= 0) && (active_file < numfiles)) | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 			params->active_file = active_file; | 
					
						
							| 
									
										
										
										
											2009-07-28 16:46:14 +00:00
										 |  |  | 		else | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 			params->active_file = -1; | 
					
						
							| 
									
										
										
										
											2009-07-28 16:46:14 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	else | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 		params->active_file = -1; | 
					
						
							| 
									
										
										
										
											2009-07-28 16:46:14 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return (params->active_file != origfile); | 
					
						
							| 
									
										
										
										
											2009-01-28 11:27:25 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-15 01:36:14 +00:00
										 |  |  | static int file_highlight_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *event) | 
					
						
							| 
									
										
										
										
											2009-01-28 11:27:25 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	ARegion *ar = CTX_wm_region(C); | 
					
						
							|  |  |  | 	SpaceFile *sfile = CTX_wm_space_file(C); | 
					
						
							| 
									
										
										
										
											2009-07-28 16:46:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-04 15:04:38 +00:00
										 |  |  | 	if (!file_highlight_set(sfile, ar, event->x, event->y)) | 
					
						
							| 
									
										
										
										
											2009-07-28 16:46:14 +00:00
										 |  |  | 		return OPERATOR_CANCELLED; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ED_area_tag_redraw(CTX_wm_area(C)); | 
					
						
							| 
									
										
										
										
											2009-01-21 19:28:28 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	return OPERATOR_FINISHED; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-14 14:25:48 +00:00
										 |  |  | void FILE_OT_highlight(struct wmOperatorType *ot) | 
					
						
							| 
									
										
										
										
											2009-01-21 19:28:28 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	/* identifiers */ | 
					
						
							| 
									
										
										
										
											2012-03-22 07:26:09 +00:00
										 |  |  | 	ot->name = "Highlight File"; | 
					
						
							|  |  |  | 	ot->description = "Highlight selected file(s)"; | 
					
						
							|  |  |  | 	ot->idname = "FILE_OT_highlight"; | 
					
						
							| 
									
										
										
										
											2009-01-21 19:28:28 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	/* api callbacks */ | 
					
						
							| 
									
										
										
										
											2012-03-22 07:26:09 +00:00
										 |  |  | 	ot->invoke = file_highlight_invoke; | 
					
						
							|  |  |  | 	ot->poll = ED_operator_file_active; | 
					
						
							| 
									
										
										
										
											2009-01-21 19:28:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-15 01:36:14 +00:00
										 |  |  | int file_cancel_exec(bContext *C, wmOperator *UNUSED(unused)) | 
					
						
							| 
									
										
										
										
											2009-01-28 11:27:25 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	SpaceFile *sfile = CTX_wm_space_file(C); | 
					
						
							| 
									
										
										
										
											2010-09-17 22:12:23 +00:00
										 |  |  | 	wmOperator *op = sfile->op; | 
					
						
							| 
									
										
										
										
											2009-01-28 11:27:25 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2010-09-17 22:12:23 +00:00
										 |  |  | 	sfile->op = NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	WM_event_fileselect_event(C, op, EVT_FILESELECT_CANCEL); | 
					
						
							| 
									
										
										
										
											2009-09-15 20:47:34 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2009-01-28 11:27:25 +00:00
										 |  |  | 	return OPERATOR_FINISHED; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-14 17:55:27 +00:00
										 |  |  | static int file_operator_poll(bContext *C) | 
					
						
							| 
									
										
										
										
											2009-09-20 17:23:57 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	int poll = ED_operator_file_active(C); | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	SpaceFile *sfile = CTX_wm_space_file(C); | 
					
						
							| 
									
										
										
										
											2009-09-20 17:23:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	if (!sfile || !sfile->op) poll = 0; | 
					
						
							| 
									
										
										
										
											2009-09-20 17:23:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return poll; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-14 14:25:48 +00:00
										 |  |  | void FILE_OT_cancel(struct wmOperatorType *ot) | 
					
						
							| 
									
										
										
										
											2009-01-28 11:27:25 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	/* identifiers */ | 
					
						
							| 
									
										
										
										
											2012-03-22 07:26:09 +00:00
										 |  |  | 	ot->name = "Cancel File Load"; | 
					
						
							|  |  |  | 	ot->description = "Cancel loading of selected file"; | 
					
						
							|  |  |  | 	ot->idname = "FILE_OT_cancel"; | 
					
						
							| 
									
										
										
										
											2009-01-28 11:27:25 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	/* api callbacks */ | 
					
						
							| 
									
										
										
										
											2012-03-22 07:26:09 +00:00
										 |  |  | 	ot->exec = file_cancel_exec; | 
					
						
							|  |  |  | 	ot->poll = file_operator_poll; | 
					
						
							| 
									
										
										
										
											2009-01-28 11:27:25 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-17 09:27:31 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | void file_sfile_to_operator(wmOperator *op, SpaceFile *sfile, char *filepath) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-02-13 03:21:27 +00:00
										 |  |  | 	BLI_join_dirfile(filepath, FILE_MAX, sfile->params->dir, sfile->params->file); /* XXX, not real length */ | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 	if (RNA_struct_find_property(op->ptr, "relative_path")) { | 
					
						
							|  |  |  | 		if (RNA_boolean_get(op->ptr, "relative_path")) { | 
					
						
							| 
									
										
										
										
											2010-10-18 06:41:16 +00:00
										 |  |  | 			BLI_path_rel(filepath, G.main->name); | 
					
						
							| 
									
										
										
										
											2010-09-17 09:27:31 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 	if (RNA_struct_find_property(op->ptr, "filename")) { | 
					
						
							| 
									
										
										
										
											2010-09-17 09:27:31 +00:00
										 |  |  | 		RNA_string_set(op->ptr, "filename", sfile->params->file); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 	if (RNA_struct_find_property(op->ptr, "directory")) { | 
					
						
							| 
									
										
										
										
											2010-09-17 09:27:31 +00:00
										 |  |  | 		RNA_string_set(op->ptr, "directory", sfile->params->dir); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 	if (RNA_struct_find_property(op->ptr, "filepath")) { | 
					
						
							| 
									
										
										
										
											2010-09-17 09:27:31 +00:00
										 |  |  | 		RNA_string_set(op->ptr, "filepath", filepath); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	/* some ops have multiple files to select */ | 
					
						
							| 
									
										
										
										
											2011-08-24 14:22:41 +00:00
										 |  |  | 	/* this is called on operators check() so clear collections first since
 | 
					
						
							|  |  |  | 	 * they may be already set. */ | 
					
						
							| 
									
										
										
										
											2010-09-17 09:27:31 +00:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 		PointerRNA itemptr; | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 		PropertyRNA *prop_files = RNA_struct_find_property(op->ptr, "files"); | 
					
						
							|  |  |  | 		PropertyRNA *prop_dirs = RNA_struct_find_property(op->ptr, "dirs"); | 
					
						
							| 
									
										
										
										
											2010-09-17 09:27:31 +00:00
										 |  |  | 		int i, numfiles = filelist_numfiles(sfile->files); | 
					
						
							| 
									
										
										
										
											2011-03-21 03:22:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 		if (prop_files) { | 
					
						
							| 
									
										
										
										
											2012-06-17 14:16:26 +00:00
										 |  |  | 			int num_files = 0; | 
					
						
							| 
									
										
										
										
											2011-08-24 14:22:41 +00:00
										 |  |  | 			RNA_property_collection_clear(op->ptr, prop_files); | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 			for (i = 0; i < numfiles; i++) { | 
					
						
							| 
									
										
										
										
											2011-03-21 03:22:33 +00:00
										 |  |  | 				if (filelist_is_selected(sfile->files, i, CHECK_FILES)) { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 					struct direntry *file = filelist_file(sfile->files, i); | 
					
						
							| 
									
										
										
										
											2011-08-24 14:22:41 +00:00
										 |  |  | 					RNA_property_collection_add(op->ptr, prop_files, &itemptr); | 
					
						
							| 
									
										
										
										
											2011-03-20 15:15:05 +00:00
										 |  |  | 					RNA_string_set(&itemptr, "name", file->relname); | 
					
						
							| 
									
										
										
										
											2012-06-17 14:16:26 +00:00
										 |  |  | 					num_files++; | 
					
						
							| 
									
										
										
										
											2010-09-17 09:27:31 +00:00
										 |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2012-06-17 14:16:26 +00:00
										 |  |  | 			/* make sure the file specified in the filename button is added even if no files selected */ | 
					
						
							|  |  |  | 			if (0 == num_files) { | 
					
						
							|  |  |  | 				RNA_property_collection_add(op->ptr, prop_files, &itemptr); | 
					
						
							|  |  |  | 				RNA_string_set(&itemptr, "name", sfile->params->file); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2010-09-17 09:27:31 +00:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2011-08-24 14:22:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 		if (prop_dirs) { | 
					
						
							| 
									
										
										
										
											2012-06-17 14:16:26 +00:00
										 |  |  | 			int num_dirs = 0; | 
					
						
							| 
									
										
										
										
											2011-08-24 14:22:41 +00:00
										 |  |  | 			RNA_property_collection_clear(op->ptr, prop_dirs); | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 			for (i = 0; i < numfiles; i++) { | 
					
						
							| 
									
										
										
										
											2011-03-21 03:22:33 +00:00
										 |  |  | 				if (filelist_is_selected(sfile->files, i, CHECK_DIRS)) { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 					struct direntry *file = filelist_file(sfile->files, i); | 
					
						
							| 
									
										
										
										
											2011-08-24 14:22:41 +00:00
										 |  |  | 					RNA_property_collection_add(op->ptr, prop_dirs, &itemptr); | 
					
						
							| 
									
										
										
										
											2011-03-20 15:15:05 +00:00
										 |  |  | 					RNA_string_set(&itemptr, "name", file->relname); | 
					
						
							| 
									
										
										
										
											2012-06-17 14:16:26 +00:00
										 |  |  | 					num_dirs++; | 
					
						
							| 
									
										
										
										
											2010-09-17 09:27:31 +00:00
										 |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2012-06-17 14:16:26 +00:00
										 |  |  | 			 | 
					
						
							|  |  |  | 			/* make sure the directory specified in the button is added even if no directory selected */ | 
					
						
							|  |  |  | 			if (0 == num_dirs) { | 
					
						
							|  |  |  | 				RNA_property_collection_add(op->ptr, prop_dirs, &itemptr); | 
					
						
							|  |  |  | 				RNA_string_set(&itemptr, "name", sfile->params->dir); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2010-09-17 09:27:31 +00:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2011-03-20 15:15:05 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-17 09:27:31 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void file_operator_to_sfile(SpaceFile *sfile, wmOperator *op) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-08-26 01:32:07 +00:00
										 |  |  | 	PropertyRNA *prop; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-17 09:27:31 +00:00
										 |  |  | 	/* If neither of the above are set, split the filepath back */ | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	if ((prop = RNA_struct_find_property(op->ptr, "filepath"))) { | 
					
						
							| 
									
										
										
										
											2011-08-26 01:32:07 +00:00
										 |  |  | 		char filepath[FILE_MAX]; | 
					
						
							|  |  |  | 		RNA_property_string_get(op->ptr, prop, filepath); | 
					
						
							| 
									
										
										
										
											2011-10-15 03:56:05 +00:00
										 |  |  | 		BLI_split_dirfile(filepath, sfile->params->dir, sfile->params->file, sizeof(sfile->params->dir), sizeof(sfile->params->file)); | 
					
						
							| 
									
										
										
										
											2011-08-26 01:32:07 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	else { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 		if ((prop = RNA_struct_find_property(op->ptr, "filename"))) { | 
					
						
							| 
									
										
										
										
											2011-08-26 01:32:07 +00:00
										 |  |  | 			RNA_property_string_get(op->ptr, prop, sfile->params->file); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 		if ((prop = RNA_struct_find_property(op->ptr, "directory"))) { | 
					
						
							| 
									
										
										
										
											2011-08-26 01:32:07 +00:00
										 |  |  | 			RNA_property_string_get(op->ptr, prop, sfile->params->dir); | 
					
						
							| 
									
										
										
										
											2010-09-17 09:27:31 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2011-08-26 01:32:07 +00:00
										 |  |  | 	/* we could check for relative_path property which is used when converting
 | 
					
						
							|  |  |  | 	 * in the other direction but doesnt hurt to do this every time */ | 
					
						
							|  |  |  | 	BLI_path_abs(sfile->params->dir, G.main->name); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-17 09:27:31 +00:00
										 |  |  | 	/* XXX, files and dirs updates missing, not really so important though */ | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-16 08:03:28 +00:00
										 |  |  | void file_draw_check_cb(bContext *C, void *UNUSED(arg1), void *UNUSED(arg2)) | 
					
						
							| 
									
										
										
										
											2010-09-17 09:27:31 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	SpaceFile *sfile = CTX_wm_space_file(C); | 
					
						
							|  |  |  | 	wmOperator *op = sfile->op; | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 	if (op) { /* fail on reload */ | 
					
						
							|  |  |  | 		if (op->type->check) { | 
					
						
							| 
									
										
										
										
											2010-09-17 15:11:12 +00:00
										 |  |  | 			char filepath[FILE_MAX]; | 
					
						
							|  |  |  | 			file_sfile_to_operator(op, sfile, filepath); | 
					
						
							|  |  |  | 			 | 
					
						
							|  |  |  | 			/* redraw */ | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 			if (op->type->check(C, op)) { | 
					
						
							| 
									
										
										
										
											2010-09-17 15:11:12 +00:00
										 |  |  | 				file_operator_to_sfile(sfile, op); | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 				/* redraw, else the changed settings wont get updated */ | 
					
						
							|  |  |  | 				ED_area_tag_redraw(CTX_wm_area(C)); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2010-09-17 09:27:31 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int file_draw_check_exists(SpaceFile *sfile) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 	if (sfile->op) { /* fails on reload */ | 
					
						
							|  |  |  | 		if (RNA_struct_find_property(sfile->op->ptr, "check_existing")) { | 
					
						
							|  |  |  | 			if (RNA_boolean_get(sfile->op->ptr, "check_existing")) { | 
					
						
							| 
									
										
										
										
											2010-09-17 15:11:12 +00:00
										 |  |  | 				char filepath[FILE_MAX]; | 
					
						
							| 
									
										
										
										
											2011-02-13 03:21:27 +00:00
										 |  |  | 				BLI_join_dirfile(filepath, sizeof(filepath), sfile->params->dir, sfile->params->file); | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 				if (BLI_is_file(filepath)) { | 
					
						
							| 
									
										
										
										
											2010-09-17 15:11:12 +00:00
										 |  |  | 					return TRUE; | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2010-09-17 09:27:31 +00:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return FALSE; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-16 12:14:04 +00:00
										 |  |  | /* sends events now, so things get handled on windowqueue level */ | 
					
						
							| 
									
										
										
										
											2010-01-20 08:57:26 +00:00
										 |  |  | int file_exec(bContext *C, wmOperator *exec_op) | 
					
						
							| 
									
										
										
										
											2009-01-28 11:27:25 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	SpaceFile *sfile = CTX_wm_space_file(C); | 
					
						
							| 
									
										
										
										
											2010-06-26 08:53:29 +00:00
										 |  |  | 	char filepath[FILE_MAX]; | 
					
						
							| 
									
										
										
										
											2009-01-28 11:27:25 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 	if (sfile->op) { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 		wmOperator *op = sfile->op; | 
					
						
							| 
									
										
										
										
											2010-01-19 03:59:05 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2010-01-20 08:57:26 +00:00
										 |  |  | 		/* when used as a macro, for doubleclick, 
 | 
					
						
							| 
									
										
										
										
											2012-03-03 16:31:46 +00:00
										 |  |  | 		 * to prevent closing when doubleclicking on .. item */ | 
					
						
							| 
									
										
										
										
											2010-01-20 08:57:26 +00:00
										 |  |  | 		if (RNA_boolean_get(exec_op->ptr, "need_active")) { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 			int i, active = 0; | 
					
						
							| 
									
										
										
										
											2010-01-20 08:57:26 +00:00
										 |  |  | 			 | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 			for (i = 0; i < filelist_numfiles(sfile->files); i++) { | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 				if (filelist_is_selected(sfile->files, i, CHECK_ALL)) { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 					active = 1; | 
					
						
							| 
									
										
										
										
											2011-03-20 15:15:05 +00:00
										 |  |  | 					break; | 
					
						
							| 
									
										
										
										
											2010-01-20 08:57:26 +00:00
										 |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			if (active == 0) | 
					
						
							|  |  |  | 				return OPERATOR_CANCELLED; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		 | 
					
						
							| 
									
										
										
										
											2009-01-28 11:27:25 +00:00
										 |  |  | 		sfile->op = NULL; | 
					
						
							| 
									
										
										
										
											2009-09-13 08:08:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-17 09:27:31 +00:00
										 |  |  | 		file_sfile_to_operator(op, sfile, filepath); | 
					
						
							| 
									
										
										
										
											2009-09-16 18:07:49 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-21 22:33:41 +00:00
										 |  |  | 		if (BLI_exists(sfile->params->dir)) | 
					
						
							| 
									
										
										
										
											2011-09-22 15:46:43 +00:00
										 |  |  | 			fsmenu_insert_entry(fsmenu_get(), FS_CATEGORY_RECENT, sfile->params->dir, 0, 1); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-18 06:41:16 +00:00
										 |  |  | 		BLI_make_file_string(G.main->name, filepath, BLI_get_folder_create(BLENDER_USER_CONFIG, NULL), BLENDER_BOOKMARK_FILE); | 
					
						
							| 
									
										
										
										
											2010-06-26 08:53:29 +00:00
										 |  |  | 		fsmenu_write_file(fsmenu_get(), filepath); | 
					
						
							| 
									
										
										
										
											2009-02-16 12:14:04 +00:00
										 |  |  | 		WM_event_fileselect_event(C, op, EVT_FILESELECT_EXEC); | 
					
						
							| 
									
										
										
										
											2009-09-15 20:47:34 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-28 11:27:25 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2009-02-14 14:25:48 +00:00
										 |  |  | 				 | 
					
						
							| 
									
										
										
										
											2009-01-28 11:27:25 +00:00
										 |  |  | 	return OPERATOR_FINISHED; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-04 04:29:54 +00:00
										 |  |  | void FILE_OT_execute(struct wmOperatorType *ot) | 
					
						
							| 
									
										
										
										
											2009-01-28 11:27:25 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-03-23 22:31:14 +00:00
										 |  |  | 	PropertyRNA *prop; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-28 11:27:25 +00:00
										 |  |  | 	/* identifiers */ | 
					
						
							| 
									
										
										
										
											2012-03-22 07:26:09 +00:00
										 |  |  | 	ot->name = "Execute File Window"; | 
					
						
							|  |  |  | 	ot->description = "Execute selected file"; | 
					
						
							|  |  |  | 	ot->idname = "FILE_OT_execute"; | 
					
						
							| 
									
										
										
										
											2009-01-28 11:27:25 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	/* api callbacks */ | 
					
						
							| 
									
										
										
										
											2012-03-22 07:26:09 +00:00
										 |  |  | 	ot->exec = file_exec; | 
					
						
							|  |  |  | 	ot->poll = file_operator_poll;  | 
					
						
							| 
									
										
										
										
											2010-01-20 08:57:26 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2012-03-23 22:31:14 +00:00
										 |  |  | 	prop = RNA_def_boolean(ot->srna, "need_active", 0, "Need Active", | 
					
						
							|  |  |  | 	                       "Only execute if there's an active selected file in the file list"); | 
					
						
							|  |  |  | 	RNA_def_property_flag(prop, PROP_SKIP_SAVE); | 
					
						
							| 
									
										
										
										
											2009-01-28 11:27:25 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-14 14:25:48 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-15 01:36:14 +00:00
										 |  |  | int file_parent_exec(bContext *C, wmOperator *UNUSED(unused)) | 
					
						
							| 
									
										
										
										
											2009-02-10 17:53:10 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	SpaceFile *sfile = CTX_wm_space_file(C); | 
					
						
							| 
									
										
										
										
											2009-02-10 17:53:10 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 	if (sfile->params) { | 
					
						
							| 
									
										
										
										
											2009-07-10 19:19:54 +00:00
										 |  |  | 		if (BLI_has_parent(sfile->params->dir)) { | 
					
						
							|  |  |  | 			BLI_parent_dir(sfile->params->dir); | 
					
						
							| 
									
										
										
										
											2010-10-18 06:41:16 +00:00
										 |  |  | 			BLI_cleanup_dir(G.main->name, sfile->params->dir); | 
					
						
							| 
									
										
										
										
											2010-03-10 19:30:20 +00:00
										 |  |  | 			file_change_dir(C, 0); | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 			WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_LIST, NULL); | 
					
						
							| 
									
										
										
										
											2009-07-10 19:19:54 +00:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2009-02-10 17:53:10 +00:00
										 |  |  | 	}		 | 
					
						
							| 
									
										
										
										
											2009-07-10 19:19:54 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2009-02-10 17:53:10 +00:00
										 |  |  | 	return OPERATOR_FINISHED; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-08 13:14:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-14 14:25:48 +00:00
										 |  |  | void FILE_OT_parent(struct wmOperatorType *ot) | 
					
						
							| 
									
										
										
										
											2009-02-10 17:53:10 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	/* identifiers */ | 
					
						
							| 
									
										
										
										
											2012-03-22 07:26:09 +00:00
										 |  |  | 	ot->name = "Parent File"; | 
					
						
							|  |  |  | 	ot->description = "Move to parent directory"; | 
					
						
							|  |  |  | 	ot->idname = "FILE_OT_parent"; | 
					
						
							| 
									
										
										
										
											2009-02-10 17:53:10 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	/* api callbacks */ | 
					
						
							| 
									
										
										
										
											2012-03-22 07:26:09 +00:00
										 |  |  | 	ot->exec = file_parent_exec; | 
					
						
							|  |  |  | 	ot->poll = ED_operator_file_active; /* <- important, handler is on window level */ | 
					
						
							| 
									
										
										
										
											2009-02-10 17:53:10 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-12 06:40:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-14 17:55:27 +00:00
										 |  |  | static int file_refresh_exec(bContext *C, wmOperator *UNUSED(unused)) | 
					
						
							| 
									
										
										
										
											2009-03-12 06:40:03 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	SpaceFile *sfile = CTX_wm_space_file(C); | 
					
						
							|  |  |  | 	struct FSMenu *fsmenu = fsmenu_get(); | 
					
						
							| 
									
										
										
										
											2010-04-19 19:29:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	ED_fileselect_clear(C, sfile); | 
					
						
							| 
									
										
										
										
											2009-07-07 07:25:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-18 12:49:25 +00:00
										 |  |  | 	/* refresh system directory menu */ | 
					
						
							|  |  |  | 	fsmenu_refresh_system_category(fsmenu); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_LIST, NULL); | 
					
						
							| 
									
										
										
										
											2009-07-07 07:25:44 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return OPERATOR_FINISHED; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void FILE_OT_previous(struct wmOperatorType *ot) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	/* identifiers */ | 
					
						
							| 
									
										
										
										
											2012-03-22 07:26:09 +00:00
										 |  |  | 	ot->name = "Previous Folder"; | 
					
						
							|  |  |  | 	ot->description = "Move to previous folder"; | 
					
						
							|  |  |  | 	ot->idname = "FILE_OT_previous"; | 
					
						
							| 
									
										
										
										
											2009-07-07 07:25:44 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	/* api callbacks */ | 
					
						
							| 
									
										
										
										
											2012-03-22 07:26:09 +00:00
										 |  |  | 	ot->exec = file_previous_exec; | 
					
						
							|  |  |  | 	ot->poll = ED_operator_file_active; /* <- important, handler is on window level */ | 
					
						
							| 
									
										
										
										
											2009-07-07 07:25:44 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-15 01:36:14 +00:00
										 |  |  | int file_previous_exec(bContext *C, wmOperator *UNUSED(unused)) | 
					
						
							| 
									
										
										
										
											2009-07-07 07:25:44 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	SpaceFile *sfile = CTX_wm_space_file(C); | 
					
						
							| 
									
										
										
										
											2009-07-07 07:25:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 	if (sfile->params) { | 
					
						
							| 
									
										
										
										
											2009-07-07 07:25:44 +00:00
										 |  |  | 		if (!sfile->folders_next) | 
					
						
							|  |  |  | 			sfile->folders_next = folderlist_new(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		folderlist_pushdir(sfile->folders_next, sfile->params->dir); | 
					
						
							|  |  |  | 		folderlist_popdir(sfile->folders_prev, sfile->params->dir); | 
					
						
							|  |  |  | 		folderlist_pushdir(sfile->folders_next, sfile->params->dir); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-10 19:30:20 +00:00
										 |  |  | 		file_change_dir(C, 1); | 
					
						
							| 
									
										
										
										
											2009-06-29 20:23:40 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_LIST, NULL); | 
					
						
							| 
									
										
										
										
											2009-03-12 06:40:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return OPERATOR_FINISHED; | 
					
						
							| 
									
										
										
										
											2009-07-07 07:25:44 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2009-03-12 06:40:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-07 07:25:44 +00:00
										 |  |  | void FILE_OT_next(struct wmOperatorType *ot) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	/* identifiers */ | 
					
						
							| 
									
										
										
										
											2012-03-22 07:26:09 +00:00
										 |  |  | 	ot->name = "Next Folder"; | 
					
						
							|  |  |  | 	ot->description = "Move to next folder"; | 
					
						
							|  |  |  | 	ot->idname = "FILE_OT_next"; | 
					
						
							| 
									
										
										
										
											2009-07-07 07:25:44 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	/* api callbacks */ | 
					
						
							| 
									
										
										
										
											2012-03-22 07:26:09 +00:00
										 |  |  | 	ot->exec = file_next_exec; | 
					
						
							|  |  |  | 	ot->poll = ED_operator_file_active; /* <- important, handler is on window level */ | 
					
						
							| 
									
										
										
										
											2009-03-12 06:40:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-15 01:36:14 +00:00
										 |  |  | int file_next_exec(bContext *C, wmOperator *UNUSED(unused)) | 
					
						
							| 
									
										
										
										
											2009-07-07 07:25:44 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	SpaceFile *sfile = CTX_wm_space_file(C); | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 	if (sfile->params) { | 
					
						
							| 
									
										
										
										
											2010-03-27 12:14:51 +00:00
										 |  |  | 		if (!sfile->folders_next) | 
					
						
							| 
									
										
										
										
											2009-07-07 07:25:44 +00:00
										 |  |  | 			sfile->folders_next = folderlist_new(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		folderlist_pushdir(sfile->folders_prev, sfile->params->dir); | 
					
						
							|  |  |  | 		folderlist_popdir(sfile->folders_next, sfile->params->dir); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-25 09:28:52 +00:00
										 |  |  | 		// update folders_prev so we can check for it in folderlist_clear_next()
 | 
					
						
							| 
									
										
										
										
											2009-07-07 07:25:44 +00:00
										 |  |  | 		folderlist_pushdir(sfile->folders_prev, sfile->params->dir); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-10 19:30:20 +00:00
										 |  |  | 		file_change_dir(C, 1); | 
					
						
							| 
									
										
										
										
											2009-07-07 07:25:44 +00:00
										 |  |  | 	}		 | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_LIST, NULL); | 
					
						
							| 
									
										
										
										
											2009-07-07 07:25:44 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return OPERATOR_FINISHED; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2009-03-12 06:40:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-08 21:02:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* only meant for timer usage */ | 
					
						
							| 
									
										
										
										
											2010-10-15 01:36:14 +00:00
										 |  |  | static int file_smoothscroll_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *event) | 
					
						
							| 
									
										
										
										
											2010-05-08 21:02:22 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-10 08:57:58 +00:00
										 |  |  | 	ScrArea *sa = CTX_wm_area(C); | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	SpaceFile *sfile = CTX_wm_space_file(C); | 
					
						
							|  |  |  | 	ARegion *ar, *oldar = CTX_wm_region(C); | 
					
						
							| 
									
										
										
										
											2011-03-14 19:56:13 +00:00
										 |  |  | 	int offset; | 
					
						
							|  |  |  | 	int numfiles, numfiles_layout; | 
					
						
							| 
									
										
										
										
											2010-05-08 21:02:22 +00:00
										 |  |  | 	int edit_idx = 0; | 
					
						
							|  |  |  | 	int i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* escape if not our timer */ | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	if (sfile->smoothscroll_timer == NULL || sfile->smoothscroll_timer != event->customdata) | 
					
						
							| 
									
										
										
										
											2010-05-08 21:02:22 +00:00
										 |  |  | 		return OPERATOR_PASS_THROUGH; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	numfiles = filelist_numfiles(sfile->files); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* check if we are editing a name */ | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	for (i = 0; i < numfiles; ++i) { | 
					
						
							| 
									
										
										
										
											2011-03-21 03:22:33 +00:00
										 |  |  | 		if (filelist_is_selected(sfile->files, i, CHECK_ALL) ) { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 			edit_idx = i; | 
					
						
							| 
									
										
										
										
											2010-05-08 21:02:22 +00:00
										 |  |  | 			break; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* if we are not editing, we are done */ | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	if (0 == edit_idx) { | 
					
						
							| 
									
										
										
										
											2010-05-08 21:02:22 +00:00
										 |  |  | 		WM_event_remove_timer(CTX_wm_manager(C), CTX_wm_window(C), sfile->smoothscroll_timer); | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 		sfile->smoothscroll_timer = NULL; | 
					
						
							| 
									
										
										
										
											2010-05-08 21:02:22 +00:00
										 |  |  | 		return OPERATOR_PASS_THROUGH; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* we need the correct area for scrolling */ | 
					
						
							| 
									
										
										
										
											2010-05-10 08:57:58 +00:00
										 |  |  | 	ar = BKE_area_find_region_type(sa, RGN_TYPE_WINDOW); | 
					
						
							| 
									
										
										
										
											2010-05-08 21:02:22 +00:00
										 |  |  | 	if (!ar || ar->regiontype != RGN_TYPE_WINDOW) { | 
					
						
							|  |  |  | 		WM_event_remove_timer(CTX_wm_manager(C), CTX_wm_window(C), sfile->smoothscroll_timer); | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 		sfile->smoothscroll_timer = NULL; | 
					
						
							| 
									
										
										
										
											2010-05-08 21:02:22 +00:00
										 |  |  | 		return OPERATOR_PASS_THROUGH; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-10 09:37:04 +00:00
										 |  |  | 	offset = ED_fileselect_layout_offset(sfile->layout, (int)ar->v2d.cur.xmin, (int)-ar->v2d.cur.ymax); | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	if (offset < 0) offset = 0; | 
					
						
							| 
									
										
										
										
											2010-05-08 21:02:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* scroll offset is the first file in the row/column we are editing in */ | 
					
						
							|  |  |  | 	if (sfile->scroll_offset == 0) { | 
					
						
							|  |  |  | 		if (sfile->layout->flag & FILE_LAYOUT_HOR) { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 			sfile->scroll_offset = (edit_idx / sfile->layout->rows) * sfile->layout->rows; | 
					
						
							| 
									
										
										
										
											2010-05-08 21:02:22 +00:00
										 |  |  | 			if (sfile->scroll_offset <= offset) sfile->scroll_offset -= sfile->layout->rows; | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		else { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 			sfile->scroll_offset = (edit_idx / sfile->layout->columns) * sfile->layout->columns; | 
					
						
							| 
									
										
										
										
											2010-05-08 21:02:22 +00:00
										 |  |  | 			if (sfile->scroll_offset <= offset) sfile->scroll_offset -= sfile->layout->columns; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	numfiles_layout = ED_fileselect_layout_numfiles(sfile->layout, ar); | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	/* check if we have reached our final scroll position */ | 
					
						
							|  |  |  | 	if ( (sfile->scroll_offset >= offset) && (sfile->scroll_offset < offset + numfiles_layout) ) { | 
					
						
							|  |  |  | 		WM_event_remove_timer(CTX_wm_manager(C), CTX_wm_window(C), sfile->smoothscroll_timer); | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 		sfile->smoothscroll_timer = NULL; | 
					
						
							| 
									
										
										
										
											2010-05-08 21:02:22 +00:00
										 |  |  | 		return OPERATOR_FINISHED; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-10 08:57:58 +00:00
										 |  |  | 	/* temporarily set context to the main window region, 
 | 
					
						
							|  |  |  | 	 * so the scroll operators work */ | 
					
						
							|  |  |  | 	CTX_wm_region_set(C, ar); | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2010-05-08 21:02:22 +00:00
										 |  |  | 	/* scroll one step in the desired direction */ | 
					
						
							|  |  |  | 	if (sfile->scroll_offset < offset) { | 
					
						
							|  |  |  | 		if (sfile->layout->flag & FILE_LAYOUT_HOR) { | 
					
						
							|  |  |  | 			WM_operator_name_call(C, "VIEW2D_OT_scroll_left", 0, NULL); | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		else { | 
					
						
							| 
									
										
										
										
											2010-05-08 21:02:22 +00:00
										 |  |  | 			WM_operator_name_call(C, "VIEW2D_OT_scroll_up", 0, NULL); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		 | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	else { | 
					
						
							| 
									
										
										
										
											2010-05-08 21:02:22 +00:00
										 |  |  | 		if (sfile->layout->flag & FILE_LAYOUT_HOR) { | 
					
						
							|  |  |  | 			WM_operator_name_call(C, "VIEW2D_OT_scroll_right", 0, NULL); | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		else { | 
					
						
							| 
									
										
										
										
											2010-05-08 21:02:22 +00:00
										 |  |  | 			WM_operator_name_call(C, "VIEW2D_OT_scroll_down", 0, NULL); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	ED_region_tag_redraw(CTX_wm_region(C)); | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2010-05-10 08:57:58 +00:00
										 |  |  | 	/* and restore context */ | 
					
						
							|  |  |  | 	CTX_wm_region_set(C, oldar); | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2010-05-08 21:02:22 +00:00
										 |  |  | 	return OPERATOR_FINISHED; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void FILE_OT_smoothscroll(wmOperatorType *ot) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	/* identifiers */ | 
					
						
							| 
									
										
										
										
											2012-03-22 07:26:09 +00:00
										 |  |  | 	ot->name = "Smooth Scroll"; | 
					
						
							|  |  |  | 	ot->idname = "FILE_OT_smoothscroll"; | 
					
						
							|  |  |  | 	ot->description = "Smooth scroll to make editable file visible"; | 
					
						
							| 
									
										
										
										
											2010-05-08 21:02:22 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	/* api callbacks */ | 
					
						
							| 
									
										
										
										
											2012-03-22 07:26:09 +00:00
										 |  |  | 	ot->invoke = file_smoothscroll_invoke; | 
					
						
							| 
									
										
										
										
											2010-05-08 21:02:22 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2012-03-22 07:26:09 +00:00
										 |  |  | 	ot->poll = ED_operator_file_active; | 
					
						
							| 
									
										
										
										
											2010-05-08 21:02:22 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-07 23:47:37 +00:00
										 |  |  | /* create a new, non-existing folder name, returns 1 if successful, 0 if name couldn't be created.
 | 
					
						
							| 
									
										
										
										
											2012-03-03 16:31:46 +00:00
										 |  |  |  * The actual name is returned in 'name', 'folder' contains the complete path, including the new folder name. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | static int new_folder_path(const char *parent, char *folder, char *name) | 
					
						
							| 
									
										
										
										
											2009-07-10 17:05:04 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	int i = 1; | 
					
						
							| 
									
										
										
										
											2009-12-07 23:47:37 +00:00
										 |  |  | 	int len = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	BLI_strncpy(name, "New Folder", FILE_MAXFILE); | 
					
						
							| 
									
										
										
										
											2011-02-13 03:21:27 +00:00
										 |  |  | 	BLI_join_dirfile(folder, FILE_MAX, parent, name); /* XXX, not real length */ | 
					
						
							| 
									
										
										
										
											2009-12-07 23:47:37 +00:00
										 |  |  | 	/* check whether folder with the name already exists, in this case
 | 
					
						
							| 
									
										
										
										
											2012-03-03 16:31:46 +00:00
										 |  |  | 	 * add number to the name. Check length of generated name to avoid | 
					
						
							|  |  |  | 	 * crazy case of huge number of folders each named 'New Folder (x)' */ | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	while (BLI_exists(folder) && (len < FILE_MAXFILE)) { | 
					
						
							| 
									
										
										
										
											2009-12-07 23:47:37 +00:00
										 |  |  | 		len = BLI_snprintf(name, FILE_MAXFILE, "New Folder(%d)", i); | 
					
						
							| 
									
										
										
										
											2011-02-13 03:21:27 +00:00
										 |  |  | 		BLI_join_dirfile(folder, FILE_MAX, parent, name); /* XXX, not real length */ | 
					
						
							| 
									
										
										
										
											2009-12-07 23:47:37 +00:00
										 |  |  | 		i++; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2009-07-10 17:05:04 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	return (len < FILE_MAXFILE); | 
					
						
							| 
									
										
										
										
											2009-12-07 23:47:37 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int file_directory_new_exec(bContext *C, wmOperator *op) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	char name[FILE_MAXFILE]; | 
					
						
							|  |  |  | 	char path[FILE_MAX]; | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	int generate_name = 1; | 
					
						
							| 
									
										
										
										
											2010-11-06 16:09:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	SpaceFile *sfile = CTX_wm_space_file(C); | 
					
						
							| 
									
										
										
										
											2009-07-10 17:05:04 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 	if (!sfile->params) { | 
					
						
							| 
									
										
										
										
											2012-04-29 15:47:02 +00:00
										 |  |  | 		BKE_report(op->reports, RPT_WARNING, "No parent directory given"); | 
					
						
							| 
									
										
										
										
											2009-12-07 23:47:37 +00:00
										 |  |  | 		return OPERATOR_CANCELLED; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2010-11-06 16:09:12 +00:00
										 |  |  | 	path[0] = '\0'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 	if (RNA_struct_find_property(op->ptr, "directory")) { | 
					
						
							| 
									
										
										
										
											2010-11-06 16:09:12 +00:00
										 |  |  | 		RNA_string_get(op->ptr, "directory", path); | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 		if (path[0] != '\0') generate_name = 0; | 
					
						
							| 
									
										
										
										
											2009-12-07 23:47:37 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2010-11-06 16:09:12 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (generate_name) { | 
					
						
							|  |  |  | 		/* create a new, non-existing folder name */ | 
					
						
							|  |  |  | 		if (!new_folder_path(sfile->params->dir, path, name)) { | 
					
						
							| 
									
										
										
										
											2012-04-29 15:47:02 +00:00
										 |  |  | 			BKE_report(op->reports, RPT_ERROR, "Couldn't create new folder name"); | 
					
						
							| 
									
										
										
										
											2010-11-06 16:09:12 +00:00
										 |  |  | 			return OPERATOR_CANCELLED; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* create the file */ | 
					
						
							| 
									
										
										
										
											2011-10-22 15:35:49 +00:00
										 |  |  | 	BLI_dir_create_recursive(path); | 
					
						
							| 
									
										
										
										
											2009-12-07 23:47:37 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (!BLI_exists(path)) { | 
					
						
							| 
									
										
										
										
											2012-04-29 15:47:02 +00:00
										 |  |  | 		BKE_report(op->reports, RPT_ERROR, "Couldn't create new folder"); | 
					
						
							| 
									
										
										
										
											2009-12-07 23:47:37 +00:00
										 |  |  | 		return OPERATOR_CANCELLED; | 
					
						
							|  |  |  | 	}  | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* now remember file to jump into editing */ | 
					
						
							|  |  |  | 	BLI_strncpy(sfile->params->renamefile, name, FILE_MAXFILE); | 
					
						
							| 
									
										
										
										
											2010-05-08 21:02:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* set timer to smoothly view newly generated file */ | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	sfile->smoothscroll_timer = WM_event_add_timer(CTX_wm_manager(C), CTX_wm_window(C), TIMER1, 1.0 / 1000.0);    /* max 30 frs/sec */ | 
					
						
							|  |  |  | 	sfile->scroll_offset = 0; | 
					
						
							| 
									
										
										
										
											2010-05-08 21:02:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* reload dir to make sure we're seeing what's in the directory */ | 
					
						
							| 
									
										
										
										
											2010-03-27 12:14:51 +00:00
										 |  |  | 	ED_fileselect_clear(C, sfile); | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_LIST, NULL); | 
					
						
							| 
									
										
										
										
											2009-07-10 17:05:04 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return OPERATOR_FINISHED; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void FILE_OT_directory_new(struct wmOperatorType *ot) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	/* identifiers */ | 
					
						
							| 
									
										
										
										
											2012-03-22 07:26:09 +00:00
										 |  |  | 	ot->name = "Create New Directory"; | 
					
						
							|  |  |  | 	ot->description = "Create a new directory"; | 
					
						
							|  |  |  | 	ot->idname = "FILE_OT_directory_new"; | 
					
						
							| 
									
										
										
										
											2009-07-10 17:05:04 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	/* api callbacks */ | 
					
						
							| 
									
										
										
										
											2012-03-22 07:26:09 +00:00
										 |  |  | 	ot->invoke = WM_operator_confirm; | 
					
						
							|  |  |  | 	ot->exec = file_directory_new_exec; | 
					
						
							|  |  |  | 	ot->poll = ED_operator_file_active; /* <- important, handler is on window level */ | 
					
						
							| 
									
										
										
										
											2010-11-06 16:09:12 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	RNA_def_string_dir_path(ot->srna, "directory", "", FILE_MAX, "Directory", "Name of new directory"); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-10 17:05:04 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-06 16:09:12 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | static void file_expand_directory(bContext *C) | 
					
						
							| 
									
										
										
										
											2009-07-10 17:05:04 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	SpaceFile *sfile = CTX_wm_space_file(C); | 
					
						
							| 
									
										
										
										
											2009-07-10 17:05:04 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 	if (sfile->params) { | 
					
						
							| 
									
										
										
										
											2012-05-17 10:07:29 +00:00
										 |  |  | 		/* TODO, what about // when relbase isn't valid? */ | 
					
						
							|  |  |  | 		if (G.relbase_valid && strncmp(sfile->params->dir, "//", 2) == 0) { | 
					
						
							|  |  |  | 			BLI_path_abs(sfile->params->dir, G.main->name); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		else if (sfile->params->dir[0] == '~') { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 			char tmpstr[sizeof(sfile->params->dir) - 1]; | 
					
						
							|  |  |  | 			BLI_strncpy(tmpstr, sfile->params->dir + 1, sizeof(tmpstr)); | 
					
						
							| 
									
										
										
										
											2011-02-13 03:21:27 +00:00
										 |  |  | 			BLI_join_dirfile(sfile->params->dir, sizeof(sfile->params->dir), BLI_getDefaultDocumentFolder(), tmpstr); | 
					
						
							| 
									
										
										
										
											2009-07-10 17:05:04 +00:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2010-05-07 23:34:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-01-30 10:04:27 +00:00
										 |  |  | 		else if (sfile->params->dir[0] == '\0') | 
					
						
							|  |  |  | #ifndef WIN32
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			sfile->params->dir[0] = '/'; | 
					
						
							|  |  |  | 			sfile->params->dir[1] = '\0'; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2009-07-10 19:52:00 +00:00
										 |  |  | 			get_default_root(sfile->params->dir); | 
					
						
							| 
									
										
										
										
											2011-08-05 06:06:15 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		/* change "C:" --> "C:\", [#28102] */ | 
					
						
							|  |  |  | 		else if (   (isalpha(sfile->params->dir[0]) && | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 		             (sfile->params->dir[1] == ':')) && | 
					
						
							| 
									
										
										
										
											2011-08-05 06:06:15 +00:00
										 |  |  | 		            (sfile->params->dir[2] == '\0') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 		            ) { | 
					
						
							|  |  |  | 			sfile->params->dir[2] = '\\'; | 
					
						
							|  |  |  | 			sfile->params->dir[3] = '\0'; | 
					
						
							| 
									
										
										
										
											2011-08-05 06:06:15 +00:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2009-07-10 19:52:00 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2010-11-06 16:09:12 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-14 17:55:27 +00:00
										 |  |  | static int file_directory_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event)) | 
					
						
							| 
									
										
										
										
											2010-11-06 16:09:12 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	SpaceFile *sfile = CTX_wm_space_file(C); | 
					
						
							| 
									
										
										
										
											2010-11-06 16:09:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 	if (sfile->params) { | 
					
						
							| 
									
										
										
										
											2010-11-06 16:09:12 +00:00
										 |  |  | 		file_expand_directory(C); | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 		if (!BLI_exists(sfile->params->dir)) { | 
					
						
							|  |  |  | 			return WM_operator_confirm_message(C, op, "Create new directory?"); | 
					
						
							| 
									
										
										
										
											2012-06-18 12:39:19 +00:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2010-11-06 16:09:12 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		return file_directory_exec(C, op); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return OPERATOR_CANCELLED; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int file_directory_exec(bContext *C, wmOperator *UNUSED(unused)) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	SpaceFile *sfile = CTX_wm_space_file(C); | 
					
						
							| 
									
										
										
										
											2010-11-06 16:09:12 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 	if (sfile->params) { | 
					
						
							| 
									
										
										
										
											2010-11-06 16:09:12 +00:00
										 |  |  | 		file_expand_directory(C); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (!BLI_exists(sfile->params->dir)) { | 
					
						
							| 
									
										
										
										
											2011-10-22 15:35:49 +00:00
										 |  |  | 			BLI_dir_create_recursive(sfile->params->dir); | 
					
						
							| 
									
										
										
										
											2011-01-13 07:25:18 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-12 18:06:36 +00:00
										 |  |  | 		/* special case, user may have pasted a filepath into the directory */ | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 		if (BLI_is_file(sfile->params->dir)) { | 
					
						
							| 
									
										
										
										
											2011-01-13 07:25:18 +00:00
										 |  |  | 			char path[sizeof(sfile->params->dir)]; | 
					
						
							|  |  |  | 			BLI_strncpy(path, sfile->params->dir, sizeof(path)); | 
					
						
							| 
									
										
										
										
											2011-10-15 03:56:05 +00:00
										 |  |  | 			BLI_split_dirfile(path, sfile->params->dir, sfile->params->file, sizeof(sfile->params->dir), sizeof(sfile->params->file)); | 
					
						
							| 
									
										
										
										
											2011-01-13 07:25:18 +00:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2010-11-06 16:09:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-18 06:41:16 +00:00
										 |  |  | 		BLI_cleanup_dir(G.main->name, sfile->params->dir); | 
					
						
							| 
									
										
										
										
											2009-07-10 19:19:54 +00:00
										 |  |  | 		BLI_add_slash(sfile->params->dir); | 
					
						
							| 
									
										
										
										
											2010-03-10 19:30:20 +00:00
										 |  |  | 		file_change_dir(C, 1); | 
					
						
							| 
									
										
										
										
											2009-10-15 11:11:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 		WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_LIST, NULL); | 
					
						
							| 
									
										
										
										
											2012-06-18 12:39:19 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2009-07-10 17:05:04 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return OPERATOR_FINISHED; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-15 01:36:14 +00:00
										 |  |  | int file_filename_exec(bContext *C, wmOperator *UNUSED(unused)) | 
					
						
							| 
									
										
										
										
											2009-07-10 17:05:04 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	SpaceFile *sfile = CTX_wm_space_file(C); | 
					
						
							| 
									
										
										
										
											2012-06-17 14:16:26 +00:00
										 |  |  | 	char matched_file[FILE_MAX]; | 
					
						
							| 
									
										
										
										
											2012-03-06 18:40:15 +00:00
										 |  |  | 	if (sfile->params) { | 
					
						
							| 
									
										
										
										
											2012-06-17 14:16:26 +00:00
										 |  |  | 		matched_file[0] = '\0'; | 
					
						
							|  |  |  | 		if (file_select_match(sfile, sfile->params->file, matched_file)) { | 
					
						
							| 
									
										
										
										
											2012-06-18 12:39:19 +00:00
										 |  |  | 			/* int i, numfiles = filelist_numfiles(sfile->files); */ /* XXX UNUSED */ | 
					
						
							| 
									
										
										
										
											2009-07-10 17:05:04 +00:00
										 |  |  | 			sfile->params->file[0] = '\0'; | 
					
						
							| 
									
										
										
										
											2012-06-17 14:16:26 +00:00
										 |  |  | 			/* replace the pattern (or filename that the user typed in, with the first selected file of the match */ | 
					
						
							|  |  |  | 			BLI_strncpy(sfile->params->file, matched_file, sizeof(sfile->params->file)); | 
					
						
							|  |  |  | 			 | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 			WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_PARAMS, NULL); | 
					
						
							| 
									
										
										
										
											2009-07-10 17:05:04 +00:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2012-06-18 12:39:19 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2009-07-10 17:05:04 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return OPERATOR_FINISHED; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-15 04:11:55 +00:00
										 |  |  | /* TODO, directory operator is non-functional while a library is loaded
 | 
					
						
							|  |  |  |  * until this is properly supported just disable it. */ | 
					
						
							|  |  |  | static int file_directory_poll(bContext *C) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-10-03 03:48:48 +00:00
										 |  |  | 	/* sfile->files can be NULL on file load */ | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	SpaceFile *sfile = CTX_wm_space_file(C); | 
					
						
							|  |  |  | 	return ED_operator_file_active(C) && (sfile->files == NULL || filelist_lib(sfile->files) == NULL); | 
					
						
							| 
									
										
										
										
											2011-08-15 04:11:55 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-06 16:09:12 +00:00
										 |  |  | void FILE_OT_directory(struct wmOperatorType *ot) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	/* identifiers */ | 
					
						
							| 
									
										
										
										
											2012-03-22 07:26:09 +00:00
										 |  |  | 	ot->name = "Enter Directory Name"; | 
					
						
							|  |  |  | 	ot->description = "Enter a directory name"; | 
					
						
							|  |  |  | 	ot->idname = "FILE_OT_directory"; | 
					
						
							| 
									
										
										
										
											2010-11-06 16:09:12 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	/* api callbacks */ | 
					
						
							| 
									
										
										
										
											2012-03-22 07:26:09 +00:00
										 |  |  | 	ot->invoke = file_directory_invoke; | 
					
						
							|  |  |  | 	ot->exec = file_directory_exec; | 
					
						
							|  |  |  | 	ot->poll = file_directory_poll; /* <- important, handler is on window level */ | 
					
						
							| 
									
										
										
										
											2010-11-06 16:09:12 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2009-07-10 17:05:04 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-12 06:40:03 +00:00
										 |  |  | void FILE_OT_refresh(struct wmOperatorType *ot) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	/* identifiers */ | 
					
						
							| 
									
										
										
										
											2012-03-22 07:26:09 +00:00
										 |  |  | 	ot->name = "Refresh Filelist"; | 
					
						
							|  |  |  | 	ot->description = "Refresh the file list"; | 
					
						
							|  |  |  | 	ot->idname = "FILE_OT_refresh"; | 
					
						
							| 
									
										
										
										
											2009-03-12 06:40:03 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	/* api callbacks */ | 
					
						
							| 
									
										
										
										
											2012-03-22 07:26:09 +00:00
										 |  |  | 	ot->exec = file_refresh_exec; | 
					
						
							|  |  |  | 	ot->poll = ED_operator_file_active; /* <- important, handler is on window level */ | 
					
						
							| 
									
										
										
										
											2009-03-12 06:40:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-14 17:55:27 +00:00
										 |  |  | static int file_hidedot_exec(bContext *C, wmOperator *UNUSED(unused)) | 
					
						
							| 
									
										
										
										
											2009-06-30 18:29:30 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	SpaceFile *sfile = CTX_wm_space_file(C); | 
					
						
							| 
									
										
										
										
											2009-06-30 18:29:30 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 	if (sfile->params) { | 
					
						
							| 
									
										
										
										
											2009-06-30 18:29:30 +00:00
										 |  |  | 		sfile->params->flag ^= FILE_HIDE_DOT; | 
					
						
							| 
									
										
										
										
											2010-03-10 19:30:20 +00:00
										 |  |  | 		ED_fileselect_clear(C, sfile); | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 		WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_LIST, NULL); | 
					
						
							| 
									
										
										
										
											2009-06-30 18:29:30 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	return OPERATOR_FINISHED; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void FILE_OT_hidedot(struct wmOperatorType *ot) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	/* identifiers */ | 
					
						
							| 
									
										
										
										
											2012-03-22 07:26:09 +00:00
										 |  |  | 	ot->name = "Toggle Hide Dot Files"; | 
					
						
							|  |  |  | 	ot->description = "Toggle hide hidden dot files"; | 
					
						
							|  |  |  | 	ot->idname = "FILE_OT_hidedot"; | 
					
						
							| 
									
										
										
										
											2009-06-30 18:29:30 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	/* api callbacks */ | 
					
						
							| 
									
										
										
										
											2012-03-22 07:26:09 +00:00
										 |  |  | 	ot->exec = file_hidedot_exec; | 
					
						
							|  |  |  | 	ot->poll = ED_operator_file_active; /* <- important, handler is on window level */ | 
					
						
							| 
									
										
										
										
											2009-06-30 18:29:30 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-26 22:47:05 +00:00
										 |  |  | ARegion *file_buttons_region(ScrArea *sa) | 
					
						
							| 
									
										
										
										
											2012-06-20 16:43:48 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-06-29 20:23:40 +00:00
										 |  |  | 	ARegion *ar, *arnew; | 
					
						
							| 
									
										
										
										
											2009-03-08 13:14:12 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	for (ar = sa->regionbase.first; ar; ar = ar->next) | 
					
						
							|  |  |  | 		if (ar->regiontype == RGN_TYPE_CHANNELS) | 
					
						
							| 
									
										
										
										
											2009-03-08 13:14:12 +00:00
										 |  |  | 			return ar; | 
					
						
							| 
									
										
										
										
											2009-06-29 20:23:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* add subdiv level; after header */ | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	for (ar = sa->regionbase.first; ar; ar = ar->next) | 
					
						
							|  |  |  | 		if (ar->regiontype == RGN_TYPE_HEADER) | 
					
						
							| 
									
										
										
										
											2009-06-29 20:23:40 +00:00
										 |  |  | 			break; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	/* is error! */ | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	if (ar == NULL) return NULL; | 
					
						
							| 
									
										
										
										
											2009-06-29 20:23:40 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	arnew = MEM_callocN(sizeof(ARegion), "buttons for file panels"); | 
					
						
							| 
									
										
										
										
											2009-06-29 20:23:40 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	BLI_insertlinkafter(&sa->regionbase, ar, arnew); | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	arnew->regiontype = RGN_TYPE_CHANNELS; | 
					
						
							|  |  |  | 	arnew->alignment = RGN_ALIGN_LEFT; | 
					
						
							| 
									
										
										
										
											2009-06-29 20:23:40 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	arnew->flag = RGN_FLAG_HIDDEN; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	return arnew; | 
					
						
							| 
									
										
										
										
											2009-03-08 13:14:12 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2009-01-28 11:27:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-14 17:55:27 +00:00
										 |  |  | static int file_bookmark_toggle_exec(bContext *C, wmOperator *UNUSED(unused)) | 
					
						
							| 
									
										
										
										
											2009-03-08 13:14:12 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	ScrArea *sa = CTX_wm_area(C); | 
					
						
							|  |  |  | 	ARegion *ar = file_buttons_region(sa); | 
					
						
							| 
									
										
										
										
											2009-03-08 13:14:12 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 	if (ar) | 
					
						
							| 
									
										
										
										
											2009-09-14 19:12:29 +00:00
										 |  |  | 		ED_region_toggle_hidden(C, ar); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-08 13:14:12 +00:00
										 |  |  | 	return OPERATOR_FINISHED; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2009-01-28 11:27:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-08 13:14:12 +00:00
										 |  |  | void FILE_OT_bookmark_toggle(struct wmOperatorType *ot) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	/* identifiers */ | 
					
						
							| 
									
										
										
										
											2012-03-22 07:26:09 +00:00
										 |  |  | 	ot->name = "Toggle Bookmarks"; | 
					
						
							|  |  |  | 	ot->description = "Toggle bookmarks display"; | 
					
						
							|  |  |  | 	ot->idname = "FILE_OT_bookmark_toggle"; | 
					
						
							| 
									
										
										
										
											2009-03-08 13:14:12 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	/* api callbacks */ | 
					
						
							| 
									
										
										
										
											2012-03-22 07:26:09 +00:00
										 |  |  | 	ot->exec = file_bookmark_toggle_exec; | 
					
						
							|  |  |  | 	ot->poll = ED_operator_file_active; /* <- important, handler is on window level */ | 
					
						
							| 
									
										
										
										
											2009-03-08 13:14:12 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2009-07-05 22:26:43 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-14 17:55:27 +00:00
										 |  |  | static int file_filenum_exec(bContext *C, wmOperator *op) | 
					
						
							| 
									
										
										
										
											2009-07-05 22:26:43 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	SpaceFile *sfile = CTX_wm_space_file(C); | 
					
						
							|  |  |  | 	ScrArea *sa = CTX_wm_area(C); | 
					
						
							| 
									
										
										
										
											2009-07-05 22:26:43 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	int inc = RNA_int_get(op->ptr, "increment"); | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 	if (sfile->params && (inc != 0)) { | 
					
						
							| 
									
										
										
										
											2009-07-05 22:26:43 +00:00
										 |  |  | 		BLI_newname(sfile->params->file, inc); | 
					
						
							| 
									
										
										
										
											2009-09-12 19:54:39 +00:00
										 |  |  | 		ED_area_tag_redraw(sa); | 
					
						
							| 
									
										
										
										
											2010-09-21 10:59:53 +00:00
										 |  |  | 		file_draw_check_cb(C, NULL, NULL); | 
					
						
							| 
									
										
										
										
											2009-09-12 19:54:39 +00:00
										 |  |  | 		// WM_event_add_notifier(C, NC_WINDOW, NULL);
 | 
					
						
							| 
									
										
										
										
											2009-07-05 22:26:43 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	return OPERATOR_FINISHED; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void FILE_OT_filenum(struct wmOperatorType *ot) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	/* identifiers */ | 
					
						
							| 
									
										
										
										
											2012-03-22 07:26:09 +00:00
										 |  |  | 	ot->name = "Increment Number in Filename"; | 
					
						
							|  |  |  | 	ot->description = "Increment number in filename"; | 
					
						
							|  |  |  | 	ot->idname = "FILE_OT_filenum"; | 
					
						
							| 
									
										
										
										
											2009-07-05 22:26:43 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	/* api callbacks */ | 
					
						
							| 
									
										
										
										
											2012-03-22 07:26:09 +00:00
										 |  |  | 	ot->exec = file_filenum_exec; | 
					
						
							|  |  |  | 	ot->poll = ED_operator_file_active; /* <- important, handler is on window level */ | 
					
						
							| 
									
										
										
										
											2009-07-05 22:26:43 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* props */ | 
					
						
							| 
									
										
										
										
											2012-04-29 15:47:02 +00:00
										 |  |  | 	RNA_def_int(ot->srna, "increment", 1, -100, 100, "Increment", "", -100, 100); | 
					
						
							| 
									
										
										
										
											2009-07-09 19:49:04 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-14 17:55:27 +00:00
										 |  |  | static int file_rename_exec(bContext *C, wmOperator *UNUSED(op)) | 
					
						
							| 
									
										
										
										
											2009-07-26 18:52:27 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	ScrArea *sa = CTX_wm_area(C); | 
					
						
							|  |  |  | 	SpaceFile *sfile = (SpaceFile *)CTX_wm_space_data(C); | 
					
						
							| 
									
										
										
										
											2009-07-26 18:52:27 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 	if (sfile->params) { | 
					
						
							| 
									
										
										
										
											2009-07-26 18:52:27 +00:00
										 |  |  | 		int idx = sfile->params->active_file; | 
					
						
							|  |  |  | 		int numfiles = filelist_numfiles(sfile->files); | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 		if ( (0 <= idx) && (idx < numfiles) ) { | 
					
						
							|  |  |  | 			struct direntry *file = filelist_file(sfile->files, idx); | 
					
						
							| 
									
										
										
										
											2011-03-20 15:15:05 +00:00
										 |  |  | 			filelist_select_file(sfile->files, idx, FILE_SEL_ADD, EDITING_FILE, CHECK_ALL); | 
					
						
							| 
									
										
										
										
											2010-09-22 05:32:39 +00:00
										 |  |  | 			BLI_strncpy(sfile->params->renameedit, file->relname, FILE_MAXFILE); | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 			sfile->params->renamefile[0] = '\0'; | 
					
						
							| 
									
										
										
										
											2009-07-26 18:52:27 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		ED_area_tag_redraw(sa); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	return OPERATOR_FINISHED; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-14 17:55:27 +00:00
										 |  |  | static int file_rename_poll(bContext *C) | 
					
						
							| 
									
										
										
										
											2009-09-12 19:54:39 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	int poll = ED_operator_file_active(C); | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	SpaceFile *sfile = CTX_wm_space_file(C); | 
					
						
							| 
									
										
										
										
											2009-09-12 19:54:39 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (sfile && sfile->params) { | 
					
						
							|  |  |  | 		if (sfile->params->active_file < 0) {  | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 			poll = 0; | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		else { | 
					
						
							| 
									
										
										
										
											2009-09-12 19:54:39 +00:00
										 |  |  | 			char dir[FILE_MAX], group[FILE_MAX];	 | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 			if (filelist_islibrary(sfile->files, dir, group)) poll = 0; | 
					
						
							| 
									
										
										
										
											2009-09-12 19:54:39 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	else | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 		poll = 0; | 
					
						
							| 
									
										
										
										
											2009-09-12 19:54:39 +00:00
										 |  |  | 	return poll; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-26 18:52:27 +00:00
										 |  |  | void FILE_OT_rename(struct wmOperatorType *ot) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	/* identifiers */ | 
					
						
							| 
									
										
										
										
											2012-03-22 07:26:09 +00:00
										 |  |  | 	ot->name = "Rename File or Directory"; | 
					
						
							|  |  |  | 	ot->description = "Rename file or file directory"; | 
					
						
							|  |  |  | 	ot->idname = "FILE_OT_rename"; | 
					
						
							| 
									
										
										
										
											2009-07-26 18:52:27 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	/* api callbacks */ | 
					
						
							| 
									
										
										
										
											2012-03-22 07:26:09 +00:00
										 |  |  | 	ot->exec = file_rename_exec; | 
					
						
							|  |  |  | 	ot->poll = file_rename_poll;  | 
					
						
							| 
									
										
										
										
											2009-07-26 18:52:27 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-14 17:55:27 +00:00
										 |  |  | static int file_delete_poll(bContext *C) | 
					
						
							| 
									
										
										
										
											2009-07-10 17:05:04 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	int poll = ED_operator_file_active(C); | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	SpaceFile *sfile = CTX_wm_space_file(C); | 
					
						
							|  |  |  | 	struct direntry *file; | 
					
						
							| 
									
										
										
										
											2009-07-10 17:05:04 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-29 18:15:46 +00:00
										 |  |  | 	if (sfile && sfile->params) { | 
					
						
							| 
									
										
										
										
											2009-07-20 00:02:03 +00:00
										 |  |  | 		if (sfile->params->active_file < 0) {  | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 			poll = 0; | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		else { | 
					
						
							| 
									
										
										
										
											2009-09-12 19:54:39 +00:00
										 |  |  | 			char dir[FILE_MAX], group[FILE_MAX];	 | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 			if (filelist_islibrary(sfile->files, dir, group)) poll = 0; | 
					
						
							| 
									
										
										
										
											2009-07-20 00:02:03 +00:00
										 |  |  | 			file = filelist_file(sfile->files, sfile->params->active_file); | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 			if (file && S_ISDIR(file->type)) poll = 0; | 
					
						
							| 
									
										
										
										
											2009-07-20 00:02:03 +00:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2009-07-10 17:05:04 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2009-07-20 00:02:03 +00:00
										 |  |  | 	else | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 		poll = 0; | 
					
						
							| 
									
										
										
										
											2009-07-20 00:02:03 +00:00
										 |  |  | 		 | 
					
						
							| 
									
										
										
										
											2009-07-10 17:05:04 +00:00
										 |  |  | 	return poll; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-15 01:36:14 +00:00
										 |  |  | int file_delete_exec(bContext *C, wmOperator *UNUSED(op)) | 
					
						
							| 
									
										
										
										
											2009-07-10 17:05:04 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	char str[FILE_MAX]; | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	SpaceFile *sfile = CTX_wm_space_file(C); | 
					
						
							|  |  |  | 	struct direntry *file; | 
					
						
							| 
									
										
										
										
											2009-07-10 17:05:04 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	file = filelist_file(sfile->files, sfile->params->active_file); | 
					
						
							| 
									
										
										
										
											2010-10-18 06:41:16 +00:00
										 |  |  | 	BLI_make_file_string(G.main->name, str, sfile->params->dir, file->relname); | 
					
						
							| 
									
										
										
										
											2009-07-10 17:05:04 +00:00
										 |  |  | 	BLI_delete(str, 0, 0);	 | 
					
						
							| 
									
										
										
										
											2010-03-10 19:30:20 +00:00
										 |  |  | 	ED_fileselect_clear(C, sfile); | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_LIST, NULL); | 
					
						
							| 
									
										
										
										
											2009-07-10 17:05:04 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	return OPERATOR_FINISHED; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void FILE_OT_delete(struct wmOperatorType *ot) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	/* identifiers */ | 
					
						
							| 
									
										
										
										
											2012-03-22 07:26:09 +00:00
										 |  |  | 	ot->name = "Delete File"; | 
					
						
							|  |  |  | 	ot->description = "Delete selected file"; | 
					
						
							|  |  |  | 	ot->idname = "FILE_OT_delete"; | 
					
						
							| 
									
										
										
										
											2009-07-10 17:05:04 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	/* api callbacks */ | 
					
						
							| 
									
										
										
										
											2012-03-22 07:26:09 +00:00
										 |  |  | 	ot->invoke = WM_operator_confirm; | 
					
						
							|  |  |  | 	ot->exec = file_delete_exec; | 
					
						
							|  |  |  | 	ot->poll = file_delete_poll; /* <- important, handler is on window level */ | 
					
						
							| 
									
										
										
										
											2009-07-10 17:05:04 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-19 03:59:05 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | void ED_operatormacros_file(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-11 17:01:29 +00:00
										 |  |  | //	wmOperatorType *ot;
 | 
					
						
							|  |  |  | //	wmOperatorTypeMacro *otmacro;
 | 
					
						
							| 
									
										
										
										
											2010-01-19 03:59:05 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2011-03-11 17:01:29 +00:00
										 |  |  | 	/* future macros */ | 
					
						
							| 
									
										
										
										
											2010-01-19 03:59:05 +00:00
										 |  |  | } |