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)
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")