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.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.docsearch, 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.lists['docs']['model'].clear() if len(main_window.doc.pages) > 0 and main_window.doc.can_edit: 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 else: # add a first document to the list (the user will need one anyway) actions['add_doc'][1].do() 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.connect("destroy", self.__on_destroy) self.dialog.set_transient_for(main_window.window) self.dialog.set_visible(True)
class MultiscanDialog(gobject.GObject): __gsignals__ = { 'need-doclist-refresh' : (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.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.docsearch, 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.lists['docs']['model'].clear() if len(main_window.doc.pages) > 0 and main_window.doc.can_edit: 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 else: # add a first document to the list (the user will need one anyway) actions['add_doc'][1].do() 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.connect("destroy", self.__on_destroy) 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 Img" " (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 else: msg = _("All the pages have been scanned") dialog = gtk.MessageDialog(self.dialog, flags=gtk.DIALOG_MODAL, type=gtk.MESSAGE_INFO, buttons=gtk.BUTTONS_OK, message_format=msg) dialog.run() dialog.destroy() self.dialog.destroy() self.emit('need-doclist-refresh') def __on_destroy(self, window=None): if self.scan_queue.is_running: self.scan_queue.stop() print "Multi-scan dialog destroyed"