eric6/Preferences/ConfigurationPages/EditorGeneralPage.py

changeset 7278
1820a0344b62
parent 7229
53054eb5b15a
child 7360
9190402e4505
equal deleted inserted replaced
7277:adecbc6335c5 7278:1820a0344b62
5 5
6 """ 6 """
7 Module implementing the Editor General configuration page. 7 Module implementing the Editor General configuration page.
8 """ 8 """
9 9
10 10 from PyQt5.QtCore import pyqtSlot, Qt
11 from PyQt5.QtWidgets import QTreeWidgetItem, QHeaderView, QDialog
11 from PyQt5.Qsci import QsciScintillaBase 12 from PyQt5.Qsci import QsciScintillaBase
13
14 from E5Gui import E5MessageBox
12 15
13 from .ConfigurationPageBase import ConfigurationPageBase 16 from .ConfigurationPageBase import ConfigurationPageBase
14 from .Ui_EditorGeneralPage import Ui_EditorGeneralPage 17 from .Ui_EditorGeneralPage import Ui_EditorGeneralPage
18 from .EditorLanguageTabIndentOverrideDialog import (
19 EditorLanguageTabIndentOverrideDialog
20 )
15 21
16 import Preferences 22 import Preferences
23 import UI.PixmapCache
17 24
18 25
19 class EditorGeneralPage(ConfigurationPageBase, Ui_EditorGeneralPage): 26 class EditorGeneralPage(ConfigurationPageBase, Ui_EditorGeneralPage):
20 """ 27 """
21 Class implementing the Editor General configuration page. 28 Class implementing the Editor General configuration page.
25 Constructor 32 Constructor
26 """ 33 """
27 super(EditorGeneralPage, self).__init__() 34 super(EditorGeneralPage, self).__init__()
28 self.setupUi(self) 35 self.setupUi(self)
29 self.setObjectName("EditorGeneralPage") 36 self.setObjectName("EditorGeneralPage")
37
38 self.addButton.setIcon(UI.PixmapCache.getIcon("plus"))
39 self.deleteButton.setIcon(UI.PixmapCache.getIcon("minus"))
40 self.editButton.setIcon(UI.PixmapCache.getIcon("edit"))
30 41
31 # set initial values 42 # set initial values
32 self.tabwidthSlider.setValue( 43 self.tabwidthSlider.setValue(
33 Preferences.getEditor("TabWidth")) 44 Preferences.getEditor("TabWidth"))
34 self.indentwidthSlider.setValue( 45 self.indentwidthSlider.setValue(
48 self.vsSelectionCheckBox.setChecked( 59 self.vsSelectionCheckBox.setChecked(
49 virtualSpaceOptions & QsciScintillaBase.SCVS_RECTANGULARSELECTION) 60 virtualSpaceOptions & QsciScintillaBase.SCVS_RECTANGULARSELECTION)
50 self.vsUserCheckBox.setChecked( 61 self.vsUserCheckBox.setChecked(
51 virtualSpaceOptions & QsciScintillaBase.SCVS_USERACCESSIBLE) 62 virtualSpaceOptions & QsciScintillaBase.SCVS_USERACCESSIBLE)
52 63
64 self.__populateLanguageOverrideWidget()
65
53 def save(self): 66 def save(self):
54 """ 67 """
55 Public slot to save the Editor General configuration. 68 Public slot to save the Editor General configuration.
56 """ 69 """
57 Preferences.setEditor( 70 Preferences.setEditor(
81 virtualSpaceOptions |= QsciScintillaBase.SCVS_RECTANGULARSELECTION 94 virtualSpaceOptions |= QsciScintillaBase.SCVS_RECTANGULARSELECTION
82 if self.vsUserCheckBox.isChecked(): 95 if self.vsUserCheckBox.isChecked():
83 virtualSpaceOptions |= QsciScintillaBase.SCVS_USERACCESSIBLE 96 virtualSpaceOptions |= QsciScintillaBase.SCVS_USERACCESSIBLE
84 Preferences.setEditor("VirtualSpaceOptions", virtualSpaceOptions) 97 Preferences.setEditor("VirtualSpaceOptions", virtualSpaceOptions)
85 98
99 self.__saveLanguageOverrides()
100
86 def on_tabforindentationCheckBox_toggled(self, checked): 101 def on_tabforindentationCheckBox_toggled(self, checked):
87 """ 102 """
88 Private slot used to set the tab conversion check box. 103 Private slot used to set the tab conversion check box.
89 104
90 @param checked flag received from the signal (boolean) 105 @param checked flag received from the signal (boolean)
91 """ 106 """
92 if checked and self.converttabsCheckBox.isChecked(): 107 if checked and self.converttabsCheckBox.isChecked():
93 self.converttabsCheckBox.setChecked(not checked) 108 self.converttabsCheckBox.setChecked(not checked)
94 self.converttabsCheckBox.setEnabled(not checked) 109 self.converttabsCheckBox.setEnabled(not checked)
95 110
111 def __populateLanguageOverrideWidget(self):
112 """
113 Private method to populate the language specific indentation and tab
114 width override widget.
115 """
116 overrides = Preferences.getEditor("TabIndentOverride")
117 for language, (tabWidth, indentWidth) in overrides.items():
118 self.__createOverrideItem(language, tabWidth, indentWidth)
119 self.languageOverrideWidget.sortItems(0, Qt.AscendingOrder)
120 self.__resizeOverrideColumns()
121 self.on_languageOverrideWidget_itemSelectionChanged()
122
123 def __createOverrideItem(self, language, tabWidth, indentWidth):
124 """
125 Private method to create an entry for a language override.
126
127 @param language name of the language
128 @type str
129 @param tabWidth tabulator width
130 @type int
131 @param indentWidth indentation width
132 @type int
133 """
134 itm = QTreeWidgetItem(self.languageOverrideWidget, [
135 language,
136 "{0:2d}".format(tabWidth),
137 "{0:2d}".format(indentWidth)])
138 itm.setTextAlignment(1, Qt.AlignHCenter)
139 itm.setTextAlignment(2, Qt.AlignHCenter)
140
141 def __resizeOverrideColumns(self):
142 """
143 Private method to resize the list columns.
144 """
145 self.languageOverrideWidget.header().resizeSections(
146 QHeaderView.ResizeToContents)
147 self.languageOverrideWidget.header().setStretchLastSection(True)
148
149 def __saveLanguageOverrides(self):
150 """
151 Private method to save the language specific indentation and tab width
152 overrides.
153 """
154 overrides = {}
155 for row in range(self.languageOverrideWidget.topLevelItemCount()):
156 itm = self.languageOverrideWidget.topLevelItem(row)
157 language = itm.text(0)
158 overrides[language] = [
159 int(itm.text(1)),
160 int(itm.text(2)),
161 ]
162
163 Preferences.setEditor("TabIndentOverride", overrides)
164
165 @pyqtSlot()
166 def on_languageOverrideWidget_itemSelectionChanged(self):
167 """
168 Private slot handling a change of the override selection.
169 """
170 self.deleteButton.setEnabled(
171 len(self.languageOverrideWidget.selectedItems()) > 0)
172 self.editButton.setEnabled(
173 len(self.languageOverrideWidget.selectedItems()) == 1)
174
175 @pyqtSlot()
176 def on_addButton_clicked(self):
177 """
178 Private slot to add a new override entry.
179 """
180 import QScintilla.Lexers
181 languages = list(
182 QScintilla.Lexers.getSupportedLanguages().keys())
183 for row in range(self.languageOverrideWidget.topLevelItemCount()):
184 itm = self.languageOverrideWidget.topLevelItem(row)
185 language = itm.text(0)
186 if language in languages:
187 languages.remove(language)
188 dlg = EditorLanguageTabIndentOverrideDialog(
189 editMode=False,
190 languages=languages,
191 tabWidth=self.tabwidthSlider.value(),
192 indentWidth=self.indentwidthSlider.value(),
193 )
194 if dlg.exec_() == QDialog.Accepted:
195 language, tabWidth, indentWidth = dlg.getData()
196 self.__createOverrideItem(language, tabWidth, indentWidth)
197 self.languageOverrideWidget.sortItems(0, Qt.AscendingOrder)
198 self.__resizeOverrideColumns()
199
200 @pyqtSlot()
201 def on_deleteButton_clicked(self):
202 """
203 Private slot to delete the selected override entries.
204 """
205 ok = E5MessageBox.yesNo(
206 self,
207 self.tr("Tab and Indent Override"),
208 self.tr("""Shall the selected entries really be removed?"""))
209 if ok:
210 for itm in self.languageOverrideWidget.selectedItems():
211 index = self.languageOverrideWidget.indexOfTopLevelItem(itm)
212 self.languageOverrideWidget.takeTopLevelItem(index)
213 del itm
214
215 @pyqtSlot()
216 def on_editButton_clicked(self):
217 """
218 Private slot to edit the selected override entry.
219 """
220 itm = self.languageOverrideWidget.selectedItems()[0]
221 dlg = EditorLanguageTabIndentOverrideDialog(
222 editMode=True,
223 languages=[itm.text(0)],
224 tabWidth=int(itm.text(1)),
225 indentWidth=int(itm.text(2)),
226 )
227 if dlg.exec_() == QDialog.Accepted:
228 language, tabWidth, indentWidth = dlg.getData()
229 itm.setText(1, "{0:2d}".format(tabWidth))
230 itm.setText(2, "{0:2d}".format(indentWidth))
231
96 232
97 def create(dlg): 233 def create(dlg):
98 """ 234 """
99 Module function to create the configuration page. 235 Module function to create the configuration page.
100 236

eric ide

mercurial