def initialize_thumbs_window(self): options = self.load_options() def _go(): self.thumbs_window = ThumbsWindow(screen=self.screen, position=options.position, breadth=options.breadth) try: icon = varietyconfig.get_data_file("media", "variety.svg") self.thumbs_window.set_icon_from_file(icon) except Exception: logger.exception(lambda: "Could not set thumbs window icon") if self.type == "history": title = _("Variety History") elif self.type == "downloads": title = _("Variety Recent Downloads") else: title = _("Variety Images") self.thumbs_window.set_title(title) self.thumbs_window.connect("clicked", self.on_click) def _on_close(window, event): self.hide(force=True) self.thumbs_window.connect("delete-event", _on_close) self.mark_active(self.active_file, self.active_position) self.thumbs_window.start(self.images) Util.add_mainloop_task(_go)
def ok_thread(self): def _start_ui(): self.ui.message.set_visible(True) self.ui.buttonbox.set_sensitive(False) self.ui.query.set_sensitive(False) self.ui.spinner.set_visible(True) self.ui.spinner.start() self.ui.error.set_label("") Util.add_mainloop_task(_start_ui) query = self.ui.query.get_text().strip() final_query, invalid_msg = self.validate(query) def _stop_ui(): if invalid_msg: self.ui.buttonbox.set_sensitive(True) self.ui.error.set_label(invalid_msg) self.ui.spinner.stop() self.ui.query.set_sensitive(True) self.ui.message.set_visible(False) self.ui.spinner.set_visible(False) self.ui.query.grab_focus() else: self.commit(final_query) self.destroy() Util.add_mainloop_task(_stop_ui)
def _autoscroll_thread(self): last_update = time.time() while self.running: while not self.mouse_in: if not self.running: return self.autoscroll_event.wait(10) time.sleep(max(0, last_update + 0.005 - time.time())) if not self.mouse_position or self.scrolling_paused: continue x = self.mouse_position[0] y = self.mouse_position[1] def _go(): if self.is_horizontal() and y > 0: self.autoscroll_step(self.scroll.get_hadjustment(), self.scroll.get_min_content_width(), x) elif not self.is_horizontal() and x > 0: self.autoscroll_step(self.scroll.get_vadjustment(), self.scroll.get_min_content_height(), y) Util.add_mainloop_task(_go) last_update = time.time()
def _thumbs_thread(self): logger.debug(lambda: "Starting thumb thread %s, %d" % (str(self), time.time())) try: self.total_width = 0 for i, file in enumerate(self.images): if not self.running: Util.add_mainloop_task(self.destroy) return self.add_image(file, at_front=False) self.image_count = i except Exception: logger.exception(lambda: "Error while creating thumbs:")
def populate_sfw_menu(self): try: self.rating_items = [] sfw_ratings = Smart.get_all_sfw_ratings() def _gui_update(sfw_ratings): try: def _add_menuitem(rating): menuitem = Gtk.ImageMenuItem(_(rating['label_long'])) menuitem.set_visible(True) def _rate(*args, **kwargs): self.parent.report_sfw_rating(file=None, rating=rating['rating']) menuitem.connect("activate", _rate) try: menuitem.set_always_show_image(True) image = Gtk.Image() image.set_from_file(varietyconfig.get_data_file("media", "sfw-%s.svg" % rating['rating'])) menuitem.set_image(image) except: logger.exception(lambda: "Could not set image to NSFW menuitem:") self.sfw_menu.append(menuitem) self.rating_items.append(menuitem) map(_add_menuitem, reversed(sfw_ratings)) separator = Gtk.SeparatorMenuItem.new() separator.set_visible(True) self.sfw_menu.append(separator) self.safe_mode = Gtk.CheckMenuItem(_("_Safe mode")) self.safe_mode.set_visible(True) self.safe_mode.set_active(self.parent.options.safe_mode) self.safe_mode.set_use_underline(True) self.safe_mode_handler_id = self.safe_mode.connect("toggled", self.parent.on_safe_mode_toggled) self.sfw_menu.append(self.safe_mode) self.sfw_menu_item.set_sensitive(True) self.parent.update_indicator() except Exception: logger.exception(lambda: 'Oops, could not populate NSFW menu:') Util.add_mainloop_task(_gui_update, sfw_ratings) except Exception: logger.exception(lambda: 'Oops, could not populate NSFW menu:')
def write_quote(quote, author, infile, outfile, options=None): done_event = threading.Event() exception = [None] def go(): try: w, h = Util.get_scaled_size(infile) surface = QuoteWriter.load_cairo_surface(infile, w, h) QuoteWriter.write_quote_on_surface(surface, quote, author, options) QuoteWriter.save_cairo_surface(surface, outfile) except Exception as e: exception[0] = e finally: done_event.set() Util.add_mainloop_task(go) done_event.wait() if exception[0]: raise exception[0] # pylint: disable=raising-bad-type
def hide(self, force=True, keep_settings=False): if force: self.pinned = False if self.pinned: return if not keep_settings: self.type = None self.images = [] self.screen = None self.folders = None if self.thumbs_window: def _go(): self.thumbs_window.destroy() self.thumbs_window = None Util.add_mainloop_task(_go) self.parent.update_indicator(auto_changed=False)
def show(self, images, screen=None, type=None, folders=None): options = self.load_options() with self.show_thumbs_lock: self.unlimited_images = images self.type = type limit = len(self.unlimited_images ) if options.limit == self.UNLIMITED else options.limit self.images = self.unlimited_images[:limit] self.screen = screen self.folders = folders def _go(): try: if self.thumbs_window: self.thumbs_window.destroy() self.thumbs_window = None if len(self.images) > 0: self.initialize_thumbs_window() except Exception: logger.exception(lambda: "Could not create thumbs window:") Util.add_mainloop_task(_go)
def ok_thread(self): search = "" if len(self.ui.tags.get_text().strip()): search += ( "tags:" + ",".join( [urllib.parse.quote_plus(t.strip()) for t in self.ui.tags.get_text().split(",")] ) + ";" ) if len(self.ui.text.get_text().strip()): search += "text:" + urllib.parse.quote_plus(self.ui.text.get_text().strip()) + ";" self.error = "" user_url = self.ui.user_url.get_text().strip() if len(user_url) > 0: self.show_spinner() u = FlickrDownloader.obtain_userid(user_url) if u[0]: search += ( "user:"******"http://", "").replace("https://", "") + ";" ) search += "user_id:" + u[2] + ";" else: self.error = self.error + "\n" + u[1] group_url = self.ui.group_url.get_text().strip() if len(group_url) > 0: self.show_spinner() g = FlickrDownloader.obtain_groupid(group_url) if g[0]: search += ( "group:" + self.ui.group_url.get_text().replace("http://", "").replace("https://", "") + ";" ) search += "group_id:" + g[2] else: self.error = self.error + "\n" + g[1] if not len(self.error) and len(search) > 0: self.show_spinner() if FlickrDownloader.count_search_results(search) <= 0: self.error = _("No images found") def _stop_ui(): self.ui.buttonbox.set_sensitive(True) self.ui.spinner.stop() self.ui.spinner.set_visible(False) self.ui.message.set_visible(False) if len(self.error) > 0: self.ui.error.set_label(self.error) for entry in (self.ui.text, self.ui.tags, self.ui.user_url, self.ui.group_url): if entry.get_text().strip(): entry.grab_focus() break else: if len(search): self.parent.on_add_dialog_okay( Options.SourceType.FLICKR, search, self.edited_row ) self.destroy() Util.add_mainloop_task(_stop_ui)
def add_image(self, file, at_front=False): try: if self.is_horizontal(): pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size( file, 10000, self.breadth) else: pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size( file, self.breadth, 10000) except Exception: logger.warning( lambda: "Could not create thumbnail for file %s. File may be missing or invalid." % file) pixbuf = None def _go(): image_size = (0 if not pixbuf else pixbuf.get_width() if self.is_horizontal() else pixbuf.get_height()) thumb = Gtk.Image() if pixbuf: thumb.set_from_pixbuf(pixbuf) thumb.set_visible(True) overlay = Gtk.Overlay() overlay.add(thumb) overlay.set_visible(True) eventbox = Gtk.EventBox() eventbox.set_visible(True) def click(widget, event, file=file): self.emit("clicked", file, widget, event) eventbox.connect("button-release-event", click) eventbox.add(overlay) image_info = { "file": file, "eventbox": eventbox, "thumb": thumb, "size": image_size, "overlay": overlay, } if at_front: image_info["start"] = 0 for info in self.all: info["start"] += image_size self.all.insert(0, image_info) position = 0 else: image_info["start"] = self.total_width self.all.append(image_info) position = len(self.all) - 1 self.total_width += image_size adj = (self.scroll.get_hadjustment() if self.is_horizontal() else self.scroll.get_vadjustment()) scrollbar_at_start = not adj or adj.get_value( ) <= adj.get_lower() + 20 self.box.pack_start(eventbox, False, False, 0) if at_front: self.box.reorder_child(eventbox, 0) # get adj again - we just added at front, scrollbar might have appeared adj = (self.scroll.get_hadjustment() if self.is_horizontal() else self.scroll.get_vadjustment()) if adj: if scrollbar_at_start: adj.set_value(adj.get_lower()) else: adj.set_value(adj.get_value() + image_size) self.update_size() if file == self.active_file or position == self.active_position: self.mark_active(self.active_file, self.active_position) Util.add_mainloop_task(_go)