[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21400] branches/blender2.5/blender: 2. 5 filebrowser: previous/next + bugfix + elubie's changes and cleanup

Dalai Felinto dfelinto at gmail.com
Tue Jul 7 09:25:44 CEST 2009


Revision: 21400
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21400
Author:   dfelinto
Date:     2009-07-07 09:25:44 +0200 (Tue, 07 Jul 2009)

Log Message:
-----------
2.5 filebrowser: previous/next + bugfix + elubie's changes and cleanup
* Previous/Next Folder browser
* bugfix: "open most recently opened directory".

* Previous and Next functionalities:
- use BACKSPACE to navigate to previous folders
- use SHIFT+BACKSPACE to navigate forward
- once you change the folder by other ways the forward folder list is cleared

* bug fix: the sfile->params->dir set through ED_fileselect_set_params wasn't correct. According to the code taking the settings from the existing (previous) filebrowser is a temp solution. In that case this is a fix for a temp solution :)
(changes in: wm_event_system.c, filesel.c and ED_fileselect.h)

** Andrea(elubie): we can get away of the folderlist_clear_next test if we manually pass a boolean to file_change_dir (e.g. file_change_dir(sfile, true)). I tried not to mess up with your changes here. It's slightly slower (and maybe hacky) but its's more conservative IMHO.

(my first commit to 2.5 ... that was a good reason to put my paper on hold :p)

Modified Paths:
--------------
    branches/blender2.5/blender/release/ui/space_filebrowser.py
    branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c
    branches/blender2.5/blender/source/blender/editors/include/ED_fileselect.h
    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/filelist.c
    branches/blender2.5/blender/source/blender/editors/space_file/filelist.h
    branches/blender2.5/blender/source/blender/editors/space_file/filesel.c
    branches/blender2.5/blender/source/blender/editors/space_file/space_file.c
    branches/blender2.5/blender/source/blender/makesdna/DNA_space_types.h
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c

Modified: branches/blender2.5/blender/release/ui/space_filebrowser.py
===================================================================
--- branches/blender2.5/blender/release/ui/space_filebrowser.py	2009-07-07 06:56:29 UTC (rev 21399)
+++ branches/blender2.5/blender/release/ui/space_filebrowser.py	2009-07-07 07:25:44 UTC (rev 21400)
@@ -17,11 +17,13 @@
 			row = layout.row()
 			row.itemM("FILEBROWSER_MT_directory")
 			row.itemM("FILEBROWSER_MT_bookmarks")
-			
+
 		row = layout.row(align=True)
 		row.itemO("FILE_OT_parent", text="", icon='ICON_FILE_PARENT')
 		row.itemO("FILE_OT_refresh", text="", icon='ICON_FILE_REFRESH')
-
+		row.itemO("FILE_OT_previous", text="", icon='ICON_PREV_KEYFRAME')
+		row.itemO("FILE_OT_next", text="", icon='ICON_NEXT_KEYFRAME')
+		
 		layout.itemR(params, "display", expand=True, text="")
 		layout.itemR(params, "sort", expand=True, text="")
 		

Modified: branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c	2009-07-07 06:56:29 UTC (rev 21399)
+++ branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c	2009-07-07 07:25:44 UTC (rev 21400)
@@ -4472,13 +4472,10 @@
 					
 					SpaceFile *sfile= (SpaceFile *)sl;
 					sfile->files= NULL;
+					sfile->folders_prev= NULL;
+					sfile->folders_next= NULL;
 					sfile->params= NULL;
 					sfile->op= NULL;
-					/* XXX needs checking - best solve in filesel itself 
-					if(sfile->libfiledata)	
-						BLO_blendhandle_close(sfile->libfiledata);
-					sfile->libfiledata= 0;
-					*/
 				}
 				else if(sl->spacetype==SPACE_IMASEL) {
                     SpaceImaSel *simasel= (SpaceImaSel *)sl;

Modified: branches/blender2.5/blender/source/blender/editors/include/ED_fileselect.h
===================================================================
--- branches/blender2.5/blender/source/blender/editors/include/ED_fileselect.h	2009-07-07 06:56:29 UTC (rev 21399)
+++ branches/blender2.5/blender/source/blender/editors/include/ED_fileselect.h	2009-07-07 07:25:44 UTC (rev 21400)
@@ -69,7 +69,7 @@
 
 struct FileSelectParams* ED_fileselect_get_params(struct SpaceFile *sfile);
 
-short ED_fileselect_set_params(struct SpaceFile *sfile, const char *title, const char *path, 
+short ED_fileselect_set_params(struct SpaceFile *sfile, const char *title, const char *dir, const char *path, 
 						   short flag, short display, short filter, short sort);
 
 void ED_fileselect_reset_params(struct SpaceFile *sfile);

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-07 06:56:29 UTC (rev 21399)
+++ branches/blender2.5/blender/source/blender/editors/space_file/file_intern.h	2009-07-07 07:25:44 UTC (rev 21400)
@@ -65,6 +65,8 @@
 void FILE_OT_exec(struct wmOperatorType *ot);
 void FILE_OT_cancel(struct wmOperatorType *ot);
 void FILE_OT_parent(struct wmOperatorType *ot);
+void FILE_OT_previous(struct wmOperatorType *ot);
+void FILE_OT_next(struct wmOperatorType *ot);
 void FILE_OT_refresh(struct wmOperatorType *ot);
 void FILE_OT_bookmark_toggle(struct wmOperatorType *ot);
 void FILE_OT_filenum(struct wmOperatorType *ot);
@@ -72,11 +74,14 @@
 int file_exec(bContext *C, struct wmOperator *unused);
 int file_cancel_exec(bContext *C, struct wmOperator *unused);
 int file_parent_exec(bContext *C, struct wmOperator *unused);
+int file_previous_exec(bContext *C, struct wmOperator *unused);
+int file_next_exec(bContext *C, struct wmOperator *unused);
 int file_hilight_set(struct SpaceFile *sfile, struct ARegion *ar, int mx, int my);
 
 /* filesel.c */
 float file_string_width(const char* str);
 float file_font_pointsize();
+void file_change_dir(struct SpaceFile *sfile);
 
 /* 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-07 06:56:29 UTC (rev 21399)
+++ branches/blender2.5/blender/source/blender/editors/space_file/file_ops.c	2009-07-07 07:25:44 UTC (rev 21400)
@@ -146,9 +146,7 @@
 				strcat(params->dir,"/");
 				params->file[0] = '\0';
 				BLI_cleanup_dir(G.sce, params->dir);
-				filelist_setdir(sfile->files, params->dir);
-				filelist_free(sfile->files);
-				params->active_file = -1;
+				file_change_dir(sfile);
 			}
 		}
 		else if (file)
@@ -305,10 +303,8 @@
 		RNA_string_get(op->ptr, "dir", entry);
 		BLI_strncpy(params->dir, entry, sizeof(params->dir));
 		BLI_cleanup_dir(G.sce, params->dir);
-		filelist_free(sfile->files);	
-		filelist_setdir(sfile->files, params->dir);
-		params->file[0] = '\0';			
-		params->active_file = -1;
+		file_change_dir(sfile);				
+		params->file[0] = '\0';
 
 		WM_event_add_notifier(C, NC_FILE|ND_PARAMS, NULL);
 	}
@@ -467,7 +463,10 @@
 int file_cancel_exec(bContext *C, wmOperator *unused)
 {
 	SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
-	
+
+	folderlist_free(sfile->folders_prev);
+	folderlist_free(sfile->folders_next);
+
 	WM_event_fileselect_event(C, sfile->op, EVT_FILESELECT_CANCEL);
 	sfile->op = NULL;
 	
@@ -529,6 +528,9 @@
 			}
 		}
 		
+		folderlist_free(sfile->folders_prev);
+		folderlist_free(sfile->folders_next);
+
 		fsmenu_insert_entry(fsmenu_get(), FS_CATEGORY_RECENT, sfile->params->dir,0, 1);
 		BLI_make_file_string(G.sce, name, BLI_gethome(), ".Bfs");
 		fsmenu_write_file(fsmenu_get(), name);
@@ -556,9 +558,7 @@
 	
 	if(sfile->params) {
 		BLI_parent_dir(sfile->params->dir);
-		filelist_setdir(sfile->files, sfile->params->dir);
-		filelist_free(sfile->files);
-		sfile->params->active_file = -1;
+		file_change_dir(sfile);
 	}		
 	WM_event_add_notifier(C, NC_FILE|ND_FILELIST, NULL);
 
@@ -583,18 +583,75 @@
 {
 	SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
 	
+	file_change_dir(sfile);
+
+	WM_event_add_notifier(C, NC_FILE|ND_FILELIST, NULL);
+
+	return OPERATOR_FINISHED;
+
+}
+
+void FILE_OT_previous(struct wmOperatorType *ot)
+{
+	/* identifiers */
+	ot->name= "Previous Folder";
+	ot->idname= "FILE_OT_previous";
+	
+	/* api callbacks */
+	ot->exec= file_previous_exec;
+	ot->poll= ED_operator_file_active; /* <- important, handler is on window level */
+}
+
+int file_previous_exec(bContext *C, wmOperator *unused)
+{
+	SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
+
 	if(sfile->params) {
-		filelist_setdir(sfile->files, sfile->params->dir);
-		filelist_free(sfile->files);
-		sfile->params->active_file = -1;
+		if (!sfile->folders_next)
+			sfile->folders_next = folderlist_new();
+
+		folderlist_pushdir(sfile->folders_next, sfile->params->dir);
+		folderlist_popdir(sfile->folders_prev, sfile->params->dir);
+		folderlist_pushdir(sfile->folders_next, sfile->params->dir);
+
+		file_change_dir(sfile);
 	}
 	WM_event_add_notifier(C, NC_FILE|ND_FILELIST, NULL);
 
 	return OPERATOR_FINISHED;
+}
 
+void FILE_OT_next(struct wmOperatorType *ot)
+{
+	/* identifiers */
+	ot->name= "Next Folder";
+	ot->idname= "FILE_OT_next";
+	
+	/* api callbacks */
+	ot->exec= file_next_exec;
+	ot->poll= ED_operator_file_active; /* <- important, handler is on window level */
 }
 
+int file_next_exec(bContext *C, wmOperator *unused)
+{
+	SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
+		if(sfile->params) {
+			if (!sfile->folders_next)
+			sfile->folders_next = folderlist_new();
 
+		folderlist_pushdir(sfile->folders_prev, sfile->params->dir);
+		folderlist_popdir(sfile->folders_next, sfile->params->dir);
+
+		// update folder_prev so we can check for it in folderlist_clear_next()
+		folderlist_pushdir(sfile->folders_prev, sfile->params->dir);
+
+		file_change_dir(sfile);
+	}		
+	WM_event_add_notifier(C, NC_FILE|ND_FILELIST, NULL);
+
+	return OPERATOR_FINISHED;
+}
+
 void FILE_OT_refresh(struct wmOperatorType *ot)
 {
 	/* identifiers */

Modified: branches/blender2.5/blender/source/blender/editors/space_file/filelist.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_file/filelist.c	2009-07-07 06:56:29 UTC (rev 21399)
+++ branches/blender2.5/blender/source/blender/editors/space_file/filelist.c	2009-07-07 07:25:44 UTC (rev 21400)
@@ -123,6 +123,12 @@
 	ListBase threads;
 } FileList;
 
+typedef struct FolderList
+{
+	struct FolderList *next, *prev;
+	char *foldername;
+} FolderList;
+
 #define SPECIAL_IMG_SIZE 48
 #define SPECIAL_IMG_ROWS 4
 #define SPECIAL_IMG_COLS 4
@@ -354,6 +360,86 @@
 	}
 }
 
+//-----------------FOLDERLIST (previous/next) --------------//
+struct ListBase* folderlist_new()
+{
+	ListBase* p = MEM_callocN( sizeof(ListBase), "folderlist" );
+	return p;
+}
+
+void folderlist_popdir(struct ListBase* folderlist, const char *dir)
+{
+	const char *prev_dir;
+	struct FolderList *folder;
+	folder = folderlist->last;
+
+	if(folder){
+		// remove the current directory
+		MEM_freeN(folder->foldername);
+		BLI_freelinkN(folderlist, folder);
+
+		folder = folderlist->last;
+		if(folder){
+			prev_dir = folder->foldername;
+			BLI_strncpy(dir, prev_dir, FILE_MAXDIR);
+		}
+	}
+	// delete the folder next or use setdir directly before PREVIOUS OP
+}
+
+void folderlist_pushdir(ListBase* folderlist, const char *dir)
+{
+	struct FolderList *folder, *previous_folder;
+	previous_folder = folderlist->last;
+
+	// check if already exists
+	if(previous_folder){
+		if(! strcmp(previous_folder->foldername, dir)){
+			return;
+		}
+	}
+
+	// create next folder element
+	folder = (FolderList*)MEM_mallocN(sizeof(FolderList),"FolderList");
+	folder->foldername = (char*)MEM_mallocN(sizeof(char)*(strlen(dir)+1), "foldername");
+	folder->foldername[0] = '\0';
+
+	BLI_strncpy(folder->foldername, dir, FILE_MAXDIR);
+
+	// add it to the end of the list
+	BLI_addtail(folderlist, folder);
+}
+
+int folderlist_clear_next(struct SpaceFile *sfile)
+{
+	struct FolderList *folder;
+
+	// if there is no folder_next there is nothing we can clear
+	if (!sfile->folders_next)
+		return 0;
+
+	// if previous_folder, next_folder or refresh_folder operators are executed it doesn't clear folder_next
+	folder = sfile->folders_prev->last;
+	if ((!folder) ||(!strcmp(folder->foldername, sfile->params->dir)))
+		return 0;
+
+	// eventually clear flist->folders_next
+	return 1;
+}
+

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list