|
1 # -*- coding: utf-8 -*- |
|
2 |
|
3 # Copyright (c) 2010 - 2019 Detlev Offenbach <detlev@die-offenbachs.de> |
|
4 # |
|
5 |
|
6 """ |
|
7 Module implementing the editor highlighter keywords configuration page. |
|
8 """ |
|
9 |
|
10 from __future__ import unicode_literals |
|
11 |
|
12 from PyQt5.QtCore import pyqtSlot |
|
13 |
|
14 from E5Gui import E5MessageBox |
|
15 |
|
16 from .ConfigurationPageBase import ConfigurationPageBase |
|
17 from .Ui_EditorKeywordsPage import Ui_EditorKeywordsPage |
|
18 |
|
19 import Preferences |
|
20 |
|
21 |
|
22 class EditorKeywordsPage(ConfigurationPageBase, Ui_EditorKeywordsPage): |
|
23 """ |
|
24 Class implementing the editor highlighter keywords configuration page. |
|
25 """ |
|
26 MaxKeywordSets = 8 # max. 8 sets are allowed |
|
27 |
|
28 def __init__(self): |
|
29 """ |
|
30 Constructor |
|
31 """ |
|
32 super(EditorKeywordsPage, self).__init__() |
|
33 self.setupUi(self) |
|
34 self.setObjectName("EditorKeywordsPage") |
|
35 |
|
36 # set initial values |
|
37 import QScintilla.Lexers |
|
38 from QScintilla.Lexers.LexerContainer import LexerContainer |
|
39 |
|
40 self.__keywords = { |
|
41 "": { |
|
42 "Sets": [""] * (self.MaxKeywordSets + 1), |
|
43 "Descriptions": [""] * (self.MaxKeywordSets + 1), |
|
44 "MaxSets": 0, |
|
45 } |
|
46 } |
|
47 |
|
48 languages = sorted( |
|
49 [''] + list(QScintilla.Lexers.getSupportedLanguages().keys())) |
|
50 for lang in languages: |
|
51 if lang: |
|
52 lex = QScintilla.Lexers.getLexer(lang) |
|
53 if isinstance(lex, LexerContainer): |
|
54 continue |
|
55 keywords = Preferences.getEditorKeywords(lang)[:] |
|
56 if keywords: |
|
57 # set empty entries to default values |
|
58 for kwSet in range(1, self.MaxKeywordSets + 1): |
|
59 if not keywords[kwSet]: |
|
60 kw = lex.defaultKeywords(kwSet) |
|
61 if kw is None: |
|
62 kw = "" |
|
63 keywords[kwSet] = kw |
|
64 else: |
|
65 keywords = [""] |
|
66 descriptions = [""] |
|
67 for kwSet in range(1, self.MaxKeywordSets + 1): |
|
68 kw = lex.keywords(kwSet) |
|
69 if kw is None: |
|
70 kw = "" |
|
71 keywords.append(kw) |
|
72 descriptions = [""] |
|
73 for kwSet in range(1, self.MaxKeywordSets + 1): |
|
74 desc = lex.keywordsDescription(kwSet) |
|
75 descriptions.append(desc) |
|
76 defaults = [""] |
|
77 for kwSet in range(1, self.MaxKeywordSets + 1): |
|
78 dkw = lex.defaultKeywords(kwSet) |
|
79 if dkw is None: |
|
80 dkw = "" |
|
81 defaults.append(dkw) |
|
82 self.__keywords[lang] = { |
|
83 "Sets": keywords, |
|
84 "Descriptions": descriptions, |
|
85 "DefaultSets": defaults, |
|
86 "MaxSets": lex.maximumKeywordSet(), |
|
87 } |
|
88 self.languageCombo.addItem( |
|
89 QScintilla.Lexers.getLanguageIcon(lang, False), |
|
90 lang) |
|
91 |
|
92 self.currentLanguage = '' |
|
93 self.currentSet = 1 |
|
94 self.on_languageCombo_activated(self.currentLanguage) |
|
95 |
|
96 def save(self): |
|
97 """ |
|
98 Public slot to save the editor highlighter keywords configuration. |
|
99 """ |
|
100 lang = self.languageCombo.currentText() |
|
101 kwSet = self.setSpinBox.value() |
|
102 self.__keywords[lang]["Sets"][kwSet] = self.keywordsEdit.toPlainText() |
|
103 |
|
104 for lang, keywords in self.__keywords.items(): |
|
105 Preferences.setEditorKeywords(lang, keywords["Sets"]) |
|
106 |
|
107 @pyqtSlot(str) |
|
108 def on_languageCombo_activated(self, language): |
|
109 """ |
|
110 Private slot to fill the keywords edit. |
|
111 |
|
112 @param language selected language |
|
113 @type str |
|
114 """ |
|
115 self.defaultButton.setEnabled(bool(language)) |
|
116 self.allDefaultButton.setEnabled(bool(language)) |
|
117 |
|
118 if self.currentLanguage == language: |
|
119 return |
|
120 |
|
121 if self.setSpinBox.value() == 1: |
|
122 self.on_setSpinBox_valueChanged(1) |
|
123 if self.__keywords[language]["MaxSets"]: |
|
124 first = 1 |
|
125 last = self.__keywords[language]["MaxSets"] |
|
126 else: |
|
127 first, last = self.MaxKeywordSets + 1, 0 |
|
128 for kwSet in range(1, self.MaxKeywordSets + 1): |
|
129 if self.__keywords[language]["Descriptions"][kwSet] != "": |
|
130 first = min(first, kwSet) |
|
131 last = max(last, kwSet) |
|
132 self.setSpinBox.setEnabled(language != "" and |
|
133 first <= self.MaxKeywordSets) |
|
134 self.keywordsEdit.setEnabled(language != "" and |
|
135 first <= self.MaxKeywordSets) |
|
136 if first <= self.MaxKeywordSets: |
|
137 self.setSpinBox.setMinimum(first) |
|
138 self.setSpinBox.setMaximum(last) |
|
139 self.setSpinBox.setValue(first) |
|
140 else: |
|
141 self.setSpinBox.setMinimum(0) |
|
142 self.setSpinBox.setMaximum(0) |
|
143 self.setSpinBox.setValue(0) |
|
144 |
|
145 @pyqtSlot(int) |
|
146 def on_setSpinBox_valueChanged(self, kwSet): |
|
147 """ |
|
148 Private slot to fill the keywords edit. |
|
149 |
|
150 @param kwSet number of the selected keyword set |
|
151 @type int |
|
152 """ |
|
153 language = self.languageCombo.currentText() |
|
154 if self.currentLanguage == language and self.currentSet == kwSet: |
|
155 return |
|
156 |
|
157 self.__keywords[self.currentLanguage]["Sets"][self.currentSet] = \ |
|
158 self.keywordsEdit.toPlainText() |
|
159 |
|
160 self.currentLanguage = language |
|
161 self.currentSet = kwSet |
|
162 self.setDescriptionLabel.setText("<b>{0}</b>".format( |
|
163 self.__keywords[language]["Descriptions"][kwSet])) |
|
164 self.keywordsEdit.setPlainText( |
|
165 self.__keywords[language]["Sets"][kwSet]) |
|
166 |
|
167 @pyqtSlot() |
|
168 def on_defaultButton_clicked(self): |
|
169 """ |
|
170 Private slot to set the current keyword set to default values. |
|
171 """ |
|
172 if bool(self.keywordsEdit.toPlainText()): |
|
173 ok = E5MessageBox.yesNo( |
|
174 self, |
|
175 self.tr("Reset to Default"), |
|
176 self.tr("Shall the current keyword set really be reset to" |
|
177 " default values?")) |
|
178 else: |
|
179 ok = True |
|
180 if ok: |
|
181 language = self.languageCombo.currentText() |
|
182 kwSet = self.setSpinBox.value() |
|
183 self.__keywords[language]["Sets"][kwSet] = \ |
|
184 self.__keywords[language]["DefaultSets"][kwSet] |
|
185 self.keywordsEdit.setPlainText( |
|
186 self.__keywords[language]["Sets"][kwSet]) |
|
187 |
|
188 @pyqtSlot() |
|
189 def on_allDefaultButton_clicked(self): |
|
190 """ |
|
191 Private slot to set all keyword sets of the current language to default |
|
192 values. |
|
193 """ |
|
194 ok = E5MessageBox.yesNo( |
|
195 self, |
|
196 self.tr("Reset All to Default"), |
|
197 self.tr("Shall all keyword sets of the current language really be" |
|
198 " reset to default values?")) |
|
199 if ok: |
|
200 language = self.languageCombo.currentText() |
|
201 kwSet = self.setSpinBox.value() |
|
202 self.__keywords[language]["Sets"] = \ |
|
203 self.__keywords[language]["DefaultSets"][:] |
|
204 self.keywordsEdit.setPlainText( |
|
205 self.__keywords[language]["Sets"][kwSet]) |
|
206 |
|
207 |
|
208 def create(dlg): |
|
209 """ |
|
210 Module function to create the configuration page. |
|
211 |
|
212 @param dlg reference to the configuration dialog |
|
213 @type ConfigurationWidget |
|
214 @return reference to the instantiated page |
|
215 @rtype ConfigurationPageBase |
|
216 """ |
|
217 page = EditorKeywordsPage() |
|
218 return page |