[Bf-blender-cvs] [0f72a2916ca] asset-engine: Amber: some more dev (tags UIList ordering, some WIP on adding new assets...)
Bastien Montagne
noreply at git.blender.org
Fri Oct 27 12:22:25 CEST 2017
Commit: 0f72a2916ca11bbdf7ec01a43e820e786264eb6a
Author: Bastien Montagne
Date: Thu Oct 26 15:23:59 2017 +0200
Branches: asset-engine
https://developer.blender.org/rB0f72a2916ca11bbdf7ec01a43e820e786264eb6a
Amber: some more dev (tags UIList ordering, some WIP on adding new assets...)
===================================================================
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 541a350fe22..8144ac318e6 100644
--- a/release/scripts/startup/bl_operators/amber/operators.py
+++ b/release/scripts/startup/bl_operators/amber/operators.py
@@ -163,7 +163,8 @@ class AmberOpsAssetAdd(Operator, AmberOpsEditing):
bl_label = "Add Asset"
bl_options = set()
- active_type = EnumProperty(items=(('OBJECT', "Object/Group", "Active Object or Group in Blender"),
+ active_type = EnumProperty(items=(('NONE', "None", "Do not use context to find an active data-block to create asset from"),
+ ('OBJECT', "Object/Group", "Active Object or Group in Blender"),
('MATERIAL', "Material", "Active material from active Object"),
# TODO More options?
),
@@ -173,6 +174,19 @@ class AmberOpsAssetAdd(Operator, AmberOpsEditing):
description="Copy selected datablock and its dependencies into a library .blend file "
"local to the repository (mandatory when current .blend file is not saved)")
+ id_type = EnumProperty(bpy.types.AssetEntry.bl_rna.properties['blender_type'].enum_items_static,
+ name="ID Type", description="Type of the datablock to create asset from")
+
+ def id_name_enum_itemf(self, context):
+ if self.id_type == 'OBJECT':
+ return [(ob.name, ob.name, "") for ob in bpy.data.objects if ob.library is None]
+ return []
+ id_name = EnumProperty(id_name_enum_itemf,
+ name="ID Name", description="Name of the local datablock to create asset from")
+
+ @staticmethod # self is not op instance here, but menu generated by window manager...
+ def datablocks_select_menu(self, context):
+ self.layout.operator_menu_enum("AMBER_OT_asset_add", "id_name").id_type = 'OBJECT'
def execute(self, context):
import time
@@ -192,9 +206,20 @@ class AmberOpsAssetAdd(Operator, AmberOpsEditing):
elif self.active_type == 'MATERIAL':
datablock = context.active_object.material_slots[context.active_object.active_material_index].material
+ if datablock is None and self.id_name:
+ if self.id_type == 'OBJECT':
+ datablock = bpy.data.objects[self.id_name]
+ elif self.id_type == 'MATERIAL':
+ datablock = bpy.data.materials[self.id_name]
+ elif self.id_type == 'TEXTURE':
+ datablock = bpy.data.textures[self.id_name]
+
if datablock is None:
self.report({'INFO'}, "No suitable active datablock found to create a new asset")
return {'CANCELLED'}
+ elif datablock.library is not None:
+ self.report({'INFO'}, "Active datablock is a linked one, this is not supported currently")
+ return {'CANCELLED'}
if bpy.data.is_dirty or not bpy.data.filepath:
self.report({'WARNING'}, "Current .blend file not saved on disk, enforcing copying data into local repository storage")
@@ -251,6 +276,12 @@ class AmberOpsAssetAdd(Operator, AmberOpsEditing):
return {'FINISHED'}
+ def invoke(self, context, event):
+ if self.active_type == 'NONE':
+ context.window_manager.popup_menu(self.datablocks_select_menu, "Select A Data-block")
+ return {'FINISHED'}
+ return self.execute(context)
+
class AmberOpsAssetDelete(Operator, AmberOpsEditing):
"""Delete active Amber asset from the repository (WARNING! No undo!)"""
diff --git a/release/scripts/startup/bl_operators/amber/ui.py b/release/scripts/startup/bl_operators/amber/ui.py
index 8274aa02f62..6d76cf62501 100644
--- a/release/scripts/startup/bl_operators/amber/ui.py
+++ b/release/scripts/startup/bl_operators/amber/ui.py
@@ -174,17 +174,75 @@ class AMBER_UL_asset_tags(UIList):
class AMBER_UL_tags(UIList):
+ use_filter_name_reverse = bpy.props.BoolProperty(name="Reverse Name", default=False, options=set(),
+ description="Reverse name filtering")
+
+ def _gen_order_update(name1, name2):
+ def _u(self, ctxt):
+ if (getattr(self, name1)):
+ setattr(self, name2, False)
+ return _u
+ use_order_name = bpy.props.BoolProperty(name="Name", default=False, options=set(),
+ description="Sort tags by their name (case-insensitive)",
+ update=_gen_order_update("use_order_name", "use_order_importance"))
+ use_order_importance = bpy.props.BoolProperty(name="Importance", default=False, options=set(),
+ description="Sort tags by their weight",
+ update=_gen_order_update("use_order_importance", "use_order_name"))
+
+ use_filter_orderby_invert= bpy.props.BoolProperty(name="Invert Ordering", default=False, options=set(),
+ description="Reverse tag ordering")
+
def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index):
# assert(isinstance(item, bpy.types.AmberDataTagPG))
tag = item
if self.layout_type in {'DEFAULT', 'COMPACT'}:
- split = layout.split(0.66, False)
+ split = layout.split(0.5, False)
split.prop(tag, "name", text="", emboss=False, icon_value=icon)
split.prop(tag, "priority", text="", emboss=False)
elif self.layout_type == 'GRID':
layout.alignment = 'CENTER'
layout.label(text="", icon_value=icon)
+ def draw_filter(self, context, layout):
+ # Nothing much to say here, it's usual UI code...
+ row = layout.row()
+
+ subrow = row.row(align=True)
+ subrow.prop(self, "filter_name", text="")
+ icon = 'ZOOM_OUT' if self.use_filter_name_reverse else 'ZOOM_IN'
+ subrow.prop(self, "use_filter_name_reverse", text="", icon=icon)
+
+ row = layout.row(align=True)
+ row.label("Order by:")
+ row.prop(self, "use_order_name", toggle=True)
+ row.prop(self, "use_order_importance", toggle=True)
+ icon = 'TRIA_UP' if self.use_filter_orderby_invert else 'TRIA_DOWN'
+ row.prop(self, "use_filter_orderby_invert", text="", icon=icon)
+
+ def filter_items(self, context, data, propname):
+ tags = getattr(data, propname)
+ helper_funcs = bpy.types.UI_UL_list
+
+ # Default return values.
+ flt_flags = []
+ flt_neworder = []
+
+ # Filtering by name
+ if self.filter_name:
+ flt_flags = helper_funcs.filter_items_by_name(self.filter_name, self.bitflag_filter_item, tags, "name",
+ reverse=self.use_filter_name_reverse)
+ if not flt_flags:
+ flt_flags = [self.bitflag_filter_item] * len(tags)
+
+ # Reorder by name or weight.
+ if self.use_order_name:
+ flt_neworder = helper_funcs.sort_items_by_name(tags, "name")
+ elif self.use_order_importance:
+ _sort = [(idx, -tag.priority if self.use_filter_orderby_invert else tag.priority) for idx, tag in enumerate(tags)]
+ flt_neworder = helper_funcs.sort_items_helper(_sort, lambda e: e[1], True)
+
+ return flt_flags, flt_neworder
+
class AMBER_PT_datablocks(Panel, AmberPanelEditing):
bl_space_type = 'FILE_BROWSER'
@@ -211,11 +269,14 @@ class AMBER_PT_assets(Panel, AmberPanelEditing):
row = self.layout.row()
row.template_list("AMBER_UL_assets", "", ae.repository_pg, "assets", ae.repository_pg, "asset_index_active",
- rows=3)
+ rows=4)
col = row.column()
+ col.operator_context = 'EXEC_DEFAULT'
col.operator("AMBER_OT_asset_add", text="", icon='OBJECT_DATA').active_type = 'OBJECT'
col.operator("AMBER_OT_asset_add", text="", icon='MATERIAL_DATA').active_type = 'MATERIAL'
+ col.operator_context = 'INVOKE_DEFAULT'
+ col.operator("AMBER_OT_asset_add", text="", icon='ZOOMIN')
col.operator("AMBER_OT_asset_delete", text="", icon='ZOOMOUT')
row = self.layout.row()
More information about the Bf-blender-cvs
mailing list