Esempio n. 1
0
    def __init__(self, main_window, config):
        gobject.GObject.__init__(self)

        self.scanned_pages = 0

        self.__config = config

        widget_tree = load_uifile("multiscan.glade")

        self.lists = {
            "docs": {
                "gui": widget_tree.get_object("treeviewScanList"),
                "model": widget_tree.get_object("liststoreScanList"),
                "columns": {"nb_pages": widget_tree.get_object("treeviewcolumnNbPages")},
                "include_current_doc": False,
            }
        }

        self.lists["docs"]["model"].clear()
        if len(main_window.doc.pages) > 0:
            self.lists["docs"]["model"].append(
                [
                    _("Current document (%s)") % (str(main_window.doc)),
                    "0",  # nb_pages
                    True,  # can_edit (nb_pages)
                    0,  # scan_progress_int
                    "",  # scan_progress_txt
                    False,  # can_delete
                ]
            )
            self.lists["docs"]["include_current_doc"] = True

        self.removeDocButton = widget_tree.get_object("buttonRemoveDoc")
        self.removeDocButton.set_sensitive(False)

        actions = {
            "add_doc": ([widget_tree.get_object("buttonAddDoc")], ActionAddDoc(self, config)),
            "select_doc": ([widget_tree.get_object("treeviewScanList")], ActionSelectDoc(self)),
            "start_edit_doc": ([widget_tree.get_object("buttonEditDoc")], ActionStartEditDoc(self)),
            "end_edit_doc": ([widget_tree.get_object("cellrenderertextNbPages")], ActionEndEditDoc(self)),
            "del_doc": ([self.removeDocButton], ActionRemoveDoc(self)),
            "cancel": ([widget_tree.get_object("buttonCancel")], ActionCancel(self)),
            "scan": ([widget_tree.get_object("buttonOk")], ActionScan(self, config, main_window.doc)),
        }

        for action in ["add_doc", "select_doc", "start_edit_doc", "end_edit_doc", "del_doc", "scan", "cancel"]:
            actions[action][1].connect(actions[action][0])

        self.to_disable_on_scan = [
            actions["add_doc"][0][0],
            actions["start_edit_doc"][0][0],
            actions["del_doc"][0][0],
            actions["scan"][0][0],
        ]

        self.scan_queue = WorkerQueue("Mutiple scans")
        self.scan_queue.connect("queue-start", lambda queue: gobject.idle_add(self.__on_global_scan_start_cb, queue))
        self.scan_queue.connect(
            "queue-stop", lambda queue, exc: gobject.idle_add(self.__on_global_scan_end_cb, queue, exc)
        )
        self.scan_queue.connect(
            "scan-start", lambda worker, page, total: gobject.idle_add(self.__on_scan_start_cb, worker, page, total)
        )
        self.scan_queue.connect(
            "ocr-start", lambda worker, page, total: gobject.idle_add(self.__on_ocr_start_cb, worker, page, total)
        )
        self.scan_queue.connect(
            "scan-done", lambda worker, page, total: gobject.idle_add(self.__on_scan_done_cb, worker, page, total)
        )

        self.dialog = widget_tree.get_object("dialogMultiscan")
        self.dialog.set_transient_for(main_window.window)
        self.dialog.set_visible(True)
Esempio n. 2
0
class MultiscanDialog(gobject.GObject):

    __gsignals__ = {"need-reindex": (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, ())}

    def __init__(self, main_window, config):
        gobject.GObject.__init__(self)

        self.scanned_pages = 0

        self.__config = config

        widget_tree = load_uifile("multiscan.glade")

        self.lists = {
            "docs": {
                "gui": widget_tree.get_object("treeviewScanList"),
                "model": widget_tree.get_object("liststoreScanList"),
                "columns": {"nb_pages": widget_tree.get_object("treeviewcolumnNbPages")},
                "include_current_doc": False,
            }
        }

        self.lists["docs"]["model"].clear()
        if len(main_window.doc.pages) > 0:
            self.lists["docs"]["model"].append(
                [
                    _("Current document (%s)") % (str(main_window.doc)),
                    "0",  # nb_pages
                    True,  # can_edit (nb_pages)
                    0,  # scan_progress_int
                    "",  # scan_progress_txt
                    False,  # can_delete
                ]
            )
            self.lists["docs"]["include_current_doc"] = True

        self.removeDocButton = widget_tree.get_object("buttonRemoveDoc")
        self.removeDocButton.set_sensitive(False)

        actions = {
            "add_doc": ([widget_tree.get_object("buttonAddDoc")], ActionAddDoc(self, config)),
            "select_doc": ([widget_tree.get_object("treeviewScanList")], ActionSelectDoc(self)),
            "start_edit_doc": ([widget_tree.get_object("buttonEditDoc")], ActionStartEditDoc(self)),
            "end_edit_doc": ([widget_tree.get_object("cellrenderertextNbPages")], ActionEndEditDoc(self)),
            "del_doc": ([self.removeDocButton], ActionRemoveDoc(self)),
            "cancel": ([widget_tree.get_object("buttonCancel")], ActionCancel(self)),
            "scan": ([widget_tree.get_object("buttonOk")], ActionScan(self, config, main_window.doc)),
        }

        for action in ["add_doc", "select_doc", "start_edit_doc", "end_edit_doc", "del_doc", "scan", "cancel"]:
            actions[action][1].connect(actions[action][0])

        self.to_disable_on_scan = [
            actions["add_doc"][0][0],
            actions["start_edit_doc"][0][0],
            actions["del_doc"][0][0],
            actions["scan"][0][0],
        ]

        self.scan_queue = WorkerQueue("Mutiple scans")
        self.scan_queue.connect("queue-start", lambda queue: gobject.idle_add(self.__on_global_scan_start_cb, queue))
        self.scan_queue.connect(
            "queue-stop", lambda queue, exc: gobject.idle_add(self.__on_global_scan_end_cb, queue, exc)
        )
        self.scan_queue.connect(
            "scan-start", lambda worker, page, total: gobject.idle_add(self.__on_scan_start_cb, worker, page, total)
        )
        self.scan_queue.connect(
            "ocr-start", lambda worker, page, total: gobject.idle_add(self.__on_ocr_start_cb, worker, page, total)
        )
        self.scan_queue.connect(
            "scan-done", lambda worker, page, total: gobject.idle_add(self.__on_scan_done_cb, worker, page, total)
        )

        self.dialog = widget_tree.get_object("dialogMultiscan")
        self.dialog.set_transient_for(main_window.window)
        self.dialog.set_visible(True)

    def set_mouse_cursor(self, cursor):
        self.dialog.window.set_cursor({"Normal": None, "Busy": gtk.gdk.Cursor(gtk.gdk.WATCH)}[cursor])

    def __on_global_scan_start_cb(self, work_queue):
        for el in self.to_disable_on_scan:
            el.set_sensitive(False)
        for line in self.lists["docs"]["model"]:
            line[2] = False  # disable nb page edit
            line[5] = False  # disable deletion
        self.set_mouse_cursor("Busy")

    def __on_scan_start_cb(self, worker, current_page, total_pages):
        line_idx = worker.line_in_treeview
        self.lists["docs"]["model"][line_idx][1] = "%d / %d" % (current_page, total_pages)
        self.lists["docs"]["model"][line_idx][3] = current_page * 100 / total_pages
        self.lists["docs"]["model"][line_idx][4] = _("Scanning")

    def __on_ocr_start_cb(self, worker, current_page, total_pages):
        line_idx = worker.line_in_treeview
        self.lists["docs"]["model"][line_idx][3] = (current_page * 100 + 50) / total_pages
        self.lists["docs"]["model"][line_idx][4] = _("Reading")

    def __on_scan_done_cb(self, worker, current_page, total_pages):
        line_idx = worker.line_in_treeview
        self.lists["docs"]["model"][line_idx][1] = "%d / %d" % (current_page + 1, total_pages)
        self.lists["docs"]["model"][line_idx][3] = (current_page * 100 + 100) / total_pages
        self.lists["docs"]["model"][line_idx][4] = _("Done")
        self.scanned_pages += 1

    def __on_global_scan_end_cb(self, work_queue, exception=None):
        self.set_mouse_cursor("Normal")
        if exception != None:
            if isinstance(exception, StopIteration):
                msg = _("Less pages than expected have been scanned" " (got %d pages)") % (self.scanned_pages)
                dialog = gtk.MessageDialog(
                    self.dialog,
                    flags=gtk.DIALOG_MODAL,
                    type=gtk.MESSAGE_WARNING,
                    buttons=gtk.BUTTONS_OK,
                    message_format=msg,
                )
                dialog.run()
                dialog.destroy()
            else:
                raise exception
        self.dialog.destroy()
        self.emit("need-reindex")