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

Andrea Weikert elubie at gmx.net
Sun Jul 26 14:40:48 CEST 2009


Revision: 21923
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21923
Author:   elubie
Date:     2009-07-26 14:40:44 +0200 (Sun, 26 Jul 2009)

Log Message:
-----------
2.5 filebrowser
Bugfixes:
* crash when loading file that has filebrowser open
* file size over 2GB/4GB? shows negative number 
Other:
* tried to improve drawing speed a bit by only drawing the files actually shown and improving refresh behaviour a bit.

Note: Solution I found so far is to use the non-standard _stat64, as far as I could see, WIN64 should work without that patch (Genscher, please check and if needed you can enable this too by removing the !defined(WIN64) )
This probably needs to be fixed in at least one other place (BLI_filesize), will look into this once this fix proves stable enough)

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/blenlib/BLI_storage_types.h
    branches/blender2.5/blender/source/blender/blenlib/intern/storage.c
    branches/blender2.5/blender/source/blender/editors/include/ED_fileselect.h
    branches/blender2.5/blender/source/blender/editors/space_file/file_draw.c
    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/windowmanager/WM_types.h

Modified: branches/blender2.5/blender/source/blender/blenlib/BLI_storage_types.h
===================================================================
--- branches/blender2.5/blender/source/blender/blenlib/BLI_storage_types.h	2009-07-26 11:57:27 UTC (rev 21922)
+++ branches/blender2.5/blender/source/blender/blenlib/BLI_storage_types.h	2009-07-26 12:40:44 UTC (rev 21923)
@@ -55,7 +55,11 @@
 	char	*string;
 	mode_t	type;
 	char	*relname;
+#if defined(WIN32) && !defined(WIN64) && (_MSC_VER>=1500)
+	struct _stat64 s;
+#else
 	struct	stat s;
+#endif
 	unsigned int	flags;
 	char	size[16];
 	char	mode1[4];

Modified: branches/blender2.5/blender/source/blender/blenlib/intern/storage.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenlib/intern/storage.c	2009-07-26 11:57:27 UTC (rev 21922)
+++ branches/blender2.5/blender/source/blender/blenlib/intern/storage.c	2009-07-26 12:40:44 UTC (rev 21923)
@@ -265,7 +265,13 @@
 				while(dlink){
 					memset(&files[actnum], 0 , sizeof(struct direntry));
 					files[actnum].relname = dlink->name;
+// use 64 bit file size, only needed for WIN32, WIN64 should work fine with stat. 
+// Excluding other than current MSVC compiler until able to test.
+#if defined(WIN32) && !defined(WIN64) && (_MSC_VER>=1500)
+					_stat64(dlink->name,&files[actnum].s);
+#else
 					stat(dlink->name,&files[actnum].s);
+#endif
 					files[actnum].type=files[actnum].s.st_mode;
 					files[actnum].flags = 0;
 					totnum++;
@@ -361,7 +367,7 @@
 		 * will buy us some time until files get bigger than 4GB or until
 		 * everyone starts using __USE_FILE_OFFSET64 or equivalent.
 		 */
-		st_size= (off_t)files[num].s.st_size;
+		st_size= files[num].s.st_size;
 
 		if (st_size > 1024*1024*1024) {
 			sprintf(files[num].size, "%.2f GB", ((double)st_size)/(1024*1024*1024));	

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-26 11:57:27 UTC (rev 21922)
+++ branches/blender2.5/blender/source/blender/editors/include/ED_fileselect.h	2009-07-26 12:40:44 UTC (rev 21923)
@@ -64,6 +64,7 @@
 	short width;
 	short height;
 	short flag;
+	short dirty;
 	float column_widths[MAX_FILE_COLUMN];
 } FileLayout;
 
@@ -80,6 +81,7 @@
 
 FileLayout* ED_fileselect_get_layout(struct SpaceFile *sfile, struct ARegion *ar);
 
+int ED_fileselect_layout_numfiles(FileLayout* layout, struct ARegion *ar);
 int ED_fileselect_layout_offset(FileLayout* layout, int x, int y);
 
 void ED_fileselect_layout_tilepos(FileLayout* layout, int tile, short *x, short *y);

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-26 11:57:27 UTC (rev 21922)
+++ branches/blender2.5/blender/source/blender/editors/space_file/file_draw.c	2009-07-26 12:40:44 UTC (rev 21923)
@@ -505,6 +505,7 @@
 	struct FileList* files = sfile->files;
 	struct direntry *file;
 	int numfiles;
+	int numfiles_layout;
 	int colorid = 0;
 	short sx, sy;
 	int offset;
@@ -543,8 +544,10 @@
 
 	sx = ar->v2d.cur.xmin + layout->tile_border_x;
 	sy = ar->v2d.cur.ymax - layout->tile_border_y;
+	
+	numfiles_layout = ED_fileselect_layout_numfiles(layout, ar);
 
-	for (i=offset; (i < numfiles); ++i)
+	for (i=offset; (i < numfiles) && (i<offset+numfiles_layout); ++i)
 	{
 		ED_fileselect_layout_tilepos(layout, i, &sx, &sy);
 		sx += v2d->tot.xmin+2;

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-26 11:57:27 UTC (rev 21922)
+++ branches/blender2.5/blender/source/blender/editors/space_file/filesel.c	2009-07-26 12:40:44 UTC (rev 21923)
@@ -141,7 +141,22 @@
 	sfile->params->title[0] = '\0';
 }
 
+int ED_fileselect_layout_numfiles(FileLayout* layout, struct ARegion *ar)
+{
+	int numfiles;
+	short width, height;
 
+	if (layout->flag & FILE_LAYOUT_HOR) {
+		short width = ar->v2d.cur.xmax - ar->v2d.cur.xmin - 2*layout->tile_border_x;
+		numfiles = width/layout->tile_w + 1;
+	} else {
+		short height = ar->v2d.cur.ymax - ar->v2d.cur.ymin - 2*layout->tile_border_y;
+		numfiles = height/layout->tile_h + 1;
+	}
+
+	return layout->columns*layout->rows;
+}
+
 int ED_fileselect_layout_offset(FileLayout* layout, int x, int y)
 {
 	int offsetx, offsety;
@@ -227,68 +242,78 @@
 
 void ED_fileselect_init_layout(struct SpaceFile *sfile, struct ARegion *ar)
 {
-	FileSelectParams* params = ED_fileselect_get_params(sfile);
+	FileSelectParams *params = ED_fileselect_get_params(sfile);
+	FileLayout *layout=0;
 	View2D *v2d= &ar->v2d;
 	int maxlen = 0;
-	int numfiles = filelist_numfiles(sfile->files);
-	int textheight = file_font_pointsize();
+	int numfiles;
+	int textheight;
 	if (sfile->layout == 0) {
 		sfile->layout = MEM_callocN(sizeof(struct FileLayout), "file_layout");
-	}
+		sfile->layout->dirty = 1;
+	} 
+
+	if (!sfile->layout->dirty) return;
+
+	numfiles = filelist_numfiles(sfile->files);
+	textheight = file_font_pointsize();
+	layout = sfile->layout;
+
 	if (params->display == FILE_IMGDISPLAY) {
-		sfile->layout->prv_w = 96;
-		sfile->layout->prv_h = 96;
-		sfile->layout->tile_border_x = 6;
-		sfile->layout->tile_border_y = 6;
-		sfile->layout->prv_border_x = 6;
-		sfile->layout->prv_border_y = 6;
-		sfile->layout->tile_w = sfile->layout->prv_w + 2*sfile->layout->prv_border_x;
-		sfile->layout->tile_h = sfile->layout->prv_h + 2*sfile->layout->prv_border_y + textheight;
-		sfile->layout->width= (v2d->cur.xmax - v2d->cur.xmin - 2*sfile->layout->tile_border_x);
-		sfile->layout->columns= sfile->layout->width / (sfile->layout->tile_w + 2*sfile->layout->tile_border_x);
-		if(sfile->layout->columns > 0)
-			sfile->layout->rows= numfiles/sfile->layout->columns + 1; // XXX dirty, modulo is zero
+		layout->prv_w = 96;
+		layout->prv_h = 96;
+		layout->tile_border_x = 6;
+		layout->tile_border_y = 6;
+		layout->prv_border_x = 6;
+		layout->prv_border_y = 6;
+		layout->tile_w = layout->prv_w + 2*layout->prv_border_x;
+		layout->tile_h = layout->prv_h + 2*layout->prv_border_y + textheight;
+		layout->width= (v2d->cur.xmax - v2d->cur.xmin - 2*layout->tile_border_x);
+		layout->columns= layout->width / (layout->tile_w + 2*layout->tile_border_x);
+		if(layout->columns > 0)
+			layout->rows= numfiles/layout->columns + 1; // XXX dirty, modulo is zero
 		else {
-			sfile->layout->columns = 1;
-			sfile->layout->rows= numfiles + 1; // XXX dirty, modulo is zero
+			layout->columns = 1;
+			layout->rows= numfiles + 1; // XXX dirty, modulo is zero
 		}
-		sfile->layout->height= sfile->layout->rows*(sfile->layout->tile_h+2*sfile->layout->tile_border_y) + sfile->layout->tile_border_y*2;
-		sfile->layout->flag = FILE_LAYOUT_VER;
+		layout->height= sfile->layout->rows*(layout->tile_h+2*layout->tile_border_y) + layout->tile_border_y*2;
+		layout->flag = FILE_LAYOUT_VER;
 	} else {
-		sfile->layout->prv_w = 0;
-		sfile->layout->prv_h = 0;
-		sfile->layout->tile_border_x = 8;
-		sfile->layout->tile_border_y = 2;
-		sfile->layout->prv_border_x = 0;
-		sfile->layout->prv_border_y = 0;
-		sfile->layout->tile_h = textheight*3/2;
-		sfile->layout->height= v2d->cur.ymax - v2d->cur.ymin;
-		sfile->layout->rows = sfile->layout->height / (sfile->layout->tile_h + 2*sfile->layout->tile_border_y);;
+		layout->prv_w = 0;
+		layout->prv_h = 0;
+		layout->tile_border_x = 8;
+		layout->tile_border_y = 2;
+		layout->prv_border_x = 0;
+		layout->prv_border_y = 0;
+		layout->tile_h = textheight*3/2;
+		layout->height= v2d->cur.ymax - v2d->cur.ymin - 2*layout->tile_border_y;
+		layout->rows = layout->height / (layout->tile_h + 2*layout->tile_border_y);
         
-		column_widths(sfile->files, sfile->layout);
+		column_widths(sfile->files, layout);
 
 		if (params->display == FILE_SHORTDISPLAY) {
-			maxlen = sfile->layout->column_widths[COLUMN_NAME] +
-					 sfile->layout->column_widths[COLUMN_SIZE];
+			maxlen = layout->column_widths[COLUMN_NAME] +
+					 layout->column_widths[COLUMN_SIZE];
 			maxlen += 20+2*10; // for icon and space between columns
 		} else {
-			maxlen = sfile->layout->column_widths[COLUMN_NAME] +
-					 sfile->layout->column_widths[COLUMN_DATE] +
-					 sfile->layout->column_widths[COLUMN_TIME] +
-					 sfile->layout->column_widths[COLUMN_SIZE];
+			maxlen = layout->column_widths[COLUMN_NAME] +
+					 layout->column_widths[COLUMN_DATE] +
+					 layout->column_widths[COLUMN_TIME] +
+					 layout->column_widths[COLUMN_SIZE];
 					/* XXX add mode1, mode2, mode3, owner columns for non-windows platforms */
 			maxlen += 20+4*10; // for icon and space between columns
 		}
-		sfile->layout->tile_w = maxlen + 40;
-		if(sfile->layout->rows > 0)
-			sfile->layout->columns = numfiles/sfile->layout->rows + 1; // XXX dirty, modulo is zero
+		layout->tile_w = maxlen + 40;
+		if(layout->rows > 0)
+			layout->columns = numfiles/layout->rows + 1; // XXX dirty, modulo is zero
 		else {
-			sfile->layout->rows = 1;
-			sfile->layout->columns = numfiles + 1; // XXX dirty, modulo is zero
+			layout->rows = 1;
+			layout->columns = numfiles + 1; // XXX dirty, modulo is zero
 		}
-		sfile->layout->width = sfile->layout->columns * (sfile->layout->tile_w + 2*sfile->layout->tile_border_x) + sfile->layout->tile_border_x*2;
-		sfile->layout->flag = FILE_LAYOUT_HOR;
-	} 
+		layout->width = sfile->layout->columns * (layout->tile_w + 2*layout->tile_border_x) + layout->tile_border_x*2;
+		layout->flag = FILE_LAYOUT_HOR;
+	}
+	layout->dirty= 0;
 }
 
 FileLayout* ED_fileselect_get_layout(struct SpaceFile *sfile, struct ARegion *ar)

Modified: branches/blender2.5/blender/source/blender/editors/space_file/space_file.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_file/space_file.c	2009-07-26 11:57:27 UTC (rev 21922)
+++ branches/blender2.5/blender/source/blender/editors/space_file/space_file.c	2009-07-26 12:40:44 UTC (rev 21923)
@@ -153,6 +153,7 @@
 /* spacetype; init callback, area size changes, screen set, etc */
 static void file_init(struct wmWindowManager *wm, ScrArea *sa)
 {
+	printf("file_init\n");
 }
 
 
@@ -200,6 +201,9 @@
 	}

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list