[ocrfeeder/langs: 6/15] Add languages capabilities to the BoxEditor
- From: Joaquim Manuel Pereira Rocha <jrocha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [ocrfeeder/langs: 6/15] Add languages capabilities to the BoxEditor
- Date: Tue, 5 Feb 2013 06:25:13 +0000 (UTC)
commit c7ac930dca83ddda7804ba340c43c31cda355b16
Author: Joaquim Rocha <jrocha igalia com>
Date: Mon Jan 28 15:29:12 2013 +0100
Add languages capabilities to the BoxEditor
Also adds a utility function to get the languages separately.
src/ocrfeeder/studio/widgetModeler.py | 20 ++++++-
src/ocrfeeder/studio/widgetPresenter.py | 98 +++++++++++++++++++++++++++++++
src/ocrfeeder/util/constants.py.in | 3 +
src/ocrfeeder/util/lib.py | 14 +++++
4 files changed, 134 insertions(+), 1 deletions(-)
---
diff --git a/src/ocrfeeder/studio/widgetModeler.py b/src/ocrfeeder/studio/widgetModeler.py
index 0dbd797..b0dd297 100644
--- a/src/ocrfeeder/studio/widgetModeler.py
+++ b/src/ocrfeeder/studio/widgetModeler.py
@@ -954,6 +954,8 @@ class Editor:
self.box_editor.align_fill_button.connect('toggled', self.__setDataBoxAlign, ALIGN_FILL)
self.box_editor.letter_spacing_spin.connect('value-changed', self.__setDataBoxLetterSpacing)
self.box_editor.line_spacing_spin.connect('value-changed', self.__setDataBoxLineSpacing)
+ self.box_editor.ocr_combo_box.connect('changed', self._onOCREngineChanged)
+ self.box_editor.languages_combo.connect('changed', self._onLanguageChanged)
self.box_editor.hide()
def __updateBoxX(self, spin_button):
@@ -1032,6 +1034,21 @@ class Editor:
line_spacing_button = line_spacing_button or self.box_editor.line_spacing_spin
self.data_box.setLineSpacing(line_spacing_button.get_value())
+ def __setDataBoxLanguage(self, language = ''):
+ language = language or self.box_editor.getLanguage()
+ self.data_box.setLanguage(language)
+
+ def _onOCREngineChanged(self, combobox):
+ index = self.box_editor.getSelectedOcrEngine()
+ if index == -1:
+ return
+ engine = self.ocr_engines[index][0]
+ self.box_editor.setAvailableLanguages(engine.getLanguages().keys())
+
+ def _onLanguageChanged(self, combobox):
+ if self.data_box:
+ self.data_box.setLanguage(self.box_editor.getLanguage())
+
def update(self, box):
self.box = box
x, y, width, height = self.data_box.updateBoundsFromBox(self.box)
@@ -1101,7 +1118,7 @@ class Editor:
self.__setDataBoxFont()
self.__setDataBoxLetterSpacing()
self.__setDataBoxLineSpacing()
-
+ self.__setDataBoxLanguage()
def updateDataBox(self, data_box):
self.__updating_data_box = True
@@ -1119,6 +1136,7 @@ class Editor:
self.box_editor.setFontSize(self.data_box.text_data.size)
self.box_editor.setLineSpacing(self.data_box.getLineSpacing())
self.box_editor.setLetterSpacing(self.data_box.getLetterSpacing())
+ self.box_editor.setLanguage(self.data_box.getLanguage())
self.__updating_data_box = False
self.__connectDataBoxSignals()
self.__updateBoxColor(None, self.data_box.type)
diff --git a/src/ocrfeeder/studio/widgetPresenter.py b/src/ocrfeeder/studio/widgetPresenter.py
index 71f1091..4511b37 100644
--- a/src/ocrfeeder/studio/widgetPresenter.py
+++ b/src/ocrfeeder/studio/widgetPresenter.py
@@ -228,6 +228,87 @@ class MainWindow:
for action in actions]:
gtkaction.set_sensitive(set_sensitive)
+class LanguagesComboBox(gtk.ComboBox):
+
+ _ID_COLUMN = 0
+ _CHECK_COLUMN = 1
+ _LANG_COLUMN = 2
+
+ def __init__(self, use_icon = False):
+ gtk.ComboBox.__init__(self)
+
+ self._cached_iters = {}
+ self._model_columns = {self._ID_COLUMN: str, self._LANG_COLUMN: str}
+ if use_icon:
+ self._model_columns[self._CHECK_COLUMN] = bool
+ model = gtk.ListStore(*(self._model_columns.values()))
+
+ self.set_model(model)
+
+ if use_icon:
+ renderer = gtk.CellRendererToggle()
+ renderer.set_sensitive(False)
+ self.pack_start(renderer, False)
+ self.add_attribute(renderer, 'active', self._CHECK_COLUMN)
+
+ renderer = gtk.CellRendererText()
+ # setting width so the combo won't be crazy large
+ renderer.set_property('width', 50)
+ self.pack_start(renderer, False)
+ self.add_attribute(renderer, 'text', self._LANG_COLUMN)
+
+ languages = lib.getLanguages()
+ sorted_keys = sorted(languages, key = lambda k: languages[k])
+ if sorted_keys:
+ model.append(('', False, _('No language')))
+ for key in sorted_keys:
+ language = languages[key]
+ translation = gettext.dgettext('iso_639', language)
+ values = (key, translation)
+ if len(self._model_columns.keys()) == 3:
+ values = (key, False, translation)
+ model.append(values)
+
+ def setAvailableLanguages(self, languages):
+ if len(self._model_columns.keys()) != 3:
+ return
+ cached_languages = self._cached_iters.keys()
+ languages_to_unset = [lang for lang in cached_languages
+ if lang not in languages]
+ model = self.get_model()
+ for lang in languages:
+ iter = self._cached_iters.get(lang)
+ if iter is None:
+ iter = model.get_iter_first()
+ while iter:
+ if model.get_value(iter, self._ID_COLUMN) == lang:
+ self._cached_iters[lang] = iter
+ break
+ iter = model.iter_next(iter)
+ if iter:
+ model.set_value(iter, self._CHECK_COLUMN, True)
+ for lang in languages_to_unset:
+ iter = self._cached_iters.get(lang)
+ if iter:
+ model.set_value(iter, self._CHECK_COLUMN, False)
+
+ def getLanguage(self):
+ iter = self.get_active_iter()
+ if iter:
+ return self.get_model().get_value(iter, self._ID_COLUMN)
+
+ def setLanguage(self, language):
+ iter = self._cached_iters.get(language)
+ model = self.get_model()
+ if not iter:
+ iter = model.get_iter_first()
+ while iter:
+ if model.get_value(iter, self._ID_COLUMN) == language:
+ break
+ iter = model.iter_next(iter)
+ if iter:
+ self.set_active_iter(iter)
+
class BoxEditor(gtk.ScrolledWindow, gobject.GObject):
__gtype_name__ = 'BoxEditor'
@@ -445,6 +526,9 @@ class BoxEditor(gtk.ScrolledWindow, gobject.GObject):
return self.align_left_button, self.align_center_button, self.align_right_button, self.align_fill_button
+ def getLanguage(self):
+ return self.languages_combo.getLanguage()
+
def __makeOcrProperties(self, engines):
hbox = gtk.HBox()
self.perform_ocr_button = gtk.Button(_('OC_R'))
@@ -537,6 +621,15 @@ class BoxEditor(gtk.ScrolledWindow, gobject.GObject):
text_properties_notebook.append_page(angle_box, gtk.Label( _('Angle')))
text_properties_notebook.set_tab_reorderable(angle_box, True)
+ label = gtk.Label( _('Mis_c'))
+ label.set_use_underline(True)
+ vbox = gtk.VBox()
+ language_frame = PlainFrame(_('Language'))
+ self.languages_combo = LanguagesComboBox(use_icon = True)
+ language_frame.add(self.languages_combo)
+ vbox.pack_start(language_frame, False, False, 0)
+ text_properties_notebook.append_page(vbox, label)
+
vbox = gtk.VBox()
label = gtk.Label(_('OCR engine to recogni_ze this area:'))
label.set_mnemonic_widget(self.ocr_combo_box)
@@ -561,6 +654,11 @@ class BoxEditor(gtk.ScrolledWindow, gobject.GObject):
vbox.pack_start(self.detect_angle_button, False)
return vbox
+ def setAvailableLanguages(self, languages):
+ self.languages_combo.setAvailableLanguages(languages)
+
+ def setLanguage(self, language):
+ self.languages_combo.setLanguage(language)
def setFontSize(self, size):
font_name = self.font_button.get_font_name().split(' ')
diff --git a/src/ocrfeeder/util/constants.py.in b/src/ocrfeeder/util/constants.py.in
index 6dfc6bd..539ae36 100644
--- a/src/ocrfeeder/util/constants.py.in
+++ b/src/ocrfeeder/util/constants.py.in
@@ -91,3 +91,6 @@ DTP = 72
# UI files' location
OCRFEEDER_SPELLCHECKER_UI = os.path.join(RESOURCES_DIR, 'spell-checker.ui')
OCRFEEDER_MENUBAR_UI = os.path.join(RESOURCES_DIR, 'menubar.ui')
+
+# ISO-codes location
+ISO_CODES_PATH = '/usr/share/xml/iso-codes/'
diff --git a/src/ocrfeeder/util/lib.py b/src/ocrfeeder/util/lib.py
index 5d6780f..00b3f98 100644
--- a/src/ocrfeeder/util/lib.py
+++ b/src/ocrfeeder/util/lib.py
@@ -27,6 +27,8 @@ import math
from constants import *
import sane
import tempfile
+import locale
+from lxml import etree
def getIconOrLabel(icon_name, label_text, icon_size = gtk.ICON_SIZE_SMALL_TOOLBAR):
icon = gtk.Image()
@@ -163,3 +165,15 @@ def scan(device):
return filename
except (RuntimeError, sane._sane.error), msgerr:
return None
+
+languages = {}
+
+def getLanguages():
+ global languages
+ if not languages:
+ lc, encoding = locale.getdefaultlocale()
+ language_country = lc.split('_')
+ root = etree.parse(ISO_CODES_PATH + 'iso_639.xml')
+ for element in root.findall('//iso_639_entry[ iso_639_1_code]'):
+ languages[element.get('iso_639_1_code')] = element.get('name')
+ return languages
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]