[Bf-blender-cvs] [649b09d] asset-experiments: Make selection & co really working even during listing process.

Bastien Montagne noreply at git.blender.org
Tue Jun 16 17:33:32 CEST 2015


Commit: 649b09debb99d9ae91522a2c83fbf9c30790bdd8
Author: Bastien Montagne
Date:   Tue Jun 16 16:59:29 2015 +0200
Branches: asset-experiments
https://developer.blender.org/rB649b09debb99d9ae91522a2c83fbf9c30790bdd8

Make selection & co really working even during listing process.

This commit replaces `filelist_numfiles()` by `filelist_files_ensure()`. The later
also returns number of visible files (i.e. filtered ones), but also ensures filelist
is filetered and sorted.

Otherwise, during listing process, operators could be executed between an update of the listing job,
and the refresh from the file space - i.e. at a time filelist is virtually empty (from filebrowser PoV).

Also, got rid of 'need_refresh', this ended up being unused...

===================================================================

M	source/blender/editors/space_file/file_draw.c
M	source/blender/editors/space_file/file_ops.c
M	source/blender/editors/space_file/filelist.c
M	source/blender/editors/space_file/filelist.h
M	source/blender/editors/space_file/filesel.c
M	source/blender/editors/space_file/space_file.c

===================================================================

diff --git a/source/blender/editors/space_file/file_draw.c b/source/blender/editors/space_file/file_draw.c
index aa8fa7a..42f5e67 100644
--- a/source/blender/editors/space_file/file_draw.c
+++ b/source/blender/editors/space_file/file_draw.c
@@ -492,7 +492,7 @@ void file_draw_list(const bContext *C, ARegion *ar)
 	const bool small_size = SMALL_SIZE_CHECK(params->thumbnail_size);
 	const bool update_stat_strings = small_size != SMALL_SIZE_CHECK(layout->curr_size);
 
-	numfiles = filelist_numfiles(files);
+	numfiles = filelist_files_ensure(files);
 	
 	if (params->display != FILE_IMGDISPLAY) {
 
diff --git a/source/blender/editors/space_file/file_ops.c b/source/blender/editors/space_file/file_ops.c
index 674446d..a26571a 100644
--- a/source/blender/editors/space_file/file_ops.c
+++ b/source/blender/editors/space_file/file_ops.c
@@ -99,7 +99,7 @@ static void file_deselect_all(SpaceFile *sfile, unsigned int flag)
 {
 	FileSelection sel;
 	sel.first = 0;
-	sel.last = filelist_numfiles(sfile->files) - 1;
+	sel.last = filelist_files_ensure(sfile->files) - 1;
 	
 	filelist_entries_select_index_range_set(sfile->files, &sel, FILE_SEL_REMOVE, flag, CHECK_ALL);
 }
@@ -139,7 +139,7 @@ static FileSelection file_selection_get(bContext *C, const rcti *rect, bool fill
 {
 	ARegion *ar = CTX_wm_region(C);
 	SpaceFile *sfile = CTX_wm_space_file(C);
-	int numfiles = filelist_numfiles(sfile->files);
+	int numfiles = filelist_files_ensure(sfile->files);
 	FileSelection sel;
 
 	sel = find_file_mouse_rect(sfile, ar, rect);
@@ -168,7 +168,7 @@ static FileSelect file_select_do(bContext *C, int selected_idx, bool do_diropen)
 	FileSelect retval = FILE_SELECT_NOTHING;
 	SpaceFile *sfile = CTX_wm_space_file(C);
 	FileSelectParams *params = ED_fileselect_get_params(sfile);
-	int numfiles = filelist_numfiles(sfile->files);
+	int numfiles = filelist_files_ensure(sfile->files);
 	const FileDirEntry *file;
 
 	/* make the selected file active */
@@ -226,7 +226,7 @@ static FileSelect file_select_do(bContext *C, int selected_idx, bool do_diropen)
  */
 static bool file_is_any_selected(struct FileList *files)
 {
-	const int numfiles = filelist_numfiles(files);
+	const int numfiles = filelist_files_ensure(files);
 	int i;
 
 	/* Is any file selected ? */
@@ -420,7 +420,7 @@ static int file_select_invoke(bContext *C, wmOperator *op, const wmEvent *event)
 
 	if (sfile && sfile->params) {
 		int idx = sfile->params->highlight_file;
-		int numfiles = filelist_numfiles(sfile->files);
+		int numfiles = filelist_files_ensure(sfile->files);
 
 		if ((idx >= 0) && (idx < numfiles)) {
 			struct FileDirEntry *file = filelist_file(sfile->files, idx);
@@ -571,7 +571,7 @@ static bool file_walk_select_do(
         const bool extend, const bool fill)
 {
 	struct FileList *files = sfile->files;
-	const int numfiles = filelist_numfiles(files);
+	const int numfiles = filelist_files_ensure(files);
 	const bool has_selection = file_is_any_selected(files);
 	const int active_old = params->active_file;
 	int active_new = -1;
@@ -685,7 +685,7 @@ static int file_select_all_exec(bContext *C, wmOperator *UNUSED(op))
 	ScrArea *sa = CTX_wm_area(C);
 	SpaceFile *sfile = CTX_wm_space_file(C);
 	FileSelection sel;
-	const int numfiles = filelist_numfiles(sfile->files);
+	const int numfiles = filelist_files_ensure(sfile->files);
 	const bool has_selection = file_is_any_selected(sfile->files);
 
 	sel.first = 0; 
@@ -1022,7 +1022,7 @@ int file_highlight_set(SpaceFile *sfile, ARegion *ar, int mx, int my)
 
 	if (sfile == NULL || sfile->files == NULL) return 0;
 
-	numfiles = filelist_numfiles(sfile->files);
+	numfiles = filelist_files_ensure(sfile->files);
 	params = ED_fileselect_get_params(sfile);
 
 	origfile = params->highlight_file;
@@ -1136,7 +1136,7 @@ void file_sfile_to_operator(wmOperator *op, SpaceFile *sfile, char *filepath)
 	/* this is called on operators check() so clear collections first since
 	 * they may be already set. */
 	{
-		int i, numfiles = filelist_numfiles(sfile->files);
+		int i, numfiles = filelist_files_ensure(sfile->files);
 
 		if ((prop = RNA_struct_find_property(op->ptr, "files"))) {
 			PointerRNA itemptr;
@@ -1264,9 +1264,10 @@ int file_exec(bContext *C, wmOperator *exec_op)
 		/* when used as a macro, for doubleclick, 
 		 * to prevent closing when doubleclicking on .. item */
 		if (RNA_boolean_get(exec_op->ptr, "need_active")) {
+			const int numfiles = filelist_files_ensure(sfile->files);
 			int i, active = 0;
 			
-			for (i = 0; i < filelist_numfiles(sfile->files); i++) {
+			for (i = 0; i < numfiles; i++) {
 				if (filelist_entry_select_index_get(sfile->files, i, CHECK_ALL)) {
 					active = 1;
 					break;
@@ -1459,7 +1460,7 @@ static int file_smoothscroll_invoke(bContext *C, wmOperator *UNUSED(op), const w
 	if (sfile->smoothscroll_timer == NULL || sfile->smoothscroll_timer != event->customdata)
 		return OPERATOR_PASS_THROUGH;
 	
-	numfiles = filelist_numfiles(sfile->files);
+	numfiles = filelist_files_ensure(sfile->files);
 
 	/* check if we are editing a name */
 	for (i = 0; i < numfiles; ++i) {
@@ -1955,7 +1956,7 @@ static int file_rename_exec(bContext *C, wmOperator *UNUSED(op))
 	
 	if (sfile->params) {
 		int idx = sfile->params->highlight_file;
-		int numfiles = filelist_numfiles(sfile->files);
+		int numfiles = filelist_files_ensure(sfile->files);
 		if ( (0 <= idx) && (idx < numfiles) ) {
 			FileDirEntry *file = filelist_file(sfile->files, idx);
 			filelist_entry_select_index_set(sfile->files, idx, FILE_SEL_ADD, FILE_SEL_EDITING, CHECK_ALL);
@@ -1976,7 +1977,7 @@ static int file_rename_poll(bContext *C)
 
 	if (sfile && sfile->params) {
 		int idx = sfile->params->highlight_file;
-		int numfiles = filelist_numfiles(sfile->files);
+		int numfiles = filelist_files_ensure(sfile->files);
 
 		if ((0 <= idx) && (idx < numfiles)) {
 			FileDirEntry *file = filelist_file(sfile->files, idx);
@@ -2022,7 +2023,7 @@ static int file_delete_poll(bContext *C)
 
 	if (sfile && sfile->params) {
 		char dir[FILE_MAX];
-		int numfiles = filelist_numfiles(sfile->files);
+		int numfiles = filelist_files_ensure(sfile->files);
 		int i;
 		int num_selected = 0;
 
@@ -2049,7 +2050,7 @@ int file_delete_exec(bContext *C, wmOperator *UNUSED(op))
 	SpaceFile *sfile = CTX_wm_space_file(C);
 	ScrArea *sa = CTX_wm_area(C);
 	FileDirEntry *file;
-	int numfiles = filelist_numfiles(sfile->files);
+	int numfiles = filelist_files_ensure(sfile->files);
 	int i;
 
 	for (i = 0; i < numfiles; i++) {
diff --git a/source/blender/editors/space_file/filelist.c b/source/blender/editors/space_file/filelist.c
index 0a67a2d..67804bf 100644
--- a/source/blender/editors/space_file/filelist.c
+++ b/source/blender/editors/space_file/filelist.c
@@ -274,7 +274,6 @@ typedef struct FileList {
 	short prv_h;
 
 	bool force_reset;
-	bool force_refresh;
 	bool filelist_ready;
 	bool filelist_pending;
 
@@ -490,14 +489,9 @@ static int compare_extension(void *UNUSED(user_data), const void *a1, const void
 	return BLI_natstrcmp(name1, name2);
 }
 
-bool filelist_need_sorting(struct FileList *filelist)
-{
-	return filelist->need_sorting && (filelist->sort != FILE_SORT_NONE);
-}
-
 void filelist_sort(struct FileList *filelist)
 {
-	if (filelist_need_sorting(filelist)) {
+	if (filelist->need_sorting && (filelist->sort != FILE_SORT_NONE)) {
 		filelist->need_sorting = false;
 
 		switch (filelist->sort) {
@@ -1267,11 +1261,6 @@ BlendHandle *filelist_lib(struct FileList *filelist)
 	return filelist->libfiledata;
 }
 
-int filelist_numfiles(struct FileList *filelist)
-{
-	return filelist->filelist.nbr_entries_filtered;
-}
-
 static const char *fileentry_uiname(const char *root, const char *relpath, const int typeflag, char *buff)
 {
 	char *name = NULL;
@@ -1348,15 +1337,18 @@ bool filelist_pending(struct FileList *filelist)
 	return filelist->filelist_pending;
 }
 
-bool filelist_need_refresh(struct FileList *filelist)
+/**
+ * Limited version of full update done by space_file's file_refresh(), to be used by operators and such.
+ * Ensures given filelist is ready to be used (i.e. it is filtered and sorted), unless it is tagged for a full refresh.
+ */
+int filelist_files_ensure(FileList *filelist)
 {
-	return (BLI_listbase_is_empty(&filelist->filelist.entries) || filelist->need_filtering ||
-	        filelist->force_reset || filelist->force_refresh || filelist->need_sorting);
-}
+	if (!filelist_force_reset(filelist) || !filelist_empty(filelist)) {
+		filelist_sort(filelist);
+		filelist_filter(filelist);
+	}
 
-void filelist_clear_refresh(struct FileList *filelist)
-{
-	filelist->force_refresh = false;
+	return filelist->filelist.nbr_entries_filtered;;
 }
 
 static FileDirEntry *filelist_file_create_entry(FileList *filelist, const int index)
@@ -2527,7 +2519,6 @@ static void filelist_readjob_update(void *flrjv)
 
 		flrj->filelist->need_sorting = true;
 		flrj->filelist->need_filtering = true;
-		flrj->filelist->force_refresh = true;
 	}
 
 	/* if no new_nbr_entries, this is NOP */
diff --git a/source/blender/editors/space_file/filelist.h b/source/blender/editors/space_file/filelist.h
index 173305a..60faee5 100644
--- a/source/blender/editors/space_file/filelist.h
+++ b/source/blender/editors/space_file/filelist.h
@@ -66,7 +66,6 @@ int                 folderlist_clear_next(struct SpaceFile *sfile);
 
 
 void                filelist_setsorting(struct FileList *filelist, const short sort);
-bool                filelist_need_sorting(struct FileList *filelist);
 void                filelist_sort(struct FileList *filelist);
 
 void                filelist_setfilter_options(struct FileList *filelist, const bool hide_dot, const bool hide_parent,
@@ -89,8 +88,8 @@ void                filelist_free(struct FileList *filelist);
 const char *        filelist_dir(struct FileList *filelist);
 void                filelist_setdir(struct FileList *filelist, char *r_dir);
 
+int                 filelist_files_ensure(struct FileList *filelist);
 int                 filelist_empty(struct FileList *filelist);
-int                 filelist_numfiles(struct FileList *filelist);
 FileDirEntry *      filelist_file(struct FileList *filelist, int index);
 int                 filelist_file_findpath(struct FileList *filelist, const char *file);
 F

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list