[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