[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21973] branches/blender2.5/blender/source /blender: 2.5: File browser

Brecht Van Lommel brecht at blender.org
Tue Jul 28 18:46:14 CEST 2009


Revision: 21973
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21973
Author:   blendix
Date:     2009-07-28 18:46:14 +0200 (Tue, 28 Jul 2009)

Log Message:
-----------
2.5: File browser

* Side panels now use list widgets.
* Enabled theme colors for side panel.
* Add button in bookmarks panel.
* Operator panel title now uses operator name.
* For unix, added / to system, and home and desktop to bookmarks.

* For opening fileselect with filter, cleaned up the code a bit,
  adding WM_operator_properties_filesel instead of duplicating code.
* Also added filter for all operators calling fileselect, only image
  and file open did it before.
* Hide . files by default, and also hide files ending with ~.

* Added back .. (but not .) in the file list, I really missed this.
* File highlight now only happens when you're actually over a file,
  instead staying after you move the mouse away.
* Fix some redraw/refresh issues.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/blenlib/intern/storage.c
    branches/blender2.5/blender/source/blender/editors/curve/editfont.c
    branches/blender2.5/blender/source/blender/editors/screen/screendump.c
    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/file_panels.c
    branches/blender2.5/blender/source/blender/editors/space_file/filesel.c
    branches/blender2.5/blender/source/blender/editors/space_file/fsmenu.c
    branches/blender2.5/blender/source/blender/editors/space_file/space_file.c
    branches/blender2.5/blender/source/blender/editors/space_image/image_ops.c
    branches/blender2.5/blender/source/blender/editors/space_info/info_ops.c
    branches/blender2.5/blender/source/blender/editors/space_sequencer/sequencer_add.c
    branches/blender2.5/blender/source/blender/editors/space_text/text_ops.c
    branches/blender2.5/blender/source/blender/makesdna/DNA_space_types.h
    branches/blender2.5/blender/source/blender/makesrna/intern/rna_space.c
    branches/blender2.5/blender/source/blender/makesrna/intern/rna_ui.c
    branches/blender2.5/blender/source/blender/makesrna/intern/rna_userdef.c
    branches/blender2.5/blender/source/blender/windowmanager/WM_api.h
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_operators.c

Modified: branches/blender2.5/blender/source/blender/blenlib/intern/storage.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenlib/intern/storage.c	2009-07-28 16:33:02 UTC (rev 21972)
+++ branches/blender2.5/blender/source/blender/blenlib/intern/storage.c	2009-07-28 16:46:14 UTC (rev 21973)
@@ -218,7 +218,7 @@
 {
 	struct dirent *fname;
 	struct dirlink *dlink;
-	int rellen, newnum = 0;
+	int rellen, newnum = 0, len;
 	char buf[256];
 	DIR *dir;
 
@@ -237,13 +237,11 @@
 
 	if ( (dir = (DIR *)opendir(".")) ){
 		while ((fname = (struct dirent*) readdir(dir)) != NULL) {
+			len= strlen(fname->d_name);
 			
-			if(hide_dot && fname->d_name[0]=='.' && fname->d_name[1]!='.' && fname->d_name[1]!=0) {
-			}
-			else if ( ( (fname->d_name[0] == '.') && (fname->d_name[1] == 0) ) ||
-					  ( (fname->d_name[0] == '.') && (fname->d_name[1] == '.') && (fname->d_name[2] == 0)) ) {
-				/* ignore '.' and '..' */
-			}
+			if(hide_dot && fname->d_name[0]=='.' && fname->d_name[1]!='.' && fname->d_name[1]!=0); /* ignore .file */
+			else if(hide_dot && len && fname->d_name[len-1]=='~'); /* ignore file~ */
+			else if (((fname->d_name[0] == '.') && (fname->d_name[1] == 0) )); /* ignore . */
 			else {
 				dlink = (struct dirlink *)malloc(sizeof(struct dirlink));
 				if (dlink){

Modified: branches/blender2.5/blender/source/blender/editors/curve/editfont.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/curve/editfont.c	2009-07-28 16:33:02 UTC (rev 21972)
+++ branches/blender2.5/blender/source/blender/editors/curve/editfont.c	2009-07-28 16:46:14 UTC (rev 21973)
@@ -416,7 +416,7 @@
 	ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
 
 	/* properties */
-	RNA_def_string_file_path(ot->srna, "filename", "", 0, "Filename", "File path of text file to load.");
+	WM_operator_properties_filesel(ot, FOLDERFILE|TEXTFILE);
 }
 
 /******************* paste buffer operator ********************/

Modified: branches/blender2.5/blender/source/blender/editors/screen/screendump.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/screen/screendump.c	2009-07-28 16:33:02 UTC (rev 21972)
+++ branches/blender2.5/blender/source/blender/editors/screen/screendump.c	2009-07-28 16:46:14 UTC (rev 21973)
@@ -173,7 +173,7 @@
 	
 	ot->flag= 0;
 	
-	RNA_def_property(ot->srna, "filename", PROP_STRING, PROP_FILEPATH);
+	WM_operator_properties_filesel(ot, FOLDERFILE|IMAGEFILE);
 	RNA_def_boolean(ot->srna, "full", 1, "Full Screen", "");
 }
 

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-28 16:33:02 UTC (rev 21972)
+++ branches/blender2.5/blender/source/blender/editors/space_file/file_draw.c	2009-07-28 16:46:14 UTC (rev 21973)
@@ -153,7 +153,7 @@
 	
 	uiBut*            but;
 	uiBlock*          block;
-	SpaceFile*        sfile  = (SpaceFile*) CTX_wm_space_data(C);
+	SpaceFile*        sfile  = CTX_wm_space_file(C);
 	FileSelectParams* params = ED_fileselect_get_params(sfile);
 	
 	/* Initialize UI block. */
@@ -345,7 +345,7 @@
 
 void file_calc_previews(const bContext *C, ARegion *ar)
 {
-	SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
+	SpaceFile *sfile= CTX_wm_space_file(C);
 	View2D *v2d= &ar->v2d;
 	
 	ED_fileselect_init_layout(sfile, ar);
@@ -354,7 +354,7 @@
 
 void file_draw_previews(const bContext *C, ARegion *ar)
 {
-	SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
+	SpaceFile *sfile= CTX_wm_space_file(C);
 	FileSelectParams* params= ED_fileselect_get_params(sfile);
 	FileLayout* layout= ED_fileselect_get_layout(sfile, ar);
 	View2D *v2d= &ar->v2d;
@@ -517,7 +517,7 @@
 
 void file_draw_list(const bContext *C, ARegion *ar)
 {
-	SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
+	SpaceFile *sfile= CTX_wm_space_file(C);
 	FileSelectParams* params = ED_fileselect_get_params(sfile);
 	FileLayout* layout= ED_fileselect_get_layout(sfile, ar);
 	View2D *v2d= &ar->v2d;

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-28 16:33:02 UTC (rev 21972)
+++ branches/blender2.5/blender/source/blender/editors/space_file/file_ops.c	2009-07-28 16:46:14 UTC (rev 21973)
@@ -143,14 +143,20 @@
 		params->active_file = last_file;
 
 		if(file && S_ISDIR(file->type)) {
-			/* the path is too long! */
-			if (strlen(params->dir) + strlen(file->relname) >= FILE_MAX ) 
+			/* the path is too long and we are not going up! */
+			if (strcmp(file->relname, "..") && strlen(params->dir) + strlen(file->relname) >= FILE_MAX ) 
 			{
 				// XXX error("Path too long, cannot enter this directory");
 			} else {
-				BLI_cleanup_dir(G.sce, params->dir);
-				strcat(params->dir, file->relname);
-				BLI_add_slash(params->dir);
+				if (strcmp(file->relname, "..")==0) { 	 
+					/* avoids /../../ */ 	 
+					BLI_parent_dir(params->dir); 	 
+				} else {
+					BLI_cleanup_dir(G.sce, params->dir);
+					strcat(params->dir, file->relname);
+					BLI_add_slash(params->dir);
+				}
+
 				params->file[0] = '\0';
 				file_change_dir(sfile);
 				retval = FILE_SELECT_DIR;
@@ -172,7 +178,7 @@
 static int file_border_select_exec(bContext *C, wmOperator *op)
 {
 	ARegion *ar= CTX_wm_region(C);
-	SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
+	SpaceFile *sfile= CTX_wm_space_file(C);
 	short val;
 	rcti rect;
 
@@ -216,24 +222,31 @@
 static int file_select_invoke(bContext *C, wmOperator *op, wmEvent *event)
 {
 	ARegion *ar= CTX_wm_region(C);
-	SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
+	SpaceFile *sfile= CTX_wm_space_file(C);
 	short val;
 	rcti rect;
 
+	if(ar->regiontype != RGN_TYPE_WINDOW)
+		return OPERATOR_CANCELLED;
+
 	rect.xmin = rect.xmax = event->x - ar->winrct.xmin;
 	rect.ymin = rect.ymax = event->y - ar->winrct.ymin;
 	val = event->val;
 
-	if (BLI_in_rcti(&ar->v2d.mask, rect.xmin, rect.ymin)) { 
+	if(!BLI_in_rcti(&ar->v2d.mask, rect.xmin, rect.ymin))
+		return OPERATOR_CANCELLED;
 
-		/* single select, deselect all selected first */
-		file_deselect_all(sfile);
-		if (FILE_SELECT_DIR == file_select(sfile, ar, &rect, val )) {
-			WM_event_add_notifier(C, NC_FILE|ND_FILELIST, NULL);
-		} else {
-			WM_event_add_notifier(C, NC_FILE|ND_PARAMS, NULL);
-		}
-	}
+	/* single select, deselect all selected first */
+	file_deselect_all(sfile);
+
+	if (FILE_SELECT_DIR == file_select(sfile, ar, &rect, val ))
+		WM_event_add_notifier(C, NC_FILE|ND_FILELIST, NULL);
+	else
+		WM_event_add_notifier(C, NC_FILE|ND_PARAMS, NULL);
+
+	WM_event_add_mousemove(C); /* for directory changes */
+	WM_event_add_notifier(C, NC_FILE|ND_PARAMS, NULL);
+
 	return OPERATOR_FINISHED;
 }
 
@@ -254,7 +267,7 @@
 static int file_select_all_invoke(bContext *C, wmOperator *op, wmEvent *event)
 {
 	ScrArea *sa= CTX_wm_area(C);
-	SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
+	SpaceFile *sfile= CTX_wm_space_file(C);
 	int numfiles = filelist_numfiles(sfile->files);
 	int i;
 	int select = 1;
@@ -299,7 +312,7 @@
 
 static int bookmark_select_invoke(bContext *C, wmOperator *op, wmEvent *event)
 {
-	SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
+	SpaceFile *sfile= CTX_wm_space_file(C);
 
 	if(RNA_struct_find_property(op->ptr, "dir")) {
 		char entry[256];
@@ -333,7 +346,7 @@
 static int bookmark_add_invoke(bContext *C, wmOperator *op, wmEvent *event)
 {
 	ScrArea *sa= CTX_wm_area(C);
-	SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
+	SpaceFile *sfile= CTX_wm_space_file(C);
 	struct FSMenu* fsmenu = fsmenu_get();
 	struct FileSelectParams* params= ED_fileselect_get_params(sfile);
 
@@ -398,7 +411,7 @@
 static int loadimages_invoke(bContext *C, wmOperator *op, wmEvent *event)
 {
 	ScrArea *sa= CTX_wm_area(C);
-	SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
+	SpaceFile *sfile= CTX_wm_space_file(C);
 	if (sfile->files) {
 		filelist_loadimage_timer(sfile->files);
 		if (filelist_changed(sfile->files)) {
@@ -425,32 +438,42 @@
 int file_hilight_set(SpaceFile *sfile, ARegion *ar, int mx, int my)
 {
 	FileSelectParams* params;
-	int numfiles, actfile;
+	int numfiles, actfile, origfile;
 	
 	if(sfile==NULL || sfile->files==NULL) return 0;
-	
+
 	numfiles = filelist_numfiles(sfile->files);
 	params = ED_fileselect_get_params(sfile);
 
-	actfile = find_file_mouse(sfile, ar, mx , my, 0);
-	
-	if (params && (actfile >= 0) && (actfile < numfiles) ) {
-		params->active_file=actfile;
-		return 1;
-	} 
-	params->active_file= -1;
-	return 0;
+	origfile= params->active_file;
+
+	mx -= ar->winrct.xmin;
+	my -= ar->winrct.ymin;
+
+	if(BLI_in_rcti(&ar->v2d.mask, mx, my)) {
+		actfile = find_file_mouse(sfile, ar, mx , my, 0);
+
+		if((actfile >= 0) && (actfile < numfiles))
+			params->active_file=actfile;
+		else
+			params->active_file= -1;
+	}
+	else
+		params->active_file= -1;
+
+	return (params->active_file != origfile);
 }
 
 static int file_highlight_invoke(bContext *C, wmOperator *op, wmEvent *event)
 {
 	ARegion *ar= CTX_wm_region(C);
-	SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
+	SpaceFile *sfile= CTX_wm_space_file(C);
+
+	if(!file_hilight_set(sfile, ar, event->x, event->y))
+		return OPERATOR_CANCELLED;
+
+	ED_area_tag_redraw(CTX_wm_area(C));
 	
-	if( file_hilight_set(sfile, ar, event->x - ar->winrct.xmin, event->y - ar->winrct.ymin)) {
-		ED_area_tag_redraw(CTX_wm_area(C));
-	}
-	
 	return OPERATOR_FINISHED;
 }
 
@@ -467,7 +490,7 @@
 
 int file_cancel_exec(bContext *C, wmOperator *unused)
 {
-	SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
+	SpaceFile *sfile= CTX_wm_space_file(C);
 
 	folderlist_free(sfile->folders_prev);
 	folderlist_free(sfile->folders_next);
@@ -492,7 +515,7 @@
 /* sends events now, so things get handled on windowqueue level */
 int file_exec(bContext *C, wmOperator *unused)
 {
-	SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
+	SpaceFile *sfile= CTX_wm_space_file(C);
 	char name[FILE_MAX];
 	
 	if(sfile->op) {
@@ -559,7 +582,7 @@
 
 int file_parent_exec(bContext *C, wmOperator *unused)
 {
-	SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
+	SpaceFile *sfile= CTX_wm_space_file(C);
 	
 	if(sfile->params) {
 		if (BLI_has_parent(sfile->params->dir)) {
@@ -589,7 +612,7 @@
 

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list