eric7/Preferences/ConfigurationPages/EditorGeneralPage.py

branch
eric7
changeset 8312
800c432b34c8
parent 8218
7c09585bd960
child 8318
962bce857696
equal deleted inserted replaced
8311:4e8b98454baa 8312:800c432b34c8
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2006 - 2021 Detlev Offenbach <detlev@die-offenbachs.de>
4 #
5
6 """
7 Module implementing the Editor General configuration page.
8 """
9
10 from PyQt5.QtCore import pyqtSlot, Qt
11 from PyQt5.QtWidgets import QTreeWidgetItem, QHeaderView, QDialog
12 from PyQt5.Qsci import QsciScintillaBase
13
14 from E5Gui import E5MessageBox
15
16 from .ConfigurationPageBase import ConfigurationPageBase
17 from .Ui_EditorGeneralPage import Ui_EditorGeneralPage
18 from .EditorLanguageTabIndentOverrideDialog import (
19 EditorLanguageTabIndentOverrideDialog
20 )
21
22 from QScintilla.DocstringGenerator import getSupportedDocstringTypes
23
24 import Preferences
25 import UI.PixmapCache
26
27
28 class EditorGeneralPage(ConfigurationPageBase, Ui_EditorGeneralPage):
29 """
30 Class implementing the Editor General configuration page.
31 """
32 def __init__(self):
33 """
34 Constructor
35 """
36 super().__init__()
37 self.setupUi(self)
38 self.setObjectName("EditorGeneralPage")
39
40 self.addButton.setIcon(UI.PixmapCache.getIcon("plus"))
41 self.deleteButton.setIcon(UI.PixmapCache.getIcon("minus"))
42 self.editButton.setIcon(UI.PixmapCache.getIcon("edit"))
43
44 for docstringType, docstringStyle in sorted(
45 getSupportedDocstringTypes()
46 ):
47 self.docstringStyleComboBox.addItem(docstringStyle, docstringType)
48
49 # set initial values
50 self.tabwidthSlider.setValue(
51 Preferences.getEditor("TabWidth"))
52 self.indentwidthSlider.setValue(
53 Preferences.getEditor("IndentWidth"))
54 self.tabforindentationCheckBox.setChecked(
55 Preferences.getEditor("TabForIndentation"))
56 self.tabindentsCheckBox.setChecked(
57 Preferences.getEditor("TabIndents"))
58 self.converttabsCheckBox.setChecked(
59 Preferences.getEditor("ConvertTabsOnLoad"))
60 self.autoindentCheckBox.setChecked(
61 Preferences.getEditor("AutoIndentation"))
62 self.comment0CheckBox.setChecked(
63 Preferences.getEditor("CommentColumn0"))
64
65 self.sourceOutlineGroupBox.setChecked(
66 Preferences.getEditor("ShowSourceOutline"))
67 self.sourceOutlineWidthSpinBox.setValue(
68 Preferences.getEditor("SourceOutlineWidth"))
69 self.sourceOutlineWidthStepSpinBox.setValue(
70 Preferences.getEditor("SourceOutlineStepSize"))
71 self.sourceOutlineShowCodingCheckBox.setChecked(
72 Preferences.getEditor("SourceOutlineShowCoding"))
73
74 index = self.docstringStyleComboBox.findData(
75 Preferences.getEditor("DocstringType"))
76 self.docstringStyleComboBox.setCurrentIndex(index)
77 self.docstringCompletionCheckBox.setChecked(
78 Preferences.getEditor("DocstringAutoGenerate"))
79
80 virtualSpaceOptions = Preferences.getEditor("VirtualSpaceOptions")
81 self.vsSelectionCheckBox.setChecked(
82 virtualSpaceOptions & QsciScintillaBase.SCVS_RECTANGULARSELECTION)
83 self.vsUserCheckBox.setChecked(
84 virtualSpaceOptions & QsciScintillaBase.SCVS_USERACCESSIBLE)
85
86 self.__populateLanguageOverrideWidget()
87
88 def save(self):
89 """
90 Public slot to save the Editor General configuration.
91 """
92 Preferences.setEditor(
93 "TabWidth",
94 self.tabwidthSlider.value())
95 Preferences.setEditor(
96 "IndentWidth",
97 self.indentwidthSlider.value())
98 Preferences.setEditor(
99 "TabForIndentation",
100 self.tabforindentationCheckBox.isChecked())
101 Preferences.setEditor(
102 "TabIndents",
103 self.tabindentsCheckBox.isChecked())
104 Preferences.setEditor(
105 "ConvertTabsOnLoad",
106 self.converttabsCheckBox.isChecked())
107 Preferences.setEditor(
108 "AutoIndentation",
109 self.autoindentCheckBox.isChecked())
110 Preferences.setEditor(
111 "CommentColumn0",
112 self.comment0CheckBox.isChecked())
113
114 Preferences.setEditor(
115 "ShowSourceOutline",
116 self.sourceOutlineGroupBox.isChecked())
117 Preferences.setEditor(
118 "SourceOutlineWidth",
119 self.sourceOutlineWidthSpinBox.value())
120 Preferences.setEditor(
121 "SourceOutlineStepSize",
122 self.sourceOutlineWidthStepSpinBox.value())
123 Preferences.setEditor(
124 "SourceOutlineShowCoding",
125 self.sourceOutlineShowCodingCheckBox.isChecked())
126
127 Preferences.setEditor(
128 "DocstringType",
129 self.docstringStyleComboBox.currentData())
130 Preferences.setEditor(
131 "DocstringAutoGenerate",
132 self.docstringCompletionCheckBox.isChecked())
133
134 virtualSpaceOptions = QsciScintillaBase.SCVS_NONE
135 if self.vsSelectionCheckBox.isChecked():
136 virtualSpaceOptions |= QsciScintillaBase.SCVS_RECTANGULARSELECTION
137 if self.vsUserCheckBox.isChecked():
138 virtualSpaceOptions |= QsciScintillaBase.SCVS_USERACCESSIBLE
139 Preferences.setEditor("VirtualSpaceOptions", virtualSpaceOptions)
140
141 self.__saveLanguageOverrides()
142
143 def on_tabforindentationCheckBox_toggled(self, checked):
144 """
145 Private slot used to set the tab conversion check box.
146
147 @param checked flag received from the signal (boolean)
148 """
149 if checked and self.converttabsCheckBox.isChecked():
150 self.converttabsCheckBox.setChecked(not checked)
151 self.converttabsCheckBox.setEnabled(not checked)
152
153 def __populateLanguageOverrideWidget(self):
154 """
155 Private method to populate the language specific indentation and tab
156 width override widget.
157 """
158 overrides = Preferences.getEditor("TabIndentOverride")
159 for language, (tabWidth, indentWidth) in overrides.items():
160 self.__createOverrideItem(language, tabWidth, indentWidth)
161 self.languageOverrideWidget.sortItems(0, Qt.SortOrder.AscendingOrder)
162 self.__resizeOverrideColumns()
163 self.on_languageOverrideWidget_itemSelectionChanged()
164
165 def __createOverrideItem(self, language, tabWidth, indentWidth):
166 """
167 Private method to create an entry for a language override.
168
169 @param language name of the language
170 @type str
171 @param tabWidth tabulator width
172 @type int
173 @param indentWidth indentation width
174 @type int
175 """
176 itm = QTreeWidgetItem(self.languageOverrideWidget, [
177 language,
178 "{0:2d}".format(tabWidth),
179 "{0:2d}".format(indentWidth)])
180 itm.setTextAlignment(1, Qt.AlignmentFlag.AlignHCenter)
181 itm.setTextAlignment(2, Qt.AlignmentFlag.AlignHCenter)
182
183 def __resizeOverrideColumns(self):
184 """
185 Private method to resize the list columns.
186 """
187 self.languageOverrideWidget.header().resizeSections(
188 QHeaderView.ResizeMode.ResizeToContents)
189 self.languageOverrideWidget.header().setStretchLastSection(True)
190
191 def __saveLanguageOverrides(self):
192 """
193 Private method to save the language specific indentation and tab width
194 overrides.
195 """
196 overrides = {}
197 for row in range(self.languageOverrideWidget.topLevelItemCount()):
198 itm = self.languageOverrideWidget.topLevelItem(row)
199 language = itm.text(0)
200 overrides[language] = [
201 int(itm.text(1)),
202 int(itm.text(2)),
203 ]
204
205 Preferences.setEditor("TabIndentOverride", overrides)
206
207 @pyqtSlot()
208 def on_languageOverrideWidget_itemSelectionChanged(self):
209 """
210 Private slot handling a change of the override selection.
211 """
212 self.deleteButton.setEnabled(
213 len(self.languageOverrideWidget.selectedItems()) > 0)
214 self.editButton.setEnabled(
215 len(self.languageOverrideWidget.selectedItems()) == 1)
216
217 @pyqtSlot()
218 def on_addButton_clicked(self):
219 """
220 Private slot to add a new override entry.
221 """
222 languages = []
223 for row in range(self.languageOverrideWidget.topLevelItemCount()):
224 itm = self.languageOverrideWidget.topLevelItem(row)
225 languages.append(itm.text(0))
226 dlg = EditorLanguageTabIndentOverrideDialog(
227 editMode=False,
228 languages=languages,
229 tabWidth=self.tabwidthSlider.value(),
230 indentWidth=self.indentwidthSlider.value(),
231 )
232 if dlg.exec() == QDialog.DialogCode.Accepted:
233 language, tabWidth, indentWidth = dlg.getData()
234 self.__createOverrideItem(language, tabWidth, indentWidth)
235 self.languageOverrideWidget.sortItems(
236 0, Qt.SortOrder.AscendingOrder)
237 self.__resizeOverrideColumns()
238
239 @pyqtSlot()
240 def on_deleteButton_clicked(self):
241 """
242 Private slot to delete the selected override entries.
243 """
244 ok = E5MessageBox.yesNo(
245 self,
246 self.tr("Tab and Indent Override"),
247 self.tr("""Shall the selected entries really be removed?"""))
248 if ok:
249 for itm in self.languageOverrideWidget.selectedItems():
250 index = self.languageOverrideWidget.indexOfTopLevelItem(itm)
251 self.languageOverrideWidget.takeTopLevelItem(index)
252 del itm
253
254 @pyqtSlot()
255 def on_editButton_clicked(self):
256 """
257 Private slot to edit the selected override entry.
258 """
259 itm = self.languageOverrideWidget.selectedItems()[0]
260 dlg = EditorLanguageTabIndentOverrideDialog(
261 editMode=True,
262 languages=[itm.text(0)],
263 tabWidth=int(itm.text(1)),
264 indentWidth=int(itm.text(2)),
265 )
266 if dlg.exec() == QDialog.DialogCode.Accepted:
267 language, tabWidth, indentWidth = dlg.getData()
268 itm.setText(1, "{0:2d}".format(tabWidth))
269 itm.setText(2, "{0:2d}".format(indentWidth))
270
271
272 def create(dlg):
273 """
274 Module function to create the configuration page.
275
276 @param dlg reference to the configuration dialog
277 @return reference to the instantiated page (ConfigurationPageBase)
278 """
279 page = EditorGeneralPage()
280 return page

eric ide

mercurial