[Bf-blender-cvs] [336c7f9] asset-engine: AssetEngine WIP support of new filelisting behavior in filebrowser...
Bastien Montagne
noreply at git.blender.org
Thu Apr 9 20:36:29 CEST 2015
Commit: 336c7f9ba59b4b7080f419dfcf584a968b697020
Author: Bastien Montagne
Date: Thu Apr 9 14:04:21 2015 +0200
Branches: asset-engine
https://developer.blender.org/rB336c7f9ba59b4b7080f419dfcf584a968b697020
AssetEngine WIP support of new filelisting behavior in filebrowser...
Nearly working, still have some mem issues to fix.
===================================================================
M release/scripts/startup/bl_operators/amber.py
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/editors/space_file/filelist.h
M source/blender/editors/space_file/space_file.c
M source/blender/makesrna/intern/rna_asset.c
===================================================================
diff --git a/release/scripts/startup/bl_operators/amber.py b/release/scripts/startup/bl_operators/amber.py
index 897dc81..4f51f9a 100644
--- a/release/scripts/startup/bl_operators/amber.py
+++ b/release/scripts/startup/bl_operators/amber.py
@@ -221,6 +221,8 @@ class AssetEngineAmber(AssetEngine):
self.dirs = []
self.tags_source = []
+ self.sortedfiltered = []
+
self.job_uuid = 1
def __del__(self):
@@ -229,80 +231,6 @@ class AssetEngineAmber(AssetEngine):
# Even though it does not seem to be an issue, this is not nice and shall be fixed somehow.
#~ self.executor.shutdown(wait=False)
- def fill_entries(self, entries):
- if entries.root_path != self.root:
- entries.entries.clear()
- self.root = entries.root_path
-
- existing = {}
- for e in entries.entries:
- vd = {}
- existing[e.uuid] = (e, vd)
- for v in e.variants:
- rd = {}
- vd[v.uuid] = (v, rd)
- for r in v.revisions:
- rd[r.uuid] = r
-
- for path, size, timestamp, entry_uuid in self.dirs:
- if entry_uuid in existing:
- continue
- entry = entries.entries.add()
- entry.type = {'DIR'}
- entry.relpath = path
- entry.uuid = entry_uuid
- variant = entry.variants.add()
- entry.variants.active = variant
- rev = variant.revisions.add()
- rev.size = size
- rev.timestamp = timestamp
- variant.revisions.active = rev
-
- if self.repo:
- for euuid, e in self.repo["entries"].items():
- entry_uuid = binascii.unhexlify(euuid)
- entry, existing_vuuids = existing.get(entry_uuid, (None, {}))
- if entry is None:
- entry = entries.entries.add()
- entry.uuid = entry_uuid
- entry.name = e["name"]
- entry.description = e["description"]
- entry.type = {e["file_type"]}
- entry.blender_type = e["blen_type"]
- existing[entry_uuid] = (entry, existing_vuuids) # Not really needed, but for sake of consistency...
- vuuids = {}
- self.uuids[entry.uuid] = (self.root, entry.type, entry.blender_type, vuuids)
- act_rev = None
- for vuuid, v in e["variants"].items():
- variant_uuid = binascii.unhexlify(vuuid)
- variant, existing_ruuids = existing_vuuids.get(variant_uuid, (None, {}))
- if variant is None:
- variant = entry.variants.add()
- variant.uuid = variant_uuid
- variant.name = v["name"]
- variant.description = v["description"]
- existing_vuuids[variant_uuid] = (variant, existing_ruuids) # Not really needed, but for sake of consistency...
- ruuids = vuuids[variant_uuid] = {}
- if vuuid == e["variant_default"]:
- entry.variants.active = variant
- for ruuid, r in v["revisions"].items():
- revision_uuid = binascii.unhexlify(ruuid)
- revision = existing_ruuids.get(revision_uuid, None)
- if revision is None:
- revision = variant.revisions.add()
- revision.uuid = revision_uuid
- #~ revision.comment = r["comment"]
- revision.size = r["size"]
- revision.timestamp = r["timestamp"]
- ruuids[revision_uuid] = (r["path_archive"], r["path"])
- if ruuid == v["revision_default"]:
- variant.revisions.active = revision
- if vuuid == e["variant_default"]:
- act_rev = r
- if act_rev:
- entry.relpath = act_rev["path"]
- self.tags_source = sorted(self.repo["tags"].items(), key=lambda i: i[1], reverse=True)
-
def status(self, job_id):
if job_id:
@@ -330,7 +258,7 @@ class AssetEngineAmber(AssetEngine):
def list_dir(self, job_id, entries):
job = self.jobs.get(job_id, None)
- print(entries.root_path, job_id, job)
+ #~ print(entries.root_path, job_id, job)
if job is not None and isinstance(job, AmberJobList):
if job.root != entries.root_path:
self.jobs[job_id] = AmberJobList(self.executor, job_id, entries.root_path)
@@ -340,7 +268,12 @@ class AssetEngineAmber(AssetEngine):
job_id = self.job_uuid
self.job_uuid += 1
self.jobs[job_id] = AmberJobList(self.executor, job_id, entries.root_path)
- self.fill_entries(entries)
+ if self.repo:
+ entries.nbr_entries = len(self.repo["entries"])
+ self.tags_source[:] = sorted(self.repo["tags"].items(), key=lambda i: i[1], reverse=True)
+ else:
+ entries.nbr_entries = len(self.dirs)
+ self.tags_source.clear()
return job_id
def load_pre(self, uuids, entries):
@@ -362,6 +295,81 @@ class AssetEngineAmber(AssetEngine):
entries.root_path = root_path
return True
+ def sort_filter(self, use_sort, use_filter, filter_glob, filter_search, entries):
+ if use_filter:
+ self.sortedfiltered.clear()
+ if self.repo:
+ for key, val in self.repo["entries"].items():
+ if filter_search and filter_search not in (val["name"] + val["description"]):
+ continue
+ self.sortedfiltered.append((val["name"], key, val))
+ elif self.dirs:
+ for path, size, timestamp, uuid in self.dirs:
+ if filter_search and filter_search not in path:
+ continue
+ self.sortedfiltered.append((path, size, timestamp, uuid))
+ use_sort = True
+ entries.nbr_entries_filtered = len(self.sortedfiltered)
+ if use_sort:
+ self.sortedfiltered.sort(key=lambda e: e[0])
+ return True
+ return False
+
+ def entries_block_get(self, start_index, end_index, entries):
+ if self.repo:
+ for _n, euuid, e in self.sortedfiltered[start_index:end_index]:
+ uuid = binascii.unhexlify(euuid)
+ entry = entries.entries.add()
+ entry.uuid = uuid
+ entry.name = e["name"]
+ entry.description = e["description"]
+ entry.type = {e["file_type"]}
+ entry.blender_type = e["blen_type"]
+ vuuids = {}
+ self.uuids[entry.uuid] = (self.root, entry.type, entry.blender_type, vuuids)
+ act_rev = None
+ for vuuid, v in e["variants"].items():
+ variant_uuid = binascii.unhexlify(vuuid)
+ variant, existing_ruuids = existing_vuuids.get(variant_uuid, (None, {}))
+ if variant is None:
+ variant = entry.variants.add()
+ variant.uuid = variant_uuid
+ variant.name = v["name"]
+ variant.description = v["description"]
+ existing_vuuids[variant_uuid] = (variant, existing_ruuids) # Not really needed, but for sake of consistency...
+ ruuids = vuuids[variant_uuid] = {}
+ if vuuid == e["variant_default"]:
+ entry.variants.active = variant
+ for ruuid, r in v["revisions"].items():
+ revision_uuid = binascii.unhexlify(ruuid)
+ revision = existing_ruuids.get(revision_uuid, None)
+ if revision is None:
+ revision = variant.revisions.add()
+ revision.uuid = revision_uuid
+ #~ revision.comment = r["comment"]
+ revision.size = r["size"]
+ revision.timestamp = r["timestamp"]
+ ruuids[revision_uuid] = (r["path_archive"], r["path"])
+ if ruuid == v["revision_default"]:
+ variant.revisions.active = revision
+ if vuuid == e["variant_default"]:
+ act_rev = r
+ if act_rev:
+ entry.relpath = act_rev["path"]
+ else:
+ for path, size, timestamp, uuid in self.sortedfiltered[start_index:end_index]:
+ entry = entries.entries.add()
+ entry.type = {'DIR'}
+ entry.relpath = path
+ entry.uuid = uuid
+ variant = entry.variants.add()
+ entry.variants.active = variant
+ rev = variant.revisions.add()
+ rev.size = size
+ rev.timestamp = timestamp
+ variant.revisions.active = rev
+ return True
+
##########
# UI stuff
diff --git a/source/blender/blenkernel/BKE_asset.h b/source/blender/blenkernel/BKE_asset.h
index ea98001..78566f4 100644
--- a/source/blender/blenkernel/BKE_asset.h
+++ b/source/blender/blenkernel/BKE_asset.h
@@ -76,6 +76,7 @@ typedef void (*ae_kill)(struct AssetEngine *engine, const int job_id);
/* 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);
@@ -85,7 +86,8 @@ typedef int (*ae_ensure_entries)(struct As
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list