def __init__(self, book: Book, on_click): super().__init__(on_click, book) self.set_tooltip_text(_("Play this book")) scale = self.get_scale_factor() pixbuf = artwork_cache.get_cover_pixbuf(book.db_object, scale, BOOK_ICON_SIZE) if pixbuf: surface = Gdk.cairo_surface_create_from_pixbuf(pixbuf, scale, None) img = Gtk.Image.new_from_surface(surface) else: img = Gtk.Image.new_from_icon_name("book-open-variant-symbolic", Gtk.IconSize.MENU) img.props.pixel_size = BOOK_ICON_SIZE img.set_size_request(BOOK_ICON_SIZE, BOOK_ICON_SIZE) title_label = Gtk.Label() title_label.set_text(tools.shorten_string(book.name, MAX_BOOK_LENGTH)) title_label.set_halign(Gtk.Align.START) title_label.props.margin = 4 title_label.props.hexpand = True title_label.props.hexpand_set = True title_label.set_margin_right(5) title_label.props.width_request = 100 title_label.props.xalign = 0.0 title_label.set_line_wrap(True) self.box.add(img) self.box.add(title_label) self.add(self.box) self.show_all()
def update_track_ui(self): # set data of new stream in ui track = player.get_current_track() if track is None: return self.title_label.set_text(track.book.name) self.subtitle_label.set_text(track.name) self.block_ui_buttons(False) self.progress_scale.set_sensitive(True) self.progress_scale.set_visible(True) # only change cover when book has changed if self.current_book is not track.book: self.current_book = track.book if tools.is_elementary(): size = 28 else: size = 40 self.set_title_cover( artwork_cache.get_cover_pixbuf( track.book, self.ui.window.get_scale_factor(), size), size) self.current_remaining = db.get_book_remaining(self.current_book, False) self.current_elapsed = db.get_book_progress(self.current_book, False) self.__update_progress_scale_range() if tools.get_glib_settings().get_boolean("titlebar-remaining-time"): self.progress_scale.set_value(self.current_elapsed / self.ui.speed.get_speed()) else: self.progress_scale.set_value(0) self.update_ui_time(None) self.current_label.set_visible(True) self.remaining_label.set_visible(True)
def __init__(self, book, size, scale, bordered=False, square=False): """ :param size: the size for the longer side of the image :param bordered: should there be a border around the album art? :param square: should the widget be always a square? """ super().__init__() self.props.height_request = size self.book = book self.selected = False self.signal_ids = [] self.play_signal_ids = [] # the event box is used for mouse enter and leave signals self.event_box = Gtk.EventBox() self.event_box.set_property("halign", Gtk.Align.CENTER) self.event_box.set_property("valign", Gtk.Align.CENTER) # scale the book cover to a fix size. pixbuf = artwork_cache.get_cover_pixbuf(book, scale, size) # box is the main container for the album art self.set_halign(Gtk.Align.CENTER) self.set_valign(Gtk.Align.CENTER) # img contains the album art img = Gtk.Image() img.set_halign(Gtk.Align.CENTER) img.set_valign(Gtk.Align.CENTER) if pixbuf: if bordered: img.get_style_context().add_class("bordered") surface = Gdk.cairo_surface_create_from_pixbuf(pixbuf, scale, None) img.set_from_surface(surface) else: img.set_from_icon_name("book-open-variant-symbolic", Gtk.IconSize.DIALOG) img.props.pixel_size = size self.play_box = Gtk.EventBox() # on click we want to play the audio book self.play_signal_ids.append( self.play_box.connect("button-press-event", self._on_play_button_press)) self.play_box.set_property("halign", Gtk.Align.CENTER) self.play_box.set_property("valign", Gtk.Align.CENTER) self.play_box.set_tooltip_text(_("Play this book")) # play_color is an overlay for the play button # with this it should be visible on any album art color play_image = GdkPixbuf.Pixbuf.new_from_resource( "/de/geigi/cozy/play_background.svg") if square: play_image = play_image.scale_simple(size - 10, size - 10, GdkPixbuf.InterpType.BILINEAR) if size < 100: self.icon_size = Gtk.IconSize.LARGE_TOOLBAR else: self.icon_size = Gtk.IconSize.DIALOG self.play_button = Gtk.Image.new_from_icon_name( "media-playback-start-symbolic", self.icon_size) self.play_button.set_property("halign", Gtk.Align.CENTER) self.play_button.set_property("valign", Gtk.Align.CENTER) self.play_button.get_style_context().add_class("white") # this is the main overlay for the album art # we need to create field for the overlays # to change the opacity of them on mouse over/leave events self.overlay = Gtk.Overlay.new() # this is the play symbol overlay self.play_overlay = Gtk.Overlay.new() # this is for the play button animation self.play_revealer = Gtk.Revealer() self.play_revealer.set_transition_type( Gtk.RevealerTransitionType.CROSSFADE) self.play_revealer.set_transition_duration(300) self.play_revealer.add(self.play_overlay) self.play_revealer.add_events(Gdk.EventMask.ENTER_NOTIFY_MASK) self.play_revealer.add_events(Gdk.EventMask.LEAVE_NOTIFY_MASK) # this grid has a background color to act as a visible overlay color = Gtk.Grid() color.set_property("halign", Gtk.Align.CENTER) color.set_property("valign", Gtk.Align.CENTER) if square: self.set_size_request(size, size) smaller_width = size - pixbuf.get_width() if smaller_width > 1: self.event_box.set_margin_left(smaller_width / 2) # assemble play overlay self.play_box.add(self.play_button) self.play_overlay.add(self.play_box) # assemble overlay with album art self.overlay.add(img) self.overlay.add_overlay(self.play_revealer) # assemble overlay color color.add(self.overlay) self.event_box.add(color) self.add(self.event_box) # connect signals self.play_signal_ids.append( self.play_box.connect("enter-notify-event", self._on_play_enter_notify)) self.play_signal_ids.append( self.play_box.connect("leave-notify-event", self._on_play_leave_notify)) # connect mouse events to the event box self.signal_ids.append( self.event_box.connect("enter-notify-event", self._on_enter_notify)) self.signal_ids.append( self.event_box.connect("leave-notify-event", self._on_leave_notify))
def set_book(self, book): """ Display the given book in the book overview. """ if self.book and self.book.id == book.id: self.update_time() return self.book = Book.get(Book.id == book.id) if player.is_playing() and self.ui.titlebar.current_book and self.book.id == self.ui.titlebar.current_book.id: self.play_book_button.set_image(self.pause_img) else: self.play_book_button.set_image(self.play_img) self.name_label.set_text(book.name) self.author_label.set_text(book.author) self.update_offline_status() pixbuf = artwork_cache.get_cover_pixbuf( book, self.ui.window.get_scale_factor(), 250) if pixbuf: surface = Gdk.cairo_surface_create_from_pixbuf( pixbuf, self.ui.window.get_scale_factor(), None) self.cover_img.set_from_surface(surface) else: self.cover_img.set_from_icon_name("book-open-variant-symbolic", Gtk.IconSize.DIALOG) self.cover_img.props.pixel_size = 250 self.duration = get_book_duration(book) self.speed = self.book.playback_speed self.total_label.set_text( tools.seconds_to_human_readable(self.duration / self.speed)) self.last_played_label.set_text( tools.past_date_to_human_readable(book.last_played)) self.published_label.set_visible(False) self.published_text.set_visible(False) # track list # This box contains all track content self.track_box = Gtk.Box() self.track_box.set_orientation(Gtk.Orientation.VERTICAL) self.track_box.set_halign(Gtk.Align.START) self.track_box.set_valign(Gtk.Align.START) self.track_box.props.margin = 8 disk_number = -1 first_disk_element = None disk_count = 0 for track in get_tracks(book): # Insert disk headers if track.disk != disk_number: disc_element = DiskElement(track.disk) self.track_box.add(disc_element) if disk_number == -1: first_disk_element = disc_element if track.disk < 2: first_disk_element.set_hidden(True) else: first_disk_element.show_all() disc_element.show_all() disk_number = track.disk disk_count += 1 track_element = TrackElement(track, self) self.track_box.add(track_element) track_element.show_all() self.track_list_container.remove_all_children() self.track_box.show() self.track_box.set_halign(Gtk.Align.FILL) self.track_list_container.add(self.track_box) self._mark_current_track() self.update_time()