1# -*- coding: utf-8 -*-
2
3# Copyright (c) 2014 - 2021 Detlev Offenbach <detlev@die-offenbachs.de>
4#
5
6"""
7Module implementing the Time Tracker configuration page.
8"""
9
10from PyQt5.QtCore import pyqtSlot, Qt
11from PyQt5.QtWidgets import QListWidgetItem
12
13from E5Gui import E5MessageBox
14
15from Preferences.ConfigurationPages.ConfigurationPageBase import (
16    ConfigurationPageBase
17)
18from .Ui_TranslatorPage import Ui_TranslatorPage
19
20from ..TranslatorLanguagesDb import TranslatorLanguagesDb
21from .. import TranslatorEngines
22
23
24class TranslatorPage(ConfigurationPageBase, Ui_TranslatorPage):
25    """
26    Class implementing the Time Tracker configuration page.
27    """
28    def __init__(self, plugin):
29        """
30        Constructor
31
32        @param plugin reference to the plugin object
33        """
34        super().__init__()
35        self.setupUi(self)
36        self.setObjectName("TranslatorPage")
37
38        self.__plugin = plugin
39        self.__enableLanguageWarning = True
40
41        self.deeplLabel.setText(self.tr(
42            """<p>A key is <b>required</b> to use this service."""
43            """ <a href="{0}">Get a commercial API key.</a></p>""").format(
44                TranslatorEngines.getKeyUrl("deepl")))
45        self.googlev2Label.setText(self.tr(
46            """<p>A key is <b>required</b> to use this service."""
47            """ <a href="{0}">Get a commercial API key.</a></p>""").format(
48                TranslatorEngines.getKeyUrl("googlev2")))
49        self.ibmLabel.setText(self.tr(
50            """<p>A key is <b>required</b> to use this service."""
51            """ <a href="{0}">Register with IBM Cloud.</a></p>""").format(
52                TranslatorEngines.getKeyUrl("ibm_watson")))
53        self.msLabel.setText(self.tr(
54            """<p>A registration of the text translation service is"""
55            """ <b>required</b>. <a href="{0}">Register with Microsoft"""
56            """ Azure.</a></p>""").format(
57                TranslatorEngines.getKeyUrl("microsoft")))
58        self.mymemoryLabel.setText(self.tr(
59            """<p>A key is <b>optional</b> to use this service."""
60            """ <a href="{0}">Get a free API key.</a></p>""").format(
61                TranslatorEngines.getKeyUrl("mymemory")))
62        self.yandexLabel.setText(self.tr(
63            """<p>A key is <b>required</b> to use this service."""
64            """ <a href="{0}">Get a free API key.</a></p>""").format(
65                TranslatorEngines.getKeyUrl("yandex")))
66
67        # set initial values
68        enabledLanguages = self.__plugin.getPreferences("EnabledLanguages")
69        languages = TranslatorLanguagesDb()
70        for languageCode in languages.getAllLanguages():
71            itm = QListWidgetItem()
72            itm.setText(languages.getLanguage(languageCode))
73            itm.setIcon(languages.getLanguageIcon(languageCode))
74            itm.setData(Qt.ItemDataRole.UserRole, languageCode)
75            if languageCode in enabledLanguages or not enabledLanguages:
76                itm.setCheckState(Qt.CheckState.Checked)
77            else:
78                itm.setCheckState(Qt.CheckState.Unchecked)
79            self.languagesList.addItem(itm)
80        self.languagesList.sortItems()
81
82        # DeepL settings
83        self.deeplKeyEdit.setText(
84            self.__plugin.getPreferences("DeeplKey"))
85        # Google settings
86        self.dictionaryCheckBox.setChecked(
87            self.__plugin.getPreferences("GoogleEnableDictionary"))
88        self.googlev2KeyEdit.setText(
89            self.__plugin.getPreferences("GoogleV2Key"))
90        # IBM Watson settings
91        self.ibmUrlEdit.setText(
92            self.__plugin.getPreferences("IbmUrl"))
93        self.ibmKeyEdit.setText(
94            self.__plugin.getPreferences("IbmKey"))
95        # Microsoft settings
96        self.msSubscriptionKeyEdit.setText(
97            self.__plugin.getPreferences("MsTranslatorKey"))
98        # MyMemory settings
99        self.mymemoryKeyEdit.setText(
100            self.__plugin.getPreferences("MyMemoryKey"))
101        self.mymemoryEmailEdit.setText(
102            self.__plugin.getPreferences("MyMemoryEmail"))
103        # Yandex settings
104        self.yandexKeyEdit.setText(
105            self.__plugin.getPreferences("YandexKey"))
106
107    def save(self):
108        """
109        Public slot to save the Pyramid configuration.
110        """
111        enabledLanguages = [
112            itm.data(Qt.ItemDataRole.UserRole)
113            for itm in self.__checkedLanguageItems()
114        ]
115        self.__plugin.setPreferences(
116            "EnabledLanguages", enabledLanguages)
117
118        # DeepL settings
119        self.__plugin.setPreferences(
120            "DeeplKey", self.deeplKeyEdit.text())
121        # Google settings
122        self.__plugin.setPreferences(
123            "GoogleEnableDictionary", self.dictionaryCheckBox.isChecked())
124        self.__plugin.setPreferences(
125            "GoogleV2Key", self.googlev2KeyEdit.text())
126        # IBM Watson settings
127        self.__plugin.setPreferences(
128            "IbmUrl", self.ibmUrlEdit.text())
129        self.__plugin.setPreferences(
130            "IbmKey", self.ibmKeyEdit.text())
131        # Microsoft settings
132        self.__plugin.setPreferences(
133            "MsTranslatorKey", self.msSubscriptionKeyEdit.text())
134        # MyMemory settings
135        self.__plugin.setPreferences(
136            "MyMemoryKey", self.mymemoryKeyEdit.text())
137        # Yandex settings
138        self.__plugin.setPreferences(
139            "YandexKey", self.yandexKeyEdit.text())
140
141    def __checkedLanguageItems(self):
142        """
143        Private method to get a list of checked language items.
144
145        @return list of checked language items (list of QListWidgetItem)
146        """
147        items = []
148        for index in range(self.languagesList.count()):
149            itm = self.languagesList.item(index)
150            if itm.checkState() == Qt.CheckState.Checked:
151                items.append(itm)
152
153        return items
154
155    @pyqtSlot()
156    def on_setButton_clicked(self):
157        """
158        Private slot to set or unset all items.
159        """
160        self.__enableLanguageWarning = False
161
162        unset = len(self.__checkedLanguageItems()) > 0
163        for index in range(self.languagesList.count()):
164            itm = self.languagesList.item(index)
165            if unset:
166                itm.setCheckState(Qt.CheckState.Unchecked)
167            else:
168                itm.setCheckState(Qt.CheckState.Checked)
169
170        self.__enableLanguageWarning = True
171
172    @pyqtSlot()
173    def on_defaultButton_clicked(self):
174        """
175        Private slot to set the default languages.
176        """
177        self.__enableLanguageWarning = False
178
179        defaults = self.__plugin.getPreferencesDefault("EnabledLanguages")
180        for index in range(self.languagesList.count()):
181            itm = self.languagesList.item(index)
182            if itm.data(Qt.ItemDataRole.UserRole) in defaults:
183                itm.setCheckState(Qt.CheckState.Checked)
184            else:
185                itm.setCheckState(Qt.CheckState.Unchecked)
186
187        self.__enableLanguageWarning = True
188
189    @pyqtSlot(QListWidgetItem)
190    def on_languagesList_itemChanged(self, item):
191        """
192        Private slot to handle the selection of an item.
193
194        @param item reference to the changed item (QListWidgetItem)
195        """
196        if (
197            self.__enableLanguageWarning and
198            len(self.__checkedLanguageItems()) < 2
199        ):
200            E5MessageBox.warning(
201                self,
202                self.tr("Enabled Languages"),
203                self.tr("""At least two languages should be selected to"""
204                        """ work correctly."""))
205