def __init__(self, main_win): widget_tree = load_uifile( os.path.join("diag", "diagdialog.glade")) self.buf = widget_tree.get_object("textbufferDiag") self.dialog = widget_tree.get_object("dialogDiag") self.dialog.set_transient_for(main_win.window) self.dialog.connect("response", self.on_response_cb) self.progressbar = widget_tree.get_object("progressbarDiag") self.scrollwin = widget_tree.get_object("scrolledwindowDiag") self._main_win = main_win self.set_text(_("Please wait. It may take a few minutes ...")) txt_view = widget_tree.get_object("textviewDiag") txt_view.connect("size-allocate", self.scroll_to_bottom) self.scheduler = main_win.schedulers['main'] self.factory = JobFactoryInfoGetter(self, main_win) job = self.factory.make() self.scheduler.schedule(job) self.dialog.connect("destroy", self.on_destroy_cb)
def __init__(self, main_window, config, doc): self.__main_win = main_window self.__config = config self.doc = doc widget_tree = load_uifile( os.path.join("doceditdialog", "doceditdialog.glade")) self.date = { 'year': { 'view': widget_tree.get_object("spinbuttonYear"), 'model': widget_tree.get_object("adjustmentYear"), 'fmt': OnYearSpinButtonChange, }, 'month': { 'view': widget_tree.get_object("spinbuttonMonth"), 'model': widget_tree.get_object("adjustmentMonth"), 'fmt': OnSpinButtonChange, }, 'day': { 'view': widget_tree.get_object("spinbuttonDay"), 'model': widget_tree.get_object("adjustmentDay"), 'fmt': OnSpinButtonChange, }, 'box': widget_tree.get_object("boxDate") } self.text = { 'view': widget_tree.get_object("textviewText"), 'model': widget_tree.get_object("textbufferText"), } self.dialog = widget_tree.get_object("dialogDocEdit") for widgets in self.date.values(): if 'fmt' not in widgets: continue widgets['fmt'](widgets['view']) widgets['view'].connect( "activate", lambda _: self.dialog.response(Gtk.ResponseType.OK)) self.__change_widget_order_according_to_locale() self.refresh_date() self.refresh_text() self.dialog.set_transient_for(self.__main_win.window) try: while True: ret = self.dialog.run() if int(ret) != int(Gtk.ResponseType.OK): logger.info("Doc edit: Cancelling changes") break else: logger.info("Doc edit: Applying changes") if self.apply_changes(): break finally: self.dialog.destroy()
def __init__(self, main_window): self.widget_tree = load_uifile( os.path.join("searchdialog", "searchdialog.glade")) self.__main_win = main_window self._labels = self.__main_win.docsearch.label_list self.dialog = self.widget_tree.get_object("searchDialog") self.dialog.set_transient_for(main_window.window) self.__search_string = None keywords = self.__main_win.search_field.get_text() keywords = keywords.strip() keywords = re.findall( r'(?:\[.*\]|(?:[^\s"]|"(?:\\.|[^"])*"))+', keywords ) self.search_element_box = self.widget_tree.get_object( "boxSearchElements" ) self.search_elements = [] add_button = self.widget_tree.get_object("buttonAdd") add_button.connect("clicked", lambda w: GLib.idle_add(self.add_element)) if keywords == []: logger.info("Starting from an empty search") self.add_element() else: logger.info("Current search: %s" % keywords) next_operator = None not_value = u"" for keyword in keywords: if keyword.upper() == u"AND": next_operator = u"AND" continue elif keyword.upper() == u"OR": next_operator = u"OR" continue elif keyword.upper() == u"NOT": not_value = u"NOT" continue logger.info("Instantiating line for [%s]" % keyword) sl = SearchLine.get_from_search(self, next_operator, not_value, keyword) self.add_element(sl) next_operator = u"AND" not_value = u""
def __init__(self, main_window): logo_path = preload_file("paperwork.svg") self.__widget_tree = load_uifile( os.path.join("aboutdialog", "aboutdialog.glade")) self.__dialog = self.__widget_tree.get_object("aboutdialog") assert (self.__dialog) self.__dialog.set_transient_for(main_window) if logo_path and os.access(logo_path, os.F_OK): logo = GdkPixbuf.Pixbuf.new_from_file(logo_path) self.__dialog.set_logo(logo) self.__dialog.connect("response", lambda x, y: x.destroy())
def __init__(self, main_window, page): self.page = page widget_tree = load_uifile( os.path.join("pageeditor", "pageeditor.glade")) self.__dialog = widget_tree.get_object("dialogPageEditing") self.__dialog.set_transient_for(main_window.window) img_scrollbars = widget_tree.get_object("scrolledwindowOriginal") img_canvas = Canvas(img_scrollbars) img_canvas.set_visible(True) img_scrollbars.add(img_canvas) self.__original_img_widgets = { 'img': img_canvas, 'scrolledwindow': img_scrollbars, 'eventbox': widget_tree.get_object("eventboxOriginal"), 'zoom': widget_tree.get_object("adjustmentZoom"), } self.__result_img_widget = widget_tree.get_object("imageResult") self.__buttons = { 'cutting': widget_tree.get_object("togglebuttonCutting"), 'rotate': { 'clockwise': (widget_tree.get_object("buttonRotateClockwise"), 90), 'counter_clockwise': (widget_tree.get_object("buttonRotateCounterClockwise"), -90), } } self.__cut_grips = None self.__original_img_widgets['scrolledwindow'].connect( "size-allocate", lambda widget, size: GLib.idle_add(self.__on_size_allocate)) self.__buttons['cutting'].connect( "toggled", lambda widget: GLib.idle_add(self.__on_cutting_button_toggled_cb)) self.__buttons['rotate']['clockwise'][0].connect( "clicked", lambda widget: GLib.idle_add( self.__on_rotate_activated_cb, widget)) self.__buttons['rotate']['counter_clockwise'][0].connect( "clicked", lambda widget: GLib.idle_add( self.__on_rotate_activated_cb, widget)) self.page = page self.img = self.page.img self.__changes = []
def __init__(self, main_window): self.__widget_tree = load_uifile( os.path.join("aboutdialog", "aboutdialog.glade")) self.__dialog = self.__widget_tree.get_object("aboutdialog") assert (self.__dialog) self.__dialog.set_transient_for(main_window) logo_path = os.path.join(sys.prefix, 'share', 'icons', 'hicolor', 'scalable', 'apps', 'paperwork.svg') if os.access(logo_path, os.F_OK): logo = GdkPixbuf.Pixbuf.new_from_file(logo_path) self.__dialog.set_logo(logo) self.__dialog.connect("response", lambda x, y: x.destroy())
def __init__(self, main_win, config): widget_tree = load_uifile( os.path.join("activation", "activationdialog.glade")) self.dialog = widget_tree.get_object("dialogActivation") self.dialog.set_transient_for(main_win.window) self.dialog.connect("response", self.on_response_cb) self._config = config self._main_win = main_win self.key_entry = widget_tree.get_object("entryKey") self.email_entry = widget_tree.get_object("entryEmail") self.key_action = ActionFormatKey(self.key_entry) self.key_action.connect([self.key_entry]) self.label_error = widget_tree.get_object("labelError")
def edit(self, main_window): """ Open the edit dialog, and update the label according to user changes """ widget_tree = load_uifile( os.path.join("labeleditor", "labeleditor.glade")) dialog = widget_tree.get_object("dialogLabelEditor") dialog.set_transient_for(main_window) # don't force the window to be centered. Otherwise, user can't use the # picker to pick colors from the current document dialog.set_position(Gtk.WindowPosition.NONE) self.__ok_button = widget_tree.get_object("buttonOk") self._pick_button = widget_tree.get_object("buttonPickColor") PickColorAction(self).connect([self._pick_button]) self._color_chooser = widget_tree.get_object("labelColorChooser") self._color_chooser.set_rgba(self.label.color) name_entry = widget_tree.get_object("entryLabelName") name_entry.connect("changed", self.__on_label_entry_changed) name_entry.set_text(self.label.name) response = dialog.run() if (response == Gtk.ResponseType.OK and name_entry.get_text().strip() == ""): response = Gtk.ResponseType.CANCEL if (response == Gtk.ResponseType.OK): logger.info("Label validated") self.label.name = name_entry.get_text() self.label.color = self._color_chooser.get_rgba() logger.info("Label after editing: %s" % self.label) else: logger.info("Label editing canceled") dialog.destroy() if response == Gtk.ResponseType.OK: return "ok" else: return "canceled"
def edit(self, main_window): """ Open the edit dialog, and update the label according to user changes """ widget_tree = load_uifile( os.path.join("labeleditor", "labeleditor.glade")) dialog = widget_tree.get_object("dialogLabelEditor") dialog.set_transient_for(main_window) # don't force the window to be centered. Otherwise, user can't use the # picker to pick colors from the current document dialog.set_position(Gtk.WindowPosition.NONE) self.__ok_button = widget_tree.get_object("buttonOk") self._pick_button = widget_tree.get_object("buttonPickColor") PickColorAction(self).connect([self._pick_button]) self._color_chooser = widget_tree.get_object("labelColorChooser") self._color_chooser.set_rgba(self.label.color) name_entry = widget_tree.get_object("entryLabelName") name_entry.connect("changed", self.__on_label_entry_changed) name_entry.set_text(self.label.name) response = dialog.run() if (response == Gtk.ResponseType.OK and name_entry.get_text().strip() == ""): response = Gtk.ResponseType.CANCEL if (response == Gtk.ResponseType.OK): logger.info("Label validated") self.label.name = name_entry.get_text() self.label.color = self._color_chooser.get_rgba() logger.info("Label after editing: %s" % self.label) else: logger.info("Label editing canceled") dialog.destroy() if response == Gtk.ResponseType.OK: return "ok" else: return "canceled"
def __init__(self, main_window): logo_path = preload_file("paperwork.svg") self.__widget_tree = load_uifile( os.path.join("aboutdialog", "aboutdialog.glade")) self.__dialog = self.__widget_tree.get_object("aboutdialog") assert(self.__dialog) self.__dialog.set_transient_for(main_window) self.__dialog.set_version(_version.version) self.__dialog.set_authors(_version.authors_code.split("\n")) self.__dialog.set_documenters( _version.authors_documentation.split("\n") ) self.__dialog.set_translator_credits(_version.authors_translators) if logo_path and os.access(logo_path, os.F_OK): logo = GdkPixbuf.Pixbuf.new_from_file(logo_path) self.__dialog.set_logo(logo) self.__dialog.connect("response", lambda x, y: x.destroy())
def edit(self, main_window): """ Open the edit dialog, and update the label according to user changes """ widget_tree = load_uifile( os.path.join("labeleditor", "labeleditor.glade")) dialog = widget_tree.get_object("dialogLabelEditor") dialog.set_transient_for(main_window) self.__ok_button = widget_tree.get_object("buttonOk") self._pick_button = widget_tree.get_object("buttonPickColor") PickColorAction(self).connect([self._pick_button]) self._color_chooser = widget_tree.get_object("labelColorChooser") self._color_chooser.set_rgba(self.label.color) name_entry = widget_tree.get_object("entryLabelName") name_entry.connect("changed", self.__on_label_entry_changed) name_entry.set_text(self.label.name) response = dialog.run() if (response == Gtk.ResponseType.OK and name_entry.get_text().strip() == ""): response = Gtk.ResponseType.CANCEL if (response == Gtk.ResponseType.OK): logger.info("Label validated") self.label.name = unicode(name_entry.get_text(), encoding='utf-8') self.label.color = self._color_chooser.get_rgba() else: logger.info("Label editing cancelled") dialog.destroy() logger.info("Label after editing: %s", self.label) return (response == Gtk.ResponseType.OK)
def __init__(self, main_scheduler, mainwindow_gui, config): super(SettingsWindow, self).__init__() self.schedulers = { 'main': main_scheduler, 'progress': JobScheduler('progress'), } self.local_schedulers = [ self.schedulers['progress'], ] widget_tree = load_uifile( os.path.join("settingswindow", "settingswindow.glade")) # self.widget_tree is for tests/screenshots ONLY self.widget_tree = widget_tree distrib = platform.dist() if distrib: distrib = distrib[0].lower() logger.info("Distribution: [%s]" % distrib) for widget in widget_tree.get_objects(): if type(widget) == Gtk.LinkButton: uri = widget.get_uri() uri += "#" + distrib widget.set_uri(uri) self.window = widget_tree.get_object("windowSettings") self.window.set_transient_for(mainwindow_gui) self.__config = config self.workdir_chooser = widget_tree.get_object("filechooserbutton") self.ocr_settings = { "enabled": { 'gui': widget_tree.get_object("checkbuttonOcrEnabled") }, "lang": { 'gui': widget_tree.get_object("comboboxLang"), 'store': widget_tree.get_object("liststoreOcrLang"), }, } actions = { "delete-event": ( [self.window], ActionApplySettings(self, config), ), "toggle_ocr": ( [self.ocr_settings['enabled']['gui']], ActionToggleOCRState(self), ), "select_scanner": ( [widget_tree.get_object("comboboxDevices")], ActionSelectScanner(self) ), "select_source": ( [widget_tree.get_object("comboboxScanSources")], ActionSelectSource(self) ), "scan_calibration": ( [widget_tree.get_object("buttonScanCalibration")], ActionScanCalibration(self) ) } self.device_settings = { "devid": { 'gui': widget_tree.get_object("comboboxDevices"), 'stores': { 'loaded': widget_tree.get_object("liststoreDevice"), }, 'nb_elements': 0, 'active_idx': -1, }, "has_feeder": False, "source": { 'gui': widget_tree.get_object("comboboxScanSources"), 'stores': { 'loaded': widget_tree.get_object("liststoreScanSources"), }, 'nb_elements': 0, 'active_idx': -1, }, "resolution": { 'gui': widget_tree.get_object("comboboxResolution"), 'stores': { 'loaded': widget_tree.get_object("liststoreResolution"), }, 'nb_elements': 0, 'active_idx': -1, }, } img_scrollbars = widget_tree.get_object("scrolledwindowCalibration") img_canvas = Canvas(img_scrollbars) img_canvas.set_visible(True) img_scrollbars.add(img_canvas) self.calibration = { "scan_button": widget_tree.get_object("buttonScanCalibration"), "image_gui": img_canvas, "image": None, "image_eventbox": widget_tree.get_object("eventboxCalibration"), "image_scrollbars": img_scrollbars, "resolution": DEFAULT_CALIBRATION_RESOLUTION, "zoom": widget_tree.get_object("adjustmentZoom"), } self.grips = None self.progressbar = widget_tree.get_object("progressbarScan") self.__scan_start = 0.0 self.job_factories = { "device_finder": JobFactoryDeviceFinder( self, config['scanner_devid'].value ), "source_finder": JobFactorySourceFinder( self, config['scanner_source'].value ), "resolution_finder": JobFactoryResolutionFinder( self, config['scanner_resolution'].value, RECOMMENDED_SCAN_RESOLUTION ), "scan": JobFactoryCalibrationScan( self, self.device_settings['resolution']['stores']['loaded'] ), "progress_updater": JobFactoryProgressUpdater(self.progressbar), } try: translations = gettext.translation( 'iso639-3', pycountry.LOCALES_DIR ) logger.info("Language name translations loaded") except Exception: logger.exception("Unable to load languages translations") translations = None ocr_tools = pyocr.get_available_tools() if len(ocr_tools) == 0: short_ocr_langs = [] else: short_ocr_langs = ocr_tools[0].get_available_languages() ocr_langs = [] for short in short_ocr_langs: if short in ['equ', 'osd']: # ignore some (equ = equation ; osd = orientation detection) continue llang = self.__get_short_to_long_langs(short) if llang: if not translations: tlang = llang else: tlang = translations.gettext(llang) logger.info("Translation: {} | {}".format(llang, tlang)) if not tlang: logger.error("Warning: Long name not found for language " "'%s'." % short) logger.warning(" Will use short name as long name.") tlang = short ocr_langs.append((short, tlang)) ocr_langs.sort(key=lambda lang: lang[1]) self.ocr_settings['lang']['store'].clear() for (short_lang, long_lang) in ocr_langs: self.ocr_settings['lang']['store'].append([long_lang, short_lang]) for (k, v) in actions.items(): v[1].connect(v[0]) self.window.connect("destroy", self.__on_destroy) self.display_config(config) self.window.set_visible(True) for scheduler in self.local_schedulers: scheduler.start() job = self.job_factories['device_finder'].make() self.schedulers['main'].schedule(job)
def __init__(self, main_scheduler, mainwindow_gui, config): super(SettingsWindow, self).__init__() self.schedulers = { 'main': main_scheduler, 'progress': JobScheduler('progress'), } self.local_schedulers = [ self.schedulers['progress'], ] widget_tree = load_uifile( os.path.join("settingswindow", "settingswindow.glade")) distrib = platform.dist() if distrib: distrib = distrib[0].lower() logger.info("Distribution: [%s]" % distrib) for widget in widget_tree.get_objects(): if type(widget) == Gtk.LinkButton: uri = widget.get_uri() uri += "#" + distrib widget.set_uri(uri) self.window = widget_tree.get_object("windowSettings") self.window.set_transient_for(mainwindow_gui) self.__config = config self.workdir_chooser = widget_tree.get_object("filechooserbutton") self.ocr_settings = { "enabled": { 'gui': widget_tree.get_object("checkbuttonOcrEnabled") }, "lang": { 'gui': widget_tree.get_object("comboboxLang"), 'store': widget_tree.get_object("liststoreOcrLang"), }, } actions = { "delete-event": ( [self.window], ActionApplySettings(self, config), ), "toggle_ocr": ( [self.ocr_settings['enabled']['gui']], ActionToggleOCRState(self), ), "select_scanner": ( [widget_tree.get_object("comboboxDevices")], ActionSelectScanner(self) ), "select_source": ( [widget_tree.get_object("comboboxScanSources")], ActionSelectSource(self) ), "scan_calibration": ( [widget_tree.get_object("buttonScanCalibration")], ActionScanCalibration(self) ) } self.device_settings = { "devid": { 'gui': widget_tree.get_object("comboboxDevices"), 'stores': { 'loaded': widget_tree.get_object("liststoreDevice"), }, 'nb_elements': 0, 'active_idx': -1, }, "has_feeder": False, "source": { 'gui': widget_tree.get_object("comboboxScanSources"), 'stores': { 'loaded': widget_tree.get_object("liststoreScanSources"), }, 'nb_elements': 0, 'active_idx': -1, }, "resolution": { 'gui': widget_tree.get_object("comboboxResolution"), 'stores': { 'loaded': widget_tree.get_object("liststoreResolution"), }, 'nb_elements': 0, 'active_idx': -1, }, } img_scrollbars = widget_tree.get_object("scrolledwindowCalibration") img_canvas = Canvas(img_scrollbars) img_canvas.set_visible(True) img_scrollbars.add(img_canvas) self.calibration = { "scan_button": widget_tree.get_object("buttonScanCalibration"), "image_gui": img_canvas, "image": None, "image_eventbox": widget_tree.get_object("eventboxCalibration"), "image_scrollbars": img_scrollbars, "resolution": DEFAULT_CALIBRATION_RESOLUTION, "zoom": widget_tree.get_object("adjustmentZoom"), } self.grips = None self.progressbar = widget_tree.get_object("progressbarScan") self.__scan_start = 0.0 self.job_factories = { "device_finder": JobFactoryDeviceFinder( self, config['scanner_devid'].value ), "source_finder": JobFactorySourceFinder( self, config['scanner_source'].value ), "resolution_finder": JobFactoryResolutionFinder( self, config['scanner_resolution'].value, RECOMMENDED_SCAN_RESOLUTION ), "scan": JobFactoryCalibrationScan( self, self.device_settings['resolution']['stores']['loaded'] ), "progress_updater": JobFactoryProgressUpdater(self.progressbar), } ocr_tools = pyocr.get_available_tools() if len(ocr_tools) == 0: ocr_langs = [] else: ocr_langs = ocr_tools[0].get_available_languages() ocr_langs = self.__get_short_to_long_langs(ocr_langs) ocr_langs.sort(key=lambda lang: lang[1]) ocr_langs.insert(0, (None, _("Disable OCR"))) self.ocr_settings['lang']['store'].clear() for (short_lang, long_lang) in ocr_langs: self.ocr_settings['lang']['store'].append([long_lang, short_lang]) for (k, v) in actions.items(): v[1].connect(v[0]) self.window.connect("destroy", self.__on_destroy) self.display_config(config) self.window.set_visible(True) for scheduler in self.local_schedulers: scheduler.start() job = self.job_factories['device_finder'].make() self.schedulers['main'].schedule(job)
def __init__(self, main_window, config): GObject.GObject.__init__(self) self.main_window = main_window self.schedulers = { 'main': main_window.schedulers['main'], } self.scanned_pages = 0 self.__config = config widget_tree = load_uifile(os.path.join("multiscan", "multiscan.glade")) self.window = widget_tree.get_object("dialogMultiscan") scan_scrollbars = widget_tree.get_object("scrolledwindowScan") self.scan_canvas = Canvas(scan_scrollbars) self.scan_canvas.set_visible(True) scan_scrollbars.add(self.scan_canvas) 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), ), } 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.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 __init__(self, main_window, config): GObject.GObject.__init__(self) self.main_window = main_window self.schedulers = { 'main': main_window.schedulers['main'], } self.scanned_pages = 0 self.__config = config widget_tree = load_uifile( os.path.join("multiscan", "multiscan.glade")) # self.widget_tree is for tests/screenshots ONLY self.widget_tree = widget_tree self.window = widget_tree.get_object("dialogMultiscan") scan_scrollbars = widget_tree.get_object("scrolledwindowScan") self.scan_canvas = Canvas(scan_scrollbars) self.scan_canvas.set_visible(True) scan_scrollbars.add(self.scan_canvas) 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) self.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), ), } for action in ['add_doc', 'select_doc', 'start_edit_doc', 'end_edit_doc', 'del_doc', 'scan', 'cancel']: self.actions[action][1].connect(self.actions[action][0]) self.to_disable_on_scan = [ self.actions['add_doc'][0][0], self.actions['start_edit_doc'][0][0], self.actions['del_doc'][0][0], self.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) self.actions['add_doc'][1].do() 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 __init__(self, main_scheduler, mainwindow_gui, config): super(SettingsWindow, self).__init__() self.schedulers = { 'main': main_scheduler, 'progress': JobScheduler('progress'), } self.local_schedulers = [ self.schedulers['progress'], ] widget_tree = load_uifile( os.path.join("settingswindow", "settingswindow.glade")) # self.widget_tree is for tests/screenshots ONLY self.widget_tree = widget_tree distrib = platform.dist() if distrib: distrib = distrib[0].lower() logger.info("Distribution: [%s]" % distrib) for widget in widget_tree.get_objects(): if type(widget) == Gtk.LinkButton: uri = widget.get_uri() uri += "#" + distrib widget.set_uri(uri) self.window = widget_tree.get_object("windowSettings") self.window.set_transient_for(mainwindow_gui) self.__config = config self.workdir_chooser = widget_tree.get_object("filechooserbutton") self.network_settings = { "update": widget_tree.get_object("checkUpdate"), "statistics": widget_tree.get_object("checkStatistics") } self.ocr_settings = { "enabled": { 'gui': widget_tree.get_object("checkbuttonOcrEnabled") }, "lang": { 'gui': widget_tree.get_object("comboboxLang"), 'store': widget_tree.get_object("liststoreOcrLang"), }, } actions = { "delete-event": ( [self.window], ActionApplySettings(self, config), ), "toggle_ocr": ( [self.ocr_settings['enabled']['gui']], ActionToggleOCRState(self), ), "select_scanner": ( [widget_tree.get_object("comboboxDevices")], ActionSelectScanner(self) ), "select_source": ( [widget_tree.get_object("comboboxScanSources")], ActionSelectSource(self) ), "scan_calibration": ( [widget_tree.get_object("buttonScanCalibration")], ActionScanCalibration(self) ) } self.device_settings = { "devid": { 'gui': widget_tree.get_object("comboboxDevices"), 'stores': { 'loaded': widget_tree.get_object("liststoreDevice"), }, 'nb_elements': 0, 'active_idx': -1, }, "has_feeder": False, "source": { 'gui': widget_tree.get_object("comboboxScanSources"), 'stores': { 'loaded': widget_tree.get_object("liststoreScanSources"), }, 'nb_elements': 0, 'active_idx': -1, }, "resolution": { 'gui': widget_tree.get_object("comboboxResolution"), 'stores': { 'loaded': widget_tree.get_object("liststoreResolution"), }, 'nb_elements': 0, 'active_idx': -1, }, } img_scrollbars = widget_tree.get_object("scrolledwindowCalibration") img_canvas = Canvas(img_scrollbars) img_canvas.set_visible(True) img_scrollbars.add(img_canvas) self.calibration = { "scan_button": widget_tree.get_object("buttonScanCalibration"), "image_gui": img_canvas, "image": None, "image_eventbox": widget_tree.get_object("eventboxCalibration"), "image_scrollbars": img_scrollbars, "resolution": DEFAULT_CALIBRATION_RESOLUTION, "zoom": widget_tree.get_object("adjustmentZoom"), } self.grips = None self.progressbar = widget_tree.get_object("progressbarScan") self.__scan_start = 0.0 self.job_factories = { "device_finder": JobFactoryDeviceFinder( self, config['scanner_devid'].value ), "source_finder": JobFactorySourceFinder( self, config['scanner_source'].value ), "resolution_finder": JobFactoryResolutionFinder( self, config['scanner_resolution'].value, RECOMMENDED_SCAN_RESOLUTION ), "scan": JobFactoryCalibrationScan( self, self.device_settings['resolution']['stores']['loaded'] ), "progress_updater": JobFactoryProgressUpdater(self.progressbar), } try: translations = gettext.translation( 'iso639-3', pycountry.LOCALES_DIR ) logger.info("Language name translations loaded") except Exception: logger.exception("Unable to load languages translations") translations = None ocr_tools = pyocr.get_available_tools() if len(ocr_tools) == 0: short_ocr_langs = [] else: short_ocr_langs = ocr_tools[0].get_available_languages() ocr_langs = [] for short in short_ocr_langs: if short in ['equ', 'osd']: # ignore some (equ = equation ; osd = orientation detection) continue llang = self.__get_short_to_long_langs(short) if llang: if not translations: tlang = llang else: tlang = translations.gettext(llang) logger.info("Translation: {} | {}".format(llang, tlang)) if not tlang: logger.error("Warning: Long name not found for language " "'%s'." % short) logger.warning(" Will use short name as long name.") tlang = short ocr_langs.append((short, tlang)) ocr_langs.sort(key=lambda lang: lang[1]) self.ocr_settings['lang']['store'].clear() for (short_lang, long_lang) in ocr_langs: self.ocr_settings['lang']['store'].append([long_lang, short_lang]) for (k, v) in actions.items(): v[1].connect(v[0]) self.window.connect("destroy", self.__on_destroy) self.display_config(config) self.window.set_visible(True) for scheduler in self.local_schedulers: scheduler.start() job = self.job_factories['device_finder'].make() self.schedulers['main'].schedule(job)