Exemple #1
0
    def __init__(self, player):
        Gtk.Bin.__init__(self)
        self.__player = player

        builder = Gtk.Builder()
        builder.add_from_file(
            xdg.get_data_path('ui', 'widgets', 'track_info.ui'))

        info_box = builder.get_object('info_box')
        info_box.reparent(self)

        self.__auto_update = False
        self.__display_progress = False
        self.__formatter = formatter.TrackFormatter(
            _('<span size="x-large" weight="bold">$title</span>\n'
              'by $artist\n'
              'from $album'))
        self.__formatter.connect('notify::format', self.on_notify_format)
        self.__default_text = ('<span size="x-large" '
                               'weight="bold">%s</span>\n\n' %
                               _('Not Playing'))
        self.__cover_size = None
        self.__timer = None
        self.__track = None

        self.info_label = builder.get_object('info_label')
        self.action_area = builder.get_object('action_area')
        self.progress_box = builder.get_object('progress_box')
        self.playback_image = builder.get_object('playback_image')
        self.progressbar = PlaybackProgressBar(player)
        guiutil.gtk_widget_replace(builder.get_object('progressbar'),
                                   self.progressbar)

        self.cover = cover.CoverWidget(builder.get_object('cover_image'))
        self.cover.hide()
        self.cover.set_no_show_all(True)

        self.clear()
        self.__update_widget_state()
Exemple #2
0
    def __init__(self, player):
        Gtk.Bin.__init__(self)
        self.__player = player

        builder = Gtk.Builder()
        builder.add_from_file(xdg.get_data_path('ui', 'widgets', 'track_info.ui'))

        info_box = builder.get_object('info_box')
        info_box.reparent(self)

        self.__auto_update = False
        self.__display_progress = False
        self.__formatter = formatter.TrackFormatter(
            _(
                '<span size="x-large" weight="bold">$title</span>\n'
                'by $artist\n'
                'from $album'
            )
        )
        self.__formatter.connect('notify::format', self.on_notify_format)
        self.__default_text = '<span size="x-large" ' 'weight="bold">%s</span>\n\n' % _(
            'Not Playing'
        )
        self.__cover_size = None
        self.__timer = None
        self.__track = None

        self.info_label = builder.get_object('info_label')
        self.action_area = builder.get_object('action_area')
        self.progress_box = builder.get_object('progress_box')
        self.playback_image = builder.get_object('playback_image')
        self.progressbar = PlaybackProgressBar(player)
        guiutil.gtk_widget_replace(builder.get_object('progressbar'), self.progressbar)

        self.cover = cover.CoverWidget(builder.get_object('cover_image'))
        self.cover.hide()
        self.cover.set_no_show_all(True)

        self.clear()
        self.__update_widget_state()
Exemple #3
0
class TrackInfoPane(Gtk.Bin):
    """
        Displays cover art and track data
    """
    def __init__(self, player):
        Gtk.Bin.__init__(self)
        self.__player = player

        builder = Gtk.Builder()
        builder.add_from_file(
            xdg.get_data_path('ui', 'widgets', 'track_info.ui'))

        info_box = builder.get_object('info_box')
        info_box.reparent(self)

        self.__auto_update = False
        self.__display_progress = False
        self.__formatter = formatter.TrackFormatter(
            _('<span size="x-large" weight="bold">$title</span>\n'
              'by $artist\n'
              'from $album'))
        self.__formatter.connect('notify::format', self.on_notify_format)
        self.__default_text = '<span size="x-large" ' 'weight="bold">%s</span>\n\n' % _(
            'Not Playing')
        self.__cover_size = None
        self.__timer = None
        self.__track = None

        self.info_label = builder.get_object('info_label')
        self.action_area = builder.get_object('action_area')
        self.progress_box = builder.get_object('progress_box')
        self.playback_image = builder.get_object('playback_image')
        self.progressbar = PlaybackProgressBar(player)
        guiutil.gtk_widget_replace(builder.get_object('progressbar'),
                                   self.progressbar)

        self.cover = cover.CoverWidget(builder.get_object('cover_image'))
        self.cover.hide()
        self.cover.set_no_show_all(True)

        self.clear()
        self.__update_widget_state()

    def destroy(self):
        """
            Cleanups
        """
        # Make sure to disconnect callbacks
        self.set_auto_update(False)

        Gtk.Bin.destroy(self)

    def get_auto_update(self):
        """
            Gets whether the info pane shall
            be automatically updated or not

            :rtype: bool
        """
        return self.__auto_update

    def set_auto_update(self, auto_update):
        """
            Sets whether the info pane shall
            be automatically updated or not

            :param auto_update: enable or disable
                automatic updating
            :type auto_update: bool
        """
        if auto_update != self.__auto_update:
            self.__auto_update = auto_update

            p_evts = [
                'playback_player_end',
                'playback_track_start',
                'playback_toggle_pause',
                'playback_error',
            ]
            events = ['track_tags_changed', 'cover_set', 'cover_removed']

            if auto_update:
                for e in p_evts:
                    event.add_ui_callback(getattr(self, 'on_%s' % e), e,
                                          self.__player)
                for e in events:
                    event.add_ui_callback(getattr(self, 'on_%s' % e), e)

                self.set_track(self.__player.current)
            else:
                for e in p_evts:
                    event.remove_callback(getattr(self, 'on_%s' % e), e,
                                          self.__player)
                for e in events:
                    event.remove_callback(getattr(self, 'on_%s' % e), e)

    def get_cover_size(self):
        """
            Gets the preferred cover size

            :rtype: int
        """
        return self.__cover_size or settings.get_option('gui/cover_width', 100)

    def set_cover_size(self, cover_size):
        """
            Overrides the cover size to display,
            set to None to use global default

            :param cover_size: the preferred cover size
            :type cover_size: int
        """
        self.__cover_size = cover_size

    def get_default_text(self):
        """
            Gets the default text displayed
            when the playback is stopped

            :rtype: string
        """
        return self.__default_text

    def set_default_text(self, default_text):
        """
            Sets the default text displayed
            when the playback is stopped

            :param default_text: the new default text
            :type default_text: string
        """
        self.__default_text = default_text

    def get_display_progress(self):
        """
            Returns whether the progress indicator
            is currently visible or not

            :rtype: bool
        """
        return self.__display_progress

    def set_display_progress(self, display_progress):
        """
            Shows or hides the progress indicator. The
            indicator will not be displayed if the
            currently displayed track is not playing.

            :param display_progress: Whether to show
                or hide the progress indicator
            :type display_progress: bool
        """
        self.__display_progress = display_progress
        self.__update_widget_state()

    def get_info_format(self):
        """
            Gets the current format used
            to display the track data

            :rtype: string
        """
        return self.__formatter.props.format

    def set_info_format(self, format):
        """
            Sets the format used to display the track data

            :param format: the format, see the documentation
                of :class:`string.Template` for details
            :type format: string
        """
        self.__formatter.props.format = format

    def set_track(self, track):
        """
            Updates the data displayed in the info pane

            :param track: A track to take the data from,
                clears the info pane if track is None
            :type track: :class:`xl.trax.Track`
        """
        if track is None:
            self.clear()
            return

        self.__track = track

        self.cover.set_track(track)

        self.info_label.set_markup(
            self.__formatter.format(track, markup_escape=True))
        self.__update_widget_state()

    def __update_widget_state(self):
        if self.__display_progress:
            if self.__track == self.__player.current and not self.__player.is_stopped(
            ):

                if self.__player.is_paused():
                    icon_name = 'media-playback-pause'
                else:
                    icon_name = 'media-playback-start'
                self.playback_image.set_from_icon_name(
                    icon_name, Gtk.IconSize.SMALL_TOOLBAR)

            self.progress_box.set_no_show_all(False)
            self.progress_box.set_visible(True)
            self.progressbar.set_visible(True)
        else:
            self.progress_box.set_visible(False)
            self.progress_box.set_no_show_all(True)
            self.progressbar.set_visible(True)

    def clear(self):
        """
            Resets the info pane
        """

        self.cover.set_track(None)
        self.info_label.set_markup(self.__default_text)

        self.__track = None
        self.__update_widget_state()

    def get_action_area(self):
        """
            Retrieves the action area
            at the end of the pane

            :rtype: :class:`Gtk.Box`
        """
        return self.action_area

    def on_notify_format(self, formatter, format):
        """
            Updates the displayed data after format changes
        """
        if self.__track is not None:
            self.set_track(self.__track)

    def on_playback_player_end(self, event, player, track):
        """
            Clears the info pane on playback end
        """
        self.clear()

    def on_playback_track_start(self, event, player, track):
        """
            Updates the info pane on track start
        """
        self.set_track(track)

    def on_playback_toggle_pause(self, event, player, track):
        """
            Updates the info pane on playback pause/resume
        """
        self.set_track(track)

    def on_playback_error(self, event, player, message):
        """
            Clears the info pane on playback errors
        """
        self.clear()

    def on_track_tags_changed(self, event, track, tags):
        """
            Updates the info pane on tag changes
        """
        if (self.__player is not None and not self.__player.is_stopped()
                and track is self.__track):
            self.set_track(track)

    def on_cover_set(self, event, covers, track):
        """
            Updates the info pane on cover set
        """
        if track is self.__track:
            self.set_track(track)

    def on_cover_removed(self, event, covers, track):
        """
            Updates the info pane on cover removal
        """
        if track is self.__track:
            self.set_track(track)
Exemple #4
0
class TrackInfoPane(Gtk.Bin):
    """
        Displays cover art and track data
    """

    def __init__(self, player):
        Gtk.Bin.__init__(self)
        self.__player = player

        builder = Gtk.Builder()
        builder.add_from_file(xdg.get_data_path('ui', 'widgets', 'track_info.ui'))

        info_box = builder.get_object('info_box')
        info_box.reparent(self)

        self.__auto_update = False
        self.__display_progress = False
        self.__formatter = formatter.TrackFormatter(
            _(
                '<span size="x-large" weight="bold">$title</span>\n'
                'by $artist\n'
                'from $album'
            )
        )
        self.__formatter.connect('notify::format', self.on_notify_format)
        self.__default_text = '<span size="x-large" ' 'weight="bold">%s</span>\n\n' % _(
            'Not Playing'
        )
        self.__cover_size = None
        self.__timer = None
        self.__track = None

        self.info_label = builder.get_object('info_label')
        self.action_area = builder.get_object('action_area')
        self.progress_box = builder.get_object('progress_box')
        self.playback_image = builder.get_object('playback_image')
        self.progressbar = PlaybackProgressBar(player)
        guiutil.gtk_widget_replace(builder.get_object('progressbar'), self.progressbar)

        self.cover = cover.CoverWidget(builder.get_object('cover_image'))
        self.cover.hide()
        self.cover.set_no_show_all(True)

        self.clear()
        self.__update_widget_state()

    def destroy(self):
        """
            Cleanups
        """
        # Make sure to disconnect callbacks
        self.set_auto_update(False)

        Gtk.Bin.destroy(self)

    def get_auto_update(self):
        """
            Gets whether the info pane shall
            be automatically updated or not

            :rtype: bool
        """
        return self.__auto_update

    def set_auto_update(self, auto_update):
        """
            Sets whether the info pane shall
            be automatically updated or not

            :param auto_update: enable or disable
                automatic updating
            :type auto_update: bool
        """
        if auto_update != self.__auto_update:
            self.__auto_update = auto_update

            p_evts = [
                'playback_player_end',
                'playback_track_start',
                'playback_toggle_pause',
                'playback_error',
            ]
            events = ['track_tags_changed', 'cover_set', 'cover_removed']

            if auto_update:
                for e in p_evts:
                    event.add_ui_callback(getattr(self, 'on_%s' % e), e, self.__player)
                for e in events:
                    event.add_ui_callback(getattr(self, 'on_%s' % e), e)

                self.set_track(self.__player.current)
            else:
                for e in p_evts:
                    event.remove_callback(getattr(self, 'on_%s' % e), e, self.__player)
                for e in events:
                    event.remove_callback(getattr(self, 'on_%s' % e), e)

    def get_cover_size(self):
        """
            Gets the preferred cover size

            :rtype: int
        """
        return self.__cover_size or settings.get_option('gui/cover_width', 100)

    def set_cover_size(self, cover_size):
        """
            Overrides the cover size to display,
            set to None to use global default

            :param cover_size: the preferred cover size
            :type cover_size: int
        """
        self.__cover_size = cover_size

    def get_default_text(self):
        """
            Gets the default text displayed
            when the playback is stopped

            :rtype: string
        """
        return self.__default_text

    def set_default_text(self, default_text):
        """
            Sets the default text displayed
            when the playback is stopped

            :param default_text: the new default text
            :type default_text: string
        """
        self.__default_text = default_text

    def get_display_progress(self):
        """
            Returns whether the progress indicator
            is currently visible or not

            :rtype: bool
        """
        return self.__display_progress

    def set_display_progress(self, display_progress):
        """
            Shows or hides the progress indicator. The
            indicator will not be displayed if the
            currently displayed track is not playing.

            :param display_progress: Whether to show
                or hide the progress indicator
            :type display_progress: bool
        """
        self.__display_progress = display_progress
        self.__update_widget_state()

    def get_info_format(self):
        """
            Gets the current format used
            to display the track data

            :rtype: string
        """
        return self.__formatter.props.format

    def set_info_format(self, format):
        """
            Sets the format used to display the track data

            :param format: the format, see the documentation
                of :class:`string.Template` for details
            :type format: string
        """
        self.__formatter.props.format = format

    def set_track(self, track):
        """
            Updates the data displayed in the info pane

            :param track: A track to take the data from,
                clears the info pane if track is None
            :type track: :class:`xl.trax.Track`
        """
        if track is None:
            self.clear()
            return

        self.__track = track

        self.cover.set_track(track)

        self.info_label.set_markup(self.__formatter.format(track, markup_escape=True))
        self.__update_widget_state()

    def __update_widget_state(self):
        if self.__display_progress:
            if self.__track == self.__player.current and not self.__player.is_stopped():

                if self.__player.is_paused():
                    icon_name = 'media-playback-pause'
                else:
                    icon_name = 'media-playback-start'
                self.playback_image.set_from_icon_name(
                    icon_name, Gtk.IconSize.SMALL_TOOLBAR
                )

            self.progress_box.set_no_show_all(False)
            self.progress_box.set_visible(True)
            self.progressbar.set_visible(True)
        else:
            self.progress_box.set_visible(False)
            self.progress_box.set_no_show_all(True)
            self.progressbar.set_visible(True)

    def clear(self):
        """
            Resets the info pane
        """

        self.cover.set_track(None)
        self.info_label.set_markup(self.__default_text)

        self.__track = None
        self.__update_widget_state()

    def get_action_area(self):
        """
            Retrieves the action area
            at the end of the pane

            :rtype: :class:`Gtk.Box`
        """
        return self.action_area

    def on_notify_format(self, formatter, format):
        """
            Updates the displayed data after format changes
        """
        if self.__track is not None:
            self.set_track(self.__track)

    def on_playback_player_end(self, event, player, track):
        """
            Clears the info pane on playback end
        """
        self.clear()

    def on_playback_track_start(self, event, player, track):
        """
            Updates the info pane on track start
        """
        self.set_track(track)

    def on_playback_toggle_pause(self, event, player, track):
        """
            Updates the info pane on playback pause/resume
        """
        self.set_track(track)

    def on_playback_error(self, event, player, message):
        """
            Clears the info pane on playback errors
        """
        self.clear()

    def on_track_tags_changed(self, event, track, tags):
        """
            Updates the info pane on tag changes
        """
        if (
            self.__player is not None
            and not self.__player.is_stopped()
            and track is self.__track
        ):
            self.set_track(track)

    def on_cover_set(self, event, covers, track):
        """
            Updates the info pane on cover set
        """
        if track is self.__track:
            self.set_track(track)

    def on_cover_removed(self, event, covers, track):
        """
            Updates the info pane on cover removal
        """
        if track is self.__track:
            self.set_track(track)