[ocrfeeder/langs: 6/15] Add languages capabilities to the BoxEditor



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]