[Bf-blender-cvs] [61bb923c4f8] asset-engine: Add basic handling of 'bookmarks' of Amber repositories.

Bastien Montagne noreply at git.blender.org
Tue Sep 5 17:39:02 CEST 2017


Commit: 61bb923c4f8d04ed819649c4b09278e9eeff81fc
Author: Bastien Montagne
Date:   Tue Sep 5 17:38:08 2017 +0200
Branches: asset-engine
https://developer.blender.org/rB61bb923c4f8d04ed819649c4b09278e9eeff81fc

Add basic handling of 'bookmarks' of Amber repositories.

Still some glitches to fix (and missing features), but mostly working on
basic level.

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

M	release/scripts/startup/bl_operators/amber/engine.py
M	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/engine.py b/release/scripts/startup/bl_operators/amber/engine.py
index 8e5761261f7..8872a81b7fb 100644
--- a/release/scripts/startup/bl_operators/amber/engine.py
+++ b/release/scripts/startup/bl_operators/amber/engine.py
@@ -45,6 +45,8 @@ from . import (repository, utils)
 from .repository import (
         AmberDataRepository,
         AmberDataRepositoryPG,
+
+        AmberDataRepositoryList,
         AmberDataRepositoryListPG,
         )
 
@@ -210,6 +212,9 @@ class AssetEngineAmber(AssetEngine):
         self.repos = {}
         self.repository = AmberDataRepository()
 
+        self.repositories = AmberDataRepositoryList()
+        self.repositories.to_pg(self.repositories_pg)
+
         self.reset()
 
         self.job_uuid = 1
@@ -384,9 +389,9 @@ class AssetEngineAmber(AssetEngine):
             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, None))[1] != self.root:
-                utils.amber_repos[uuid_repo] = (self.repository.name, self.root)  # XXX Not resistant to uuids collisions (use a set instead)...
-                utils.save_amber_repos()
+            if self.repositories.repositories.get(uuid_repo, (None, None))[1] != self.root:
+                self.repositories.repositories[uuid_repo] = (self.repository.name, self.root)  # XXX Not resistant to uuids collisions (use a set instead)...
+                self.repositories.save()
             self.repos[uuid_repo] = self.repo
             entries.nbr_entries = len(self.repository.assets) + 1  # Don't forget the 'up' entry!
         else:
@@ -401,7 +406,8 @@ class AssetEngineAmber(AssetEngine):
                   (self.pretty_version(uuids.asset_engine_version), self.pretty_version()))
         for uuid in uuids.uuids:
             repo_uuid = uuid.uuid_asset[:2] + (0, 0)
-            if repo_uuid not in utils.amber_repos or not os.path.exists(os.path.join(utils.amber_repos[repo_uuid][1], utils.AMBER_DB_NAME)):
+            if (repo_uuid not in self.repositories.repositories or
+                not os.path.exists(os.path.join(self.repositories.repositories[repo_uuid][1], utils.AMBER_DB_NAME))):
                 uuid.is_asset_missing = True
                 continue
             # Here in theory we'd reload given repo (async process) and check for asset's status...
@@ -427,11 +433,11 @@ class AssetEngineAmber(AssetEngine):
 #            print(entries.entries[:])
         for uuid in uuids.uuids:
             repo_uuid = uuid.uuid_asset[:2] + (0, 0)
-            assert(repo_uuid in utils.amber_repos)
+            assert(repo_uuid in self.repositories.repositories)
             repo = self.repos.get(repo_uuid, None)
             if repo is None:
-                repo = self.repos[repo_uuid] = AmberDataRepository.ls_repo(os.path.join(utils.amber_repos[repo_uuid][1], utils.AMBER_DB_NAME))
-            self.repository.from_dict(repo, utils.amber_repos[repo_uuid][1])
+                repo = self.repos[repo_uuid] = AmberDataRepository.ls_repo(os.path.join(self.repositories.repositories[repo_uuid][1], utils.AMBER_DB_NAME))
+            self.repository.from_dict(repo, self.repositories.repositories[repo_uuid][1])
             euuid = uuid.uuid_asset[:]
             vuuid = uuid.uuid_variant[:]
             ruuid = uuid.uuid_revision[:]
@@ -443,7 +449,7 @@ class AssetEngineAmber(AssetEngine):
             entry.type = {e.file_type}
             entry.blender_type = e.blender_type
             # archive part not yet implemented!
-            entry.relpath = os.path.join(utils.amber_repos[repo_uuid][1], r.path)
+            entry.relpath = os.path.join(self.repositories.repositories[repo_uuid][1], r.path)
 #                print("added entry for", entry.relpath)
             entry.uuid = e.uuid
             var = entry.variants.add()
diff --git a/release/scripts/startup/bl_operators/amber/repository.py b/release/scripts/startup/bl_operators/amber/repository.py
index 70604febaa0..b1c32ee6fed 100644
--- a/release/scripts/startup/bl_operators/amber/repository.py
+++ b/release/scripts/startup/bl_operators/amber/repository.py
@@ -180,6 +180,8 @@ class AmberDataAssetRevision():
             revision_pg.size = revision.size
             revision_pg.timestamp = revision.timestamp
             revision_pg.path = revision.path
+        for idx in range(len(pg), len(revisions), -1):
+            pg.remove(idx - 1)
 
 
 class AmberDataAssetVariantPG(PropertyGroup):
@@ -273,6 +275,8 @@ class AmberDataAssetVariant():
 
             AmberDataAssetRevision.to_pg(variant_pg.revisions, variant.revisions)
             variant_pg.revision_default = variant.revision_default.uuid
+        for idx in range(len(pg), len(variants), -1):
+            pg.remove(idx - 1)
 
 
 class AmberDataAssetPG(PropertyGroup):
@@ -446,7 +450,6 @@ class AmberDataRepository:
 
         if repository_pg is not None:
             self.to_pg(repository_pg)
-            print(repository_pg, len(repository_pg.assets))
 
     @classmethod
     def ls_repo(cls, db_path):
@@ -533,39 +536,84 @@ class AmberDataRepository:
         AmberDataAsset.to_pg(pg.assets, self.assets, self.tags)
 
 
+class AmberDataRepositoryListItemPG(PropertyGroup):
+    uuid = IntVectorProperty(name="UUID", description="Repository unique identifier", size=4)
+    name = StringProperty(name="Name")
+    path = StringProperty(name="Path", description="Path to this Amber repository", subtype='DIR_PATH')
+    is_valid = BoolProperty(name="Is Valid")
+
+
 class AmberDataRepositoryListPG(PropertyGroup):
-    def repositories_itemf(self, context):
-        if not hasattr(self, "repositories_items"):
-            self.repositories_items = [(utils.uuid_pack(uuid), name, path, idx) for idx, (uuid, (name, path)) in enumerate(utils.amber_repos.items())]
-        return self.repositories_items
     def repositories_update(self, context):
         space = context.space_data
         if space and space.type == 'FILE_BROWSER':
             ae = space.asset_engine
             if ae and space.asset_engine_type == "AssetEngineAmber":
-                uuid = utils.uuid_unpack(self.repositories)
-                space.params.directory = utils.amber_repos[uuid][1]
-    repositories = EnumProperty(items=repositories_itemf, update=repositories_update,
-                                name="Current Repository", description="Active Amber asset repository")
+                space.params.directory = self.repositories[self.repository_index_active].path
+
+    repositories = CollectionProperty(name="Repositories", type=AmberDataRepositoryListItemPG)
+    repository_index_active = IntProperty(name="Active Repository", options={'HIDDEN'}, update=repositories_update, default=-1)
 
 
 class AmberDataRepositoryList:
     """
-    Amber repository main class.
-
-    Note: Remember that in Amber, first 8 bytes of asset's UUID are same as first 8 bytes of repository UUID.
-          Repository UUID's last 8 bytes shall always be NULL.
-          This allows us to store repository identifier into all assets, and ensure we have uniqueness of
-          Amber assets UUIDs (which is mandatory from Blender point of view).
+    List of Amber repositories (singleton).
     """
-    pass
+    singleton = None
+
+    def __new__(cls, path=...):
+        if cls.singleton is None:
+            cls.singleton = super().__new__(cls)
+        return cls.singleton
+
+    def __init__(self, path=...):
+        if path is ...:
+            path = os.path.join(bpy.utils.user_resource('CONFIG', create=True), utils.AMBER_LIST_FILENAME)
+        self._path = ""
+        self.repositories = {}
+        self.path = path
+
+    def load(self):
+        if not os.path.exists(self.path):
+            with open(self.path, 'w') as ar_f:
+                json.dump({}, ar_f)
+        with open(self.path, 'r') as ar_f:
+            self.repositories = {utils.uuid_unpack(uuid): name_path for uuid, name_path in json.load(ar_f).items()}
+
+    def save(self):
+        ar = {utils.uuid_pack(uuid).decode(): name_path for uuid, name_path in self.repositories.items()}
+        with open(self.path, 'w') as ar_f:
+            json.dump(ar, ar_f)
+
+    def path_get(self):
+        return self._path
+    def path_set(self, path):
+        if self._path != path:
+            self._path = path
+            self.load()
+    path = property(path_get, path_set)
+
+    def to_pg(self, pg):
+        for idx, (uuid, (name, path)) in enumerate(self.repositories.items()):
+            if idx == len(pg.repositories):
+                pg.repositories.add()
+            repo_pg = pg.repositories[idx]
+            repo_pg.uuid = uuid
+            repo_pg.name = name
+            repo_pg.path = path
+            repo_pg.is_valid = os.path.exists(path)
+        for idx in range(len(pg.repositories), len(self.repositories), -1):
+            pg.repositories.remove(idx - 1)
 
 
 classes = (
     AmberDataTagPG,
+
     AmberDataAssetRevisionPG,
     AmberDataAssetVariantPG,
     AmberDataAssetPG,
     AmberDataRepositoryPG,
+
+    AmberDataRepositoryListItemPG,
     AmberDataRepositoryListPG,
 )
diff --git a/release/scripts/startup/bl_operators/amber/ui.py b/release/scripts/startup/bl_operators/amber/ui.py
index 21af9f8fc0a..4cb3ba5e432 100644
--- a/release/scripts/startup/bl_operators/amber/ui.py
+++ b/release/scripts/startup/bl_operators/amber/ui.py
@@ -53,6 +53,20 @@ class AmberPanelEditing(AmberPanel):
 ##############
 # Engine stuff
 
+class AMBER_PT_repositories(Panel, AmberPanel):
+    bl_space_type = 'FILE_BROWSER'
+    bl_region_type = 'TOOLS'
+    bl_category = "Bookmarks"
+    bl_label = "Amber Repositories"
+
+    def draw(self, context):
+        ae = context.space_data.asset_engine
+
+        self.layout.template_list("FILEBROWSER_UL_dir", "amber_repositories",
+                                  ae.repositories_pg, "repositories", ae.repositories_pg, "repository_index_active",
+                                  item_dyntip_propname="path")
+
+
 class AMBER_UL_tags_filter(UIList):
     def draw_item(self, context, layout, data, item, ic

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list