[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21503] branches/blender2.5/blender/source /blender: 2.5 filebrowser

Andrea Weikert elubie at gmx.net
Fri Jul 10 21:19:54 CEST 2009


Revision: 21503
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21503
Author:   elubie
Date:     2009-07-10 21:19:54 +0200 (Fri, 10 Jul 2009)

Log Message:
-----------
2.5 filebrowser
* bugfix: don't allow parent dir to go beyond root
* bugfix: only attempt to change directory if it exists

New (WIP) feature: autocomplete for directory
* works on TAB
* so far only one level (in current directory)

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/blenlib/BLI_util.h
    branches/blender2.5/blender/source/blender/blenlib/intern/util.c
    branches/blender2.5/blender/source/blender/editors/space_file/file_draw.c
    branches/blender2.5/blender/source/blender/editors/space_file/file_intern.h
    branches/blender2.5/blender/source/blender/editors/space_file/file_ops.c
    branches/blender2.5/blender/source/blender/editors/space_file/filesel.c

Modified: branches/blender2.5/blender/source/blender/blenlib/BLI_util.h
===================================================================
--- branches/blender2.5/blender/source/blender/blenlib/BLI_util.h	2009-07-10 19:11:22 UTC (rev 21502)
+++ branches/blender2.5/blender/source/blender/blenlib/BLI_util.h	2009-07-10 19:19:54 UTC (rev 21503)
@@ -72,6 +72,9 @@
 /* go back one directory */
 int BLI_parent_dir(char *path);
 
+/* return whether directory is root and thus has no parent dir */
+int BLI_has_parent(char *path);
+
 	/**
 	 * Blender's path code replacement function.
 	 * Bases @a path strings leading with "//" by the

Modified: branches/blender2.5/blender/source/blender/blenlib/intern/util.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenlib/intern/util.c	2009-07-10 19:11:22 UTC (rev 21502)
+++ branches/blender2.5/blender/source/blender/blenlib/intern/util.c	2009-07-10 19:19:54 UTC (rev 21503)
@@ -494,6 +494,22 @@
 	}
 }
 
+int BLI_has_parent(char *path)
+{
+	int len;
+	int slashes = 0;
+	BLI_clean(path);
+	BLI_add_slash(path);
+
+	len = strlen(path)-1;
+	while (len) {
+		if ((path[len] == '\\') || (path[len] == '/'))
+			slashes++;
+		len--;
+	}
+	return slashes > 1;
+}
+
 int BLI_parent_dir(char *path)
 {
 #ifdef WIN32

Modified: branches/blender2.5/blender/source/blender/editors/space_file/file_draw.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_file/file_draw.c	2009-07-10 19:11:22 UTC (rev 21502)
+++ branches/blender2.5/blender/source/blender/editors/space_file/file_draw.c	2009-07-10 19:19:54 UTC (rev 21503)
@@ -186,10 +186,11 @@
 	
 	/* Text input fields for directory and file. */
 	if (available_w > 0) {
-		uiDefBut(block, TEX, B_FS_DIRNAME, "",
+		but = uiDefBut(block, TEX, B_FS_DIRNAME, "",
 		         min_x, line1_y, line1_w, btn_h, 
 		         params->dir, 0.0, (float)FILE_MAXFILE-1, 0, 0, 
 		         "File path.");
+		uiButSetCompleteFunc(but, autocomplete_directory, NULL);
 		uiDefBut(block, TEX, B_FS_FILENAME, "",
 		         min_x, line2_y, line2_w, btn_h,
 		         params->file, 0.0, (float)FILE_MAXFILE-1, 0, 0, 

Modified: branches/blender2.5/blender/source/blender/editors/space_file/file_intern.h
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_file/file_intern.h	2009-07-10 19:11:22 UTC (rev 21502)
+++ branches/blender2.5/blender/source/blender/editors/space_file/file_intern.h	2009-07-10 19:19:54 UTC (rev 21503)
@@ -89,6 +89,7 @@
 float file_font_pointsize();
 void file_change_dir(struct SpaceFile *sfile);
 int file_select_match(struct SpaceFile *sfile, const char *pattern);
+void autocomplete_directory(struct bContext *C, char *str, void *arg_v);
 
 /* file_panels.c */
 void file_panels_register(struct ARegionType *art);

Modified: branches/blender2.5/blender/source/blender/editors/space_file/file_ops.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_file/file_ops.c	2009-07-10 19:11:22 UTC (rev 21502)
+++ branches/blender2.5/blender/source/blender/editors/space_file/file_ops.c	2009-07-10 19:19:54 UTC (rev 21503)
@@ -142,10 +142,10 @@
 			{
 				// XXX error("Path too long, cannot enter this directory");
 			} else {
+				BLI_cleanup_dir(G.sce, params->dir);
 				strcat(params->dir, file->relname);
-				strcat(params->dir,"/");
+				BLI_add_slash(params->dir);
 				params->file[0] = '\0';
-				BLI_cleanup_dir(G.sce, params->dir);
 				file_change_dir(sfile);
 			}
 		}
@@ -557,11 +557,13 @@
 	SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
 	
 	if(sfile->params) {
-		BLI_parent_dir(sfile->params->dir);
-		file_change_dir(sfile);
+		if (BLI_has_parent(sfile->params->dir)) {
+			BLI_parent_dir(sfile->params->dir);
+			file_change_dir(sfile);
+			WM_event_add_notifier(C, NC_FILE|ND_FILELIST, NULL);
+		}
 	}		
-	WM_event_add_notifier(C, NC_FILE|ND_FILELIST, NULL);
-
+	
 	return OPERATOR_FINISHED;
 
 }
@@ -718,10 +720,11 @@
 				BLI_strncpy(sfile->params->dir, tmpstr, sizeof(sfile->params->dir));
 			}
 		}
-
+		BLI_add_slash(sfile->params->dir);
 		file_change_dir(sfile);
+		WM_event_add_notifier(C, NC_FILE|ND_FILELIST, NULL);
 	}		
-	WM_event_add_notifier(C, NC_FILE|ND_FILELIST, NULL);
+	
 
 	return OPERATOR_FINISHED;
 }

Modified: branches/blender2.5/blender/source/blender/editors/space_file/filesel.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_file/filesel.c	2009-07-10 19:11:22 UTC (rev 21502)
+++ branches/blender2.5/blender/source/blender/editors/space_file/filesel.c	2009-07-10 19:19:54 UTC (rev 21503)
@@ -298,7 +298,7 @@
 
 void file_change_dir(struct SpaceFile *sfile)
 {
-	if (sfile->params) {
+	if (sfile->params && BLI_exists(sfile->params->dir)) {
 		filelist_setdir(sfile->files, sfile->params->dir);
 
 		if(folderlist_clear_next(sfile))
@@ -329,3 +329,27 @@
 	}
 	return match;
 }
+
+
+void autocomplete_directory(struct bContext *C, char *str, void *arg_v)
+{
+	char tmp[FILE_MAX];
+	SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
+
+	/* search if str matches the beginning of name */
+	if(str[0] && sfile->files) {
+		AutoComplete *autocpl= autocomplete_begin(str, FILE_MAX);
+		int nentries = filelist_numfiles(sfile->files);
+		int i;
+
+		for(i= 0; i<nentries; ++i) {
+			struct direntry* file = filelist_file(sfile->files, i);
+			char* dir = filelist_dir(sfile->files);
+			if (file && S_ISDIR(file->type))	{
+				BLI_make_file_string(G.sce, tmp, dir, file->relname);
+				autocomplete_do_name(autocpl,tmp);
+			}
+		}
+		autocomplete_end(autocpl, str);
+	}
+}
\ No newline at end of file





More information about the Bf-blender-cvs mailing list