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 __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()
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)
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)