예제 #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.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)
예제 #2
0
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"