Plugins/UiExtensionPlugins/Translator/TranslatorWidget.py

changeset 6411
7fd9b7ecbcfe
parent 6048
82ad8ec9548c
child 6412
d71b094845e7
--- a/Plugins/UiExtensionPlugins/Translator/TranslatorWidget.py	Sat Jul 07 12:58:50 2018 +0200
+++ b/Plugins/UiExtensionPlugins/Translator/TranslatorWidget.py	Sat Jul 07 14:38:13 2018 +0200
@@ -96,25 +96,55 @@
         Private slot to update the language combo boxes.
         """
         supportedCodes = self.__translationEngine.supportedLanguages()
+        enabledCodes = self.__plugin.getPreferences("EnabledLanguages")
+        
+        # 1. save current selections
         origLanguage = self.origLanguageComboBox.itemData(
             self.origLanguageComboBox.currentIndex())
         transLanguage = self.transLanguageComboBox.itemData(
             self.transLanguageComboBox.currentIndex())
+        
+        # 2. reload the original language combo box
+        self.origLanguageComboBox.blockSignals(True)
         self.origLanguageComboBox.clear()
-        self.transLanguageComboBox.clear()
-        for code in self.__plugin.getPreferences("EnabledLanguages"):
+        for code in enabledCodes:
             if code in supportedCodes:
                 language = self.__languages.getLanguage(code)
                 if language:
                     icon = self.__languages.getLanguageIcon(code)
                     self.origLanguageComboBox.addItem(icon, language, code)
-                    self.transLanguageComboBox.addItem(icon, language, code)
         self.origLanguageComboBox.model().sort(0)
-        self.transLanguageComboBox.model().sort(0)
-        self.origLanguageComboBox.setCurrentIndex(
-            self.origLanguageComboBox.findData(origLanguage))
-        self.transLanguageComboBox.setCurrentIndex(
-            self.transLanguageComboBox.findData(transLanguage))
+        origIndex = self.origLanguageComboBox.findData(origLanguage)
+        if origIndex == -1:
+            origIndex = 0
+        self.origLanguageComboBox.blockSignals(False)
+        self.origLanguageComboBox.setCurrentIndex(origIndex)
+        
+        # 3. reload the target language combo box, if the target is not
+        #    dependent upon the source language
+        supportedTargetCodes = \
+            self.__translationEngine.supportedTargetLanguages(
+                self.origLanguageComboBox.itemData(
+                    self.origLanguageComboBox.currentIndex()
+                )
+            )
+        if supportedTargetCodes is None:
+            # supported target codes are independent
+            self.transLanguageComboBox.clear()
+            for code in enabledCodes:
+                if code in supportedCodes:
+                    language = self.__languages.getLanguage(code)
+                    if language:
+                        icon = self.__languages.getLanguageIcon(code)
+                        self.transLanguageComboBox.addItem(icon, language,
+                                                           code)
+            self.transLanguageComboBox.model().sort(0)
+            index = self.transLanguageComboBox.findData(transLanguage)
+            if index == -1:
+                index = 0
+            self.transLanguageComboBox.setCurrentIndex(index)
+        else:
+            self.on_origLanguageComboBox_currentIndexChanged(origIndex)
     
     def __updateEngines(self):
         """
@@ -190,10 +220,22 @@
         """
         Private slot to swap the languages.
         """
-        oIdx = self.origLanguageComboBox.currentIndex()
-        self.origLanguageComboBox.setCurrentIndex(
+        # save selected language codes
+        oLanguage = self.origLanguageComboBox.itemData(
+            self.origLanguageComboBox.currentIndex())
+        
+        tLanguage = self.transLanguageComboBox.itemData(
             self.transLanguageComboBox.currentIndex())
-        self.transLanguageComboBox.setCurrentIndex(oIdx)
+        
+        oIdx = self.origLanguageComboBox.findData(tLanguage)
+        if oIdx < 0:
+            oIdx = 0
+        self.origLanguageComboBox.setCurrentIndex(oIdx)
+        
+        tIdx = self.transLanguageComboBox.findData(oLanguage)
+        if tIdx < 0:
+            tIdx = 0
+        self.transLanguageComboBox.setCurrentIndex(tIdx)
         
         origText = self.origEdit.toPlainText()
         self.origEdit.setPlainText(self.transEdit.toPlainText())
@@ -212,10 +254,9 @@
         """
         Private slot to handle changes of the original text.
         """
-        enable = bool(self.origEdit.toPlainText())
-        self.translateButton.setEnabled(enable)
         self.__updatePronounceButtons()
         self.__updateClearButton()
+        self.__updateTranslateButton()
     
     @pyqtSlot()
     def on_transEdit_textChanged(self):
@@ -234,6 +275,31 @@
         """
         self.__plugin.setPreferences(
             "OriginalLanguage", self.origLanguageComboBox.itemData(index))
+        
+        supportedTargetCodes = \
+            self.__translationEngine.supportedTargetLanguages(
+                self.origLanguageComboBox.itemData(index)
+            )
+        if supportedTargetCodes is not None:
+            enabledCodes = self.__plugin.getPreferences("EnabledLanguages")
+            transLanguage = self.transLanguageComboBox.itemData(
+                self.transLanguageComboBox.currentIndex())
+            self.transLanguageComboBox.clear()
+            if len(supportedTargetCodes) > 0:
+                for code in enabledCodes:
+                    if code in supportedTargetCodes:
+                        language = self.__languages.getLanguage(code)
+                        if language:
+                            icon = self.__languages.getLanguageIcon(code)
+                            self.transLanguageComboBox.addItem(
+                                icon, language, code)
+                self.transLanguageComboBox.model().sort(0)
+                index = self.transLanguageComboBox.findData(transLanguage)
+                if index == -1:
+                    index = 0
+                self.transLanguageComboBox.setCurrentIndex(index)
+            
+            self.__updateTranslateButton()
     
     @pyqtSlot(int)
     def on_transLanguageComboBox_currentIndexChanged(self, index):
@@ -272,7 +338,10 @@
         """
         Private slot to set the state of the pronounce buttons.
         """
-        hasTTS = self.__translationEngine.hasTTS()
+        if self.__translationEngine is not None:
+            hasTTS = self.__translationEngine.hasTTS()
+        else:
+            hasTTS = False
         self.pronounceOrigButton.setEnabled(
             hasTTS and bool(self.origEdit.toPlainText()))
         self.pronounceTransButton.setEnabled(
@@ -286,6 +355,14 @@
             bool(self.transEdit.toPlainText())
         self.clearButton.setEnabled(enable)
     
+    def __updateTranslateButton(self):
+        """
+        Private slot to set the state of the translate button.
+        """
+        enable = bool(self.origEdit.toPlainText())
+        enable &= bool(self.__translationLanguage())
+        self.translateButton.setEnabled(enable)
+    
     def __translate(self, text, originalLanguage, translationLanguage):
         """
         Private method to translate the given text.

eric ide

mercurial