[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