src/eric7/Preferences/ConfigurationPages/EditorKeywordsPage.py

branch
eric7
changeset 9209
b99e7fd55fd3
parent 8881
54e42bc2437a
child 9221
bf71ee032bb4
equal deleted inserted replaced
9208:3fc8dfeb6ebe 9209:b99e7fd55fd3
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2010 - 2022 Detlev Offenbach <detlev@die-offenbachs.de>
4 #
5
6 """
7 Module implementing the editor highlighter keywords configuration page.
8 """
9
10 from PyQt6.QtCore import pyqtSlot
11
12 from EricWidgets import EricMessageBox
13
14 from .ConfigurationPageBase import ConfigurationPageBase
15 from .Ui_EditorKeywordsPage import Ui_EditorKeywordsPage
16
17 import Preferences
18
19
20 class EditorKeywordsPage(ConfigurationPageBase, Ui_EditorKeywordsPage):
21 """
22 Class implementing the editor highlighter keywords configuration page.
23 """
24 MaxKeywordSets = 8 # max. 8 sets are allowed
25
26 def __init__(self):
27 """
28 Constructor
29 """
30 super().__init__()
31 self.setupUi(self)
32 self.setObjectName("EditorKeywordsPage")
33
34 # set initial values
35 import QScintilla.Lexers
36 from QScintilla.Lexers.LexerContainer import LexerContainer
37
38 self.__keywords = {
39 "": {
40 "Sets": [""] * (self.MaxKeywordSets + 1),
41 "Descriptions": [""] * (self.MaxKeywordSets + 1),
42 "MaxSets": 0,
43 }
44 }
45
46 languages = sorted(
47 [''] + list(QScintilla.Lexers.getSupportedLanguages().keys()))
48 for lang in languages:
49 if lang:
50 lex = QScintilla.Lexers.getLexer(lang)
51 if isinstance(lex, LexerContainer):
52 continue
53 keywords = Preferences.getEditorKeywords(lang)[:]
54 if keywords:
55 # set empty entries to default values
56 for kwSet in range(1, self.MaxKeywordSets + 1):
57 if not keywords[kwSet]:
58 kw = lex.defaultKeywords(kwSet)
59 if kw is None:
60 kw = ""
61 keywords[kwSet] = kw
62 else:
63 keywords = [""]
64 descriptions = [""]
65 for kwSet in range(1, self.MaxKeywordSets + 1):
66 kw = lex.keywords(kwSet)
67 if kw is None:
68 kw = ""
69 keywords.append(kw)
70 descriptions = [""]
71 for kwSet in range(1, self.MaxKeywordSets + 1):
72 desc = lex.keywordsDescription(kwSet)
73 descriptions.append(desc)
74 defaults = [""]
75 for kwSet in range(1, self.MaxKeywordSets + 1):
76 dkw = lex.defaultKeywords(kwSet)
77 if dkw is None:
78 dkw = ""
79 defaults.append(dkw)
80 self.__keywords[lang] = {
81 "Sets": keywords,
82 "Descriptions": descriptions,
83 "DefaultSets": defaults,
84 "MaxSets": lex.maximumKeywordSet(),
85 }
86 self.languageCombo.addItem(
87 QScintilla.Lexers.getLanguageIcon(lang, False),
88 lang)
89
90 self.currentLanguage = ''
91 self.currentSet = 1
92 self.on_languageCombo_activated(0)
93
94 def save(self):
95 """
96 Public slot to save the editor highlighter keywords configuration.
97 """
98 lang = self.languageCombo.currentText()
99 kwSet = self.setSpinBox.value()
100 self.__keywords[lang]["Sets"][kwSet] = self.keywordsEdit.toPlainText()
101
102 for lang, keywords in self.__keywords.items():
103 Preferences.setEditorKeywords(lang, keywords["Sets"])
104
105 @pyqtSlot(int)
106 def on_languageCombo_activated(self, index):
107 """
108 Private slot to fill the keywords edit.
109
110 @param index index of the selected entry
111 @type int
112 """
113 language = self.languageCombo.itemText(index)
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
161 self.currentLanguage = language
162 self.currentSet = kwSet
163 self.setDescriptionLabel.setText("<b>{0}</b>".format(
164 self.__keywords[language]["Descriptions"][kwSet]))
165 self.keywordsEdit.setPlainText(
166 self.__keywords[language]["Sets"][kwSet])
167
168 @pyqtSlot()
169 def on_defaultButton_clicked(self):
170 """
171 Private slot to set the current keyword set to default values.
172 """
173 ok = (
174 EricMessageBox.yesNo(
175 self,
176 self.tr("Reset to Default"),
177 self.tr("Shall the current keyword set really be reset to"
178 " default values?"))
179 if bool(self.keywordsEdit.toPlainText()) else
180 True
181 )
182 if ok:
183 language = self.languageCombo.currentText()
184 kwSet = self.setSpinBox.value()
185 self.__keywords[language]["Sets"][kwSet] = (
186 self.__keywords[language]["DefaultSets"][kwSet]
187 )
188 self.keywordsEdit.setPlainText(
189 self.__keywords[language]["Sets"][kwSet])
190
191 @pyqtSlot()
192 def on_allDefaultButton_clicked(self):
193 """
194 Private slot to set all keyword sets of the current language to default
195 values.
196 """
197 ok = EricMessageBox.yesNo(
198 self,
199 self.tr("Reset All to Default"),
200 self.tr("Shall all keyword sets of the current language really be"
201 " reset to default values?"))
202 if ok:
203 language = self.languageCombo.currentText()
204 kwSet = self.setSpinBox.value()
205 self.__keywords[language]["Sets"] = (
206 self.__keywords[language]["DefaultSets"][:]
207 )
208 self.keywordsEdit.setPlainText(
209 self.__keywords[language]["Sets"][kwSet])
210
211
212 def create(dlg):
213 """
214 Module function to create the configuration page.
215
216 @param dlg reference to the configuration dialog
217 @type ConfigurationWidget
218 @return reference to the instantiated page
219 @rtype ConfigurationPageBase
220 """
221 page = EditorKeywordsPage()
222 return page

eric ide

mercurial