def __init__(self, b): self.book = b self.ui = cozy.ui.main_view.CozyUI() self.ONLINE_TOOLTIP_TEXT = _("Open book overview") self.OFFLINE_TOOLTIP_TEXT = _("Currently offline") super().__init__() self.event_box = Gtk.EventBox() self.add_events(Gdk.EventMask.KEY_PRESS_MASK) self.box = Gtk.Box() self.box.set_orientation(Gtk.Orientation.VERTICAL) self.box.set_spacing(7) self.box.set_halign(Gtk.Align.CENTER) self.box.set_valign(Gtk.Align.START) self.box.set_margin_top(10) # label contains the book name and is limited to x chars title_label = Gtk.Label.new("") title = tools.shorten_string(self.book.name, MAX_BOOK_LENGTH) title_label.set_markup("<b>" + title + "</b>") title_label.set_xalign(0.5) title_label.set_line_wrap(Pango.WrapMode.WORD_CHAR) title_label.props.max_width_chars = 30 title_label.props.justify = Gtk.Justification.CENTER author_label = Gtk.Label.new( tools.shorten_string(self.book.author, MAX_BOOK_LENGTH)) author_label.set_xalign(0.5) author_label.set_line_wrap(Pango.WrapMode.WORD_CHAR) author_label.props.max_width_chars = 30 author_label.props.justify = Gtk.Justification.CENTER author_label.get_style_context().add_class("dim-label") self.art = AlbumElement(self.book, 180, self.ui.window.get_scale_factor(), bordered=True, square=False) if db.is_external( self.book) and not self.book.offline and not FilesystemMonitor( ).is_book_online(self.book): super().set_sensitive(False) self.box.set_tooltip_text(self.OFFLINE_TOOLTIP_TEXT) else: self.box.set_tooltip_text(self.ONLINE_TOOLTIP_TEXT) # assemble finished element self.box.add(self.art) self.box.add(title_label) self.box.add(author_label) self.event_box.add(self.box) self.add(self.event_box) self.event_box.connect("button-press-event", self.__on_button_press_event) self.connect("key-press-event", self.__on_key_press_event) FilesystemMonitor().add_listener(self.__on_storage_changed) Settings().add_listener(self.__on_storage_changed)
def __init__(self, on_click, artist: str, is_author): super().__init__(on_click, artist) self.is_author = is_author self.on_click = on_click title_label = Gtk.Label() if is_author: title_label.set_text(tools.shorten_string(artist, MAX_BOOK_LENGTH)) self.set_tooltip_text(_("Jump to author ") + artist) else: title_label.set_text(tools.shorten_string(artist, MAX_BOOK_LENGTH)) self.set_tooltip_text(_("Jump to reader ") + artist) 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(title_label) self.add(self.box) self.show_all()
def __init__(self, b, ui): self.book = b self.ui = ui super(Gtk.Box, self).__init__() self.set_orientation(Gtk.Orientation.VERTICAL) self.set_spacing(7) self.set_halign(Gtk.Align.CENTER) self.set_valign(Gtk.Align.START) self.set_margin_top(10) self.set_tooltip_text(_("Open book overview")) # label contains the book name and is limited to x chars title_label = Gtk.Label.new("") title = tools.shorten_string(self.book.name, MAX_BOOK_LENGTH) title_label.set_markup("<b>" + title + "</b>") title_label.set_xalign(0.5) title_label.set_line_wrap(Pango.WrapMode.WORD_CHAR) title_label.props.max_width_chars = 30 title_label.props.justify = Gtk.Justification.CENTER author_label = Gtk.Label.new(tools.shorten_string(self.book.author, MAX_BOOK_LENGTH)) author_label.set_xalign(0.5) author_label.set_line_wrap(Pango.WrapMode.WORD_CHAR) author_label.props.max_width_chars = 30 author_label.props.justify = Gtk.Justification.CENTER self.connect("button-press-event", self.__on_button_press) self.art = AlbumElement(self.book, 180, True) # assemble finished element self.add(self.art) self.add(title_label) self.add(author_label)
def __init__(self, book: Book): self.book: Book = book self.ui = cozy.ui.main_view.CozyUI() self.ONLINE_TOOLTIP_TEXT = _("Open book overview") super().__init__() self.event_box = Gtk.EventBox() self.add_events(Gdk.EventMask.KEY_PRESS_MASK) self.box = Gtk.Box() self.box.set_orientation(Gtk.Orientation.VERTICAL) self.box.set_spacing(7) self.box.set_halign(Gtk.Align.CENTER) self.box.set_valign(Gtk.Align.START) self.box.set_margin_top(10) # label contains the book name and is limited to x chars title_label = Gtk.Label() title = tools.shorten_string(self.book.name, MAX_BOOK_LENGTH) title_label.set_text(title) title_label.get_style_context().add_class("bold") title_label.set_xalign(0.5) title_label.set_line_wrap(Pango.WrapMode.WORD_CHAR) title_label.props.max_width_chars = 30 title_label.props.justify = Gtk.Justification.CENTER author_label = Gtk.Label.new( tools.shorten_string(self.book.author, MAX_BOOK_LENGTH)) author_label.set_xalign(0.5) author_label.set_line_wrap(Pango.WrapMode.WORD_CHAR) author_label.props.max_width_chars = 30 author_label.props.justify = Gtk.Justification.CENTER author_label.get_style_context().add_class("dim-label") self.art = AlbumElement(self.book, 180, self.ui.window.get_scale_factor(), bordered=True, square=False) self.box.set_tooltip_text(self.ONLINE_TOOLTIP_TEXT) # assemble finished element self.box.add(self.art) self.box.add(title_label) self.box.add(author_label) self.event_box.add(self.box) self.add(self.event_box) self.art.connect("play-pause-clicked", self._on_album_art_press_event) self.event_box.connect("button-press-event", self.__on_button_press_event) self.connect("key-press-event", self.__on_key_press_event)
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 = self._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 __init__(self, book, on_click): super().__init__(on_click, book) self.set_tooltip_text(_("Play this book")) img = AlbumElement(self.book, BOOK_ICON_SIZE, False, True) img.disconnect_signals() self.connect("enter-notify-event", img._on_enter_notify) self.connect("enter-notify-event", img._on_play_enter_notify) self.connect("leave-notify-event", img._on_leave_notify) self.connect("leave-notify-event", img._on_play_leave_notify) self.connect("button-press-event", img._on_play_button_press) title_label = Gtk.Label() title_label.set_text( tools.shorten_string(self.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 __init__(self, book, on_click, scale): super().__init__(on_click, book) self.set_tooltip_text(_("Play this book")) pixbuf = artwork_cache.get_cover_pixbuf(book, scale, BOOK_ICON_SIZE) surface = Gdk.cairo_surface_create_from_pixbuf(pixbuf, scale, None) img = Gtk.Image.new_from_surface(surface) img.set_size_request(BOOK_ICON_SIZE, BOOK_ICON_SIZE) title_label = Gtk.Label() title_label.set_text( tools.shorten_string(self.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 _process_queue(self): log.info("Startet processing queue") self.filecopy_cancel = Gio.Cancellable() self._fill_queue_from_db() self.total_batch_count = len(self.queue) self.current_batch_count = 0 if len(self.queue) > 0: self.current_book_processing = self.queue[0].track.book.id while len(self.queue) > 0: log.info("Processing item") self.current_batch_count += 1 item = self.queue[0] if self.thread.stopped(): break new_item = OfflineCacheModel.get(OfflineCacheModel.id == item.id) if self.current_book_processing != new_item.track.book.id: self.update_book_download_status( Book.get(Book.id == self.current_book_processing)) self.current_book_processing = new_item.track.book.id if not new_item.copied and os.path.exists(new_item.track.file): log.info("Copying item") Gdk.threads_add_idle(GLib.PRIORITY_DEFAULT_IDLE, self.ui.switch_to_working, _("Copying") + " " + tools.shorten_string(new_item.track.book.name, 30), False, False) self.current = new_item destination = Gio.File.new_for_path(os.path.join(self.cache_dir, new_item.file)) source = Gio.File.new_for_path(new_item.track.file) flags = Gio.FileCopyFlags.OVERWRITE try: copied = source.copy(destination, flags, self.filecopy_cancel, self.__update_copy_status, None) except Exception as e: if e.code == Gio.IOErrorEnum.CANCELLED: log.info("Download of book was cancelled.") self.thread.stop() break reporter.exception("offline_cache", e) log.error("Could not copy file to offline cache: " + new_item.track.file) log.error(e) self.queue.remove(item) continue if copied: OfflineCacheModel.update(copied=True).where( OfflineCacheModel.id == new_item.id).execute() self.queue.remove(item) if self.current_book_processing: self.update_book_download_status( Book.get(Book.id == self.current_book_processing)) self.current = None Gdk.threads_add_idle(GLib.PRIORITY_DEFAULT_IDLE, self.ui.switch_to_playing)
def __init__(self, on_click, track): super().__init__(on_click) self.track = track title_label = Gtk.Label() title_label.set_text(tools.shorten_string(self.track.name, MAX_TRACK_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(title_label) self.add(self.box) self.show_all()
def _process_queue(self): log.info("Started processing queue") self.filecopy_cancel = Gio.Cancellable() self._fill_queue_from_db() self.total_batch_count = len(self.queue) self.current_batch_count = 0 if len(self.queue) > 0: self.current_book_processing = self._get_book_to_file( self.queue[0].original_file).id self.emit_event_main_thread("start") while len(self.queue) > 0: log.info("Processing item") self.current_batch_count += 1 item = self.queue[0] if self.thread.stopped(): break query = OfflineCacheModel.select().where( OfflineCacheModel.id == item.id) if not query.exists(): continue new_item = OfflineCacheModel.get(OfflineCacheModel.id == item.id) book = self._get_book_to_file(new_item.original_file) if self.current_book_processing != book.id: self._update_book_download_status(self.current_book_processing) self.current_book_processing = book.id if not new_item.copied and os.path.exists( new_item.original_file.path): log.info("Copying item") self.emit_event_main_thread( "message", _("Copying") + " " + tools.shorten_string(book.name, 30)) self.current = new_item destination = Gio.File.new_for_path( os.path.join(self.cache_dir, new_item.cached_file)) source = Gio.File.new_for_path(new_item.original_file.path) flags = Gio.FileCopyFlags.OVERWRITE try: copied = source.copy(destination, flags, self.filecopy_cancel, self.__update_copy_status, None) except Exception as e: if e.code == Gio.IOErrorEnum.CANCELLED: log.info("Download of book was cancelled.") self.thread.stop() break reporter.exception("offline_cache", e) log.error("Could not copy file to offline cache: " + new_item.original_file.path) log.error(e) self.queue.remove(item) continue if copied: OfflineCacheModel.update(copied=True).where( OfflineCacheModel.id == new_item.id).execute() self.queue.remove(item) if self.current_book_processing: self._update_book_download_status(self.current_book_processing) self.current = None self.emit_event_main_thread("finished")