[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [28657] trunk/blender/source/blender: bugfix [#22276] filemanager autocompleate based on current path

Campbell Barton ideasman42 at gmail.com
Sat May 8 01:34:03 CEST 2010


Revision: 28657
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=28657
Author:   campbellbarton
Date:     2010-05-08 01:34:03 +0200 (Sat, 08 May 2010)

Log Message:
-----------
bugfix [#22276] filemanager autocompleate based on current path
also added autocomp to filename in fileselector

Modified Paths:
--------------
    trunk/blender/source/blender/blenlib/intern/bpath.c
    trunk/blender/source/blender/editors/space_file/file_draw.c
    trunk/blender/source/blender/editors/space_file/file_intern.h
    trunk/blender/source/blender/editors/space_file/file_ops.c
    trunk/blender/source/blender/editors/space_file/filesel.c

Modified: trunk/blender/source/blender/blenlib/intern/bpath.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/bpath.c	2010-05-07 22:04:48 UTC (rev 28656)
+++ trunk/blender/source/blender/blenlib/intern/bpath.c	2010-05-07 23:34:03 UTC (rev 28657)
@@ -622,7 +622,7 @@
 	
 	while ((de = readdir(dir)) != NULL) {
 		
-		if (strncmp(".", de->d_name, 2)==0 || strncmp("..", de->d_name, 3)==0)
+		if (strcmp(".", de->d_name)==0 || strcmp("..", de->d_name)==0)
 			continue;
 		
 		BLI_join_dirfile(path, dirname, de->d_name);

Modified: trunk/blender/source/blender/editors/space_file/file_draw.c
===================================================================
--- trunk/blender/source/blender/editors/space_file/file_draw.c	2010-05-07 22:04:48 UTC (rev 28656)
+++ trunk/blender/source/blender/editors/space_file/file_draw.c	2010-05-07 23:34:03 UTC (rev 28657)
@@ -180,10 +180,11 @@
 				 params->dir, 0.0, (float)FILE_MAX-1, 0, 0, 
 				 "File path.");
 		uiButSetCompleteFunc(but, autocomplete_directory, NULL);
-		uiDefBut(block, TEX, B_FS_FILENAME, "",
+		but = uiDefBut(block, TEX, B_FS_FILENAME, "",
 				 min_x, line2_y, line2_w-chan_offs, btn_h,
 				 params->file, 0.0, (float)FILE_MAXFILE-1, 0, 0, 
 				 "File name.");
+		uiButSetCompleteFunc(but, autocomplete_file, NULL);
 	}
 	
 	/* Filename number increment / decrement buttons. */

Modified: trunk/blender/source/blender/editors/space_file/file_intern.h
===================================================================
--- trunk/blender/source/blender/editors/space_file/file_intern.h	2010-05-07 22:04:48 UTC (rev 28656)
+++ trunk/blender/source/blender/editors/space_file/file_intern.h	2010-05-07 23:34:03 UTC (rev 28657)
@@ -90,6 +90,7 @@
 void file_change_dir(bContext *C, int checkdir);
 int file_select_match(struct SpaceFile *sfile, const char *pattern);
 void autocomplete_directory(struct bContext *C, char *str, void *arg_v);
+void autocomplete_file(struct bContext *C, char *str, void *arg_v);
 
 /* file_panels.c */
 void file_panels_register(struct ARegionType *art);

Modified: trunk/blender/source/blender/editors/space_file/file_ops.c
===================================================================
--- trunk/blender/source/blender/editors/space_file/file_ops.c	2010-05-07 22:04:48 UTC (rev 28656)
+++ trunk/blender/source/blender/editors/space_file/file_ops.c	2010-05-07 23:34:03 UTC (rev 28657)
@@ -816,26 +816,15 @@
 
 int file_directory_exec(bContext *C, wmOperator *unused)
 {
-	char tmpstr[FILE_MAX];
-
 	SpaceFile *sfile= CTX_wm_space_file(C);
 	
 	if(sfile->params) {
 		if ( sfile->params->dir[0] == '~' ) {
-			if (sfile->params->dir[1] == '\0') {
-				BLI_strncpy(sfile->params->dir, BLI_gethome(), sizeof(sfile->params->dir) );
-			} else {
-				/* replace ~ with home */
-				char homestr[FILE_MAX];
-				char *d = &sfile->params->dir[1];
-
-				while ( (*d == '\\') || (*d == '/') )
-					d++;
-				BLI_strncpy(homestr,  BLI_gethome(), FILE_MAX);
-				BLI_join_dirfile(tmpstr, homestr, d);
-				BLI_strncpy(sfile->params->dir, tmpstr, sizeof(sfile->params->dir));
-			}
+			char tmpstr[sizeof(sfile->params->dir)-1];
+			strncpy(tmpstr, sfile->params->dir+1, sizeof(tmpstr));
+			BLI_join_dirfile(sfile->params->dir, BLI_gethome(), tmpstr);
 		}
+
 #ifdef WIN32
 		if (sfile->params->dir[0] == '\0')
 			get_default_root(sfile->params->dir);

Modified: trunk/blender/source/blender/editors/space_file/filesel.c
===================================================================
--- trunk/blender/source/blender/editors/space_file/filesel.c	2010-05-07 22:04:48 UTC (rev 28656)
+++ trunk/blender/source/blender/editors/space_file/filesel.c	2010-05-07 23:34:03 UTC (rev 28657)
@@ -42,6 +42,15 @@
 #include <sys/times.h>
 #endif   
 
+/* path/file handeling stuff */
+#ifndef WIN32
+  #include <dirent.h>
+  #include <unistd.h>
+#else
+  #include <io.h>
+  #include "BLI_winstuff.h"
+#endif
+
 #include "DNA_space_types.h"
 #include "DNA_screen_types.h"
 #include "DNA_userdef_types.h"
@@ -432,33 +441,70 @@
 	return match;
 }
 
-
 void autocomplete_directory(struct bContext *C, char *str, void *arg_v)
 {
-	char tmp[FILE_MAX];
 	SpaceFile *sfile= CTX_wm_space_file(C);
 
 	/* search if str matches the beginning of name */
 	if(str[0] && sfile->files) {
+		char dirname[FILE_MAX];
+
+		DIR *dir;
+		struct dirent *de;
+		
+		BLI_split_dirfile(str, dirname, NULL);
+
+		dir = opendir(dirname);
+
+		if(dir) {
+			AutoComplete *autocpl= autocomplete_begin(str, FILE_MAX);
+
+			while ((de = readdir(dir)) != NULL) {
+				if (strcmp(".", de->d_name)==0 || strcmp("..", de->d_name)==0) {
+					/* pass */
+				}
+				else {
+					char path[FILE_MAX];
+					struct stat status;
+					
+					BLI_join_dirfile(path, dirname, de->d_name);
+
+					if (stat(path, &status) == 0) {
+						if (S_ISDIR(status.st_mode)) { /* is subdir */
+							autocomplete_do_name(autocpl, path);
+						}
+					}
+				}
+			}
+			closedir(dir);
+
+			autocomplete_end(autocpl, str);
+			if (BLI_exists(str)) {
+				BLI_add_slash(str);
+			} else {
+				BLI_make_exist(str);
+			}
+		}
+	}
+}
+
+void autocomplete_file(struct bContext *C, char *str, void *arg_v)
+{
+	SpaceFile *sfile= CTX_wm_space_file(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);
-			const char* dir = filelist_dir(sfile->files);
-			if (file && S_ISDIR(file->type))	{
-				// BLI_make_file_string(G.sce, tmp, dir, file->relname);
-				BLI_join_dirfile(tmp, dir, file->relname);
-				autocomplete_do_name(autocpl,tmp);
+			if (file && S_ISREG(file->type)) {
+				autocomplete_do_name(autocpl, file->relname);
 			}
 		}
 		autocomplete_end(autocpl, str);
-		if (BLI_exists(str)) {
-			BLI_add_slash(str);
-		} else {
-			BLI_make_exist(str);
-		}
 	}
 }
 





More information about the Bf-blender-cvs mailing list