def _on_view_updated(self, view): """ @param view as AlbumsListView """ if self.__view.children: self.__duration_task = True App().task_helper.run(self.__calculate_duration) else: self.__duration_task = False self.__duration_label.set_text(get_human_duration(0))
def _on_view_updated(self, *ignore): """ Update duration """ if self.__view.children: self.__duration_task = True App().task_helper.run(self.__calculate_duration) else: self.__duration_task = False self.__duration_label.set_text(get_human_duration(0))
def __calculate_duration(self): """ Calculate playback duration """ duration = 0 for child in self.__view.children: if not self.__duration_task: return duration += child.album.duration GLib.idle_add(self.__duration_label.set_text, get_human_duration(duration))
def __set_duration(self, duration): """ Set playlist duration @param duration as int (seconds) """ self.__duration_label.set_text(get_human_duration(duration))
def __on_get_duration(self, duration): """ Update label @param duration as int """ self.__duration_label.set_text(get_human_duration(duration))
def __init__(self, album, storage_type, view_type): """ Init cover widget @param album @param storage_type as int @param view_type as ViewType """ BannerWidget.__init__(self, view_type) self.__album = album self.__storage_type = storage_type builder = Gtk.Builder() builder.add_from_resource("/org/gnome/Lollypop/AlbumBannerWidget.ui") builder.connect_signals(self) self.__labels = builder.get_object("labels") self.__title_label = builder.get_object("title_label") self.__title_label.connect("query-tooltip", on_query_tooltip) self.__artist_label = builder.get_object("artist_label") self.__artist_label.connect("query-tooltip", on_query_tooltip) self.__year_label = builder.get_object("year_label") self.__duration_label = builder.get_object("duration_label") self.__play_button = builder.get_object("play_button") self.__add_button = builder.get_object("add_button") self.__menu_button = builder.get_object("menu_button") self.__widget = builder.get_object("widget") if view_type & ViewType.OVERLAY: style = "banner-button" else: style = "menu-button" self.__play_button.get_style_context().add_class(style) self.__add_button.get_style_context().add_class(style) self.__menu_button.get_style_context().add_class(style) self.__cover_widget = CoverWidget(album, view_type) self.__cover_widget.show() self.__title_label.set_label(album.name) if view_type & ViewType.ALBUM: self.__artist_label.show() self.__artist_label.set_label(", ".join(album.artists)) else: self.__title_label.set_opacity(0.8) self.__year_label.set_opacity(0.7) self.__duration_label.set_opacity(0.6) self.__widget.get_style_context().add_class("album-banner") if album.year is not None: self.__year_label.set_label(str(album.year)) self.__year_label.show() human_duration = get_human_duration(album.duration) self.__duration_label.set_text(human_duration) artist_eventbox = builder.get_object("artist_eventbox") artist_eventbox.connect("realize", set_cursor_type) self.__gesture1 = GesturesHelper( artist_eventbox, primary_press_callback=self._on_artist_press) year_eventbox = builder.get_object("year_eventbox") year_eventbox.connect("realize", set_cursor_type) self.__gesture2 = GesturesHelper( year_eventbox, primary_press_callback=self._on_year_press) self.__widget.attach(self.__cover_widget, 0, 0, 1, 3) self.__bottom_box = builder.get_object("bottom_box") self.__loved_widget = LovedWidget(album, Gtk.IconSize.INVALID) self.__loved_widget.show() self.__bottom_box.pack_start(self.__loved_widget, 0, False, False) self.__rating_widget = RatingWidget(album, Gtk.IconSize.INVALID) self.__rating_widget.show() self.__bottom_box.pack_start(self.__rating_widget, 0, True, True) if view_type & ViewType.OVERLAY: self._overlay.add_overlay(self.__widget) self._overlay.set_overlay_pass_through(self.__widget, True) else: self.add(self.__widget) self.__update_add_button() self.__set_internal_size() return [(App().window.container.widget, "notify::folded", "_on_container_folded"), (App().art, "album-artwork-changed", "_on_album_artwork_changed"), (App().player, "playback-added", "_on_playback_changed"), (App().player, "playback-updated", "_on_playback_changed"), (App().player, "playback-removed", "_on_playback_changed")]
def populate(self): """ Populate the view """ if self.__widget is not None: return self.__widget = Gtk.Grid.new() self.__widget.set_margin_start(MARGIN) self.__widget.set_margin_end(MARGIN_MEDIUM) self.__widget.set_margin_top(MARGIN_SMALL) self.__widget.set_margin_bottom(MARGIN_SMALL) self.__widget.set_row_spacing(MARGIN_SMALL) self.__widget.set_column_spacing(MARGIN_MEDIUM) self.__top_box = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, 0) self.__middle_box = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, 0) self.__bottom_box = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, 0) self.__labels_box = Gtk.Box.new(Gtk.Orientation.VERTICAL, 0) self.__top_box.set_vexpand(True) self.__middle_box.set_halign(Gtk.Align.END) self.__middle_box.set_valign(Gtk.Align.CENTER) self.__middle_box.set_hexpand(True) self.__bottom_box.set_vexpand(True) self.__year_eventbox = Gtk.EventBox.new() self.__year_eventbox.set_hexpand(True) self.__year_eventbox.set_halign(Gtk.Align.END) self.__year_label = Gtk.Label.new() self.__year_label.get_style_context().add_class("dim-label") self.__year_eventbox.add(self.__year_label) self.__year_eventbox.connect("realize", set_cursor_type) self.__gesture_year = GesturesHelper( self.__year_eventbox, primary_press_callback=self._on_year_press) self.__play_button = Gtk.Button.new_from_icon_name( "media-playback-start-symbolic", Gtk.IconSize.BUTTON) self.__add_button = Gtk.Button.new_from_icon_name( "list-add-symbolic", Gtk.IconSize.BUTTON) self.__menu_button = Gtk.Button.new_from_icon_name( "view-more-symbolic", Gtk.IconSize.BUTTON) self.__play_button.connect("clicked", self.__on_play_button_clicked) self.__add_button.connect("clicked", self.__on_add_button_clicked) self.__menu_button.connect("clicked", self.__on_menu_button_clicked) self.__title_label = Gtk.Label.new() self.__title_label.set_valign(Gtk.Align.END) self.__title_label.set_vexpand(True) self.__title_label.connect("query-tooltip", on_query_tooltip) self.__title_label.set_ellipsize(Pango.EllipsizeMode.END) self.__title_label.set_halign(Gtk.Align.START) self.__title_label.set_xalign(0) self.__artist_label = Gtk.Label.new() self.__artist_eventbox = Gtk.EventBox.new() self.__artist_eventbox.set_valign(Gtk.Align.START) self.__artist_eventbox.add(self.__artist_label) self.__artist_eventbox.connect("realize", set_cursor_type) self.__artist_label.connect("query-tooltip", on_query_tooltip) self.__artist_label.set_ellipsize(Pango.EllipsizeMode.END) self.__artist_label.set_halign(Gtk.Align.START) self.__artist_label.set_xalign(0) self.__gesture_artist = GesturesHelper( self.__artist_eventbox, primary_press_callback=self._on_artist_press) self.__duration_label = Gtk.Label.new() self.__duration_label.get_style_context().add_class("dim-label") self.__top_box.pack_end(self.__year_eventbox, False, True, 0) self.__middle_box.add(self.__play_button) self.__middle_box.add(self.__add_button) self.__middle_box.add(self.__menu_button) self.__middle_box.get_style_context().add_class("linked") self.__bottom_box.pack_end(self.__duration_label, False, True, 0) self.__labels_box.add(self.__title_label) self.__labels_box.add(self.__artist_eventbox) self.__widget.attach(self.__top_box, 2, 0, 1, 1) self.__widget.attach(self.__middle_box, 2, 1, 1, 1) self.__widget.attach(self.__bottom_box, 1, 2, 2, 1) self.__widget.attach(self.__labels_box, 1, 0, 1, 2) self.__widget.show_all() if self.view_type & ViewType.OVERLAY: style = "banner-button" else: style = "menu-button" self.__play_button.get_style_context().add_class(style) self.__add_button.get_style_context().add_class(style) self.__menu_button.get_style_context().add_class(style) self.__title_label.set_label(self.__album.name) if self.view_type & ViewType.ALBUM: self.__cover_widget = EditCoverWidget(self.__album, self.view_type) self.__artist_label.get_style_context().add_class("dim-label") self.__artist_label.set_label(", ".join(self.__album.artists)) else: self.__artist_label.hide() self.__cover_widget = CoverWidget(self.__album, self.view_type) self.__cover_widget.set_margin_top(MARGIN_MEDIUM) self.__cover_widget.set_margin_bottom(MARGIN_MEDIUM) self.__cover_widget.connect("populated", self.__on_cover_populated) self.__cover_widget.show() if self.__album.year is not None: self.__year_label.set_label(str(self.__album.year)) self.__year_label.show() human_duration = get_human_duration(self.__album.duration) self.__duration_label.set_text(human_duration) self.__widget.attach(self.__cover_widget, 0, 0, 1, 3) self.__loved_widget = LovedWidget(self.__album, Gtk.IconSize.INVALID) self.__loved_widget.show() self.__bottom_box.pack_start(self.__loved_widget, 0, False, False) self.__rating_widget = RatingWidget(self.__album, Gtk.IconSize.INVALID) self.__rating_widget.show() self.__bottom_box.pack_start(self.__rating_widget, 0, True, True) if self.view_type & ViewType.OVERLAY: self._overlay.add_overlay(self.__widget) self._overlay.set_overlay_pass_through(self.__widget, True) else: self.add(self.__widget) self.__update_add_button() self.__set_internal_size()
def __init__(self, album, view_type=ViewType.DEFAULT): """ Init cover widget @param album @param view_type as ViewType """ Gtk.Bin.__init__(self) self.__view_type = view_type self.__height = None self.__width = 0 self.__cloud_image = None self.__allocation_timeout_id = None self.__album = album self.set_property("valign", Gtk.Align.START) builder = Gtk.Builder() builder.add_from_resource("/org/gnome/Lollypop/AlbumBannerWidget.ui") builder.connect_signals(self) self.__title_label = builder.get_object("name_label") self.__title_label.connect("query-tooltip", on_query_tooltip) self.__year_label = builder.get_object("year_label") self.__duration_label = builder.get_object("duration_label") self.__menu_button = builder.get_object("menu_button") self.__cover_widget = CoverWidget(album, view_type) self.__cover_widget.set_vexpand(True) self.__cover_widget.show() album_name = GLib.markup_escape_text(album.name) markup = "<b>%s</b>" % album_name if view_type & ViewType.ALBUM: artist_name = GLib.markup_escape_text(", ".join(album.artists)) if view_type & ViewType.SMALL: markup += "\n<span alpha='40000'>%s</span>" % artist_name else: markup += "\n<span size='x-small' alpha='40000'>%s</span>" %\ artist_name self.__title_label.set_markup(markup) if album.year is not None: self.__year_label.set_text(str(album.year)) else: self.__year_label.hide() year_eventbox = builder.get_object("year_eventbox") year_eventbox.connect("realize", on_realize) year_eventbox.connect("button-release-event", self.__on_year_button_release_event) duration = App().albums.get_duration(self.__album.id, self.__album.genre_ids) self.__duration_label.set_text(get_human_duration(duration)) self.__artwork = builder.get_object("artwork") self.__grid = builder.get_object("grid") self.__widget = builder.get_object("widget") if view_type & ViewType.ALBUM: self.__menu_button.get_style_context().add_class( "black-transparent") self.get_style_context().add_class("black") self.__artwork.get_style_context().add_class("black") self.connect("size-allocate", self.__on_size_allocate) self.connect("destroy", self.__on_destroy) self.__art_signal_id = App().art.connect( "album-artwork-changed", self.__on_album_artwork_changed) else: self.__grid.get_style_context().add_class("banner-frame") self.__grid.attach(self.__cover_widget, 0, 0, 1, 3) self.__rating_grid = builder.get_object("rating_grid") if album.mtime <= 0: self.__cloud_image = Gtk.Image.new() self.__cloud_image.show() self.__cloud_image.set_margin_start(MARGIN) self.__rating_grid.attach(self.__cloud_image, 1, 0, 1, 1) self.__rating_widget = RatingWidget(album, Gtk.IconSize.INVALID) self.__rating_widget.set_property("halign", Gtk.Align.START) self.__rating_widget.set_property("valign", Gtk.Align.CENTER) self.__rating_widget.show() self.__rating_grid.attach(self.__rating_widget, 2, 0, 1, 1) self.__loved_widget = LovedWidget(album, Gtk.IconSize.INVALID) self.__loved_widget.set_margin_start(10) self.__loved_widget.set_property("halign", Gtk.Align.START) self.__loved_widget.set_property("valign", Gtk.Align.CENTER) self.__loved_widget.show() self.__rating_grid.attach(self.__loved_widget, 3, 0, 1, 1) self.add(self.__widget) self.__cover_widget.set_margin_start(MARGIN) self.__year_label.set_margin_end(MARGIN) self.__duration_label.set_margin_start(MARGIN) self.__rating_grid.set_margin_end(MARGIN) self.set_view_type(view_type)