[Bf-blender-cvs] [bac215bc672] asset-engine: Amber assets: add more editing UI.

Bastien Montagne noreply at git.blender.org
Fri Oct 20 15:26:48 CEST 2017


Commit: bac215bc67287e832c3eb1887491e1e542a72845
Author: Bastien Montagne
Date:   Fri Oct 20 15:26:19 2017 +0200
Branches: asset-engine
https://developer.blender.org/rBbac215bc67287e832c3eb1887491e1e542a72845

Amber assets: add more editing UI.

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

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

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

diff --git a/release/scripts/startup/bl_operators/amber/operators.py b/release/scripts/startup/bl_operators/amber/operators.py
index fade17d3ee2..0636d94077c 100644
--- a/release/scripts/startup/bl_operators/amber/operators.py
+++ b/release/scripts/startup/bl_operators/amber/operators.py
@@ -23,191 +23,757 @@
 
 import bpy
 from bpy.types import (
-        Operator,
+        AssetEntry,
+        PropertyGroup,
         )
 from bpy.props import (
         BoolProperty,
+        CollectionProperty,
         EnumProperty,
+        IntProperty,
+        IntVectorProperty,
+        PointerProperty,
+        StringProperty,
         )
 
+import json
 import os
+import stat
+import time
 
-from . import (repository, utils)
+from . import utils
 
-from .repository import (
-        AmberDataRepository,
-        AmberDataRepositoryList,
-        )
 
+###########################
+# Asset Engine data classes.
+class AmberDataTagPG(PropertyGroup):
+    def tag_update_func(self, context):
+        if not (context and context.space_data):
+            return
+        ae = context.space_data.asset_engine
+        name_prev = self.name_prev or self.name
 
-class AmberOps():
-    """Base Amber asset engine operators class."""
-    @classmethod
-    def poll(cls, context):
-        space = context.space_data
-        if space and space.type == 'FILE_BROWSER':
-            ae = space.asset_engine
-            if ae and space.asset_engine_type == "AssetEngineAmber":
-                return True
-        return False
+        if ae.repository_pg.tag_lock_updates:
+            return
+        ae.repository_pg.tag_lock_updates = True
 
+        tag = ae.repository_pg.tags.get(name_prev, None)
+        if tag and tag != self:
+            tag.name_prev = tag.name = self.name
+            tag.priority = self.priority
 
-class AmberOpsEditing(AmberOps):
-    """Base Amber asset engine operators class for editing repositories."""
-    @classmethod
-    def poll(cls, context):
-        space = context.space_data
-        wm = context.window_manager
-        if space and space.type == 'FILE_BROWSER':
-            return (space.active_operator is None) and wm.amber_enable_editing and AmberOps.poll(context)
-        return False
+        for asset in ae.repository_pg.assets:
+            tag = asset.tags.get(name_prev, None)
+            if tag and tag != self:
+                tag.name_prev = tag.name = self.name
+                tag.priority = self.priority
 
+        self.name_prev = self.name
 
-class AmberOpsAssetAdd(Operator, AmberOpsEditing):
-    """Add an Amber asset to the repository (WARNING! No undo!)"""
-    bl_idname = "amber.asset_add"
-    bl_label = "Add Asset"
-    bl_options = set()
+        repository = getattr(ae, "repository", None)
+        if repository is None:
+            repository = ae.repository = AmberDataRepository()
+        repository.from_pg(ae.repository_pg)
 
-    active_type = EnumProperty(items=(('OBJECT', "Object/Group", "Active Object or Group in Blender"),
-                                      ('MATERIAL', "Material", "Active material from active Object"),
-                                      # TODO More options?
-                                     ),
-                               name="Asset Type", description="Type of active datablock to create the asset from")
+        repository.wrt_repo(os.path.join(repository.path, utils.AMBER_DB_NAME), repository.to_dict())
 
-    copy_local = BoolProperty(name="Copy Local",
-                              description="Copy selected datablock and its dependencies into a library .blend file "
-                                          "local to the repository (mandatory when current .blend file is not saved)")
+        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)
+
+    name_prev = StringProperty(options={'HIDDEN'})
+
+    def include_update(self, context):
+        if self.use_include:
+            self.use_exclude = False
+        sd = context.space_data
+        if sd and sd.type == 'FILE_BROWSER' and sd.asset_engine:
+            sd.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
+        sd = context.space_data
+        if sd and sd.type == 'FILE_BROWSER' and sd.asset_engine:
+            sd.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)
+
+    @staticmethod
+    def from_dict(tags, tags_dict):
+        tags.clear()
+        tags.update(tags_dict)
+
+    @staticmethod
+    def to_dict(tags):
+        return tags.copy()
+
+    @staticmethod
+    def from_pg(tags, pg):
+        tags.clear()
+        tags.update({t.name: t.priority for t in pg})
+
+    @staticmethod
+    def to_pg(pg, tags, subset=None, do_clear=False):
+        if do_clear:
+            pg.clear()
+            for tag_name, tag_priority in tags.items():
+                if subset is not None and tag_name not in subset:
+                    continue
+                tag_pg = pg.add()
+                tag_pg.name_prev = tag_pg.name = tag_name
+                tag_pg.priority = tag_priority
+        else:
+            removed_tags = set(t.name for t in pg) - set(subset or tags)
+            added_tags = set(subset or tags) - set(t.name for t in pg)
+            for tag_name in removed_tags:
+                pg.remove(pg.find(tag_name))
+            for tag_pg in pg:
+                tag_pg.priority = tags[tag_pg.name]
+            for tag_name in added_tags:
+                tag_pg = pg.add()
+                tag_pg.name_prev = tag_pg.name = tag_name
+                tag_pg.priority = tags[tag_name]
+
+
+class AmberDataAssetViewPG(PropertyGroup):
+    uuid = IntVectorProperty(name="UUID", description="View unique identifier", size=4)
+    name = StringProperty(name="Name", description="Asset/Variant/Revision view name")
+    description = StringProperty(name="Description", description="Asset/Variant/Revision view description")
+
+    size = IntProperty(name="Size")
+    timestamp = IntProperty(name="Timestamp")
+
+    path = StringProperty(name="Path", description="File path of this item", subtype='FILE_PATH')
+
+
+class AmberDataAssetView():
+    def __init__(self):
+        self.uuid = (0, 0, 0, 0)
+        self.name = ""
+        self.description = ""
+        self.size = 0
+        self.timestamp = 0
+        self.path = ""
+
+    @staticmethod
+    def from_dict(views, views_dict):
+        # For now, fully override revisions.
+        views.clear()
+        for uuid_hexstr, vw in views_dict.items():
+            uuid = utils.uuid_unpack(uuid_hexstr)
+            view = views[uuid] = AmberDataAssetView()
+
+            view.uuid = uuid
+            view.name = vw["name"]
+            view.description = vw["description"]
+
+            view.size = vw["size"]
+            view.timestamp = vw["timestamp"]
+            view.path = vw["path"]
+
+    @staticmethod
+    def to_dict(views):
+        views_dict = {
+            utils.uuid_pack(vw.uuid): {
+                "name": vw.name,
+                "description": vw.description,
+                "size": vw.size,
+                "timestamp": vw.timestamp,
+                "path": vw.path,
+            }
+            for vw in views.values()
+        }
+
+        return views_dict
+
+    @staticmethod
+    def from_pg(views, pg):
+        # For now, fully override variants.
+        views.clear()
+        for vw in pg:
+            uuid = vw.uuid[:]
+            view = views[uuid] = AmberDataAssetView()
+
+            view.uuid = uuid
+            view.name = vw.name
+            view.description = vw.description
+
+            view.size = vw.size
+            view.timestamp = vw.timestamp
+            view.path = vw.path
+
+    @staticmethod
+    def to_pg(pg, views):
+        for idx, view in enumerate(views.values()):
+            if idx == len(pg):
+                pg.add()
+            view_pg = pg[idx]
+            view_pg.uuid = view.uuid
+
+            view_pg.name = view.name
+            view_pg.description = view.description
+
+            view_pg.size = view.size
+            view_pg.timestamp = view.timestamp
+            view_pg.path = view.path
+        for idx in range(len(pg), len(views), -1):
+            pg.remove(idx - 1)
+
+
+class AmberDataAssetRevisionPG(PropertyGroup):
+    comment = StringProperty(name="Comment", description="Asset/Variant revision comment")
+    uuid = IntVectorProperty(name="UUID", description="Revision unique identifier", size=4)
+
+    timestamp = IntProperty(name="Timestamp")
+
+    views = CollectionProperty(name="Views", type=AmberDataAssetViewPG, description="Views of the revision")
+    view_index_active = IntProperty(name="Active View", options={'HIDDEN'})
+
+    view_default = IntVectorProperty(name="Default view", size=4,
+                                     description="Default view of the revision, to be used when nothing explicitly chosen")
+    def views_itemf(self, context):
+        if not hasattr(self, "views_items"):
+            self.views_items = [(utils.uuid_pack(v.uuid),) * 2 + (v.name[0], idx) for idx, v in enumerate(self.views)]
+            self.views_itemidx_to_uuid_map = [v.uuid for v in self.views]
+            self.views_uuid_to_itemidx_map = {v.uuid: idx for idx, v in enumerate(self.views)}
+        return self.views_items
+    def view_default_ui_get(self):
+        return self.views_uuid_to_itemidx_map[self.view_default]
+    def view_default_ui_set(self, val):
+        self.view_default = self.views_itemidx_to_uuid_map[val]
+    view_default_ui = EnumProperty(items=views_itemf, get=view_defa

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list