[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [35640] trunk/blender/source/blender/ editors/space_file: == file browser ==

Andrea Weikert elubie at gmx.net
Sun Mar 20 11:22:51 CET 2011


Revision: 35640
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=35640
Author:   elubie
Date:     2011-03-20 10:22:51 +0000 (Sun, 20 Mar 2011)
Log Message:
-----------
== file browser ==
Patch from Alexander Kuznetsov: Toggle selection rather than just extending.

Implements behaviour that unintendedly was available with previously using macro operator for selection. This was removed and now the functionality is properly implemented.

Patch accepted with minor changes:
1. Used enum rather than #defines and added value for removing from selection (deselect)
2. Moved if (select) outside file_select_do and improved check for whether last file in selection is actually selected. (Necessary since toggle can deselect and toggle select should still make file active)
3. Additionally fixed check in file_select_invoke to be consistent with border select.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/space_file/file_ops.c
    trunk/blender/source/blender/editors/space_file/filelist.c
    trunk/blender/source/blender/editors/space_file/filelist.h

Modified: trunk/blender/source/blender/editors/space_file/file_ops.c
===================================================================
--- trunk/blender/source/blender/editors/space_file/file_ops.c	2011-03-20 09:38:25 UTC (rev 35639)
+++ trunk/blender/source/blender/editors/space_file/file_ops.c	2011-03-20 10:22:51 UTC (rev 35640)
@@ -162,7 +162,7 @@
 	return sel;
 }
 
-static FileSelect file_select_do(bContext* C, short select, int selected_idx)
+static FileSelect file_select_do(bContext* C, int selected_idx)
 {
 	FileSelect retval = FILE_SELECT_NOTHING;
 	SpaceFile *sfile= CTX_wm_space_file(C);
@@ -170,7 +170,7 @@
 	int numfiles = filelist_numfiles(sfile->files);
 
 	/* make the selected file active */
-	if (select && (selected_idx >= 0) && (selected_idx < numfiles)) {
+	if ( (selected_idx >= 0) && (selected_idx < numfiles)) {
 		struct direntry* file = filelist_file(sfile->files, selected_idx);
 		params->active_file = selected_idx;
 
@@ -205,11 +205,12 @@
 }
 
 
-static FileSelect file_select(bContext* C, const rcti* rect, short select, short fill)
+static FileSelect file_select(bContext* C, const rcti* rect, FileSelType select, short fill)
 {
 	SpaceFile *sfile= CTX_wm_space_file(C);
 	FileSelect retval = FILE_SELECT_NOTHING;
 	FileSelection sel= file_selection_get(C, rect, fill); /* get the selection */
+	struct direntry *file;
 	
 	/* flag the files as selected in the filelist */
 	filelist_select(sfile->files, &sel, select, ACTIVEFILE);
@@ -217,8 +218,12 @@
 	/* Don't act on multiple selected files */
 	if (sel.first != sel.last) select = 0;
 
-	retval = file_select_do(C, select, sel.last);
-	
+	/* Check last selection, if selected, act on the file or dir */
+	file = filelist_file(sfile->files, sel.last);
+	if (file->flags & ACTIVEFILE) {
+		retval = file_select_do(C, sel.last);
+	}
+
 	/* update operator for name change event */
 	file_draw_check_cb(C, NULL, NULL);
 	
@@ -249,7 +254,7 @@
 		sel = file_selection_get(C, &rect, 0);
 		if ( (sel.first != params->sel_first) || (sel.last != params->sel_last) ) {
 			file_deselect_all(sfile, HILITED_FILE);
-			filelist_select(sfile->files, &sel, 1, HILITED_FILE);
+			filelist_select(sfile->files, &sel, FILE_SEL_ADD, HILITED_FILE);
 			WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_PARAMS, NULL);
 		}
 		params->sel_first = sel.first; params->sel_last = sel.last;
@@ -278,7 +283,7 @@
 
 	BLI_isect_rcti(&(ar->v2d.mask), &rect, &rect);
 
-	ret = file_select(C, &rect, select, 0);
+	ret = file_select(C, &rect, select ? FILE_SEL_ADD : FILE_SEL_REMOVE, 0);
 	if (FILE_SELECT_DIR == ret) {
 		WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_LIST, NULL);
 	} else if (FILE_SELECT_FILE == ret) {
@@ -308,6 +313,7 @@
 {
 	ARegion *ar= CTX_wm_region(C);
 	SpaceFile *sfile= CTX_wm_space_file(C);
+	FileSelect ret;
 	rcti rect;
 	int extend = RNA_boolean_get(op->ptr, "extend");
 	int fill = RNA_boolean_get(op->ptr, "fill");
@@ -324,9 +330,10 @@
 	/* single select, deselect all selected first */
 	if (!extend) file_deselect_all(sfile, ACTIVEFILE);
 
-	if (FILE_SELECT_DIR == file_select(C, &rect, 1, fill))
+	ret = file_select(C, &rect, extend ? FILE_SEL_TOGGLE : FILE_SEL_ADD, fill);
+	if (FILE_SELECT_DIR == ret)
 		WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_LIST, NULL);
-	else
+	else if (FILE_SELECT_FILE == ret)
 		WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_PARAMS, NULL);
 
 	WM_event_add_mousemove(C); /* for directory changes */

Modified: trunk/blender/source/blender/editors/space_file/filelist.c
===================================================================
--- trunk/blender/source/blender/editors/space_file/filelist.c	2011-03-20 09:38:25 UTC (rev 35639)
+++ trunk/blender/source/blender/editors/space_file/filelist.c	2011-03-20 10:22:51 UTC (rev 35640)
@@ -926,7 +926,7 @@
 	}
 }
 
-void filelist_select(struct FileList* filelist, FileSelection* sel, short select, unsigned int flag)
+void filelist_select(struct FileList* filelist, FileSelection* sel, FileSelType select, unsigned int flag)
 {
 	/* select all valid files between first and last indicated */
 	if ( (sel->first >= 0) && (sel->first < filelist->numfiltered) && (sel->last >= 0) && (sel->last < filelist->numfiltered) ) {
@@ -934,10 +934,17 @@
 		for (current_file = sel->first; current_file <= sel->last; current_file++) {	
 			struct direntry* file = filelist_file(filelist, current_file);
 			
-			if (select) 
-				file->flags |= flag;
-			else
-				file->flags &= ~flag;
+			switch (select) {
+				case FILE_SEL_REMOVE:
+					file->flags &= ~flag;
+					break;
+				case FILE_SEL_ADD:
+					file->flags |= flag;
+					break;
+				case FILE_SEL_TOGGLE:
+					file->flags ^= flag;
+					break;
+			}
 		}
 	}
 }

Modified: trunk/blender/source/blender/editors/space_file/filelist.h
===================================================================
--- trunk/blender/source/blender/editors/space_file/filelist.h	2011-03-20 09:38:25 UTC (rev 35639)
+++ trunk/blender/source/blender/editors/space_file/filelist.h	2011-03-20 10:22:51 UTC (rev 35640)
@@ -52,6 +52,11 @@
 struct ReportList;
 struct FileSelection;
 
+typedef enum FileSelType {
+	FILE_SEL_REMOVE = 0,
+	FILE_SEL_ADD =	1,
+	FILE_SEL_TOGGLE	 = 2
+} FileSelType;
 
 struct FileList *	filelist_new(short type);
 void				filelist_init_icons(void);
@@ -63,7 +68,7 @@
 const char *		filelist_dir(struct FileList* filelist);
 void				filelist_setdir(struct FileList* filelist, const char *dir);
 struct direntry *	filelist_file(struct FileList* filelist, int index);
-void				filelist_select(struct FileList* filelist, FileSelection* sel, short select, unsigned int flag);
+void				filelist_select(struct FileList* filelist, FileSelection* sel, FileSelType select, unsigned int flag);
 void				filelist_hidedot(struct FileList* filelist, short hide);
 void				filelist_setfilter(struct FileList* filelist, unsigned int filter);
 void				filelist_setfilter_types(struct FileList* filelist, const char *filter_glob);




More information about the Bf-blender-cvs mailing list