[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