[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