[Bf-blender-cvs] [2a71f1e29e3] asset-engine: Factorize repo editing 'write on disk' code, and add relevant update callbacks to repo's RNA properties.

Bastien Montagne noreply at git.blender.org
Fri Oct 20 16:17:04 CEST 2017


Commit: 2a71f1e29e35efa55a3337df2407f4d4ae8ebb9c
Author: Bastien Montagne
Date:   Fri Oct 20 16:15:05 2017 +0200
Branches: asset-engine
https://developer.blender.org/rB2a71f1e29e35efa55a3337df2407f4d4ae8ebb9c

Factorize repo editing 'write on disk' code, and add relevant update callbacks to repo's RNA properties.

Also made writing repo DB on disk slightly safer (using atomic file
swapping instead of directly writing into real repo DB file).

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

M	release/scripts/startup/bl_operators/amber/operators.py
M	release/scripts/startup/bl_operators/amber/repository.py

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

diff --git a/release/scripts/startup/bl_operators/amber/operators.py b/release/scripts/startup/bl_operators/amber/operators.py
index 7036d5ee7e0..6ad86140f2d 100644
--- a/release/scripts/startup/bl_operators/amber/operators.py
+++ b/release/scripts/startup/bl_operators/amber/operators.py
@@ -196,12 +196,7 @@ class AmberOpsAssetDelete(Operator, AmberOpsEditing):
         ae = context.space_data.asset_engine
         ae.repository_pg.assets.remove(ae.repository_pg.asset_index_active)
 
-        repository = getattr(ae, "repository", None)
-        if repository is None:
-            repository = ae.repository = AmberDataRepository()
-        repository.from_pg(ae.repository_pg)
-
-        repository.wrt_repo(os.path.join(repository.path, utils.AMBER_DB_NAME), repository.to_dict())
+        AmberDataRepository.update_from_asset_engine(ae)
 
         bpy.ops.file.refresh()
 
@@ -235,12 +230,7 @@ class AmberOpsAssetTagAdd(Operator, AmberOpsEditing):
             asset_tag.name = tag.name
             asset_tag.priority = tag.priority
 
-        repository = getattr(ae, "repository", None)
-        if repository is None:
-            repository = ae.repository = AmberDataRepository()
-        repository.from_pg(ae.repository_pg)
-
-        repository.wrt_repo(os.path.join(repository.path, utils.AMBER_DB_NAME), repository.to_dict())
+        AmberDataRepository.update_from_asset_engine(ae)
 
         bpy.ops.file.refresh()
 
@@ -258,12 +248,7 @@ class AmberOpsAssetTagRemove(Operator, AmberOpsEditing):
         asset = ae.repository_pg.assets[ae.repository_pg.asset_index_active]
         asset.tags.remove(asset.tag_index_active)
 
-        repository = getattr(ae, "repository", None)
-        if repository is None:
-            repository = ae.repository = AmberDataRepository()
-        repository.from_pg(ae.repository_pg)
-
-        repository.wrt_repo(os.path.join(repository.path, utils.AMBER_DB_NAME), repository.to_dict())
+        AmberDataRepository.update_from_asset_engine(ae)
 
         bpy.ops.file.refresh()
 
@@ -294,12 +279,7 @@ class AmberOpsTagAdd(Operator, AmberOpsEditing):
         tag.priority = self.priority
         ae.repository_pg.tag_index_active = len(tags) - 1
 
-        repository = getattr(ae, "repository", None)
-        if repository is None:
-            repository = ae.repository = AmberDataRepository()
-        repository.from_pg(ae.repository_pg)
-
-        repository.wrt_repo(os.path.join(repository.path, utils.AMBER_DB_NAME), repository.to_dict())
+        AmberDataRepository.update_from_asset_engine(ae)
 
         bpy.ops.file.refresh()
 
@@ -326,12 +306,7 @@ class AmberOpsTagDelete(Operator, AmberOpsEditing):
 
         ae.repository_pg.tags.remove(ae.repository_pg.tag_index_active)
 
-        repository = getattr(ae, "repository", None)
-        if repository is None:
-            repository = ae.repository = AmberDataRepository()
-        repository.from_pg(ae.repository_pg)
-
-        repository.wrt_repo(os.path.join(repository.path, utils.AMBER_DB_NAME), repository.to_dict())
+        AmberDataRepository.update_from_asset_engine(ae)
 
         bpy.ops.file.refresh()
 
diff --git a/release/scripts/startup/bl_operators/amber/repository.py b/release/scripts/startup/bl_operators/amber/repository.py
index 0636d94077c..6d8ae00a412 100644
--- a/release/scripts/startup/bl_operators/amber/repository.py
+++ b/release/scripts/startup/bl_operators/amber/repository.py
@@ -47,10 +47,11 @@ from . import utils
 ###########################
 # Asset Engine data classes.
 class AmberDataTagPG(PropertyGroup):
-    def tag_update_func(self, context):
-        if not (context and context.space_data):
+    def tag_data_update(self, context):
+        sd = context.space_data
+        if not (sd and sd.type == 'FILE_BROWSER' and sd.asset_engine):
             return
-        ae = context.space_data.asset_engine
+        ae = sd.asset_engine
         name_prev = self.name_prev or self.name
 
         if ae.repository_pg.tag_lock_updates:
@@ -70,19 +71,13 @@ class AmberDataTagPG(PropertyGroup):
 
         self.name_prev = self.name
 
-        repository = getattr(ae, "repository", None)
-        if repository is None:
-            repository = ae.repository = AmberDataRepository()
-        repository.from_pg(ae.repository_pg)
-
-        repository.wrt_repo(os.path.join(repository.path, utils.AMBER_DB_NAME), repository.to_dict())
-
-        bpy.ops.file.refresh()
-
         ae.repository_pg.tag_lock_updates = False
 
-    name = StringProperty(name="Name", description="Tag name", update=tag_update_func)
-    priority = IntProperty(name="Priority", default=0, description="Tag priority (used to order tags, highest priority go first)", update=tag_update_func)
+        AmberDataRepository.update_from_asset_engine(ae)
+
+    name = StringProperty(name="Name", description="Tag name", update=tag_data_update)
+    priority = IntProperty(name="Priority", default=0, update=tag_data_update,
+                           description="Tag priority (used to order tags, highest priority go first)")
 
     name_prev = StringProperty(options={'HIDDEN'})
 
@@ -419,14 +414,23 @@ class AmberDataAssetVariant():
 
 
 class AmberDataAssetPG(PropertyGroup):
-    name = StringProperty(name="Name", description="Asset name")
-    description = StringProperty(name="Description", description="Asset description")
-    uuid = IntVectorProperty(name="UUID", description="Asset unique identifier", size=4)
+    def asset_data_update(self, context):
+        sd = context.space_data
+        if not (sd and sd.type == 'FILE_BROWSER' and sd.asset_engine):
+            return
+        ae = sd.asset_engine
+
+        AmberDataRepository.update_from_asset_engine(ae)
+        bpy.ops.file.refresh()
+
+    name = StringProperty(name="Name", description="Asset name", update=asset_data_update)
+    description = StringProperty(name="Description", description="Asset description", update=asset_data_update)
+    uuid = IntVectorProperty(name="UUID", description="Asset unique identifier", size=4, update=asset_data_update)
 
     file_type = EnumProperty(items=[(e.identifier, e.name, e.description, e.value) for e in AssetEntry.bl_rna.properties["type"].enum_items],
-                             name="File Type", description="Type of file storing the asset")
+                             name="File Type", description="Type of file storing the asset", update=asset_data_update)
     blender_type = EnumProperty(items=[(e.identifier, e.name, e.description, e.value) for e in AssetEntry.bl_rna.properties["blender_type"].enum_items],
-                                name="Blender Type", description="Blender data-block type of the asset")
+                                name="Blender Type", description="Blender data-block type of the asset", update=asset_data_update)
 
     tags = CollectionProperty(name="Tags", type=AmberDataTagPG, description="Tags of the asset")
     tag_index_active = IntProperty(name="Active Tag", options={'HIDDEN'})
@@ -615,8 +619,21 @@ class AmberDataRepository:
 
     @classmethod
     def wrt_repo(cls, db_path, repo_dict):
-        with open(db_path, 'w') as db_f:
+        temp_path = os.path.join(os.path.dirname(db_path), utils.AMBER_DB_NAME + ".tmp")
+        with open(temp_path, 'w') as db_f:
             json.dump(repo_dict, db_f, indent=4)
+        os.replace(temp_path, db_path)
+
+    @staticmethod
+    def update_from_asset_engine(ae):
+        """Generic helper wrapping repository JSON file update when editing withing Blender."""
+        repository = getattr(ae, "repository", None)
+        if repository is None:
+            repository = ae.repository = AmberDataRepository()
+        repository.from_pg(ae.repository_pg)
+
+        repository.wrt_repo(os.path.join(repository.path, utils.AMBER_DB_NAME), repository.to_dict())
+
 
     def from_dict(self, repo_dict, root_path):
         self.clear()



More information about the Bf-blender-cvs mailing list