[Bf-blender-cvs] [744c029] asset-engine: AssetEngine: Add needed API for new 'on demand' entries listing from FileBrowser.

Bastien Montagne noreply at git.blender.org
Thu Apr 2 17:35:04 CEST 2015


Commit: 744c029d012ba7748cd8eb87b277669b5e18240a
Author: Bastien Montagne
Date:   Thu Apr 2 17:11:33 2015 +0200
Branches: asset-engine
https://developer.blender.org/rB744c029d012ba7748cd8eb87b277669b5e18240a

AssetEngine: Add needed API for new 'on demand' entries listing from FileBrowser.

Also use that new API in filebrowser - only partially for now, at least
it does not crash anymore even if 100% empty...

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

M	source/blender/blenkernel/BKE_asset.h
M	source/blender/blenkernel/intern/asset.c
M	source/blender/editors/space_file/filelist.c
M	source/blender/makesrna/intern/rna_asset.c

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

diff --git a/source/blender/blenkernel/BKE_asset.h b/source/blender/blenkernel/BKE_asset.h
index 7ee314a..5714998 100644
--- a/source/blender/blenkernel/BKE_asset.h
+++ b/source/blender/blenkernel/BKE_asset.h
@@ -74,13 +74,23 @@ typedef void (*ae_kill)(struct AssetEngine *engine, const int job_id);
  * It is the responsability of the engine to start/stop background processes to actually perform tasks as/if needed.
  */
 
-/* Return (list) everything available at given root path. */
+/* List everything available at given root path - only returns numbers of entries! */
 typedef int (*ae_list_dir)(struct AssetEngine *engine, const int job_id, struct FileDirEntryArr *entries_r);
 /* Ensure given direntries are really available for append/link (some kind of 'anticipated loading'...). */
 typedef int (*ae_ensure_entries)(struct AssetEngine *engine, const int job_id, struct AssetUUIDList *uuids);
 
 /* ***** All callbacks below are blocking. They shall be completed upon return. ***** */
 
+/* Perform sorting and/or filtering on engines' side.
+ * Note that engine is assumed to feature its own sorting/filtering settings!
+ * Number of available filtered entries is to be set in entries_r.
+ */
+typedef bool (*ae_sort_filter)(struct AssetEngine *engine, const bool sort, const bool filter, struct FileDirEntryArr *entries_r);
+
+/* Return specified block of entries in entries_r. */
+typedef bool (*ae_entries_block_get)(struct AssetEngine *engine, const int start_index, const int end_index,
+                                     struct FileDirEntryArr *entries_r);
+
 /* 'pre-loading' hook, called before opening/appending/linking given entries.
  * Note first given uuid is the one of 'active' entry, and first entry in returned list will be considered as such too.
  * E.g. allows the engine to ensure entries' paths are actually valid by downloading requested data, etc.
@@ -111,6 +121,8 @@ typedef struct AssetEngineType {
 	ae_kill kill;
 
 	ae_list_dir list_dir;
+	ae_sort_filter sort_filter;
+	ae_entries_block_get entries_block_get;
 	ae_ensure_entries ensure_entries;
 
 	ae_load_pre load_pre;
diff --git a/source/blender/blenkernel/intern/asset.c b/source/blender/blenkernel/intern/asset.c
index d5df5f4..48d0a02 100644
--- a/source/blender/blenkernel/intern/asset.c
+++ b/source/blender/blenkernel/intern/asset.c
@@ -326,6 +326,7 @@ void BKE_filedir_entryarr_clear(FileDirEntryArr *array)
 	}
 	BLI_freelistN(&array->entries);
     array->nbr_entries = 0;
+	array->nbr_entries_filtered = 0;
 }
 
 bool BKE_filedir_entry_is_selected(FileDirEntry *entry, FileCheckType check)
diff --git a/source/blender/editors/space_file/filelist.c b/source/blender/editors/space_file/filelist.c
index 6ec2637..34d3cc0 100644
--- a/source/blender/editors/space_file/filelist.c
+++ b/source/blender/editors/space_file/filelist.c
@@ -1372,6 +1372,41 @@ int filelist_file_findpath(struct FileList *filelist, const char *filename)
 	return -1;
 }
 
+/* Helper, low-level, it assumes cursor + size <= FILELIST_ENTRYCACHESIZE */
+static bool filelist_file_cache_block_do(struct FileList *filelist, const int start_index, const int size, int cursor)
+{
+	FileListEntryCache *cache = &filelist->filelist_cache;
+
+	if (filelist->ae) {
+		FileDirEntryArr tmp_arr;
+		FileDirEntry *tmp_entry;
+		int i;
+
+		if (!filelist->ae->type->entries_block_get) {
+			printf("%s: Asset Engine %s does not implement 'entries_block_get'...\n", __func__, filelist->ae->type->name);
+			return false;
+		}
+
+		tmp_arr = filelist->filelist;
+		BLI_listbase_clear(&tmp_arr.entries);
+		if (!filelist->ae->type->entries_block_get(filelist->ae, start_index, start_index + size, &tmp_arr)) {
+			BKE_filedir_entryarr_clear(&tmp_arr);
+			return false;
+		}
+
+		for (i = 0, tmp_entry = tmp_arr.entries.first; i < size; i++, cursor++, tmp_entry = tmp_entry->next) {
+			cache->block_entries[cursor] = tmp_entry;
+		}
+	}
+	else {
+		FileListIntern *intern = &filelist->filelist_intern;
+		memcpy(&cache->block_entries[cursor], &intern->filtered[start_index],
+		       sizeof(cache->block_entries[cursor]) * size);
+	}
+
+	return false;
+}
+
 /* Load in cache all entries "around" given index (as much as block cache may hold). */
 bool filelist_file_cache_block(struct FileList *filelist, const int index)
 {
@@ -1412,8 +1447,9 @@ bool filelist_file_cache_block(struct FileList *filelist, const int index)
 //		printf("Full Recaching!\n");
 
 		/* New cached block does not overlap existing one, simple. */
-		memcpy(cache->block_entries, &filelist->filelist_intern.filtered[start_index],
-		       sizeof(cache->block_entries[0]) * (end_index - start_index));
+		if (!filelist_file_cache_block_do(filelist, start_index, end_index - start_index, 0)) {
+			return false;
+		}
 
 		if (cache->previews_pool) {
 			filelist_cache_previews_clear(cache);
@@ -1451,11 +1487,13 @@ bool filelist_file_cache_block(struct FileList *filelist, const int index)
 			}
 
 			if (size2) {
-				memcpy(&cache->block_entries[idx2], &filelist->filelist_intern.filtered[end_index - size2],
-					   sizeof(cache->block_entries[0]) * size2);
+				if (!filelist_file_cache_block_do(filelist, end_index - size2, size2, idx2)) {
+					return false;
+				}
+			}
+			if (!filelist_file_cache_block_do(filelist, end_index - size1 - size2, size1, idx1)) {
+				return false;
 			}
-			memcpy(&cache->block_entries[idx1], &filelist->filelist_intern.filtered[end_index - size1 - size2],
-				   sizeof(cache->block_entries[0]) * size1);
 
 			if (cache->previews_pool) {
 				i = size1 + size2;
@@ -1491,11 +1529,13 @@ bool filelist_file_cache_block(struct FileList *filelist, const int index)
 			}
 
 			if (size2) {
-				memcpy(&cache->block_entries[idx2], &filelist->filelist_intern.filtered[start_index + size1],
-					   sizeof(cache->block_entries[0]) * size2);
+				if (!filelist_file_cache_block_do(filelist, start_index + size1, size2, idx2)) {
+					return false;
+				}
+			}
+			if (!filelist_file_cache_block_do(filelist, start_index, size1, idx1)) {
+				return false;
 			}
-			memcpy(&cache->block_entries[idx1], &filelist->filelist_intern.filtered[start_index],
-				   sizeof(cache->block_entries[0]) * size1);
 
 			cache->block_cursor = idx1;
 
diff --git a/source/blender/makesrna/intern/rna_asset.c b/source/blender/makesrna/intern/rna_asset.c
index 73d53de..0d66b66 100644
--- a/source/blender/makesrna/intern/rna_asset.c
+++ b/source/blender/makesrna/intern/rna_asset.c
@@ -434,6 +434,66 @@ static bool rna_ae_load_pre(AssetEngine *engine, AssetUUIDList *uuids, struct Fi
 	return ret_success;
 }
 
+static bool rna_ae_sort_filter(AssetEngine *engine, const bool use_sort, const bool use_filter, FileDirEntryArr *entries_r)
+{
+	extern FunctionRNA rna_AssetEngine_sort_filter_func;
+	PointerRNA ptr;
+	PropertyRNA *parm;
+	ParameterList list;
+	FunctionRNA *func;
+
+	void *ret;
+	bool ret_changed;
+
+	RNA_pointer_create(NULL, engine->type->ext.srna, engine, &ptr);
+	func = &rna_AssetEngine_sort_filter_func;
+
+	RNA_parameter_list_create(&list, &ptr, func);
+	RNA_parameter_set_lookup(&list, "use_sort", &use_sort);
+	RNA_parameter_set_lookup(&list, "use_filter", &use_filter);
+	RNA_parameter_set_lookup(&list, "entries", &entries_r);
+	engine->type->ext.call(NULL, &ptr, func, &list);
+
+	parm = RNA_function_find_parameter(NULL, func, "changed_return");
+	RNA_parameter_get(&list, parm, &ret);
+	ret_changed= *(bool *)ret;
+
+	RNA_parameter_list_free(&list);
+
+	return ret_changed;
+}
+
+static bool rna_ae_entries_block_get(
+        AssetEngine *engine, const int start_index, const int end_index, FileDirEntryArr *entries_r)
+{
+	extern FunctionRNA rna_AssetEngine_entries_block_get_func;
+	PointerRNA ptr;
+	PropertyRNA *parm;
+	ParameterList list;
+	FunctionRNA *func;
+
+	void *ret;
+	bool ret_success;
+
+	RNA_pointer_create(NULL, engine->type->ext.srna, engine, &ptr);
+	func = &rna_AssetEngine_entries_block_get_func;
+
+	RNA_parameter_list_create(&list, &ptr, func);
+	RNA_parameter_set_lookup(&list, "start_index", &start_index);
+	RNA_parameter_set_lookup(&list, "end_index", &end_index);
+	RNA_parameter_set_lookup(&list, "entries", &entries_r);
+	engine->type->ext.call(NULL, &ptr, func, &list);
+
+	parm = RNA_function_find_parameter(NULL, func, "success_return");
+	RNA_parameter_get(&list, parm, &ret);
+	ret_success= *(bool *)ret;
+
+	RNA_parameter_list_free(&list);
+
+	return ret_success;
+}
+
+
 /* AssetEngine registration */
 
 static void rna_AssetEngine_unregister(Main *UNUSED(bmain), StructRNA *type)
@@ -455,7 +515,7 @@ static StructRNA *rna_AssetEngine_register(Main *bmain, ReportList *reports, voi
 	AssetEngineType *aet, dummyaet = {NULL};
 	AssetEngine dummyengine = {NULL};
 	PointerRNA dummyptr;
-	int have_function[5];
+	int have_function[7];
 
 	/* setup dummy engine & engine type to store static properties in */
 	dummyengine.type = &dummyaet;
@@ -496,6 +556,9 @@ static StructRNA *rna_AssetEngine_register(Main *bmain, ReportList *reports, voi
 
 	aet->load_pre = (have_function[4]) ? rna_ae_load_pre : NULL;
 
+	aet->sort_filter = (have_function[5]) ? rna_ae_sort_filter : NULL;
+	aet->entries_block_get = (have_function[6]) ? rna_ae_entries_block_get : NULL;
+
 	BLI_addtail(&asset_engines, aet);
 
 	return aet->ext.srna;
@@ -885,6 +948,26 @@ static void rna_def_asset_engine(BlenderRNA *brna)
 	parm = RNA_def_boolean(func, "success_return", 0, "", "Success");
 	RNA_def_function_output(func, parm);
 
+	/* Sorting/filtering callback */
+	func = RNA_def_function(srna, "sort_filter", NULL);
+	RNA_def_function_ui_description(func, "Sort and/or filter the assets (on engine's side)");
+	RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL | FUNC_ALLOW_WRITE);
+	RNA_def_boolean(func, "use_sort", 0, "", "Whether to (re-)sort assets");
+	RNA_def_boolean(func, "use_filter", 0, "", "Whether to (re-)filter assets");
+	RNA_def_pointer(func, "entries", "AssetList", "", "List of asset entries proposed to user by the asset engine");
+	parm = RNA_def_boolean(func, "changed_return", 0, "", "Whether list of available entries was changed");
+	RNA_def_function_output(func, parm);
+
+	/* Block of entries by-index getter callback */
+	func = RNA_def_function(srna, "entries_block_get", NULL);
+	RNA_def_function_ui_descrip

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list