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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to