import bpy

# SCENES --------------------------------

def SwitchScene(context):
    bpy.context.window.scene = context.scene

class SwitchSceneOp(bpy.types.Operator):
    bl_label = "Switch Scenes"
    bl_idname = "tibi.switchscene"
    # operator idnames must have at least one . and be all lowercase. for some reason.
       
    def execute(self, context):
        SwitchScene(context)
        return {'FINISHED'}
    

class sceneSwitcher(bpy.types.Menu):
    bl_label = "Scenes"
    bl_idname = "tibi.scene_switcher"
                
    def draw(self, context):
            layout = self.layout
            layout.operator_context = 'INVOKE_REGION_WIN'
            
            if not bpy.data.scenes:
                return
            
            layout.separator()
            
            for i in range(len(bpy.data.scenes)):
                sel_scene = bpy.data.scenes[i]
                if sel_scene.name == bpy.context.scene.name:
                    icon = 'SCENE_DATA'
                    layout.label(text = sel_scene.name, icon = icon)        
                else:
                    icon = 'NONE'
                    layout.context_pointer_set(name="scene", data=sel_scene)
                    layout.operator(SwitchSceneOp.bl_idname, text = sel_scene.name)

def draw_item(self, context):
    layout = self.layout
    layout.menu(sceneSwitcher.bl_idname)
    
                    
# LAYERS --------------------------------
        
def SwitchLayer(context):
    bpy.context.window.view_layer = context.layer 

class SwitchLayerOp(bpy.types.Operator):
    bl_label = "Switch Layers"
    bl_idname = "tibi.switchlayer"
       
    def execute(self, context):
        SwitchLayer(context)
        return {'FINISHED'}

                    
class layerSwitcher(bpy.types.Menu):
    bl_label = "View Layers"
    bl_idname = "tibi.layer_switcher"
                
    def draw(self, context):
            layout = self.layout
            layout.operator_context = 'INVOKE_REGION_WIN'
            
            if not bpy.context.scene.view_layers:
                return
            
            layout.separator()
            
            for i in range(len(bpy.context.scene.view_layers)):
                sel_layer = bpy.context.scene.view_layers[i]
                if sel_layer.name == bpy.context.window.view_layer.name:
                    icon = 'RENDERLAYERS'
                    layout.label(text = sel_layer.name, icon = icon)        
                else:
                    icon = 'NONE'
                    layout.context_pointer_set(name="layer", data=sel_layer)
                    layout.operator(SwitchLayerOp.bl_idname, text = sel_layer.name)
                    
def draw_item(self, context):
    layout = self.layout
    layout.menu(layerSwitcher.bl_idname)
               
                    
# REGISTER --------------------------------

def register():
    bpy.utils.register_class(SwitchSceneOp)
    bpy.utils.register_class(sceneSwitcher)
    bpy.utils.register_class(SwitchLayerOp)
    bpy.utils.register_class(layerSwitcher)

def unregister():
    bpy.utils.unregister_class(SwitchSceneOp)
    bpy.utils.unregister_class(sceneSwitcher)
    bpy.utils.unregister_class(SwitchLayerOp)
    bpy.utils.unregister_class(layerSwitcher)
            
if __name__ == "__main__":
    register()

    # bpy.ops.wm.call_menu(name=sceneSwitcher.bl_idname)
    # bpy.ops.wm.call_menu(name=layerSwitcher.bl_idname)