[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