def load(self, media): self._progress_scale_zero() self._set_duration(media.get_duration()) self.songTotalTimeLabel.set_label( utils.seconds_to_string(media.get_duration())) self.progressScale.set_sensitive(True) self.playBtn.set_sensitive(True) self._sync_prev_next() artist = utils.get_artist_name(media) self.artistLabel.set_label(artist) self._currentArtist = artist self.coverImg.set_from_surface(self._loading_icon_surface) self.cache.lookup(media, ArtSize.xsmall, self._on_cache_lookup, None) self._currentTitle = utils.get_media_title(media) self.titleLabel.set_label(self._currentTitle) self._currentTimestamp = int(time.time()) url = media.get_url() if url != self.player.get_value('current-uri', 0): self.player.set_property('uri', url) if self.currentTrack and self.currentTrack.valid(): currentTrack = self.playlist.get_iter(self.currentTrack.get_path()) self.emit('playlist-item-changed', self.playlist, currentTrack) self.emit('current-changed') self._validate_next_track()
def load(self, media): self._progress_scale_zero() self._set_duration(media.get_duration()) self.songTotalTimeLabel.set_label( utils.seconds_to_string(media.get_duration())) self.progressScale.set_sensitive(True) self.playBtn.set_sensitive(True) self._sync_prev_next() artist = utils.get_artist_name(media) self.artistLabel.set_label(artist) self.coverImg.set_from_surface(self._loading_icon_surface) self.cache.lookup(media, ArtSize.XSMALL, self._on_cache_lookup, None) title = utils.get_media_title(media) self.titleLabel.set_label(title) self._time_stamp = int(time.time()) url = media.get_url() if url != self.player.get_value('current-uri', 0): self.player.set_property('uri', url) if self.currentTrack and self.currentTrack.valid(): currentTrack = self.playlist.get_iter(self.currentTrack.get_path()) self.emit('playlist-item-changed', self.playlist, currentTrack) self.emit('current-changed') self._validate_next_track()
def _create_song_widget(self, track): """Helper function to create a song widget for a single song :param track: A Grilo media item :returns: A complete song widget :rtype: Gtk.EventBox """ builder = Gtk.Builder() builder.add_from_resource('/org/gnome/Music/TrackWidget.ui') song_widget = builder.get_object('eventbox1') self._songs.append(song_widget) title = utils.get_media_title(track) itr = self._model.append(None) self._model[itr][0, 1, 2, 5, 6] = [title, '', '', track, False] song_widget.itr = itr song_widget.model = self._model track_number = track.get_track_number() if track_number == 0: track_number = "" song_widget.number = builder.get_object('num') song_widget.number.set_markup( '<span color=\'grey\'>{}</span>'.format(track_number)) song_widget.number.set_no_show_all(True) song_widget.title = builder.get_object('title') song_widget.title.set_text(title) song_widget.title.set_max_width_chars(50) song_widget.duration = builder.get_object('duration') time = utils.seconds_to_string(track.get_duration()) song_widget.duration.set_text(time) song_widget.check_button = builder.get_object('select') song_widget.check_button.set_visible(False) song_widget.check_button.connect('toggled', self._check_button_toggled, song_widget) song_widget.now_playing_sign = builder.get_object('image1') song_widget.now_playing_sign.set_from_icon_name( NOW_PLAYING_ICON_NAME, Gtk.IconSize.SMALL_TOOLBAR) song_widget.now_playing_sign.set_no_show_all(True) song_widget.can_be_played = True song_widget.connect('button-release-event', self._track_activated) song_widget.star_stack = builder.get_object('starstack') song_widget.star_stack.set_favorite(track.get_lyrics()) song_widget.star_stack.set_visible(True) song_widget.starevent = builder.get_object('starevent') song_widget.starevent.connect('button-release-event', self._toggle_favorite, song_widget) return song_widget
def _on_list_widget_duration_render(self, col, cell, model, _iter, data): if not model.iter_is_valid(_iter): return item = model[_iter][5] if item: duration = item.get_duration() cell.set_property('text', utils.seconds_to_string(duration))
def _update_view(self, player, playlist, current_iter): media = playlist[current_iter][player.Field.SONG] self._duration_label.set_label( utils.seconds_to_string(media.get_duration())) self._play_button.set_sensitive(True) self._sync_prev_next() self._artist_label.set_label(utils.get_artist_name(media)) self._title_label.set_label(utils.get_media_title(media)) self._cover_stack.update(media)
def __init__(self, media): super().__init__() self._media = media self._selection_mode = False self._state = SongWidget.State.UNPLAYED song_number = media.get_track_number() if song_number == 0: song_number = "" self._number_label.set_text(str(song_number)) title = utils.get_media_title(media) self._title_label.set_max_width_chars(50) self._title_label.set_text(title) self._title_label.props.tooltip_text = title time = utils.seconds_to_string(media.get_duration()) self._duration_label.set_text(time) self._star_image.props.favorite = media.get_favourite() self._select_button.set_visible(False) self._play_icon.set_from_icon_name( 'media-playback-start-symbolic', Gtk.IconSize.SMALL_TOOLBAR) self._play_icon.set_no_show_all(True) self.bind_property( 'selected', self._select_button, 'active', GObject.BindingFlags.BIDIRECTIONAL | GObject.BindingFlags.SYNC_CREATE) self.bind_property( 'show-duration', self._duration_label, 'visible', GObject.BindingFlags.SYNC_CREATE) self._duration_label.set_no_show_all(True) self.bind_property( 'show-favorite', self._star_eventbox, 'visible', GObject.BindingFlags.SYNC_CREATE) self._star_eventbox.set_no_show_all(True) self.bind_property( 'show-song-number', self._number_label, 'visible', GObject.BindingFlags.SYNC_CREATE) self._number_label.set_no_show_all(True)
def _on_items_changed(self, model, position, removed, added): if removed > 0: for i in list(range(removed)): path = Gtk.TreePath.new_from_string("{}".format(position)) iter_ = self.get_iter(path) self.remove(iter_) if added > 0: for i in list(range(added)): coresong = model[position] time = utils.seconds_to_string(coresong.props.duration) self.insert_with_valuesv( position, [2, 3, 4, 5, 6, 7], [coresong.props.title, coresong.props.artist, coresong.props.album, time, int(coresong.props.favorite), coresong]) coresong.connect( "notify::favorite", self._on_favorite_changed) coresong.connect( "notify::validation", self._on_validation_state_changed)
def _update_view(self, player): """Updates model when the song changes :param Player player: The main player object """ current_song = player.props.current_song self._duration_label.set_label( utils.seconds_to_string(current_song.get_duration())) self._play_button.set_sensitive(True) self._sync_prev_next() artist = utils.get_artist_name(current_song) title = utils.get_media_title(current_song) self._title_label.props.label = title self._artist_label.props.label = artist self._tooltip.props.title = title self._tooltip.props.subtitle = artist self._cover_stack.update(current_song)
def _update_view(self, player): """Update all visual elements on song change :param Player player: The main player object """ coresong = player.props.current_song self._duration_label.props.label = utils.seconds_to_string( coresong.props.duration) self._progress_time_label.props.label = "0:00" self._play_button.set_sensitive(True) self._sync_prev_next() artist = coresong.props.artist title = coresong.props.title self._title_label.props.label = title self._artist_label.props.label = artist self._tooltip.props.title = title self._tooltip.props.subtitle = artist self._cover_stack.update(coresong)
def _on_list_widget_duration_render(self, col, cell, model, itr, data): item = model[itr][5] if item: seconds = item.get_duration() track_time = utils.seconds_to_string(seconds) cell.set_property('text', '{}'.format(track_time))
def _on_progress_value_changed(self, widget): seconds = int(self.progressScale.get_value() / 60) self.songPlaybackTimeLabel.set_label(utils.seconds_to_string(seconds)) return False
def _on_progress_value_changed(self, progress_scale): seconds = int(progress_scale.get_value() / 60) self._progress_time_label.set_label(utils.seconds_to_string(seconds))
def _on_clock_tick(self, player, seconds): self._progress_time_label.set_label(utils.seconds_to_string(seconds))
def __init__(self, coresong, can_dnd=False, show_artist_and_album=False): """Instanciates a SongWidget :param Corsong coresong: song associated with the widget :param bool can_dnd: allow drag and drop operations :param bool show_artist_and_album: display artist and album """ super().__init__() self.props.coresong = coresong self._selection_mode = False self._state = SongWidget.State.UNPLAYED self.props.coresong.bind_property( "track-number", self, "song-number", GObject.BindingFlags.SYNC_CREATE) self._title_label.set_max_width_chars(50) self.props.coresong.bind_property( "title", self._title_label, "label", GObject.BindingFlags.SYNC_CREATE) self.props.coresong.bind_property( "title", self._title_label, "tooltip-text", GObject.BindingFlags.SYNC_CREATE) time = utils.seconds_to_string(self.props.coresong.props.duration) self._duration_label.props.label = time if show_artist_and_album is True: self.props.coresong.bind_property( "album", self._album_label, "label", GObject.BindingFlags.SYNC_CREATE) self._album_label.props.visible = True self.props.coresong.bind_property( "artist", self._artist_label, "label", GObject.BindingFlags.SYNC_CREATE) self._artist_box.props.visible = True else: self._size_group.remove_widget(self._album_duration_box) self._select_button.set_visible(False) self._play_icon.set_from_icon_name( 'media-playback-start-symbolic', Gtk.IconSize.SMALL_TOOLBAR) self.props.coresong.bind_property( 'selected', self._select_button, 'active', GObject.BindingFlags.BIDIRECTIONAL | GObject.BindingFlags.SYNC_CREATE) self.bind_property( 'show-song-number', self._number_label, 'visible', GObject.BindingFlags.SYNC_CREATE) self.props.coresong.bind_property( "favorite", self._star_image, "favorite", GObject.BindingFlags.BIDIRECTIONAL | GObject.BindingFlags.SYNC_CREATE) self.props.coresong.bind_property( "state", self, "state", GObject.BindingFlags.SYNC_CREATE) self.props.coresong.connect( "notify::validation", self._on_validation_changed) if not self.props.coresong.props.is_tracker: self._star_stack.props.visible_child_name = "empty" if can_dnd is True: self._dnd_eventbox.props.visible = True self._drag_widget = None entries = [ Gtk.TargetEntry.new( "GTK_EVENT_BOX", Gtk.TargetFlags.SAME_APP, 0) ] self._dnd_eventbox.drag_source_set( Gdk.ModifierType.BUTTON1_MASK, entries, Gdk.DragAction.MOVE) self.drag_dest_set( Gtk.DestDefaults.ALL, entries, Gdk.DragAction.MOVE)