def __init__(self, plugin, shell, buttons, ds, view):
        GObject.GObject.__init__(self)
        self.shell = shell
        self.sp = shell.props.shell_player
        self.db = shell.props.db
        self.buttons = buttons

        self.button = PixbufButton()
        self.button.set_image(create_button_image(plugin, self.button_image))
        self.ds = ds
        self.view = view
        self.album_title = None
        self.artist = None
        self.active = False

        self.button.show()
        self.button.set_relief(Gtk.ReliefStyle.NONE)
        self.button.set_focus_on_click(False)
        self.button.connect(
            'clicked',
            lambda button: self.emit('switch-tab', self.button_name))
        buttons.pack_start(self.button, False, True, 0)
    def __init__ (self, plugin, shell, buttons, ds, view):
        GObject.GObject.__init__ (self)
        self.shell      = shell
        self.sp         = shell.props.shell_player
        self.db         = shell.props.db
        self.buttons    = buttons

        self.button     = PixbufButton()
        self.button.set_image(create_button_image(plugin, self.button_image))
        self.ds = ds
        self.view       = view
        self.album_title= None
        self.artist     = None
        self.active     = False

        self.button.show()
        self.button.set_relief (Gtk.ReliefStyle.NONE)
        self.button.set_focus_on_click(False)
        self.button.connect ('clicked', 
            lambda button : self.emit('switch-tab', self.button_name))
        buttons.pack_start (self.button, False, True, 0)
    def setup_source(self):

        colour = self.viewmgr.get_selection_colour()
        self.cover_search_pane = CoverSearchPane(self.plugin, colour)

        self.stack.add_titled(self.cover_search_pane, "notebook_covers",
                              _("Covers"))

        # define entry-view toolbar
        self.stars = ReactiveStar()
        self.stars.set_rating(0)
        self.stars.connect('changed', self.rating_changed_callback)
        self.stars.props.valign = Gtk.Align.CENTER
        self.entry_view_grid.attach(self.stars, 1, 1, 1, 1)
        stack_switcher = Gtk.StackSwitcher()
        stack_switcher.set_stack(self.stack)
        self.entry_view_grid.attach(stack_switcher, 0, 1, 1, 1)
        viewtoggle = PixbufButton()
        viewtoggle.set_image(create_button_image(self.plugin, "entryview.png"))
        self.viewtoggle_id = None

        setting = self.gs.get_setting(self.gs.Path.PLUGIN)
        viewtoggle.set_active(not setting[self.gs.PluginKey.ENTRY_VIEW_MODE])
        self.entry_view_toggled(viewtoggle, True)
        viewtoggle.connect('toggled', self.entry_view_toggled)

        smallwindowbutton = PixbufButton()
        smallwindowbutton.set_image(
            create_button_image(self.plugin, "view-restore.png"))
        smallwindowbutton.connect('toggled', self.smallwindowbutton_callback)

        self.smallwindowext = ExternalPlugin()
        self.smallwindowext.appendattribute('plugin_name', 'smallwindow')
        self.smallwindowext.appendattribute('action_group_name',
                                            'small window actions')
        self.smallwindowext.appendattribute('action_name', 'SmallWindow')
        self.smallwindowext.appendattribute('action_type', 'app')

        whatsplayingtoggle = PixbufButton()
        whatsplayingtoggle.set_image(
            create_button_image(self.plugin, "whatsplaying.png"))
        whatsplayingtoggle.connect('toggled', self.whatsplayingtoggle_callback)

        rightgrid = Gtk.Grid()
        rightgrid.props.halign = Gtk.Align.END

        # rightgrid.attach(whatsplayingtoggle, 0, 0, 1, 1)
        rightgrid.attach(viewtoggle, 1, 0, 1, 1)
        rightgrid.attach(smallwindowbutton, 2, 0, 1, 1)

        self.entry_view_grid.attach_next_to(rightgrid, self.stars,
                                            Gtk.PositionType.RIGHT, 1, 1)
        self.stack.set_visible_child(self.entry_view_results)
        self.stack.connect('notify::visible-child-name',
                           self.notebook_switch_page_callback)

        self.entry_view_grid.show_all()
        smallwindowbutton.set_visible(self.smallwindowext.is_activated())
class ArtistInfoTab (GObject.GObject):
    
    __gsignals__ = {
        'switch-tab' : (GObject.SIGNAL_RUN_LAST, GObject.TYPE_NONE,
                                (GObject.TYPE_STRING,))
    }
    
    button_image = "microphone.png"
    button_name  = "artist"

    def __init__ (self, plugin, shell, buttons, ds, view):
        GObject.GObject.__init__ (self)
        self.shell      = shell
        self.sp         = shell.props.shell_player
        self.db         = shell.props.db
        self.buttons    = buttons

        self.button     = PixbufButton()
        self.button.set_image(create_button_image(plugin, self.button_image))
        self.ds = ds
        self.view       = view
        self.album_title= None
        self.artist     = None
        self.active     = False

        self.button.show()
        self.button.set_relief (Gtk.ReliefStyle.NONE)
        self.button.set_focus_on_click(False)
        self.button.connect ('clicked', 
            lambda button : self.emit('switch-tab', self.button_name))
        buttons.pack_start (self.button, False, True, 0)

    def activate (self, artist=None, album_title=None):
        print("activating Artist Tab")
        self.button.set_active(True)
        self.active = True
        self.reload (artist, album_title)

    def deactivate (self):
        print("deactivating Artist Tab")
        self.button.set_active(False)
        self.active = False

    def reload (self, artist, album_title):
        if not artist:
            return
        
        if self.active and artist_exceptions(artist):
            print ("blank")
            self.view.blank_view()
            return
            
        if self.active and (   (not self.artist or self.artist != artist) 
                            or (not self.album_title or self.album_title != album_title)
                           ):
            print ("now loading")
            self.view.loading (artist, album_title)
            print ("active")
            self.ds.fetch_artist_data (artist)
        else:
            print ("load_view")
            self.view.load_view()

        self.album_title = album_title
        self.artist = artist
class ArtistInfoTab(GObject.GObject):

    __gsignals__ = {
        'switch-tab':
        (GObject.SIGNAL_RUN_LAST, GObject.TYPE_NONE, (GObject.TYPE_STRING, ))
    }

    button_image = "microphone.png"
    button_name = "artist"

    def __init__(self, plugin, shell, buttons, ds, view):
        GObject.GObject.__init__(self)
        self.shell = shell
        self.sp = shell.props.shell_player
        self.db = shell.props.db
        self.buttons = buttons

        self.button = PixbufButton()
        self.button.set_image(create_button_image(plugin, self.button_image))
        self.ds = ds
        self.view = view
        self.album_title = None
        self.artist = None
        self.active = False

        self.button.show()
        self.button.set_relief(Gtk.ReliefStyle.NONE)
        self.button.set_focus_on_click(False)
        self.button.connect(
            'clicked',
            lambda button: self.emit('switch-tab', self.button_name))
        buttons.pack_start(self.button, False, True, 0)

    def activate(self, artist=None, album_title=None):
        print("activating Artist Tab")
        self.button.set_active(True)
        self.active = True
        self.reload(artist, album_title)

    def deactivate(self):
        print("deactivating Artist Tab")
        self.button.set_active(False)
        self.active = False

    def reload(self, artist, album_title):
        if not artist:
            return

        if self.active and artist_exceptions(artist):
            print("blank")
            self.view.blank_view()
            return

        if self.active and (
            (not self.artist or self.artist != artist) or
            (not self.album_title or self.album_title != album_title)):
            print("now loading")
            self.view.loading(artist, album_title)
            print("active")
            self.ds.fetch_artist_data(artist)
        else:
            print("load_view")
            self.view.load_view()

        self.album_title = album_title
        self.artist = artist
    def setup_source(self):

        colour = self.viewmgr.get_selection_colour()
        self.cover_search_pane = CoverSearchPane(self.plugin, colour)

        self.stack.add_titled(self.cover_search_pane, "notebook_covers", _("Covers"))

        # define entry-view toolbar
        self.stars = ReactiveStar()
        self.stars.set_rating(0)
        self.stars.connect('changed', self.rating_changed_callback)
        self.stars.props.valign = Gtk.Align.CENTER
        self.entry_view_grid.attach(self.stars, 1, 1, 1, 1)
        stack_switcher = Gtk.StackSwitcher()
        stack_switcher.set_stack(self.stack)
        self.entry_view_grid.attach(stack_switcher, 0, 1, 1, 1)
        viewtoggle = PixbufButton()
        viewtoggle.set_image(create_button_image(self.plugin, "entryview.png"))
        self.viewtoggle_id = None

        setting = self.gs.get_setting(self.gs.Path.PLUGIN)
        viewtoggle.set_active(not setting[self.gs.PluginKey.ENTRY_VIEW_MODE])
        self.entry_view_toggled(viewtoggle, True)
        viewtoggle.connect('toggled', self.entry_view_toggled)

        smallwindowbutton = PixbufButton()
        smallwindowbutton.set_image(create_button_image(self.plugin, "view-restore.png"))
        smallwindowbutton.connect('toggled', self.smallwindowbutton_callback)

        self.smallwindowext = ExternalPlugin()
        self.smallwindowext.appendattribute('plugin_name', 'smallwindow')
        self.smallwindowext.appendattribute('action_group_name', 'small window actions')
        self.smallwindowext.appendattribute('action_name', 'SmallWindow')
        self.smallwindowext.appendattribute('action_type', 'app')

        whatsplayingtoggle = PixbufButton()
        whatsplayingtoggle.set_image(create_button_image(self.plugin, "whatsplaying.png"))
        whatsplayingtoggle.connect('toggled', self.whatsplayingtoggle_callback)

        rightgrid = Gtk.Grid()
        rightgrid.props.halign = Gtk.Align.END

        # rightgrid.attach(whatsplayingtoggle, 0, 0, 1, 1)
        rightgrid.attach(viewtoggle, 1, 0, 1, 1)
        rightgrid.attach(smallwindowbutton, 2, 0, 1, 1)

        self.entry_view_grid.attach_next_to(rightgrid, self.stars, Gtk.PositionType.RIGHT, 1, 1)
        self.stack.set_visible_child(self.entry_view_results)
        self.stack.connect('notify::visible-child-name', self.notebook_switch_page_callback)

        self.entry_view_grid.show_all()
        smallwindowbutton.set_visible(self.smallwindowext.is_activated())
class AlbumInfoTab (GObject.GObject):

    __gsignals__ = {
        'switch-tab' : (GObject.SIGNAL_RUN_LAST, GObject.TYPE_NONE,
                                (GObject.TYPE_STRING,))
    }
    
    def __init__ (self, plugin, shell, buttons, ds, view):
        GObject.GObject.__init__ (self)
        self.shell      = shell
        self.sp         = shell.props.shell_player
        self.db         = shell.props.db
        self.buttons    = buttons

        #self.button     = Gtk.ToggleButton (label=_("Albums"))
        self.button     = PixbufButton()
        self.button.set_image(create_button_image(plugin, "covermgr.png"))
        self.ds         = ds
        self.view       = view
        self.album_title= None
        self.artist     = None
        self.active     = False
        
        self.button.show()
        self.button.set_relief (Gtk.ReliefStyle.NONE)
        self.button.set_focus_on_click(False)
        self.button.connect ('clicked', 
            lambda button: self.emit ('switch-tab', 'album'))
        buttons.pack_start (self.button, False, True, 0)

    def activate (self, artist, album_title):
        self.button.set_active(True)
        self.active = True
        self.reload (artist, album_title)

    def deactivate (self):
        self.button.set_active(False)
        self.active = False

    def reload (self, artist, album_title):
        if not artist:
            return
            
        if self.active and artist_exceptions(artist):
            print ("blank")
            self.view.blank_view()
            return
            
        if self.active and (not self.artist or artist != self.artist):
            self.view.loading(artist, album_title)
            self.ds.fetch_album_list (artist)
        else:
            self.view.load_view()

        self.album_title = album_title
        self.artist = artist