Interface - switch active object with selected objects list

SelectedObjectsOperators

This is an example for what I want to achieve, currently set up in the sidebar like this:

(…)
for obj in bpy.context.selected_objects:
row = layout.row()
row.label(text=obj.name)
???
row.prop(obj, “hide_viewport”, text="", emboss=False)

??? means I dont know what to do here, because afaik there is no operator or property available for active object. (active object is set with bpy.context.view_layer.objects.active = obj)

How do I make it work to switch the active object like the picture suggests?

Hi,
You could add a property.

row.prop(obj, 'test1', text='', icon='CHECKBOX_HLT')

def register():
    bpy.types.Object.test1 = bpy.props.BoolProperty(set=set_sel)

def unregister():
    del bpy.types.Object.test1

def set_sel(self, value):
    self["test1"] = value
    bpy.context.view_layer.objects.active = self
1 Like

Thank you this works.

I ran into an issue, shortly after posting.

I havent done properties before and normaly register like that:

classes = ( VIEW3D_PT_SELECTTEST ,
            VIEW3D_PT_SELECTTEST_EXAMPLE ,
            OBJECT_PT_EXAMPLE)

register, unregister = bpy.utils.register_classes_factory(classes)
    
if __name__ == "__main__":
    register()

I would like to keep this format if possible, but how do I combine your lines into my already existing classes_factory?

Hi,
I don’t use register_classes_factory but you can do this way :

classes = ( VIEW3D_PT_SELECTTEST ,
            VIEW3D_PT_SELECTTEST_EXAMPLE ,
            OBJECT_PT_EXAMPLE)

def register():
    for cls in classes:
        bpy.utils.register_class(cls)
    bpy.types.Object.test1 = bpy.props.BoolProperty(set=set_sel)

def unregister():
    del bpy.types.Object.test1
    for cls in reversed(classes):
        bpy.utils.unregister_class(cls)
        
if __name__ == "__main__":
    register()
1 Like

Yes thats good, thank you again.