| 
									
										
										
										
											2011-02-23 10:52:22 +00:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2008-12-14 12:16:55 +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. | 
					
						
							| 
									
										
										
										
											2008-12-14 12:16:55 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * The Original Code is Copyright (C) 2008 Blender Foundation. | 
					
						
							|  |  |  |  * All rights reserved. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * Contributor(s): Blender Foundation | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * ***** END GPL LICENSE BLOCK ***** | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-27 20:29:51 +00:00
										 |  |  | /** \file blender/editors/space_file/filesel.c
 | 
					
						
							|  |  |  |  *  \ingroup spfile | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-14 12:16:55 +00:00
										 |  |  | #include <string.h>
 | 
					
						
							|  |  |  | #include <stdio.h>
 | 
					
						
							|  |  |  | #include <math.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <sys/stat.h>
 | 
					
						
							|  |  |  | #include <sys/types.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-07 23:34:03 +00:00
										 |  |  | /* path/file handeling stuff */ | 
					
						
							| 
									
										
										
										
											2012-04-15 07:54:07 +00:00
										 |  |  | #ifdef WIN32
 | 
					
						
							|  |  |  | #  include <io.h>
 | 
					
						
							|  |  |  | #  include <direct.h>
 | 
					
						
							|  |  |  | #  include "BLI_winstuff.h"
 | 
					
						
							| 
									
										
										
										
											2010-05-07 23:34:03 +00:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2012-04-15 07:54:07 +00:00
										 |  |  | #  include <unistd.h>
 | 
					
						
							|  |  |  | #  include <sys/times.h>
 | 
					
						
							|  |  |  | #  include <dirent.h>
 | 
					
						
							| 
									
										
										
										
											2010-05-07 23:34:03 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-14 12:16:55 +00:00
										 |  |  | #include "DNA_space_types.h"
 | 
					
						
							|  |  |  | #include "DNA_screen_types.h"
 | 
					
						
							| 
									
										
										
										
											2009-05-14 18:08:14 +00:00
										 |  |  | #include "DNA_userdef_types.h"
 | 
					
						
							| 
									
										
										
										
											2008-12-14 12:16:55 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "MEM_guardedalloc.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "BLI_blenlib.h"
 | 
					
						
							| 
									
										
										
										
											2011-01-07 18:36:47 +00:00
										 |  |  | #include "BLI_utildefines.h"
 | 
					
						
							| 
									
										
										
										
											2013-03-05 03:44:47 +00:00
										 |  |  | #include "BLI_fileops_types.h"
 | 
					
						
							| 
									
										
										
										
											2013-08-27 18:29:30 +00:00
										 |  |  | #include "BLI_fnmatch.h"
 | 
					
						
							| 
									
										
										
										
											2008-12-14 12:16:55 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-23 14:37:13 +01:00
										 |  |  | #include "BKE_appdir.h"
 | 
					
						
							| 
									
										
										
										
											2008-12-18 02:56:48 +00:00
										 |  |  | #include "BKE_context.h"
 | 
					
						
							| 
									
										
										
										
											2009-01-06 14:42:54 +00:00
										 |  |  | #include "BKE_global.h"
 | 
					
						
							| 
									
										
										
										
											2010-10-18 06:41:16 +00:00
										 |  |  | #include "BKE_main.h"
 | 
					
						
							| 
									
										
										
										
											2008-12-14 12:16:55 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-14 18:54:41 +00:00
										 |  |  | #include "BLF_api.h"
 | 
					
						
							| 
									
										
										
										
											2009-05-14 18:08:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-08 13:14:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-06 14:42:54 +00:00
										 |  |  | #include "ED_fileselect.h"
 | 
					
						
							| 
									
										
										
										
											2008-12-14 12:16:55 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "WM_api.h"
 | 
					
						
							|  |  |  | #include "WM_types.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-27 19:06:33 +00:00
										 |  |  | #include "RNA_access.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-14 12:16:55 +00:00
										 |  |  | #include "UI_interface.h"
 | 
					
						
							| 
									
										
										
										
											2010-11-14 10:48:36 +00:00
										 |  |  | #include "UI_interface_icons.h"
 | 
					
						
							| 
									
										
										
										
											2008-12-14 12:16:55 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "file_intern.h"
 | 
					
						
							| 
									
										
										
										
											2009-01-06 14:42:54 +00:00
										 |  |  | #include "filelist.h"
 | 
					
						
							| 
									
										
										
										
											2008-12-14 12:16:55 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | FileSelectParams *ED_fileselect_get_params(struct SpaceFile *sfile) | 
					
						
							| 
									
										
										
										
											2009-01-08 18:47:16 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	if (!sfile->params) { | 
					
						
							| 
									
										
										
										
											2009-07-27 19:06:33 +00:00
										 |  |  | 		ED_fileselect_set_params(sfile); | 
					
						
							| 
									
										
										
										
											2009-01-08 18:47:16 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	return sfile->params; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-24 04:29:35 +00:00
										 |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2013-02-06 14:02:19 +00:00
										 |  |  |  * \note RNA_struct_property_is_set_ex is used here because we want | 
					
						
							| 
									
										
										
										
											2012-10-24 04:29:35 +00:00
										 |  |  |  *       the previously used settings to be used here rather then overriding them */ | 
					
						
							| 
									
										
										
										
											2009-07-27 19:06:33 +00:00
										 |  |  | short ED_fileselect_set_params(SpaceFile *sfile) | 
					
						
							| 
									
										
										
										
											2009-01-06 14:42:54 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-01-08 18:47:16 +00:00
										 |  |  | 	FileSelectParams *params; | 
					
						
							| 
									
										
										
										
											2009-07-27 19:06:33 +00:00
										 |  |  | 	wmOperator *op = sfile->op; | 
					
						
							| 
									
										
										
										
											2009-01-06 14:42:54 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-27 19:06:33 +00:00
										 |  |  | 	/* create new parameters if necessary */ | 
					
						
							| 
									
										
										
										
											2009-01-08 18:47:16 +00:00
										 |  |  | 	if (!sfile->params) { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 		sfile->params = MEM_callocN(sizeof(FileSelectParams), "fileselparams"); | 
					
						
							| 
									
										
										
										
											2009-07-27 19:06:33 +00:00
										 |  |  | 		/* set path to most recently opened .blend */ | 
					
						
							| 
									
										
										
										
											2011-10-15 03:56:05 +00:00
										 |  |  | 		BLI_split_dirfile(G.main->name, sfile->params->dir, sfile->params->file, sizeof(sfile->params->dir), sizeof(sfile->params->file)); | 
					
						
							| 
									
										
										
										
											2010-09-24 07:05:43 +00:00
										 |  |  | 		sfile->params->filter_glob[0] = '\0'; | 
					
						
							| 
									
										
										
										
											2009-01-06 14:42:54 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-08 18:47:16 +00:00
										 |  |  | 	params = sfile->params; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-27 19:06:33 +00:00
										 |  |  | 	/* set the parameters from the operator, if it exists */ | 
					
						
							|  |  |  | 	if (op) { | 
					
						
							| 
									
										
										
										
											2013-08-26 06:54:05 +00:00
										 |  |  | 		PropertyRNA *prop; | 
					
						
							| 
									
										
										
										
											2014-01-28 03:52:21 +11:00
										 |  |  | 		const bool is_files = (RNA_struct_find_property(op->ptr, "files") != NULL); | 
					
						
							|  |  |  | 		const bool is_filepath = (RNA_struct_find_property(op->ptr, "filepath") != NULL); | 
					
						
							|  |  |  | 		const bool is_filename = (RNA_struct_find_property(op->ptr, "filename") != NULL); | 
					
						
							|  |  |  | 		const bool is_directory = (RNA_struct_find_property(op->ptr, "directory") != NULL); | 
					
						
							|  |  |  | 		const bool is_relative_path = (RNA_struct_find_property(op->ptr, "relative_path") != NULL); | 
					
						
							| 
									
										
										
										
											2011-06-24 03:30:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-07 14:58:40 +00:00
										 |  |  | 		BLI_strncpy_utf8(params->title, RNA_struct_ui_name(op->type->srna), sizeof(params->title)); | 
					
						
							| 
									
										
										
										
											2009-09-12 19:54:39 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-17 13:09:21 +11:00
										 |  |  | 		if ((prop = RNA_struct_find_property(op->ptr, "filemode"))) { | 
					
						
							|  |  |  | 			params->type = RNA_property_int_get(op->ptr, prop); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		else { | 
					
						
							| 
									
										
											  
											
												Key Configuration
Keymaps are now saveable and configurable from the user preferences, note
that editing one item in a keymap means the whole keymap is now defined by
the user and will not be updated by Blender, an option for syncing might be
added later. The outliner interface is still there, but I will probably
remove it.
There's actually 3 levels now:
* Default builtin key configuration.
* Key configuration loaded from .py file, for configs like Blender 2.4x
  or other 3D applications.
* Keymaps edited by the user and saved in .B.blend. These can be saved
  to .py files as well to make creating distributable configurations
  easier.
Also, user preferences sections were reorganized a bit, now there is:
Interface, Editing, Input, Files and System.
Implementation notes:
* wmKeyConfig was added which represents a key configuration containing
  keymaps.
* wmKeymapItem was renamed to wmKeyMapItem for consistency with wmKeyMap.
* Modal maps are not wrapped yet.
* User preferences DNA file reading did not support newdataadr() yet,
  added this now for reading keymaps.
* Key configuration related settings are now RNA wrapped.
* is_property_set and is_property_hidden python methods were added.
											
										 
											2009-10-08 18:40:03 +00:00
										 |  |  | 			params->type = FILE_SPECIAL; | 
					
						
							| 
									
										
										
										
											2015-02-17 13:09:21 +11:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2009-09-12 19:54:39 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-01 11:34:00 +11:00
										 |  |  | 		if (is_filepath && RNA_struct_property_is_set_ex(op->ptr, "filepath", false)) { | 
					
						
							| 
									
										
										
										
											2010-07-02 17:44:57 +00:00
										 |  |  | 			char name[FILE_MAX]; | 
					
						
							| 
									
										
										
										
											2010-06-14 03:52:10 +00:00
										 |  |  | 			RNA_string_get(op->ptr, "filepath", name); | 
					
						
							| 
									
										
										
										
											2009-09-12 19:54:39 +00:00
										 |  |  | 			if (params->type == FILE_LOADLIB) { | 
					
						
							|  |  |  | 				BLI_strncpy(params->dir, name, sizeof(params->dir)); | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 				sfile->params->file[0] = '\0'; | 
					
						
							| 
									
										
										
										
											2009-09-12 19:54:39 +00:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2010-07-02 17:44:57 +00:00
										 |  |  | 			else { | 
					
						
							| 
									
										
										
										
											2011-10-15 03:56:05 +00:00
										 |  |  | 				BLI_split_dirfile(name, sfile->params->dir, sfile->params->file, sizeof(sfile->params->dir), sizeof(sfile->params->file)); | 
					
						
							| 
									
										
										
										
											2010-07-02 17:44:57 +00:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		else { | 
					
						
							| 
									
										
										
										
											2014-04-01 11:34:00 +11:00
										 |  |  | 			if (is_directory && RNA_struct_property_is_set_ex(op->ptr, "directory", false)) { | 
					
						
							| 
									
										
										
										
											2010-07-02 17:44:57 +00:00
										 |  |  | 				RNA_string_get(op->ptr, "directory", params->dir); | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 				sfile->params->file[0] = '\0'; | 
					
						
							| 
									
										
										
										
											2010-07-02 17:44:57 +00:00
										 |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-01 11:34:00 +11:00
										 |  |  | 			if (is_filename && RNA_struct_property_is_set_ex(op->ptr, "filename", false)) { | 
					
						
							| 
									
										
										
										
											2010-07-02 17:44:57 +00:00
										 |  |  | 				RNA_string_get(op->ptr, "filename", params->file); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 		if (params->dir[0]) { | 
					
						
							| 
									
										
										
										
											2010-10-18 06:41:16 +00:00
										 |  |  | 			BLI_cleanup_dir(G.main->name, params->dir); | 
					
						
							|  |  |  | 			BLI_path_abs(params->dir, G.main->name); | 
					
						
							| 
									
										
										
										
											2009-09-12 19:54:39 +00:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2010-07-02 17:44:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-01 11:34:00 +11:00
										 |  |  | 		if (is_directory == true && is_filename == false && is_filepath == false && is_files == false) { | 
					
						
							| 
									
										
										
										
											2011-06-24 03:30:50 +00:00
										 |  |  | 			params->flag |= FILE_DIRSEL_ONLY; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		else { | 
					
						
							|  |  |  | 			params->flag &= ~FILE_DIRSEL_ONLY; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-27 19:06:33 +00:00
										 |  |  | 		params->filter = 0; | 
					
						
							| 
									
										
										
										
											2013-08-26 06:54:05 +00:00
										 |  |  | 		if ((prop = RNA_struct_find_property(op->ptr, "filter_blender"))) | 
					
						
							| 
									
										
										
										
											2015-01-04 12:03:47 +01:00
										 |  |  | 			params->filter |= RNA_property_boolean_get(op->ptr, prop) ? FILE_TYPE_BLENDER : 0; | 
					
						
							| 
									
										
										
										
											2013-08-26 06:54:05 +00:00
										 |  |  | 		if ((prop = RNA_struct_find_property(op->ptr, "filter_backup"))) | 
					
						
							| 
									
										
										
										
											2015-01-04 12:03:47 +01:00
										 |  |  | 			params->filter |= RNA_property_boolean_get(op->ptr, prop) ? FILE_TYPE_BLENDER_BACKUP : 0; | 
					
						
							| 
									
										
										
										
											2013-08-26 06:54:05 +00:00
										 |  |  | 		if ((prop = RNA_struct_find_property(op->ptr, "filter_image"))) | 
					
						
							| 
									
										
										
										
											2015-01-04 12:03:47 +01:00
										 |  |  | 			params->filter |= RNA_property_boolean_get(op->ptr, prop) ? FILE_TYPE_IMAGE : 0; | 
					
						
							| 
									
										
										
										
											2013-08-26 06:54:05 +00:00
										 |  |  | 		if ((prop = RNA_struct_find_property(op->ptr, "filter_movie"))) | 
					
						
							| 
									
										
										
										
											2015-01-04 12:03:47 +01:00
										 |  |  | 			params->filter |= RNA_property_boolean_get(op->ptr, prop) ? FILE_TYPE_MOVIE : 0; | 
					
						
							| 
									
										
										
										
											2013-08-26 06:54:05 +00:00
										 |  |  | 		if ((prop = RNA_struct_find_property(op->ptr, "filter_python"))) | 
					
						
							| 
									
										
										
										
											2015-01-04 12:03:47 +01:00
										 |  |  | 			params->filter |= RNA_property_boolean_get(op->ptr, prop) ? FILE_TYPE_PYSCRIPT : 0; | 
					
						
							| 
									
										
										
										
											2013-08-26 06:54:05 +00:00
										 |  |  | 		if ((prop = RNA_struct_find_property(op->ptr, "filter_font"))) | 
					
						
							| 
									
										
										
										
											2015-01-04 12:03:47 +01:00
										 |  |  | 			params->filter |= RNA_property_boolean_get(op->ptr, prop) ? FILE_TYPE_FTFONT : 0; | 
					
						
							| 
									
										
										
										
											2013-08-26 06:54:05 +00:00
										 |  |  | 		if ((prop = RNA_struct_find_property(op->ptr, "filter_sound"))) | 
					
						
							| 
									
										
										
										
											2015-01-04 12:03:47 +01:00
										 |  |  | 			params->filter |= RNA_property_boolean_get(op->ptr, prop) ? FILE_TYPE_SOUND : 0; | 
					
						
							| 
									
										
										
										
											2013-08-26 06:54:05 +00:00
										 |  |  | 		if ((prop = RNA_struct_find_property(op->ptr, "filter_text"))) | 
					
						
							| 
									
										
										
										
											2015-01-04 12:03:47 +01:00
										 |  |  | 			params->filter |= RNA_property_boolean_get(op->ptr, prop) ? FILE_TYPE_TEXT : 0; | 
					
						
							| 
									
										
										
										
											2013-08-26 06:54:05 +00:00
										 |  |  | 		if ((prop = RNA_struct_find_property(op->ptr, "filter_folder"))) | 
					
						
							| 
									
										
										
										
											2015-01-04 12:03:47 +01:00
										 |  |  | 			params->filter |= RNA_property_boolean_get(op->ptr, prop) ? FILE_TYPE_FOLDER : 0; | 
					
						
							| 
									
										
										
										
											2013-08-26 06:54:05 +00:00
										 |  |  | 		if ((prop = RNA_struct_find_property(op->ptr, "filter_btx"))) | 
					
						
							| 
									
										
										
										
											2015-01-04 12:03:47 +01:00
										 |  |  | 			params->filter |= RNA_property_boolean_get(op->ptr, prop) ? FILE_TYPE_BTX : 0; | 
					
						
							| 
									
										
										
										
											2013-08-26 06:54:05 +00:00
										 |  |  | 		if ((prop = RNA_struct_find_property(op->ptr, "filter_collada"))) | 
					
						
							| 
									
										
										
										
											2015-01-04 12:03:47 +01:00
										 |  |  | 			params->filter |= RNA_property_boolean_get(op->ptr, prop) ? FILE_TYPE_COLLADA : 0; | 
					
						
							| 
									
										
										
										
											2013-08-26 06:54:05 +00:00
										 |  |  | 		if ((prop = RNA_struct_find_property(op->ptr, "filter_glob"))) { | 
					
						
							|  |  |  | 			RNA_property_string_get(op->ptr, prop, params->filter_glob); | 
					
						
							| 
									
										
										
										
											2015-01-04 12:03:47 +01:00
										 |  |  | 			params->filter |= (FILE_TYPE_OPERATOR | FILE_TYPE_FOLDER); | 
					
						
							| 
									
										
										
										
											2010-09-24 07:05:43 +00:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2010-09-25 08:29:25 +00:00
										 |  |  | 		else { | 
					
						
							|  |  |  | 			params->filter_glob[0] = '\0'; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2010-09-24 07:05:43 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-15 20:37:47 +00:00
										 |  |  | 		if (params->filter != 0) { | 
					
						
							|  |  |  | 			if (U.uiflag & USER_FILTERFILEEXTS) { | 
					
						
							|  |  |  | 				params->flag |= FILE_FILTER; | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 			} | 
					
						
							|  |  |  | 			else { | 
					
						
							| 
									
										
										
										
											2010-04-15 20:37:47 +00:00
										 |  |  | 				params->flag &= ~FILE_FILTER; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2009-07-28 16:46:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-22 20:24:36 +00:00
										 |  |  | 		if (U.uiflag & USER_HIDE_DOT) { | 
					
						
							|  |  |  | 			params->flag |= FILE_HIDE_DOT; | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		else { | 
					
						
							| 
									
										
										
										
											2009-11-22 20:24:36 +00:00
										 |  |  | 			params->flag &= ~FILE_HIDE_DOT; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		 | 
					
						
							| 
									
										
										
										
											2009-09-13 09:41:00 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-12 19:54:39 +00:00
										 |  |  | 		if (params->type == FILE_LOADLIB) { | 
					
						
							|  |  |  | 			params->flag |= RNA_boolean_get(op->ptr, "link") ? FILE_LINK : 0; | 
					
						
							|  |  |  | 			params->flag |= RNA_boolean_get(op->ptr, "autoselect") ? FILE_AUTOSELECT : 0; | 
					
						
							|  |  |  | 			params->flag |= RNA_boolean_get(op->ptr, "active_layer") ? FILE_ACTIVELAY : 0; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2012-01-24 18:18:51 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-17 13:09:21 +11:00
										 |  |  | 		if ((prop = RNA_struct_find_property(op->ptr, "display_type"))) { | 
					
						
							|  |  |  | 			params->display = RNA_property_enum_get(op->ptr, prop); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2012-01-24 18:18:51 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 		if (params->display == FILE_DEFAULTDISPLAY) { | 
					
						
							| 
									
										
										
										
											2012-01-24 18:18:51 +00:00
										 |  |  | 			if (U.uiflag & USER_SHOW_THUMBNAILS) { | 
					
						
							| 
									
										
										
										
											2015-01-04 12:03:47 +01:00
										 |  |  | 				if (params->filter & (FILE_TYPE_IMAGE | FILE_TYPE_MOVIE)) | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 					params->display = FILE_IMGDISPLAY; | 
					
						
							| 
									
										
										
										
											2012-01-24 18:18:51 +00:00
										 |  |  | 				else | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 					params->display = FILE_SHORTDISPLAY; | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 			} | 
					
						
							|  |  |  | 			else { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 				params->display = FILE_SHORTDISPLAY; | 
					
						
							| 
									
										
										
										
											2012-01-24 18:18:51 +00:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2010-11-06 18:54:15 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-12 00:15:19 +00:00
										 |  |  | 		if (is_relative_path) { | 
					
						
							| 
									
										
										
										
											2015-02-17 13:09:21 +11:00
										 |  |  | 			if ((prop = RNA_struct_find_property(op->ptr, "relative_path"))) { | 
					
						
							|  |  |  | 				if (!RNA_property_is_set_ex(op->ptr, prop, false)) { | 
					
						
							| 
									
										
										
										
											2015-02-19 12:33:14 +11:00
										 |  |  | 					RNA_property_boolean_set(op->ptr, prop, (U.flag & USER_RELPATHS) != 0); | 
					
						
							| 
									
										
										
										
											2015-02-17 13:09:21 +11:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2011-10-12 00:15:19 +00:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2011-06-24 03:30:50 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	else { | 
					
						
							| 
									
										
										
										
											2009-07-27 19:06:33 +00:00
										 |  |  | 		/* default values, if no operator */ | 
					
						
							| 
									
										
										
										
											2009-09-15 20:47:34 +00:00
										 |  |  | 		params->type = FILE_UNIX; | 
					
						
							| 
									
										
										
										
											2009-07-28 16:46:14 +00:00
										 |  |  | 		params->flag |= FILE_HIDE_DOT; | 
					
						
							| 
									
										
										
										
											2011-06-24 03:30:50 +00:00
										 |  |  | 		params->flag &= ~FILE_DIRSEL_ONLY; | 
					
						
							| 
									
										
										
										
											2009-07-27 19:06:33 +00:00
										 |  |  | 		params->display = FILE_SHORTDISPLAY; | 
					
						
							|  |  |  | 		params->filter = 0; | 
					
						
							| 
									
										
										
										
											2010-09-25 08:29:25 +00:00
										 |  |  | 		params->filter_glob[0] = '\0'; | 
					
						
							| 
									
										
										
										
											2009-07-07 07:25:44 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2010-08-09 22:54:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-07 00:46:53 +00:00
										 |  |  | 	/* operator has no setting for this */ | 
					
						
							|  |  |  | 	params->sort = FILE_SORT_ALPHA; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-09 22:54:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* initialize the list with previous folders */ | 
					
						
							|  |  |  | 	if (!sfile->folders_prev) | 
					
						
							|  |  |  | 		sfile->folders_prev = folderlist_new(); | 
					
						
							| 
									
										
										
										
											2013-06-06 23:58:30 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (!sfile->params->dir[0]) { | 
					
						
							|  |  |  | 		if (G.main->name[0]) { | 
					
						
							|  |  |  | 			BLI_split_dir_part(G.main->name, sfile->params->dir, sizeof(sfile->params->dir)); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		else { | 
					
						
							| 
									
										
										
										
											2014-11-23 15:54:29 +01:00
										 |  |  | 			const char *doc_path = BKE_appdir_folder_default(); | 
					
						
							| 
									
										
										
										
											2013-06-06 23:58:30 +00:00
										 |  |  | 			if (doc_path) { | 
					
						
							|  |  |  | 				BLI_strncpy(sfile->params->dir, doc_path, sizeof(sfile->params->dir)); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-09 22:54:40 +00:00
										 |  |  | 	folderlist_pushdir(sfile->folders_prev, sfile->params->dir); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-05 07:57:33 +00:00
										 |  |  | 	/* switching thumbnails needs to recalc layout [#28809] */ | 
					
						
							|  |  |  | 	if (sfile->layout) { | 
					
						
							| 
									
										
										
										
											2014-04-01 11:34:00 +11:00
										 |  |  | 		sfile->layout->dirty = true; | 
					
						
							| 
									
										
										
										
											2011-10-05 07:57:33 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-06 14:42:54 +00:00
										 |  |  | 	return 1; | 
					
						
							| 
									
										
										
										
											2008-12-14 12:16:55 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-08 18:47:16 +00:00
										 |  |  | void ED_fileselect_reset_params(SpaceFile *sfile) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-09-13 08:08:50 +00:00
										 |  |  | 	sfile->params->type = FILE_UNIX; | 
					
						
							| 
									
										
										
										
											2009-01-08 18:47:16 +00:00
										 |  |  | 	sfile->params->flag = 0; | 
					
						
							|  |  |  | 	sfile->params->title[0] = '\0'; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2009-03-08 13:14:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-26 22:47:05 +00:00
										 |  |  | int ED_fileselect_layout_numfiles(FileLayout *layout, ARegion *ar) | 
					
						
							| 
									
										
										
										
											2009-07-26 12:40:44 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	int numfiles; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-03 16:00:44 +10:00
										 |  |  | 	/* Values in pixels.
 | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 * - *_item: size of each (row|col), (including padding) | 
					
						
							|  |  |  | 	 * - *_view: (x|y) size of the view. | 
					
						
							|  |  |  | 	 * - *_over: extra pixels, to take into account, when the fit isnt exact | 
					
						
							|  |  |  | 	 *   (needed since you may see the end of the previous column and the beginning of the next). | 
					
						
							|  |  |  | 	 * | 
					
						
							| 
									
										
										
										
											2014-09-05 10:16:11 +10:00
										 |  |  | 	 * Could be more clever and take scrolling into account, | 
					
						
							| 
									
										
										
										
											2014-09-03 16:00:44 +10:00
										 |  |  | 	 * but for now don't bother. | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2009-07-26 12:40:44 +00:00
										 |  |  | 	if (layout->flag & FILE_LAYOUT_HOR) { | 
					
						
							| 
									
										
										
										
											2014-09-03 16:00:44 +10:00
										 |  |  | 		const int x_item = layout->tile_w + (2 * layout->tile_border_x); | 
					
						
							|  |  |  | 		const int x_view = (int)(BLI_rctf_size_x(&ar->v2d.cur)); | 
					
						
							|  |  |  | 		const int x_over = x_item - (x_view % x_item); | 
					
						
							|  |  |  | 		numfiles = (int)((float)(x_view + x_over) / (float)(x_item)); | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 		return numfiles * layout->rows; | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	else { | 
					
						
							| 
									
										
										
										
											2014-09-03 16:00:44 +10:00
										 |  |  | 		const int y_item = layout->tile_h + (2 * layout->tile_border_y); | 
					
						
							|  |  |  | 		const int y_view = (int)(BLI_rctf_size_y(&ar->v2d.cur)); | 
					
						
							|  |  |  | 		const int y_over = y_item - (y_view % y_item); | 
					
						
							|  |  |  | 		numfiles = (int)((float)(y_view + y_over) / (float)(y_item)); | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 		return numfiles * layout->columns; | 
					
						
							| 
									
										
										
										
											2009-07-26 12:40:44 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2009-03-08 13:14:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-28 03:52:21 +11:00
										 |  |  | static bool is_inside(int x, int y, int cols, int rows) | 
					
						
							| 
									
										
										
										
											2011-03-14 19:56:13 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2014-01-28 03:52:21 +11:00
										 |  |  | 	return ((x >= 0) && (x < cols) && (y >= 0) && (y < rows)); | 
					
						
							| 
									
										
										
										
											2011-03-14 19:56:13 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | FileSelection ED_fileselect_layout_offset_rect(FileLayout *layout, const rcti *rect) | 
					
						
							| 
									
										
										
										
											2011-03-14 19:56:13 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	int colmin, colmax, rowmin, rowmax; | 
					
						
							|  |  |  | 	FileSelection sel; | 
					
						
							|  |  |  | 	sel.first = sel.last = -1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (layout == NULL) | 
					
						
							|  |  |  | 		return sel; | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	colmin = (rect->xmin) / (layout->tile_w + 2 * layout->tile_border_x); | 
					
						
							|  |  |  | 	rowmin = (rect->ymin) / (layout->tile_h + 2 * layout->tile_border_y); | 
					
						
							|  |  |  | 	colmax = (rect->xmax) / (layout->tile_w + 2 * layout->tile_border_x); | 
					
						
							|  |  |  | 	rowmax = (rect->ymax) / (layout->tile_h + 2 * layout->tile_border_y); | 
					
						
							| 
									
										
										
										
											2011-03-14 19:56:13 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2012-05-20 19:49:27 +00:00
										 |  |  | 	if (is_inside(colmin, rowmin, layout->columns, layout->rows) || | 
					
						
							|  |  |  | 	    is_inside(colmax, rowmax, layout->columns, layout->rows) ) | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 		CLAMP(colmin, 0, layout->columns - 1); | 
					
						
							|  |  |  | 		CLAMP(rowmin, 0, layout->rows - 1); | 
					
						
							|  |  |  | 		CLAMP(colmax, 0, layout->columns - 1); | 
					
						
							|  |  |  | 		CLAMP(rowmax, 0, layout->rows - 1); | 
					
						
							| 
									
										
										
										
											2012-10-21 05:46:41 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2011-03-14 19:56:13 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	if ((colmin > layout->columns - 1) || (rowmin > layout->rows - 1)) { | 
					
						
							| 
									
										
										
										
											2011-03-14 19:56:13 +00:00
										 |  |  | 		sel.first = -1; | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	else { | 
					
						
							| 
									
										
										
										
											2011-03-14 19:56:13 +00:00
										 |  |  | 		if (layout->flag & FILE_LAYOUT_HOR)  | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 			sel.first = layout->rows * colmin + rowmin; | 
					
						
							| 
									
										
										
										
											2011-03-14 19:56:13 +00:00
										 |  |  | 		else | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 			sel.first = colmin + layout->columns * rowmin; | 
					
						
							| 
									
										
										
										
											2011-03-14 19:56:13 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	if ((colmax > layout->columns - 1) || (rowmax > layout->rows - 1)) { | 
					
						
							| 
									
										
										
										
											2011-03-14 19:56:13 +00:00
										 |  |  | 		sel.last = -1; | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	else { | 
					
						
							| 
									
										
										
										
											2011-03-14 19:56:13 +00:00
										 |  |  | 		if (layout->flag & FILE_LAYOUT_HOR)  | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 			sel.last = layout->rows * colmax + rowmax; | 
					
						
							| 
									
										
										
										
											2011-03-14 19:56:13 +00:00
										 |  |  | 		else | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 			sel.last = colmax + layout->columns * rowmax; | 
					
						
							| 
									
										
										
										
											2011-03-14 19:56:13 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return sel; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | int ED_fileselect_layout_offset(FileLayout *layout, int x, int y) | 
					
						
							| 
									
										
										
										
											2009-03-08 13:14:12 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	int offsetx, offsety; | 
					
						
							|  |  |  | 	int active_file; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-31 04:52:20 +00:00
										 |  |  | 	if (layout == NULL) | 
					
						
							| 
									
										
										
										
											2011-03-14 19:56:13 +00:00
										 |  |  | 		return -1; | 
					
						
							| 
									
										
										
										
											2009-05-31 04:52:20 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	offsetx = (x) / (layout->tile_w + 2 * layout->tile_border_x); | 
					
						
							|  |  |  | 	offsety = (y) / (layout->tile_h + 2 * layout->tile_border_y); | 
					
						
							| 
									
										
										
										
											2009-03-08 13:14:12 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2012-02-27 10:35:39 +00:00
										 |  |  | 	if (offsetx > layout->columns - 1) return -1; | 
					
						
							|  |  |  | 	if (offsety > layout->rows - 1) return -1; | 
					
						
							| 
									
										
										
										
											2010-03-18 04:09:59 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2009-03-08 13:14:12 +00:00
										 |  |  | 	if (layout->flag & FILE_LAYOUT_HOR)  | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 		active_file = layout->rows * offsetx + offsety; | 
					
						
							| 
									
										
										
										
											2009-03-08 13:14:12 +00:00
										 |  |  | 	else | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 		active_file = offsetx + layout->columns * offsety; | 
					
						
							| 
									
										
										
										
											2009-03-08 13:14:12 +00:00
										 |  |  | 	return active_file; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | void ED_fileselect_layout_tilepos(FileLayout *layout, int tile, int *x, int *y) | 
					
						
							| 
									
										
										
										
											2009-03-08 13:14:12 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	if (layout->flag == FILE_LAYOUT_HOR) { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 		*x = layout->tile_border_x + (tile / layout->rows) * (layout->tile_w + 2 * layout->tile_border_x); | 
					
						
							|  |  |  | 		*y = layout->tile_border_y + (tile % layout->rows) * (layout->tile_h + 2 * layout->tile_border_y); | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	else { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 		*x = layout->tile_border_x + ((tile) % layout->columns) * (layout->tile_w + 2 * layout->tile_border_x); | 
					
						
							|  |  |  | 		*y = layout->tile_border_y + ((tile) / layout->columns) * (layout->tile_h + 2 * layout->tile_border_y); | 
					
						
							| 
									
										
										
										
											2009-03-08 13:14:12 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-06 17:03:11 +00:00
										 |  |  | /* Shorten a string to a given width w. 
 | 
					
						
							| 
									
										
										
										
											2012-03-03 16:31:46 +00:00
										 |  |  |  * If front is set, shorten from the front, | 
					
						
							|  |  |  |  * otherwise shorten from the end. */ | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | float file_shorten_string(char *string, float w, int front) | 
					
						
							| 
									
										
										
										
											2010-11-06 17:03:11 +00:00
										 |  |  | {	 | 
					
						
							|  |  |  | 	char temp[FILE_MAX]; | 
					
						
							|  |  |  | 	short shortened = 0; | 
					
						
							|  |  |  | 	float sw = 0; | 
					
						
							|  |  |  | 	float pad = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (w <= 0) { | 
					
						
							|  |  |  | 		*string = '\0'; | 
					
						
							|  |  |  | 		return 0.0; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	sw = file_string_width(string); | 
					
						
							|  |  |  | 	if (front == 1) { | 
					
						
							| 
									
										
										
										
											2014-04-27 00:22:49 +10:00
										 |  |  | 		const char *s = string; | 
					
						
							| 
									
										
										
										
											2010-11-06 17:03:11 +00:00
										 |  |  | 		BLI_strncpy(temp, "...", 4); | 
					
						
							|  |  |  | 		pad = file_string_width(temp); | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 		while ((*s) && (sw + pad > w)) { | 
					
						
							| 
									
										
										
										
											2010-11-06 17:03:11 +00:00
										 |  |  | 			s++; | 
					
						
							|  |  |  | 			sw = file_string_width(s); | 
					
						
							|  |  |  | 			shortened = 1; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if (shortened) { | 
					
						
							| 
									
										
										
										
											2011-09-19 12:26:20 +00:00
										 |  |  | 			int slen = strlen(s); | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 			BLI_strncpy(temp + 3, s, slen + 1); | 
					
						
							|  |  |  | 			temp[slen + 4] = '\0'; | 
					
						
							|  |  |  | 			BLI_strncpy(string, temp, slen + 4); | 
					
						
							| 
									
										
										
										
											2010-11-06 17:03:11 +00:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	else { | 
					
						
							| 
									
										
										
										
											2014-04-27 00:22:49 +10:00
										 |  |  | 		const char *s = string; | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 		while (sw > w) { | 
					
						
							| 
									
										
										
										
											2010-11-06 17:03:11 +00:00
										 |  |  | 			int slen = strlen(string); | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 			string[slen - 1] = '\0'; | 
					
						
							| 
									
										
										
										
											2010-11-06 17:03:11 +00:00
										 |  |  | 			sw = file_string_width(s); | 
					
						
							|  |  |  | 			shortened = 1; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (shortened) { | 
					
						
							|  |  |  | 			int slen = strlen(string); | 
					
						
							|  |  |  | 			if (slen > 3) { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 				BLI_strncpy(string + slen - 3, "...", 4); | 
					
						
							| 
									
										
										
										
											2010-11-06 17:03:11 +00:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	return sw; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | float file_string_width(const char *str) | 
					
						
							| 
									
										
										
										
											2009-05-14 18:08:14 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2014-11-09 21:20:40 +01:00
										 |  |  | 	uiStyle *style = UI_style_get(); | 
					
						
							|  |  |  | 	UI_fontstyle_set(&style->widget); | 
					
						
							| 
									
										
										
										
											2013-12-02 20:33:45 +11:00
										 |  |  | 	return BLF_width(style->widget.uifont_id, str, BLF_DRAW_STR_DUMMY_MAX); | 
					
						
							| 
									
										
										
										
											2009-05-14 18:08:14 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-13 15:02:21 +00:00
										 |  |  | float file_font_pointsize(void) | 
					
						
							| 
									
										
										
										
											2009-05-14 18:08:14 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-01-13 04:53:55 +00:00
										 |  |  | #if 0
 | 
					
						
							| 
									
										
										
										
											2009-05-14 18:08:14 +00:00
										 |  |  | 	float s; | 
					
						
							|  |  |  | 	char tmp[2] = "X"; | 
					
						
							| 
									
										
										
										
											2014-11-09 21:20:40 +01:00
										 |  |  | 	uiStyle *style = UI_style_get(); | 
					
						
							|  |  |  | 	UI_fontstyle_set(&style->widget); | 
					
						
							| 
									
										
											  
											
												BugFix:
[#20854] PROPERTIES STAMP: Rendering stamp flickers in output renders
Blenfont was not thread safe, that is why one thread can change
the font properties (size, dpi, color, etc) at the same time
that the stamp draw on the image, and then the problem.
To make blenfont thread safe I have to change two important things:
1) Every BLF_* function take one argument, the font id.
2) We have two new function to make font "thread safe":
	BLF_load_unique
	BLF_load_mem_unique
This two function are for case like stamp, that need and own font
that don't share the glyph cache, so can draw without problem
in a different thread.
Why the BLF_*_unique function ?
Because blenfont keep only one copy of a font and keep a list of
"glyph cache". Every glyph cache have size and dpi, so if two
different thread access the same font at the same time, they can
change value and finish with something like the stamp problem.
Why don't remove the glyph cache ?
Because if we do that, we finish with a font object for every size
and dpi, and the stamp is really a special case that happen in
the rendering process, so I really thing is better keep the
glyph cache and make this two new function to handle this
special case.
(When I say "font object" I mean have the same freetype font multiple
times just to have differents size and dpi)
As Matt point we still can have one case that two thread access
the BLF_*_unique function at the same time, but I am looking to
fix this with some class of thread lock.
For now I test and work fine, so if some one found problem, please
let me know.
Campbell I have to change the python api (python/generic/blf_api.c)
to the new syntax, so maybe you can take a look at this.
											
										 
											2010-04-22 10:56:45 +00:00
										 |  |  | 	s = BLF_height(style->widget.uifont_id, tmp); | 
					
						
							| 
									
										
										
										
											2009-05-14 18:08:14 +00:00
										 |  |  | 	return style->widget.points; | 
					
						
							| 
									
										
										
										
											2011-06-07 15:33:01 +00:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2014-11-09 21:20:40 +01:00
										 |  |  | 	uiStyle *style = UI_style_get(); | 
					
						
							|  |  |  | 	UI_fontstyle_set(&style->widget); | 
					
						
							| 
									
										
										
										
											2011-06-07 15:33:01 +00:00
										 |  |  | 	return style->widget.points * UI_DPI_FAC; | 
					
						
							| 
									
										
										
										
											2011-01-13 04:53:55 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2009-05-14 18:08:14 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | static void column_widths(struct FileList *files, struct FileLayout *layout) | 
					
						
							| 
									
										
										
										
											2009-05-14 18:08:14 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	int i; | 
					
						
							|  |  |  | 	int numfiles = filelist_numfiles(files); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	for (i = 0; i < MAX_FILE_COLUMN; ++i) { | 
					
						
							| 
									
										
										
										
											2009-05-14 18:08:14 +00:00
										 |  |  | 		layout->column_widths[i] = 0; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	for (i = 0; (i < numfiles); ++i) { | 
					
						
							|  |  |  | 		struct direntry *file = filelist_file(files, i); | 
					
						
							| 
									
										
										
										
											2009-05-14 18:08:14 +00:00
										 |  |  | 		if (file) { | 
					
						
							| 
									
										
										
										
											2011-04-10 09:37:04 +00:00
										 |  |  | 			float len; | 
					
						
							| 
									
										
										
										
											2009-05-14 18:08:14 +00:00
										 |  |  | 			len = file_string_width(file->relname); | 
					
						
							| 
									
										
										
										
											2010-11-14 10:48:36 +00:00
										 |  |  | 			if (len > layout->column_widths[COLUMN_NAME]) layout->column_widths[COLUMN_NAME] = len; | 
					
						
							| 
									
										
										
										
											2009-05-14 18:08:14 +00:00
										 |  |  | 			len = file_string_width(file->date); | 
					
						
							|  |  |  | 			if (len > layout->column_widths[COLUMN_DATE]) layout->column_widths[COLUMN_DATE] = len; | 
					
						
							|  |  |  | 			len = file_string_width(file->time); | 
					
						
							|  |  |  | 			if (len > layout->column_widths[COLUMN_TIME]) layout->column_widths[COLUMN_TIME] = len; | 
					
						
							|  |  |  | 			len = file_string_width(file->size); | 
					
						
							|  |  |  | 			if (len > layout->column_widths[COLUMN_SIZE]) layout->column_widths[COLUMN_SIZE] = len; | 
					
						
							|  |  |  | 			len = file_string_width(file->mode1); | 
					
						
							|  |  |  | 			if (len > layout->column_widths[COLUMN_MODE1]) layout->column_widths[COLUMN_MODE1] = len; | 
					
						
							|  |  |  | 			len = file_string_width(file->mode2); | 
					
						
							|  |  |  | 			if (len > layout->column_widths[COLUMN_MODE2]) layout->column_widths[COLUMN_MODE2] = len; | 
					
						
							|  |  |  | 			len = file_string_width(file->mode3); | 
					
						
							|  |  |  | 			if (len > layout->column_widths[COLUMN_MODE3]) layout->column_widths[COLUMN_MODE3] = len; | 
					
						
							|  |  |  | 			len = file_string_width(file->owner); | 
					
						
							|  |  |  | 			if (len > layout->column_widths[COLUMN_OWNER]) layout->column_widths[COLUMN_OWNER] = len; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2009-03-08 13:14:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-26 22:47:05 +00:00
										 |  |  | void ED_fileselect_init_layout(struct SpaceFile *sfile, ARegion *ar) | 
					
						
							| 
									
										
										
										
											2009-03-08 13:14:12 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-07-26 12:40:44 +00:00
										 |  |  | 	FileSelectParams *params = ED_fileselect_get_params(sfile); | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	FileLayout *layout = NULL; | 
					
						
							|  |  |  | 	View2D *v2d = &ar->v2d; | 
					
						
							| 
									
										
										
										
											2009-03-08 13:14:12 +00:00
										 |  |  | 	int maxlen = 0; | 
					
						
							| 
									
										
										
										
											2009-07-26 12:40:44 +00:00
										 |  |  | 	int numfiles; | 
					
						
							|  |  |  | 	int textheight; | 
					
						
							| 
									
										
										
										
											2011-10-05 12:20:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-05 10:29:10 +00:00
										 |  |  | 	if (sfile->layout == NULL) { | 
					
						
							| 
									
										
										
										
											2009-03-08 13:14:12 +00:00
										 |  |  | 		sfile->layout = MEM_callocN(sizeof(struct FileLayout), "file_layout"); | 
					
						
							| 
									
										
										
										
											2014-04-01 11:34:00 +11:00
										 |  |  | 		sfile->layout->dirty = true; | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-04-01 11:34:00 +11:00
										 |  |  | 	else if (sfile->layout->dirty == false) { | 
					
						
							| 
									
										
										
										
											2011-10-05 12:20:38 +00:00
										 |  |  | 		return; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2009-07-26 12:40:44 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	numfiles = filelist_numfiles(sfile->files); | 
					
						
							| 
									
										
										
										
											2011-04-10 09:37:04 +00:00
										 |  |  | 	textheight = (int)file_font_pointsize(); | 
					
						
							| 
									
										
										
										
											2009-07-26 12:40:44 +00:00
										 |  |  | 	layout = sfile->layout; | 
					
						
							| 
									
										
										
										
											2009-08-20 18:39:25 +00:00
										 |  |  | 	layout->textheight = textheight; | 
					
						
							| 
									
										
										
										
											2009-07-26 12:40:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-08 13:14:12 +00:00
										 |  |  | 	if (params->display == FILE_IMGDISPLAY) { | 
					
						
							| 
									
										
										
										
											2013-02-13 05:10:38 +00:00
										 |  |  | 		layout->prv_w = 4.8f * UI_UNIT_X; | 
					
						
							|  |  |  | 		layout->prv_h = 4.8f * UI_UNIT_Y; | 
					
						
							|  |  |  | 		layout->tile_border_x = 0.3f * UI_UNIT_X; | 
					
						
							|  |  |  | 		layout->tile_border_y = 0.3f * UI_UNIT_X; | 
					
						
							|  |  |  | 		layout->prv_border_x = 0.3f * UI_UNIT_X; | 
					
						
							|  |  |  | 		layout->prv_border_y = 0.3f * UI_UNIT_Y; | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 		layout->tile_w = layout->prv_w + 2 * layout->prv_border_x; | 
					
						
							|  |  |  | 		layout->tile_h = layout->prv_h + 2 * layout->prv_border_y + textheight; | 
					
						
							| 
									
										
										
										
											2012-09-15 11:48:20 +00:00
										 |  |  | 		layout->width = (int)(BLI_rctf_size_x(&v2d->cur) - 2 * layout->tile_border_x); | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 		layout->columns = layout->width / (layout->tile_w + 2 * layout->tile_border_x); | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 		if (layout->columns > 0) | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 			layout->rows = numfiles / layout->columns + 1;  // XXX dirty, modulo is zero
 | 
					
						
							| 
									
										
										
										
											2009-03-09 21:17:19 +00:00
										 |  |  | 		else { | 
					
						
							| 
									
										
										
										
											2009-07-26 12:40:44 +00:00
										 |  |  | 			layout->columns = 1; | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 			layout->rows = numfiles + 1; // XXX dirty, modulo is zero
 | 
					
						
							| 
									
										
										
										
											2009-03-09 21:17:19 +00:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 		layout->height = sfile->layout->rows * (layout->tile_h + 2 * layout->tile_border_y) + layout->tile_border_y * 2; | 
					
						
							| 
									
										
										
										
											2009-07-26 12:40:44 +00:00
										 |  |  | 		layout->flag = FILE_LAYOUT_VER; | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	else { | 
					
						
							| 
									
										
										
										
											2013-02-13 05:10:38 +00:00
										 |  |  | 		int column_space = 0.6f * UI_UNIT_X; | 
					
						
							|  |  |  | 		int column_icon_space = 0.2f * UI_UNIT_X; | 
					
						
							| 
									
										
										
										
											2013-02-12 17:09:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-26 12:40:44 +00:00
										 |  |  | 		layout->prv_w = 0; | 
					
						
							|  |  |  | 		layout->prv_h = 0; | 
					
						
							| 
									
										
										
										
											2013-02-13 05:10:38 +00:00
										 |  |  | 		layout->tile_border_x = 0.4f * UI_UNIT_X; | 
					
						
							|  |  |  | 		layout->tile_border_y = 0.1f * UI_UNIT_Y; | 
					
						
							| 
									
										
										
										
											2009-07-26 12:40:44 +00:00
										 |  |  | 		layout->prv_border_x = 0; | 
					
						
							|  |  |  | 		layout->prv_border_y = 0; | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 		layout->tile_h = textheight * 3 / 2; | 
					
						
							| 
									
										
										
										
											2012-09-15 11:48:20 +00:00
										 |  |  | 		layout->height = (int)(BLI_rctf_size_y(&v2d->cur) - 2 * layout->tile_border_y); | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 		layout->rows = layout->height / (layout->tile_h + 2 * layout->tile_border_y); | 
					
						
							| 
									
										
										
										
											2011-04-21 13:11:51 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-26 12:40:44 +00:00
										 |  |  | 		column_widths(sfile->files, layout); | 
					
						
							| 
									
										
										
										
											2009-05-14 18:08:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-14 18:15:28 +00:00
										 |  |  | 		if (params->display == FILE_SHORTDISPLAY) { | 
					
						
							| 
									
										
										
										
											2013-02-12 17:09:02 +00:00
										 |  |  | 			maxlen = ICON_DEFAULT_WIDTH_SCALE + column_icon_space + | 
					
						
							|  |  |  | 			         (int)layout->column_widths[COLUMN_NAME] + column_space + | 
					
						
							|  |  |  | 			         (int)layout->column_widths[COLUMN_SIZE] + column_space; | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		else { | 
					
						
							| 
									
										
										
										
											2013-02-12 17:09:02 +00:00
										 |  |  | 			maxlen = ICON_DEFAULT_WIDTH_SCALE + column_icon_space + | 
					
						
							|  |  |  | 			         (int)layout->column_widths[COLUMN_NAME] + column_space + | 
					
						
							| 
									
										
										
										
											2009-09-28 12:10:23 +00:00
										 |  |  | #ifndef WIN32
 | 
					
						
							| 
									
										
										
										
											2013-02-12 17:09:02 +00:00
										 |  |  | 			         (int)layout->column_widths[COLUMN_MODE1] + column_space + | 
					
						
							|  |  |  | 			         (int)layout->column_widths[COLUMN_MODE2] + column_space + | 
					
						
							|  |  |  | 			         (int)layout->column_widths[COLUMN_MODE3] + column_space + | 
					
						
							|  |  |  | 			         (int)layout->column_widths[COLUMN_OWNER] + column_space + | 
					
						
							| 
									
										
										
										
											2009-09-28 12:10:23 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2013-02-12 17:09:02 +00:00
										 |  |  | 			         (int)layout->column_widths[COLUMN_DATE] + column_space + | 
					
						
							|  |  |  | 			         (int)layout->column_widths[COLUMN_TIME] + column_space + | 
					
						
							|  |  |  | 			         (int)layout->column_widths[COLUMN_SIZE] + column_space; | 
					
						
							| 
									
										
										
										
											2010-11-14 10:48:36 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-14 18:15:28 +00:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2009-09-28 12:10:23 +00:00
										 |  |  | 		layout->tile_w = maxlen; | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 		if (layout->rows > 0) | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 			layout->columns = numfiles / layout->rows + 1;  // XXX dirty, modulo is zero
 | 
					
						
							| 
									
										
										
										
											2009-03-09 21:17:19 +00:00
										 |  |  | 		else { | 
					
						
							| 
									
										
										
										
											2009-07-26 12:40:44 +00:00
										 |  |  | 			layout->rows = 1; | 
					
						
							|  |  |  | 			layout->columns = numfiles + 1; // XXX dirty, modulo is zero
 | 
					
						
							| 
									
										
										
										
											2009-03-09 21:17:19 +00:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 		layout->width = sfile->layout->columns * (layout->tile_w + 2 * layout->tile_border_x) + layout->tile_border_x * 2; | 
					
						
							| 
									
										
										
										
											2009-07-26 12:40:44 +00:00
										 |  |  | 		layout->flag = FILE_LAYOUT_HOR; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-04-01 11:34:00 +11:00
										 |  |  | 	layout->dirty = false; | 
					
						
							| 
									
										
										
										
											2009-03-08 13:14:12 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-26 22:47:05 +00:00
										 |  |  | FileLayout *ED_fileselect_get_layout(struct SpaceFile *sfile, ARegion *ar) | 
					
						
							| 
									
										
										
										
											2009-03-08 13:14:12 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	if (!sfile->layout) { | 
					
						
							|  |  |  | 		ED_fileselect_init_layout(sfile, ar); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return sfile->layout; | 
					
						
							| 
									
										
										
										
											2009-03-11 23:22:07 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2009-07-07 07:25:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-11 00:09:45 +01:00
										 |  |  | void ED_file_change_dir(bContext *C, const bool checkdir) | 
					
						
							| 
									
										
										
										
											2009-07-07 07:25:44 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2013-03-15 19:56:29 +00:00
										 |  |  | 	wmWindowManager *wm = CTX_wm_manager(C); | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	SpaceFile *sfile = CTX_wm_space_file(C); | 
					
						
							| 
									
										
										
										
											2010-03-10 19:30:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-15 11:11:52 +00:00
										 |  |  | 	if (sfile->params) { | 
					
						
							| 
									
										
										
										
											2013-03-15 19:56:29 +00:00
										 |  |  | 		ED_fileselect_clear(wm, sfile); | 
					
						
							| 
									
										
										
										
											2010-03-10 19:30:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-05 12:23:41 +01:00
										 |  |  | 		/* Clear search string, it is very rare to want to keep that filter while changing dir,
 | 
					
						
							|  |  |  | 		 * and usually very annoying to keep it actually! */ | 
					
						
							|  |  |  | 		sfile->params->filter_search[0] = '\0'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-05 03:17:46 +00:00
										 |  |  | 		if (checkdir && !BLI_is_dir(sfile->params->dir)) { | 
					
						
							| 
									
										
										
										
											2009-10-15 11:11:52 +00:00
										 |  |  | 			BLI_strncpy(sfile->params->dir, filelist_dir(sfile->files), sizeof(sfile->params->dir)); | 
					
						
							|  |  |  | 			/* could return but just refresh the current dir */ | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2009-09-12 19:54:39 +00:00
										 |  |  | 		filelist_setdir(sfile->files, sfile->params->dir); | 
					
						
							| 
									
										
										
										
											2010-03-20 14:23:56 +00:00
										 |  |  | 		 | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 		if (folderlist_clear_next(sfile)) | 
					
						
							| 
									
										
										
										
											2009-09-12 19:54:39 +00:00
										 |  |  | 			folderlist_free(sfile->folders_next); | 
					
						
							| 
									
										
										
										
											2009-07-07 07:25:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-12 19:54:39 +00:00
										 |  |  | 		folderlist_pushdir(sfile->folders_prev, sfile->params->dir); | 
					
						
							| 
									
										
										
										
											2009-07-07 07:25:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-17 08:52:19 +11:00
										 |  |  | 		file_draw_check(C); | 
					
						
							| 
									
										
										
										
											2009-07-07 07:25:44 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2009-07-10 17:05:04 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-17 14:16:26 +00:00
										 |  |  | int file_select_match(struct SpaceFile *sfile, const char *pattern, char *matched_file) | 
					
						
							| 
									
										
										
										
											2009-07-10 17:05:04 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	int match = 0; | 
					
						
							| 
									
										
										
										
											2012-06-17 14:16:26 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	int i; | 
					
						
							|  |  |  | 	struct direntry *file; | 
					
						
							|  |  |  | 	int n = filelist_numfiles(sfile->files); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* select any file that matches the pattern, this includes exact match 
 | 
					
						
							|  |  |  | 	 * if the user selects a single file by entering the filename | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	for (i = 0; i < n; i++) { | 
					
						
							|  |  |  | 		file = filelist_file(sfile->files, i); | 
					
						
							| 
									
										
										
										
											2015-04-03 16:17:17 +02:00
										 |  |  | 		/* Do not check wether file is a file or dir here! Causes T44243 (we do accept dirs at this stage). */ | 
					
						
							|  |  |  | 		if (fnmatch(pattern, file->relname, 0) == 0) { | 
					
						
							| 
									
										
										
										
											2015-01-04 12:03:47 +01:00
										 |  |  | 			file->selflag |= FILE_SEL_SELECTED; | 
					
						
							| 
									
										
										
										
											2012-06-17 14:16:26 +00:00
										 |  |  | 			if (!match) { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 				BLI_strncpy(matched_file, file->relname, FILE_MAX); | 
					
						
							| 
									
										
										
										
											2009-07-10 17:05:04 +00:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2013-11-22 14:35:34 +01:00
										 |  |  | 			match++; | 
					
						
							| 
									
										
										
										
											2009-07-10 17:05:04 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2012-06-17 14:16:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-10 17:05:04 +00:00
										 |  |  | 	return match; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2009-07-10 19:19:54 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-22 01:35:38 +01:00
										 |  |  | int autocomplete_directory(struct bContext *C, char *str, void *UNUSED(arg_v)) | 
					
						
							| 
									
										
										
										
											2009-07-10 19:19:54 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	SpaceFile *sfile = CTX_wm_space_file(C); | 
					
						
							| 
									
										
										
										
											2013-11-19 16:31:48 +01:00
										 |  |  | 	int match = AUTOCOMPLETE_NO_MATCH; | 
					
						
							| 
									
										
										
										
											2010-05-07 23:34:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* search if str matches the beginning of name */ | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 	if (str[0] && sfile->files) { | 
					
						
							| 
									
										
										
										
											2010-05-07 23:34:03 +00:00
										 |  |  | 		char dirname[FILE_MAX]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		DIR *dir; | 
					
						
							|  |  |  | 		struct dirent *de; | 
					
						
							|  |  |  | 		 | 
					
						
							| 
									
										
										
										
											2011-10-21 02:13:36 +00:00
										 |  |  | 		BLI_split_dir_part(str, dirname, sizeof(dirname)); | 
					
						
							| 
									
										
										
										
											2010-05-07 23:34:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		dir = opendir(dirname); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 		if (dir) { | 
					
						
							| 
									
										
										
										
											2014-11-09 21:20:40 +01:00
										 |  |  | 			AutoComplete *autocpl = UI_autocomplete_begin(str, FILE_MAX); | 
					
						
							| 
									
										
										
										
											2010-05-07 23:34:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			while ((de = readdir(dir)) != NULL) { | 
					
						
							| 
									
										
										
										
											2015-01-26 16:58:02 +01:00
										 |  |  | 				if (FILENAME_IS_CURRPAR(de->d_name)) { | 
					
						
							| 
									
										
										
										
											2010-05-07 23:34:03 +00:00
										 |  |  | 					/* pass */ | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				else { | 
					
						
							|  |  |  | 					char path[FILE_MAX]; | 
					
						
							| 
									
										
										
										
											2014-05-28 22:50:40 +06:00
										 |  |  | 					BLI_stat_t status; | 
					
						
							| 
									
										
										
										
											2010-05-07 23:34:03 +00:00
										 |  |  | 					 | 
					
						
							| 
									
										
										
										
											2011-02-13 03:21:27 +00:00
										 |  |  | 					BLI_join_dirfile(path, sizeof(path), dirname, de->d_name); | 
					
						
							| 
									
										
										
										
											2010-05-07 23:34:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-25 14:48:30 +00:00
										 |  |  | 					if (BLI_stat(path, &status) == 0) { | 
					
						
							| 
									
										
										
										
											2010-05-07 23:34:03 +00:00
										 |  |  | 						if (S_ISDIR(status.st_mode)) { /* is subdir */ | 
					
						
							| 
									
										
										
										
											2014-11-09 21:20:40 +01:00
										 |  |  | 							UI_autocomplete_update_name(autocpl, path); | 
					
						
							| 
									
										
										
										
											2010-05-07 23:34:03 +00:00
										 |  |  | 						} | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			closedir(dir); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-09 21:20:40 +01:00
										 |  |  | 			match = UI_autocomplete_end(autocpl, str); | 
					
						
							| 
									
										
										
										
											2015-04-03 16:17:17 +02:00
										 |  |  | 			if (match == AUTOCOMPLETE_FULL_MATCH) { | 
					
						
							|  |  |  | 				BLI_add_slash(str); | 
					
						
							| 
									
										
										
										
											2010-05-07 23:34:03 +00:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-06-19 11:53:48 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-22 01:35:38 +01:00
										 |  |  | 	return match; | 
					
						
							| 
									
										
										
										
											2010-05-07 23:34:03 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-22 01:35:38 +01:00
										 |  |  | int autocomplete_file(struct bContext *C, char *str, void *UNUSED(arg_v)) | 
					
						
							| 
									
										
										
										
											2010-05-07 23:34:03 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 	SpaceFile *sfile = CTX_wm_space_file(C); | 
					
						
							| 
									
										
										
										
											2013-11-19 16:31:48 +01:00
										 |  |  | 	int match = AUTOCOMPLETE_NO_MATCH; | 
					
						
							| 
									
										
										
										
											2009-07-10 19:19:54 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* search if str matches the beginning of name */ | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 	if (str[0] && sfile->files) { | 
					
						
							| 
									
										
										
										
											2014-11-09 21:20:40 +01:00
										 |  |  | 		AutoComplete *autocpl = UI_autocomplete_begin(str, FILE_MAX); | 
					
						
							| 
									
										
										
										
											2009-07-10 19:19:54 +00:00
										 |  |  | 		int nentries = filelist_numfiles(sfile->files); | 
					
						
							|  |  |  | 		int i; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 		for (i = 0; i < nentries; ++i) { | 
					
						
							|  |  |  | 			struct direntry *file = filelist_file(sfile->files, i); | 
					
						
							| 
									
										
										
										
											2013-11-22 14:35:34 +01:00
										 |  |  | 			if (file && (S_ISREG(file->type) || S_ISDIR(file->type))) { | 
					
						
							| 
									
										
										
										
											2014-11-09 21:20:40 +01:00
										 |  |  | 				UI_autocomplete_update_name(autocpl, file->relname); | 
					
						
							| 
									
										
										
										
											2009-07-10 19:19:54 +00:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2014-11-09 21:20:40 +01:00
										 |  |  | 		match = UI_autocomplete_end(autocpl, str); | 
					
						
							| 
									
										
										
										
											2009-07-10 19:19:54 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-11-22 01:35:38 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return match; | 
					
						
							| 
									
										
										
										
											2009-07-16 04:45:52 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2010-03-10 19:30:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-15 19:56:29 +00:00
										 |  |  | void ED_fileselect_clear(struct wmWindowManager *wm, struct SpaceFile *sfile) | 
					
						
							| 
									
										
										
										
											2010-03-10 19:30:20 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-12-31 03:52:07 +00:00
										 |  |  | 	/* only NULL in rare cases - [#29734] */ | 
					
						
							|  |  |  | 	if (sfile->files) { | 
					
						
							| 
									
										
										
										
											2013-03-15 19:56:29 +00:00
										 |  |  | 		thumbnails_stop(wm, sfile->files); | 
					
						
							| 
									
										
										
										
											2011-12-31 03:52:07 +00:00
										 |  |  | 		filelist_freelib(sfile->files); | 
					
						
							|  |  |  | 		filelist_free(sfile->files); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-10 19:30:20 +00:00
										 |  |  | 	sfile->params->active_file = -1; | 
					
						
							| 
									
										
										
										
											2013-03-15 19:56:29 +00:00
										 |  |  | 	WM_main_add_notifier(NC_SPACE | ND_SPACE_FILE_LIST, NULL); | 
					
						
							| 
									
										
										
										
											2010-03-10 19:30:20 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-15 19:56:29 +00:00
										 |  |  | void ED_fileselect_exit(struct wmWindowManager *wm, struct SpaceFile *sfile) | 
					
						
							| 
									
										
										
										
											2010-03-10 19:30:20 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 	if (!sfile) return; | 
					
						
							|  |  |  | 	if (sfile->op) { | 
					
						
							| 
									
										
										
										
											2013-03-15 19:56:29 +00:00
										 |  |  | 		WM_event_fileselect_event(wm, sfile->op, EVT_FILESELECT_EXTERNAL_CANCEL); | 
					
						
							| 
									
										
										
										
											2011-04-25 09:28:52 +00:00
										 |  |  | 		sfile->op = NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2010-09-17 22:12:23 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	folderlist_free(sfile->folders_prev); | 
					
						
							|  |  |  | 	folderlist_free(sfile->folders_next); | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	if (sfile->files) { | 
					
						
							| 
									
										
										
										
											2013-03-15 19:56:29 +00:00
										 |  |  | 		ED_fileselect_clear(wm, sfile); | 
					
						
							| 
									
										
										
										
											2010-09-17 22:12:23 +00:00
										 |  |  | 		MEM_freeN(sfile->files); | 
					
						
							| 
									
										
										
										
											2012-06-18 13:01:24 +00:00
										 |  |  | 		sfile->files = NULL; | 
					
						
							| 
									
										
										
										
											2010-09-17 22:12:23 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-10 19:30:20 +00:00
										 |  |  | } |