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 _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs