2013-01-05 11:14:35 +00:00
|
|
|
import bpy
|
|
|
|
|
|
|
|
|
|
|
|
class MATERIAL_UL_matslots_example(bpy.types.UIList):
|
|
|
|
# The draw_item function is called for each item of the collection that is visible in the list.
|
|
|
|
# data is the RNA object containing the collection,
|
|
|
|
# item is the current drawn item of the collection,
|
|
|
|
# icon is the "computed" icon for the item (as an integer, because some objects like materials or textures
|
|
|
|
# have custom icons ID, which are not available as enum items).
|
|
|
|
# active_data is the RNA object containing the active property for the collection (i.e. integer pointing to the
|
|
|
|
# active item of the collection).
|
|
|
|
# active_propname is the name of the active property (use 'getattr(active_data, active_propname)').
|
|
|
|
# index is index of the current item in the collection.
|
2013-08-29 13:34:36 +00:00
|
|
|
# flt_flag is the result of the filtering process for this item.
|
|
|
|
# Note: as index and flt_flag are optional arguments, you do not have to use/declare them here if you don't
|
|
|
|
# need them.
|
|
|
|
def draw_item(self, context, layout, data, item, icon, active_data, active_propname):
|
2013-01-05 11:14:35 +00:00
|
|
|
ob = data
|
|
|
|
slot = item
|
|
|
|
ma = slot.material
|
|
|
|
# draw_item must handle the three layout types... Usually 'DEFAULT' and 'COMPACT' can share the same code.
|
|
|
|
if self.layout_type in {'DEFAULT', 'COMPACT'}:
|
2013-11-23 19:37:23 +00:00
|
|
|
# You should always start your row layout by a label (icon + text), or a non-embossed text field,
|
|
|
|
# this will also make the row easily selectable in the list! The later also enables ctrl-click rename.
|
2013-01-05 11:14:35 +00:00
|
|
|
# We use icon_value of label, as our given icon is an integer value, not an enum ID.
|
2013-02-08 16:01:21 +00:00
|
|
|
# Note "data" names should never be translated!
|
2013-11-23 19:37:23 +00:00
|
|
|
if ma:
|
|
|
|
layout.prop(ma, "name", text="", emboss=False, icon_value=icon)
|
|
|
|
else:
|
|
|
|
layout.label(text="", translate=False, icon_value=icon)
|
2013-01-05 11:14:35 +00:00
|
|
|
# And now we can add other UI stuff...
|
|
|
|
# Here, we add nodes info if this material uses (old!) shading nodes.
|
|
|
|
if ma and not context.scene.render.use_shading_nodes:
|
|
|
|
manode = ma.active_node_material
|
|
|
|
if manode:
|
|
|
|
# The static method UILayout.icon returns the integer value of the icon ID "computed" for the given
|
|
|
|
# RNA object.
|
2013-02-08 16:01:21 +00:00
|
|
|
layout.label(text="Node %s" % manode.name, translate=False, icon_value=layout.icon(manode))
|
2013-01-05 11:14:35 +00:00
|
|
|
elif ma.use_nodes:
|
2013-02-08 16:01:21 +00:00
|
|
|
layout.label(text="Node <none>", translate=False)
|
2013-01-05 11:14:35 +00:00
|
|
|
else:
|
2013-02-08 16:01:21 +00:00
|
|
|
layout.label(text="")
|
2013-01-05 11:14:35 +00:00
|
|
|
# 'GRID' layout type should be as compact as possible (typically a single icon!).
|
|
|
|
elif self.layout_type in {'GRID'}:
|
|
|
|
layout.alignment = 'CENTER'
|
2013-02-08 16:01:21 +00:00
|
|
|
layout.label(text="", icon_value=icon)
|
2013-01-05 11:14:35 +00:00
|
|
|
|
|
|
|
|
|
|
|
# And now we can use this list everywhere in Blender. Here is a small example panel.
|
|
|
|
class UIListPanelExample(bpy.types.Panel):
|
|
|
|
"""Creates a Panel in the Object properties window"""
|
|
|
|
bl_label = "UIList Panel"
|
|
|
|
bl_idname = "OBJECT_PT_ui_list_example"
|
|
|
|
bl_space_type = 'PROPERTIES'
|
|
|
|
bl_region_type = 'WINDOW'
|
|
|
|
bl_context = "object"
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
obj = context.object
|
|
|
|
|
|
|
|
# template_list now takes two new args.
|
|
|
|
# The first one is the identifier of the registered UIList to use (if you want only the default list,
|
|
|
|
# with no custom draw code, use "UI_UL_list").
|
|
|
|
layout.template_list("MATERIAL_UL_matslots_example", "", obj, "material_slots", obj, "active_material_index")
|
|
|
|
|
|
|
|
# The second one can usually be left as an empty string. It's an additional ID used to distinguish lists in case you
|
|
|
|
# use the same list several times in a given area.
|
|
|
|
layout.template_list("MATERIAL_UL_matslots_example", "compact", obj, "material_slots",
|
|
|
|
obj, "active_material_index", type='COMPACT')
|
|
|
|
|
|
|
|
|
|
|
|
def register():
|
|
|
|
bpy.utils.register_class(MATERIAL_UL_matslots_example)
|
|
|
|
bpy.utils.register_class(UIListPanelExample)
|
|
|
|
|
|
|
|
|
|
|
|
def unregister():
|
|
|
|
bpy.utils.unregister_class(MATERIAL_UL_matslots_example)
|
|
|
|
bpy.utils.unregister_class(UIListPanelExample)
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
2013-01-15 23:17:45 +00:00
|
|
|
register()
|