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

Andrea Weikert elubie at gmx.net
Wed Jan 21 20:28:29 CET 2009


Revision: 18611
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18611
Author:   elubie
Date:     2009-01-21 20:28:28 +0100 (Wed, 21 Jan 2009)

Log Message:
-----------
2.5 filebrowser
cleaned up selection code
new operators: 
- highlight file under cursor
- select all/nothing (AKEY)
- border select (BKEY)
changed selection to be invoked by LEFTMOUSE

Modified Paths:
--------------
    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/space_file.c
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_operators.c

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-01-21 19:11:20 UTC (rev 18610)
+++ branches/blender2.5/blender/source/blender/editors/space_file/file_intern.h	2009-01-21 19:28:28 UTC (rev 18611)
@@ -47,7 +47,10 @@
 
 /* file_ops.h */
 struct wmOperatorType;
+void ED_FILE_OT_highlight(struct wmOperatorType *ot);
 void ED_FILE_OT_select(struct wmOperatorType *ot);
+void ED_FILE_OT_select_all(struct wmOperatorType *ot);
+void ED_FILE_OT_border_select(struct wmOperatorType *ot);
 void ED_FILE_OT_select_bookmark(struct wmOperatorType *ot);
 void ED_FILE_OT_loadimages(struct wmOperatorType *ot);
 

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-01-21 19:11:20 UTC (rev 18610)
+++ branches/blender2.5/blender/source/blender/editors/space_file/file_ops.c	2009-01-21 19:28:28 UTC (rev 18611)
@@ -42,11 +42,14 @@
 #include "ED_screen.h"
 #include "ED_fileselect.h"
 
+#include "RNA_access.h"
+#include "RNA_define.h"
+
+#include "UI_view2d.h"
+
 #include "WM_api.h"
 #include "WM_types.h"
 
-#include "UI_view2d.h"
-
 #include "file_intern.h"
 #include "filelist.h"
 #include "fsmenu.h"
@@ -60,162 +63,201 @@
 #define ACTIVATE			1
 #define INACTIVATE			2
 
+/* ---------- FILE SELECTION ------------ */
 
-static void set_active_file_thumbs(SpaceFile *sfile, FileSelectParams* params, struct ARegion* ar, short mval[])
+static int find_file_mouse_hor(SpaceFile *sfile, struct ARegion* ar, short x, short y)
 {
-	float x,y;
+	float fx,fy;
+	int offsetx, offsety;
+	int columns;
 	int active_file = -1;
-	struct direntry* file;
-	int offsetx, offsety;
 	int numfiles = filelist_numfiles(sfile->files);
-	int columns;
+	View2D* v2d = &ar->v2d;
 
-	View2D* v2d = &ar->v2d;
-	UI_view2d_region_to_view(v2d, mval[0], mval[1], &x, &y);
-	
-	offsetx = (x - (v2d->cur.xmin+sfile->tile_border_x))/(sfile->tile_w + 2*sfile->tile_border_x);
-	offsety = (v2d->tot.ymax - sfile->tile_border_y - y)/(sfile->tile_h + 2*sfile->tile_border_y);
+	UI_view2d_region_to_view(v2d, x, y, &fx, &fy);
+
+	offsetx = (fx - (v2d->cur.xmin+sfile->tile_border_x))/(sfile->tile_w + 2*sfile->tile_border_x);
+	offsety = (v2d->tot.ymax - sfile->tile_border_y - fy)/(sfile->tile_h + 2*sfile->tile_border_y);
 	columns = (v2d->cur.xmax - v2d->cur.xmin) / (sfile->tile_w+ 2*sfile->tile_border_x);
 	active_file = offsetx + columns*offsety;
 
-	if (active_file >= 0 && active_file < numfiles )
+	if ( (active_file < 0) || (active_file >= numfiles) )
 	{
-		params->active_file = active_file;
-		if (params->selstate & ACTIVATE) {
-			file = filelist_file(sfile->files, params->active_file);
-			file->flags |= ACTIVE;
-		}			
+		active_file = -1;
 	}
+	return active_file;
 }
 
 
-static void set_active_file(SpaceFile *sfile, FileSelectParams* params, struct ARegion* ar, short mval[])
+static int find_file_mouse_vert(SpaceFile *sfile, struct ARegion* ar, short x, short y)
 {
 	int offsetx, offsety;
-	float x,y;
+	float fx,fy;
 	int active_file = -1;
 	int numfiles = filelist_numfiles(sfile->files);
 	int rows;
-	struct direntry* file;
+	View2D* v2d = &ar->v2d;
 
-	View2D* v2d = &ar->v2d;
-	UI_view2d_region_to_view(v2d, mval[0], mval[1], &x, &y);
+	UI_view2d_region_to_view(v2d, x, y, &fx, &fy);
 	
-	offsetx = (x-sfile->tile_border_x)/(sfile->tile_w + sfile->tile_border_x);
-	offsety = (v2d->cur.ymax-y-sfile->tile_border_y)/(sfile->tile_h + sfile->tile_border_y);
+	offsetx = (fx-sfile->tile_border_x)/(sfile->tile_w + sfile->tile_border_x);
+	offsety = (v2d->cur.ymax-fy-sfile->tile_border_y)/(sfile->tile_h + sfile->tile_border_y);
 	rows = (v2d->cur.ymax - v2d->cur.ymin - 2*sfile->tile_border_y) / (sfile->tile_h+sfile->tile_border_y);
 	active_file = rows*offsetx + offsety;
-	if ( (active_file >= 0) && (active_file < numfiles) )
+	if ( (active_file < 0) || (active_file >= numfiles) )
 	{
-		params->active_file = active_file;
-		if (params->selstate & ACTIVATE) {
-			file = filelist_file(sfile->files, params->active_file);
-			file->flags |= ACTIVE;
-		}			
-	} 
+		active_file = -1;
+	}
+	return active_file;
 }
 
+static void file_deselect_all(SpaceFile* sfile)
+{
+	int numfiles = filelist_numfiles(sfile->files);
+	int i;
 
-static void set_active_bookmark(FileSelectParams* params, struct ARegion* ar, short y)
-{
-	int nentries = fsmenu_get_nentries();
-	short posy = ar->v2d.mask.ymax - TILE_BORDER_Y - y;
-	params->active_bookmark = ((float)posy / (U.fontsize*3.0f/2.0f));
-	if (params->active_bookmark < 0 || params->active_bookmark > nentries) {
-		params->active_bookmark = -1;
+	for ( i=0; i < numfiles; ++i) {
+		struct direntry* file = filelist_file(sfile->files, i);
+		if (file && (file->flags & ACTIVE)) {
+			file->flags &= ~ACTIVE;
+		}
 	}
 }
 
-static void mouse_select(SpaceFile* sfile, FileSelectParams* params, ARegion* ar, short *mval)
+static void file_select(SpaceFile* sfile, FileSelectParams* params, ARegion* ar, const rcti* rect, short val)
 {
+	int first_file = -1;
+	int last_file = -1;
+	int act_file;
+	short selecting = (val == LEFTMOUSE);
+
 	int numfiles = filelist_numfiles(sfile->files);
-	if(mval[0]>ar->v2d.mask.xmin && mval[0]<ar->v2d.mask.xmax
-		&& mval[1]>ar->v2d.mask.ymin && mval[1]<ar->v2d.mask.ymax) {
-			params->selstate = NOTACTIVE;
-			if (params->display) {
-				set_active_file_thumbs(sfile, params, ar, mval);
+
+	params->selstate = NOTACTIVE;
+	if (params->display) {
+		first_file = find_file_mouse_hor(sfile, ar, rect->xmin, rect->ymax);
+		last_file = find_file_mouse_hor(sfile, ar, rect->xmax, rect->ymin);
+	} else {
+		first_file = find_file_mouse_vert(sfile, ar, rect->xmin, rect->ymax);
+		last_file = find_file_mouse_vert(sfile, ar, rect->xmax, rect->ymin);
+	}
+	
+	/* select all valid files between first and last indicated */
+	if ( (first_file >= 0) && (first_file < numfiles) && (last_file >= 0) && (last_file < numfiles) ) {
+		for (act_file = first_file; act_file <= last_file; act_file++) {
+			struct direntry* file = filelist_file(sfile->files, act_file);
+			if (selecting) 
+				file->flags |= ACTIVE;
+			else
+				file->flags &= ~ACTIVE;
+		}
+	}
+	
+	/* make the last file active */
+	if (last_file >= 0 && last_file < numfiles) {
+		struct direntry* file = filelist_file(sfile->files, last_file);
+		params->active_file = last_file;
+
+		if(file && S_ISDIR(file->type)) {
+			/* the path is too long and we are not going up! */
+			if (strcmp(file->relname, ".") &&
+				strcmp(file->relname, "..") &&
+				strlen(params->dir) + strlen(file->relname) >= FILE_MAX ) 
+			{
+				// XXX error("Path too long, cannot enter this directory");
 			} else {
-				set_active_file(sfile, params, ar, mval);
+				if (strcmp(file->relname, "..")==0) {
+					/* avoids /../../ */
+					BLI_parent_dir(params->dir);
+				} else {
+					strcat(params->dir, file->relname);
+					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;
 			}
-			if (params->active_file >= 0 && params->active_file < numfiles) {
-				struct direntry* file = filelist_file(sfile->files, params->active_file);
-				
-				if(file && S_ISDIR(file->type)) {
-					/* the path is too long and we are not going up! */
-					if (strcmp(file->relname, ".") &&
-						strcmp(file->relname, "..") &&
-						strlen(params->dir) + strlen(file->relname) >= FILE_MAX ) 
-					{
-						// XXX error("Path too long, cannot enter this directory");
-					} else {
-						if (strcmp(file->relname, "..")==0) {
-							/* avoids /../../ */
-							BLI_parent_dir(params->dir);
-						} else {
-							strcat(params->dir, file->relname);
-							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;
-					}
-				}
-				else if (file)
-				{
-					if (file->relname) {
-						BLI_strncpy(params->file, file->relname, FILE_MAXFILE);
-						/* XXX
-						if(event==MIDDLEMOUSE && filelist_gettype(sfile->files)) 
-							imasel_execute(sfile);
-						*/
-					}
-					
-				}	
+		}
+		else if (file)
+		{
+			if (file->relname) {
+				BLI_strncpy(params->file, file->relname, FILE_MAXFILE);
 				/* XXX
-				if(BIF_filelist_gettype(sfile->files)==FILE_MAIN) {
-					active_imasel_object(sfile);
-				}
+				if(event==MIDDLEMOUSE && filelist_gettype(sfile->files)) 
+					imasel_execute(sfile);
 				*/
 			}
+			
+		}	
+		/* XXX
+		if(BIF_filelist_gettype(sfile->files)==FILE_MAIN) {
+			active_imasel_object(sfile);
 		}
+		*/
+	}
 }
 
-static void mouse_select_bookmark(SpaceFile* sfile, ARegion* ar, short *mval)
+
+
+static int file_border_select_exec(bContext *C, wmOperator *op)
 {
-	if(mval[0]>ar->v2d.mask.xmin && mval[0]<ar->v2d.mask.xmax
-	&& mval[1]>ar->v2d.mask.ymin && mval[1]<ar->v2d.mask.ymax) {
-		char *selected;
-		set_active_bookmark(sfile->params, ar, mval[1]);
-		selected= fsmenu_get_entry(sfile->params->active_bookmark);			
-		/* which string */
-		if (selected) {
-			FileSelectParams* params = sfile->params;
-			BLI_strncpy(params->dir, selected, 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;
-		}
-	}
+	ARegion *ar= CTX_wm_region(C);
+	SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
+	short val;
+	rcti rect;
+
+	val= RNA_int_get(op->ptr, "event_type");
+	rect.xmin= RNA_int_get(op->ptr, "xmin");
+	rect.ymin= RNA_int_get(op->ptr, "ymin");
+	rect.xmax= RNA_int_get(op->ptr, "xmax");
+	rect.ymax= RNA_int_get(op->ptr, "ymax");
+
+	file_select(sfile, sfile->params, ar, &rect, val );
+	WM_event_add_notifier(C, NC_WINDOW, NULL);
+	return OPERATOR_FINISHED;
 }
 
+void ED_FILE_OT_border_select(wmOperatorType *ot)
+{
+	/* identifiers */
+	ot->name= "Activate/Select File";
+	ot->idname= "ED_FILE_OT_border_select";
+	
+	/* api callbacks */
+	ot->invoke= WM_border_select_invoke;
+	ot->exec= file_border_select_exec;
+	ot->modal= WM_border_select_modal;
+
+	/* rna */

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list