1
$\begingroup$

enter image description hereI am trying to create a basic crud tool in blender and my requirements are create a dropdown on top of the panel and once i select one of the types from the dropdown it shows data below accordingly.

for example in the given picture if mesh is selected then in the body box only mesh objects will be shown like cube,sphere and if light is selected then different light objects will be shown similarly for other object types.

$\endgroup$
16
  • 2
    $\begingroup$ Hello, the content of your question is a little vague, could you maybe add a diagram or a little bit more information ? Where should the panel be located ? what type of data should it show ? What types of objects can you select from ? $\endgroup$
    – Gorgious
    Nov 21, 2022 at 8:02
  • $\begingroup$ @Gorgious Thanks for your input i'll make sure to be more clear from now on, hope this helps a bit more now $\endgroup$ Nov 21, 2022 at 12:08
  • 1
    $\begingroup$ @Chris hehe most certainly :) But I still don't understand how this is different from the plain old outliner editor $\endgroup$
    – Gorgious
    Nov 22, 2022 at 16:56
  • 1
    $\begingroup$ @Chris Thanks Chris. $\endgroup$ Nov 22, 2022 at 17:02
  • 1
    $\begingroup$ Hehe no problem, just trying to help you figure things out, too :) you can reward chris with accepting the answer and clicking the grey tick in the top left of his answer if it helped you. Cheers $\endgroup$
    – Gorgious
    Nov 22, 2022 at 17:10

1 Answer 1

2
$\begingroup$

you can try this code here:

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.
    #   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):
        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'}:
            # 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.
            # We use icon_value of label, as our given icon is an integer value, not an enum ID.
            # Note "data" names should never be translated!
            if ma:
                layout.prop(ma, "name", text="", emboss=False, icon_value=icon)
            else:
                layout.label(text="", translate=False, icon_value=icon)
        # 'GRID' layout type should be as compact as possible (typically a single icon!).
        elif self.layout_type == 'GRID':
            layout.alignment = 'CENTER'
            layout.label(text="", icon_value=icon)



# 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
         
        layout.prop(context.scene, "preset_enum")
        
        # 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").
        
        if context.scene.preset_enum == "Materials":
        
            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')
        else:
            
            for ob in context.scene.objects:
                print(ob.type)
                if ob.type == "LIGHT":
                    row = layout.row()
                    row.label(text = ob.name)


def register():
    bpy.utils.register_class(MATERIAL_UL_matslots_example)
    bpy.utils.register_class(UIListPanelExample)
       
    bpy.types.Scene.preset_enum = bpy.props.EnumProperty(
        name = "my name",
        description ="choose",
        items = [
        ('Materials', "Materials", "Materials"),
        ('Lights', "Lights", "Lights")
    ])


def unregister():
    bpy.utils.unregister_class(MATERIAL_UL_matslots_example)
    bpy.utils.unregister_class(UIListPanelExample)


if __name__ == "__main__":
    register()

result looks like this, if you select an object with materials and you have some lights:

enter image description here

$\endgroup$

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .