[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [19270] branches/blender2.5/blender/source /blender/editors/space_file: 2.5 filebrowser

Andrea Weikert elubie at gmx.net
Thu Mar 12 20:37:01 CET 2009


Revision: 19270
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19270
Author:   elubie
Date:     2009-03-12 20:36:59 +0100 (Thu, 12 Mar 2009)

Log Message:
-----------
2.5 filebrowser
- 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.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/editors/space_file/file_draw.c
    branches/blender2.5/blender/source/blender/editors/space_file/file_ops.c
    branches/blender2.5/blender/source/blender/editors/space_file/fsmenu.c
    branches/blender2.5/blender/source/blender/editors/space_file/fsmenu.h
    branches/blender2.5/blender/source/blender/editors/space_file/space_file.c

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-03-12 15:28:00 UTC (rev 19269)
+++ branches/blender2.5/blender/source/blender/editors/space_file/file_draw.c	2009-03-12 19:36:59 UTC (rev 19270)
@@ -546,8 +546,9 @@
 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 @@
 	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 @@
 				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 @@
 			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);
 		}
 	}
 

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-03-12 15:28:00 UTC (rev 19269)
+++ branches/blender2.5/blender/source/blender/editors/space_file/file_ops.c	2009-03-12 19:36:59 UTC (rev 19270)
@@ -318,7 +318,7 @@
 
 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 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 @@
 		}
 		
 		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 @@
 		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);
 	}
 				

Modified: branches/blender2.5/blender/source/blender/editors/space_file/fsmenu.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_file/fsmenu.c	2009-03-12 15:28:00 UTC (rev 19269)
+++ branches/blender2.5/blender/source/blender/editors/space_file/fsmenu.c	2009-03-12 19:36:59 UTC (rev 19270)
@@ -62,83 +62,97 @@
 	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;
 
-static FSMenuCategory selected_category= FS_CATEGORY_SYSTEM;
-static int selected_entry= 0;
+	FSMenuCategory selected_category;
+	int selected_entry;
 
-void fsmenu_select_entry(FSMenuCategory category, int index)
+} FSMenu;
+
+static FSMenu *g_fsmenu = NULL;
+
+struct FSMenu* fsmenu_get(void)
 {
-	selected_category = category;
-	selected_entry = index;
+	if (!g_fsmenu) {
+		g_fsmenu=MEM_callocN(sizeof(struct FSMenu), "fsmenu");
+	}
+	return g_fsmenu;
 }
 
-int	fsmenu_is_selected(FSMenuCategory category, int index)
+void fsmenu_select_entry(struct FSMenu* fsmenu, FSMenuCategory category, int index)
 {
-	return (category==selected_category) && (index==selected_entry);
+	fsmenu->selected_category = category;
+	fsmenu->selected_entry = index;
 }
 
-static FSMenuEntry *fsmenu_get(FSMenuCategory category)
+int	fsmenu_is_selected(struct FSMenu* fsmenu, FSMenuCategory category, int index)
 {
-	FSMenuEntry *fsmenu = NULL;
+	return (category==fsmenu->selected_category) && (index==fsmenu->selected_entry);
+}
 
+static FSMenuEntry *fsmenu_get_category(struct FSMenu* fsmenu, FSMenuCategory category)
+{
+	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 @@
 	}
 }
 
-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 @@
 }
 
 
-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 @@
 		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 @@
 			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,24 +245,33 @@
 	}
 }
 
-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);
+		}
+	}
 	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 @@
 				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);

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list