[Bf-blender-cvs] [0fa9f796bba] asset-engine: Heavily rework Amber's data model.
Bastien Montagne
noreply at git.blender.org
Sat Aug 19 18:27:21 CEST 2017
Commit: 0fa9f796bbac8f70fb433ab0c213f9fc5f675ebd
Author: Bastien Montagne
Date: Sat Aug 19 18:23:46 2017 +0200
Branches: asset-engine
https://developer.blender.org/rB0fa9f796bbac8f70fb433ab0c213f9fc5f675ebd
Heavily rework Amber's data model.
Since we want to be able to edit repo from within Blender, we'll need
UI-compatible representation of the repo.
Alas, PropertyGroup py instances are regenerated all the time, which
means we cannot store py-only data in those, so we have to go to a
triple representation of repo here (the JSON/dict one, the effective py
classes, and the UI-compatible PropertyGroup-based one).
Note that this is rather heavily WIP commit, it most certainly breaks
several things, but at least the basic repo listing from filebrowser is
working again...
===================================================================
M release/scripts/startup/bl_operators/amber/__init__.py
M release/scripts/startup/bl_operators/amber/engine.py
A release/scripts/startup/bl_operators/amber/repository.py
M release/scripts/startup/bl_operators/amber/ui.py
M release/scripts/startup/bl_operators/amber/utils.py
===================================================================
diff --git a/release/scripts/startup/bl_operators/amber/__init__.py b/release/scripts/startup/bl_operators/amber/__init__.py
index 5c2f91a3a9b..dce5c2b1c62 100644
--- a/release/scripts/startup/bl_operators/amber/__init__.py
+++ b/release/scripts/startup/bl_operators/amber/__init__.py
@@ -22,10 +22,10 @@
# as a startup module!
-from . import (engine, operators, ui)
+from . import (repository, engine, operators, ui)
-classes = engine.classes + operators.classes + ui.classes
+classes = repository.classes + engine.classes + operators.classes + ui.classes
if __name__ == "__main__": # only for live edit.
diff --git a/release/scripts/startup/bl_operators/amber/engine.py b/release/scripts/startup/bl_operators/amber/engine.py
index 869565cdc4d..fb7c7d7a50c 100644
--- a/release/scripts/startup/bl_operators/amber/engine.py
+++ b/release/scripts/startup/bl_operators/amber/engine.py
@@ -31,6 +31,7 @@ from bpy.props import (
BoolProperty,
IntProperty,
CollectionProperty,
+ PointerProperty,
)
import concurrent.futures as futures
@@ -40,7 +41,7 @@ import stat
import time
import random
-from . import utils
+from . import (repository, utils)
#############
@@ -67,28 +68,6 @@ class AmberJobList(AmberJob):
repo = None
else:
repo = None
- if repo is not None:
- # Convert hexa string to array of four uint32...
- # XXX will have to check endianess mess here, for now always use same one ('network' one).
- repo_uuid = repo["uuid"]
- repo["uuid"] = utils.uuid_unpack(repo_uuid)
- new_entries = {}
- for euuid, e in repo["entries"].items():
- new_variants = {}
- for vuuid, v in e["variants"].items():
- new_revisions = {}
- for ruuid, r in v["revisions"].items():
- new_revisions[utils.uuid_unpack(ruuid)] = r
- new_variants[utils.uuid_unpack(vuuid)] = v
- v["revisions"] = new_revisions
- ruuid = v["revision_default"]
- v["revision_default"] = utils.uuid_unpack(ruuid)
- new_entries[utils.uuid_unpack_asset(repo_uuid, euuid)] = e
- e["variants"] = new_variants
- vuuid = e["variant_default"]
- e["variant_default"] = utils.uuid_unpack(vuuid)
- repo["entries"] = new_entries
- #~ print(repo)
return repo
@staticmethod
@@ -228,36 +207,17 @@ class AmberJobPreviews(AmberJob):
###########################
# Main Asset Engine class.
-class AmberTag(PropertyGroup):
- name = StringProperty(name="Name", description="Tag name")
- priority = IntProperty(name="Priority", default=0, description="Tag priority")
-
- def include_update(self, context):
- if self.use_include:
- self.use_exclude = False
- context.space_data.asset_engine.is_dirty_filtering = True
- use_include = BoolProperty(name="Include", default=False, description="This tag must exist in filtered items",
- update=include_update)
-
- def exclude_update(self, context):
- if self.use_exclude:
- self.use_include = False
- context.space_data.asset_engine.is_dirty_filtering = True
- use_exclude = BoolProperty(name="Exclude", default=False, description="This tag must not exist in filtered items",
- update=exclude_update)
-
-
class AssetEngineAmber(AssetEngine):
bl_label = "Amber"
bl_version = (0 << 16) + (0 << 8) + 4 # Usual maj.min.rev version scheme...
- tags = CollectionProperty(name="Tags", type=AmberTag, description="Filtering tags")
- active_tag_index = IntProperty(name="Active Tag", options={'HIDDEN'})
+ repository_pg = PointerProperty(name="Repository", type=repository.AmberDataRepositoryPG, description="Current Amber repository")
def __init__(self):
self.executor = futures.ThreadPoolExecutor(8) # Using threads for now, if issues arise we'll switch to process.
self.jobs = {}
self.repos = {}
+ self.repository = repository.AmberDataRepository()
self.reset()
@@ -279,63 +239,65 @@ class AssetEngineAmber(AssetEngine):
self.repo = {}
self.dirs = []
+ self.repository.clear()
+
self.sortedfiltered = []
def entry_from_uuid(self, entries, euuid, vuuid, ruuid):
- e = self.repo["entries"][euuid]
+ e = self.repository.assets[euuid]
entry = entries.entries.add()
- entry.uuid = euuid
- entry.name = e["name"]
- entry.description = e["description"]
- entry.type = {e["file_type"]}
- entry.blender_type = e["blen_type"]
+ entry.uuid = e.uuid
+ entry.name = e.name
+ entry.description = e.description
+ entry.type = {e.file_type}
+ entry.blender_type = e.blender_type
act_rev = None
if vuuid == (0, 0, 0, 0):
- for vuuid, v in e["variants"].items():
+ for v in e.variants.values():
variant = entry.variants.add()
- variant.uuid = vuuid
- variant.name = v["name"]
- variant.description = v["description"]
- if vuuid == e["variant_default"]:
+ variant.uuid = v.uuid
+ variant.name = v.name
+ variant.description = v.description
+ if v == e.variant_default:
entry.variants.active = variant
- for ruuid, r in v["revisions"].items():
+ for r in v.revisions.values():
revision = variant.revisions.add()
- revision.uuid = ruuid
- #~ revision.comment = r["comment"]
- revision.size = r["size"]
- revision.timestamp = r["timestamp"]
- if ruuid == v["revision_default"]:
+ revision.uuid = r.uuid
+ #~ revision.comment = r.comment
+ revision.size = r.size
+ revision.timestamp = r.timestamp
+ if r == v.revision_default:
variant.revisions.active = revision
- if vuuid == e["variant_default"]:
+ if v == e.variant_default:
act_rev = r
else:
- v = e["variants"][vuuid]
+ v = e.variants[vuuid]
variant = entry.variants.add()
- variant.uuid = vuuid
- variant.name = v["name"]
- variant.description = v["description"]
+ variant.uuid = v.uuid
+ variant.name = v.name
+ variant.description = v.description
entry.variants.active = variant
if ruuid == (0, 0, 0, 0):
- for ruuid, r in v["revisions"].items():
+ for r in v.revisions.values():
revision = variant.revisions.add()
- revision.uuid = ruuid
- #~ revision.comment = r["comment"]
- revision.size = r["size"]
- revision.timestamp = r["timestamp"]
- if ruuid == v["revision_default"]:
+ revision.uuid = r.uuid
+ #~ revision.comment = r.comment
+ revision.size = r.size
+ revision.timestamp = r.timestamp
+ if r == v.revision_default:
variant.revisions.active = revision
act_rev = r
else:
- r = v["revisions"][ruuid]
+ r = v.revisions[ruuid]
revision = variant.revisions.add()
- revision.uuid = ruuid
- #~ revision.comment = r["comment"]
- revision.size = r["size"]
- revision.timestamp = r["timestamp"]
+ revision.uuid = r.uuid
+ #~ revision.comment = r.comment
+ revision.size = r.size
+ revision.timestamp = r.timestamp
variant.revisions.active = revision
act_rev = r
if act_rev:
- entry.relpath = act_rev["path"]
+ entry.relpath = act_rev.path
# print("added entry for", entry.relpath)
def pretty_version(self, v=None):
@@ -428,25 +390,17 @@ class AssetEngineAmber(AssetEngine):
self.jobs[job_id] = AmberJobList(self.executor, job_id, entries.root_path)
self.root = entries.root_path
if self.repo:
- uuid_repo = self.repo["uuid"]
+ self.repository.from_dict(self.repo, self.root)
+ self.repository.to_pg(self.repository_pg)
+ uuid_repo = tuple(self.repository.uuid)
if utils.amber_repos.get(uuid_repo, None) != self.root:
utils.amber_repos[uuid_repo] = self.root # XXX Not resistant to uuids collisions (use a set instead)...
utils.save_amber_repos()
self.repos[uuid_repo] = self.repo
- entries.nbr_entries = len(self.repo["entries"])
- valid_tags = set()
- for name, prio in sorted(self.repo["tags"].items(), key=lambda i: i[1], reverse=True):
- tag = self.tags.get(name)
- if tag is None:
- tag = self.tags.add()
- tag.name = name
- tag.priority = prio
- valid_tags.add(name)
- for name in (set(self.tags.keys()) - valid_tags):
- del self.tags[name]
+ entries.nbr_entries = len(self.repository.assets)
else:
entries.nbr_entries = len(self.dirs)
- self.tags.clear()
+ self.repository.clear()
return job_id
def update_check(self, job_id, uuids):
@@ -486,24 +440,25 @@ class AssetEngineAmber(AssetEngine):
repo = self.repos.get(repo_uuid, None)
if repo is None:
repo = self.repos[repo_uuid] = AmberJobLis
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list