Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
    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)
Ejemplo n.º 3
0
    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()
Ejemplo n.º 4
0
    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:")
Ejemplo n.º 5
0
    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:')
Ejemplo n.º 6
0
    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:')
Ejemplo n.º 7
0
    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
Ejemplo n.º 8
0
    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)
Ejemplo n.º 9
0
    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)
Ejemplo n.º 10
0
    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)
Ejemplo n.º 11
0
    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)