2.5 filebrowser
authorAndrea Weikert <elubie@gmx.net>
Thu, 12 Mar 2009 19:36:59 +0000 (19:36 +0000)
committerAndrea Weikert <elubie@gmx.net>
Thu, 12 Mar 2009 19:36:59 +0000 (19:36 +0000)
- better encapsulation for fsmenu to make it easier to remove global later.
- cleaned up fsmenu code to use just one global
- on file_exec current directory gets added to recent.
- save last 10 recent files in .Bfs too.

source/blender/editors/space_file/file_draw.c
source/blender/editors/space_file/file_ops.c
source/blender/editors/space_file/fsmenu.c
source/blender/editors/space_file/fsmenu.h
source/blender/editors/space_file/space_file.c

index be777c72125e244e4494f283c3eeadaaead7c47f..8ef5e069c7640e0b430e86c1be366378ee0bfcec 100644 (file)
@@ -546,8 +546,9 @@ void file_draw_list(const bContext *C, ARegion *ar)
 static void file_draw_fsmenu_category(const bContext *C, ARegion *ar, FSMenuCategory category, const char* category_name, short *starty)
 {
        SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
+       struct FSMenu* fsmenu = fsmenu_get();
        char bookmark[FILE_MAX];
-       int nentries = fsmenu_get_nentries(category);
+       int nentries = fsmenu_get_nentries(fsmenu, category);
        int linestep = gFontsize*2.0f;
        short sx, sy, xpos, ypos;
        int bmwidth = ar->v2d.cur.xmax - ar->v2d.cur.xmin - 2*TILE_BORDER_X - ICON_DEFAULT_WIDTH - 4;
@@ -564,7 +565,7 @@ static void file_draw_fsmenu_category(const bContext *C, ARegion *ar, FSMenuCate
        sy -= linestep;
 
        for (i=0; i< nentries && (sy > ar->v2d.cur.ymin) ;++i) {
-               char *fname = fsmenu_get_entry(category, i);
+               char *fname = fsmenu_get_entry(fsmenu, category, i);
 
                if (fname) {
                        int sl;
@@ -575,7 +576,7 @@ static void file_draw_fsmenu_category(const bContext *C, ARegion *ar, FSMenuCate
                                bookmark[sl] = '\0';
                                sl--;
                        }
-                       if (fsmenu_is_selected(category, i) ) {
+                       if (fsmenu_is_selected(fsmenu, category, i) ) {
                                UI_ThemeColor(TH_HILITE);
                                /* uiSetRoundBox(15);   
                                 * uiRoundBox(sx, sy - linestep, sx + bmwidth, sy, 4.0f); */
@@ -592,7 +593,7 @@ static void file_draw_fsmenu_category(const bContext *C, ARegion *ar, FSMenuCate
                        xpos += ICON_DEFAULT_WIDTH + 4;
                        file_draw_string(xpos, ypos, bookmark, bmwidth, fontsize, FILE_SHORTEN_FRONT);
                        sy -= linestep;
-                       fsmenu_set_pos(category, i, xpos, ypos);
+                       fsmenu_set_pos(fsmenu, category, i, xpos, ypos);
                }
        }
 
index 4725014a4b1db55f8eb157b494636d44100c0d3f..20e6b9b16a803a20d86162922159dce98d02db7a 100644 (file)
@@ -318,7 +318,7 @@ void FILE_OT_select_all(wmOperatorType *ot)
 
 static void set_active_bookmark(FileSelectParams* params, struct ARegion* ar, short x, short y)
 {
-       int nentries = fsmenu_get_nentries(FS_CATEGORY_BOOKMARKS);
+       int nentries = fsmenu_get_nentries(fsmenu_get(), FS_CATEGORY_BOOKMARKS);
        float fx, fy;
        short posy;
 
@@ -335,16 +335,17 @@ static void set_active_bookmark(FileSelectParams* params, struct ARegion* ar, sh
 
 static int file_select_bookmark_category(SpaceFile* sfile, ARegion* ar, short x, short y, FSMenuCategory category)
 {
-       int nentries = fsmenu_get_nentries(category);
+       struct FSMenu* fsmenu = fsmenu_get();
+       int nentries = fsmenu_get_nentries(fsmenu, category);
        int linestep = U.fontsize*2.0f;
        short xs, ys;
        int i;
        int selected = -1;
 
        for (i=0; i < nentries; ++i) {
-               fsmenu_get_pos(category, i, &xs, &ys);
+               fsmenu_get_pos(fsmenu, category, i, &xs, &ys);
                if ( (y<=ys) && (y>ys-linestep) ) {
-                       fsmenu_select_entry(category, i);
+                       fsmenu_select_entry(fsmenu, category, i);
                        selected = i;
                        break;
                }
@@ -373,7 +374,7 @@ static void file_select_bookmark(SpaceFile* sfile, ARegion* ar, short x, short y
                }
                
                if (selected>=0) {
-                       entry= fsmenu_get_entry(category, selected);                    
+                       entry= fsmenu_get_entry(fsmenu_get(), category, selected);                      
                        /* which string */
                        if (entry) {
                                FileSelectParams* params = sfile->params;
@@ -523,6 +524,9 @@ int file_exec(bContext *C, wmOperator *unused)
                strcat(name, sfile->params->file);
                RNA_string_set(op->ptr, "filename", name);
                
+               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);
                WM_event_fileselect_event(C, op, EVT_FILESELECT_EXEC);
        }
                                
index 980c014ae9c0e1f04e611cfe0e54ccf8bb3c21bc..6ef946c9697d7dd892119e267d5eb9f534fda1ef 100644 (file)
@@ -62,83 +62,97 @@ struct _FSMenuEntry {
        short xs, ys;
 };
 
-static FSMenuEntry *fsmenu_system= 0;
-static FSMenuEntry *fsmenu_bookmarks= 0;
-static FSMenuEntry *fsmenu_recent= 0;
+typedef struct FSMenu
+{
+       FSMenuEntry *fsmenu_system;
+       FSMenuEntry *fsmenu_bookmarks;
+       FSMenuEntry *fsmenu_recent;
+
+       FSMenuCategory selected_category;
+       int selected_entry;
+
+} FSMenu;
+
+static FSMenu *g_fsmenu = NULL;
 
-static FSMenuCategory selected_category= FS_CATEGORY_SYSTEM;
-static int selected_entry= 0;
+struct FSMenu* fsmenu_get(void)
+{
+       if (!g_fsmenu) {
+               g_fsmenu=MEM_callocN(sizeof(struct FSMenu), "fsmenu");
+       }
+       return g_fsmenu;
+}
 
-void fsmenu_select_entry(FSMenuCategory category, int index)
+void fsmenu_select_entry(struct FSMenu* fsmenu, FSMenuCategory category, int index)
 {
-       selected_category = category;
-       selected_entry = index;
+       fsmenu->selected_category = category;
+       fsmenu->selected_entry = index;
 }
 
-int    fsmenu_is_selected(FSMenuCategory category, int index)
+int    fsmenu_is_selected(struct FSMenu* fsmenu, FSMenuCategory category, int index)
 {
-       return (category==selected_category) && (index==selected_entry);
+       return (category==fsmenu->selected_category) && (index==fsmenu->selected_entry);
 }
 
-static FSMenuEntry *fsmenu_get(FSMenuCategory category)
+static FSMenuEntry *fsmenu_get_category(struct FSMenu* fsmenu, FSMenuCategory category)
 {
-       FSMenuEntry *fsmenu = NULL;
+       FSMenuEntry *fsms = NULL;
 
        switch(category) {
                case FS_CATEGORY_SYSTEM:
-                       fsmenu = fsmenu_system;
+                       fsms = fsmenu->fsmenu_system;
                        break;
                case FS_CATEGORY_BOOKMARKS:
-                       fsmenu = fsmenu_bookmarks;
+                       fsms = fsmenu->fsmenu_bookmarks;
                        break;
                case FS_CATEGORY_RECENT:
-                       fsmenu = fsmenu_recent;
+                       fsms = fsmenu->fsmenu_recent;
                        break;
        }
-       return fsmenu;
+       return fsms;
 }
 
-static void fsmenu_set(FSMenuCategory category, FSMenuEntry *fsmenu)
+static void fsmenu_set_category(struct FSMenu* fsmenu, FSMenuCategory category, FSMenuEntry *fsms)
 {
        switch(category) {
                case FS_CATEGORY_SYSTEM:
-                       fsmenu_system = fsmenu;
+                       fsmenu->fsmenu_system = fsms;
                        break;
                case FS_CATEGORY_BOOKMARKS:
-                       fsmenu_bookmarks = fsmenu;
+                       fsmenu->fsmenu_bookmarks = fsms;
                        break;
                case FS_CATEGORY_RECENT:
-                       fsmenu_recent = fsmenu;
+                       fsmenu->fsmenu_recent = fsms;
                        break;
        }
 }
 
-int fsmenu_get_nentries(FSMenuCategory category)
+int fsmenu_get_nentries(struct FSMenu* fsmenu, FSMenuCategory category)
 {
        FSMenuEntry *fsme;
        int count= 0;
 
-       for (fsme= fsmenu_get(category); fsme; fsme= fsme->next) 
+       for (fsme= fsmenu_get_category(fsmenu, category); fsme; fsme= fsme->next) 
                count++;
 
        return count;
 }
 
-char *fsmenu_get_entry(FSMenuCategory category, int idx)
+char *fsmenu_get_entry(struct FSMenu* fsmenu, FSMenuCategory category, int idx)
 {
        FSMenuEntry *fsme;
 
-       for (fsme= fsmenu_get(category); fsme && idx; fsme= fsme->next)
+       for (fsme= fsmenu_get_category(fsmenu, category); fsme && idx; fsme= fsme->next)
                idx--;
 
        return fsme?fsme->path:NULL;
 }
 
-void   fsmenu_set_pos( FSMenuCategory category, int idx, short xs, short ys)
+void fsmenu_set_pos(struct FSMenu* fsmenu, FSMenuCategory category, int idx, short xs, short ys)
 {
        FSMenuEntry *fsme;
 
-       for (fsme= fsmenu_get(category); fsme && idx; fsme= fsme->next)
+       for (fsme= fsmenu_get_category(fsmenu, category); fsme && idx; fsme= fsme->next)
                idx--;
 
        if (fsme) {
@@ -147,11 +161,11 @@ void      fsmenu_set_pos( FSMenuCategory category, int idx, short xs, short ys)
        }
 }
 
-int    fsmenu_get_pos (FSMenuCategory category, int idx, short* xs, short* ys)
+int    fsmenu_get_pos (struct FSMenu* fsmenu, FSMenuCategory category, int idx, short* xs, short* ys)
 {
        FSMenuEntry *fsme;
 
-       for (fsme= fsmenu_get(category); fsme && idx; fsme= fsme->next)
+       for (fsme= fsmenu_get_category(fsmenu, category); fsme && idx; fsme= fsme->next)
                idx--;
 
        if (fsme) {
@@ -164,14 +178,14 @@ int       fsmenu_get_pos (FSMenuCategory category, int idx, short* xs, short* ys)
 }
 
 
-void fsmenu_insert_entry(FSMenuCategory category, char *path, int sorted, short save)
+void fsmenu_insert_entry(struct FSMenu* fsmenu, FSMenuCategory category, char *path, int sorted, short save)
 {
        FSMenuEntry *prev;
        FSMenuEntry *fsme;
-       FSMenuEntry *fsmenu;
+       FSMenuEntry *fsms;
 
-       fsmenu = fsmenu_get(category);
-       prev= fsme= fsmenu;
+       fsms = fsmenu_get_category(fsmenu, category);
+       prev= fsme= fsms;
 
        for (; fsme; prev= fsme, fsme= fsme->next) {
                if (fsme->path) {
@@ -198,17 +212,17 @@ void fsmenu_insert_entry(FSMenuCategory category, char *path, int sorted, short
                fsme->next= prev->next;
                prev->next= fsme;
        } else {
-               fsme->next= fsmenu;
-               fsmenu_set(category, fsme);
+               fsme->next= fsms;
+               fsmenu_set_category(fsmenu, category, fsme);
        }
 }
 
-void fsmenu_remove_entry(FSMenuCategory category, int idx)
+void fsmenu_remove_entry(struct FSMenu* fsmenu, FSMenuCategory category, int idx)
 {
        FSMenuEntry *prev= NULL, *fsme= NULL;
-       FSMenuEntry *fsmenu = fsmenu_get(category);
+       FSMenuEntry *fsms = fsmenu_get_category(fsmenu, category);
 
-       for (fsme= fsmenu; fsme && idx; prev= fsme, fsme= fsme->next)           
+       for (fsme= fsms; fsme && idx; prev= fsme, fsme= fsme->next)             
                idx--;
 
        if (fsme) {
@@ -221,8 +235,8 @@ void fsmenu_remove_entry(FSMenuCategory category, int idx)
                        if (prev) {
                                prev->next= fsme->next;
                        } else {
-                               fsmenu= fsme->next;
-                               fsmenu_set(category, fsmenu);
+                               fsms= fsme->next;
+                               fsmenu_set_category(fsmenu, category, fsms);
                        }
                        /* free entry */
                        MEM_freeN(fsme->path);
@@ -231,14 +245,22 @@ void fsmenu_remove_entry(FSMenuCategory category, int idx)
        }
 }
 
-void fsmenu_write_file(const char *filename)
+void fsmenu_write_file(struct FSMenu* fsmenu, const char *filename)
 {
        FSMenuEntry *fsme= NULL;
+       int count=FSMENU_RECENT_MAX;
 
        FILE *fp = fopen(filename, "w");
        if (!fp) return;
-
-       for (fsme= fsmenu_get(FS_CATEGORY_BOOKMARKS); fsme; fsme= fsme->next) {
+       
+       fprintf(fp, "[Bookmarks]\n");
+       for (fsme= fsmenu_get_category(fsmenu, FS_CATEGORY_BOOKMARKS); fsme; fsme= fsme->next) {
+               if (fsme->path && fsme->save) {
+                       fprintf(fp, "%s\n", fsme->path);
+               }
+       }
+       fprintf(fp, "[Recent]\n");
+       for (fsme= fsmenu_get_category(fsmenu, FS_CATEGORY_RECENT); fsme && count; fsme= fsme->next, --count) {
                if (fsme->path && fsme->save) {
                        fprintf(fp, "%s\n", fsme->path);
                }
@@ -246,9 +268,10 @@ void fsmenu_write_file(const char *filename)
        fclose(fp);
 }
 
-void fsmenu_read_file(const char *filename)
+void fsmenu_read_file(struct FSMenu* fsmenu, const char *filename)
 {
        char line[256];
+       FSMenuCategory category = FS_CATEGORY_BOOKMARKS;
        FILE *fp;
 
        #ifdef WIN32
@@ -268,15 +291,15 @@ void fsmenu_read_file(const char *filename)
                                tmps[2]='\\';
                                tmps[3]=0;
                                
-                               fsmenu_insert_entry(FS_CATEGORY_SYSTEM, tmps, 1, 0);
+                               fsmenu_insert_entry(fsmenu, FS_CATEGORY_SYSTEM, tmps, 1, 0);
                        }
                }
 
                /* Adding Desktop and My Documents */
                SHGetSpecialFolderPath(0, folder, CSIDL_PERSONAL, 0);
-               fsmenu_insert_entry(FS_CATEGORY_BOOKMARKS, folder, 1, 0);
+               fsmenu_insert_entry(fsmenu,FS_CATEGORY_BOOKMARKS, folder, 1, 0);
                SHGetSpecialFolderPath(0, folder, CSIDL_DESKTOPDIRECTORY, 0);
-               fsmenu_insert_entry(FS_CATEGORY_BOOKMARKS, folder, 1, 0);
+               fsmenu_insert_entry(fsmenu, FS_CATEGORY_BOOKMARKS, folder, 1, 0);
        }
 #endif
 
@@ -285,20 +308,26 @@ void fsmenu_read_file(const char *filename)
 
        while ( fgets ( line, 256, fp ) != NULL ) /* read a line */
        {
-               int len = strlen(line);
-               if (len>0) {
-                       if (line[len-1] == '\n') {
-                               line[len-1] = '\0';
+               if (strncmp(line, "[Bookmarks]", 11)==0){
+                       category = FS_CATEGORY_BOOKMARKS;
+               } else if (strncmp(line, "[Recent]", 8)==0){
+                       category = FS_CATEGORY_RECENT;
+               } else {
+                       int len = strlen(line);
+                       if (len>0) {
+                               if (line[len-1] == '\n') {
+                                       line[len-1] = '\0';
+                               }
+                               fsmenu_insert_entry(fsmenu, category, line, 0, 1);
                        }
-                       fsmenu_insert_entry(FS_CATEGORY_BOOKMARKS, line, 0, 1);
                }
        }
        fclose(fp);
 }
 
-static void fsmenu_free_category(FSMenuCategory category)
+static void fsmenu_free_category(struct FSMenu* fsmenu, FSMenuCategory category)
 {
-       FSMenuEntry *fsme= fsmenu_get(category);
+       FSMenuEntry *fsme= fsmenu_get_category(fsmenu, category);
 
        while (fsme) {
                FSMenuEntry *n= fsme->next;
@@ -310,10 +339,11 @@ static void fsmenu_free_category(FSMenuCategory category)
        }
 }
 
-void fsmenu_free(void)
+void fsmenu_free(struct FSMenu* fsmenu)
 {
-       fsmenu_free_category(FS_CATEGORY_SYSTEM);
-       fsmenu_free_category(FS_CATEGORY_BOOKMARKS);
-       fsmenu_free_category(FS_CATEGORY_RECENT);
+       fsmenu_free_category(fsmenu, FS_CATEGORY_SYSTEM);
+       fsmenu_free_category(fsmenu, FS_CATEGORY_BOOKMARKS);
+       fsmenu_free_category(fsmenu, FS_CATEGORY_RECENT);
+       MEM_freeN(fsmenu);
 }
 
index d3ec17e9ffd916f49a2b3e3f1b882c9f7a53ca23..c51c45b7dc41f1cd23678cebd89c125ed6594102 100644 (file)
 #ifndef BSE_FSMENU_H
 #define BSE_FSMENU_H
 
+/* XXX could become UserPref */
+#define FSMENU_RECENT_MAX 10
+
 typedef enum FSMenuCategory {
        FS_CATEGORY_SYSTEM,
        FS_CATEGORY_BOOKMARKS,
        FS_CATEGORY_RECENT
 } FSMenuCategory;
 
+struct FSMenu;
+
+struct FSMenu* fsmenu_get              (void);
+
        /** Returns the number of entries in the Fileselect Menu */
-int            fsmenu_get_nentries             (FSMenuCategory category);
+int            fsmenu_get_nentries             (struct FSMenu* fsmenu, FSMenuCategory category);
 
        /** Returns the fsmenu entry at @a index (or NULL if a bad index)
      * or a separator.
         */
-char*  fsmenu_get_entry                (FSMenuCategory category, int index);
+char*  fsmenu_get_entry                (struct FSMenu* fsmenu, FSMenuCategory category, int index);
 
-void   fsmenu_select_entry             (FSMenuCategory category, int index);
+void   fsmenu_select_entry             (struct FSMenu* fsmenu, FSMenuCategory category, int index);
 
-int            fsmenu_is_selected              (FSMenuCategory category, int index);
+int            fsmenu_is_selected              (struct FSMenu* fsmenu, FSMenuCategory category, int index);
 
        /** Sets the position of the  fsmenu entry at @a index */
-void   fsmenu_set_pos          (FSMenuCategory category, int index, short xs, short ys);
+void   fsmenu_set_pos                  (struct FSMenu* fsmenu, FSMenuCategory category, int index, short xs, short ys);
 
        /** Returns the position of the  fsmenu entry at @a index. return value is 1 if successful, 0 otherwise */
-int            fsmenu_get_pos          (FSMenuCategory category, int index, short* xs, short* ys);
+int            fsmenu_get_pos                  (struct FSMenu* fsmenu, FSMenuCategory category, int index, short* xs, short* ys);
 
        /** Inserts a new fsmenu entry with the given @a path.
         * Duplicate entries are not added.
         * @param sorted Should entry be inserted in sorted order?
         */
-void   fsmenu_insert_entry             (FSMenuCategory category, char *path, int sorted, short save);
+void   fsmenu_insert_entry             (struct FSMenu* fsmenu, FSMenuCategory category, char *path, int sorted, short save);
 
        /** Removes the fsmenu entry at the given @a index. */
-void   fsmenu_remove_entry             (FSMenuCategory category, int index);
+void   fsmenu_remove_entry             (struct FSMenu* fsmenu, FSMenuCategory category, int index);
 
        /** saves the 'bookmarks' to the specified file */
-void   fsmenu_write_file(const char *filename);
+void   fsmenu_write_file               (struct FSMenu* fsmenu, const char *filename);
        
        /** reads the 'bookmarks' from the specified file */
-void   fsmenu_read_file(const char *filename);
+void   fsmenu_read_file                (struct FSMenu* fsmenu, const char *filename);
 
        /** Free's all the memory associated with the fsmenu */
-void   fsmenu_free                             (void);
+void   fsmenu_free                             (struct FSMenu* fsmenu);
 
 #endif
 
index d68cde85554bcc5637da9546a2f56b359e4c3911..b19245cba06f3f19aca377d00edfdf1ca57361f5 100644 (file)
@@ -431,13 +431,13 @@ void ED_file_init(void)
 {
        char name[FILE_MAX];
        BLI_make_file_string("/", name, BLI_gethome(), ".Bfs");
-       fsmenu_read_file(name);
+       fsmenu_read_file(fsmenu_get(), name);
        filelist_init_icons();
        IMB_thumb_makedirs();
 }
 
 void ED_file_exit(void)
 {
-       fsmenu_free();
+       fsmenu_free(fsmenu_get());
        filelist_free_icons();
 }