Fix uilists showing data names translated (reported on bf-translations ML by Satoshi...
[blender.git] / release / scripts / templates_py / ui_list.py
1 import bpy
2
3
4 class MATERIAL_UL_matslots_example(bpy.types.UIList):
5     # The draw_item function is called for each item of the collection that is visible in the list.
6     #   data is the RNA object containing the collection,
7     #   item is the current drawn item of the collection,
8     #   icon is the "computed" icon for the item (as an integer, because some objects like materials or textures
9     #   have custom icons ID, which are not available as enum items).
10     #   active_data is the RNA object containing the active property for the collection (i.e. integer pointing to the
11     #   active item of the collection).
12     #   active_propname is the name of the active property (use 'getattr(active_data, active_propname)').
13     #   index is index of the current item in the collection.
14     def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index):
15         ob = data
16         slot = item
17         ma = slot.material
18         # draw_item must handle the three layout types... Usually 'DEFAULT' and 'COMPACT' can share the same code.
19         if self.layout_type in {'DEFAULT', 'COMPACT'}:
20             # You should always start your row layout by a label (icon + text), this will also make the row easily
21             # selectable in the list!
22             # We use icon_value of label, as our given icon is an integer value, not an enum ID.
23             # Note "data" names should never be translated!
24             layout.label(text=ma.name if ma else "", translate=False, icon_value=icon)
25             # And now we can add other UI stuff...
26             # Here, we add nodes info if this material uses (old!) shading nodes.
27             if ma and not context.scene.render.use_shading_nodes:
28                 manode = ma.active_node_material
29                 if manode:
30                     # The static method UILayout.icon returns the integer value of the icon ID "computed" for the given
31                     # RNA object.
32                     layout.label(text="Node %s" % manode.name, translate=False, icon_value=layout.icon(manode))
33                 elif ma.use_nodes:
34                     layout.label(text="Node <none>", translate=False)
35                 else:
36                     layout.label(text="")
37         # 'GRID' layout type should be as compact as possible (typically a single icon!).
38         elif self.layout_type in {'GRID'}:
39             layout.alignment = 'CENTER'
40             layout.label(text="", icon_value=icon)
41
42
43 # And now we can use this list everywhere in Blender. Here is a small example panel.
44 class UIListPanelExample(bpy.types.Panel):
45     """Creates a Panel in the Object properties window"""
46     bl_label = "UIList Panel"
47     bl_idname = "OBJECT_PT_ui_list_example"
48     bl_space_type = 'PROPERTIES'
49     bl_region_type = 'WINDOW'
50     bl_context = "object"
51
52     def draw(self, context):
53         layout = self.layout
54
55         obj = context.object
56
57         # template_list now takes two new args.
58         # The first one is the identifier of the registered UIList to use (if you want only the default list,
59         # with no custom draw code, use "UI_UL_list").
60         layout.template_list("MATERIAL_UL_matslots_example", "", obj, "material_slots", obj, "active_material_index")
61
62         # The second one can usually be left as an empty string. It's an additional ID used to distinguish lists in case you
63         # use the same list several times in a given area.
64         layout.template_list("MATERIAL_UL_matslots_example", "compact", obj, "material_slots",
65                              obj, "active_material_index", type='COMPACT')
66
67
68 def register():
69     bpy.utils.register_class(MATERIAL_UL_matslots_example)
70     bpy.utils.register_class(UIListPanelExample)
71
72
73 def unregister():
74     bpy.utils.unregister_class(MATERIAL_UL_matslots_example)
75     bpy.utils.unregister_class(UIListPanelExample)
76
77
78 if __name__ == "__main__":
79     register()