src/eric7/Preferences/ConfigurationPages/EditorGeneralPage.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) 2006 - 2022 Detlev Offenbach <detlev@die-offenbachs.de>
4 #
5
6 """
7 Module implementing the Editor General configuration page.
8 """
9
10 from PyQt6.QtCore import pyqtSlot, Qt
11 from PyQt6.QtWidgets import QTreeWidgetItem, QHeaderView, QDialog
12 from PyQt6.Qsci import QsciScintillaBase
13
14 from EricWidgets import EricMessageBox
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 self.mouseHoverHelpGroupBox.setChecked(
81 Preferences.getEditor("MouseHoverHelp"))
82 self.mouseDwellTimeSpinBox.setValue(
83 Preferences.getEditor("MouseHoverTimeout"))
84
85 virtualSpaceOptions = Preferences.getEditor("VirtualSpaceOptions")
86 self.vsSelectionCheckBox.setChecked(
87 virtualSpaceOptions & QsciScintillaBase.SCVS_RECTANGULARSELECTION)
88 self.vsUserCheckBox.setChecked(
89 virtualSpaceOptions & QsciScintillaBase.SCVS_USERACCESSIBLE)
90
91 self.__populateLanguageOverrideWidget()
92
93 def save(self):
94 """
95 Public slot to save the Editor General configuration.
96 """
97 Preferences.setEditor(
98 "TabWidth",
99 self.tabwidthSlider.value())
100 Preferences.setEditor(
101 "IndentWidth",
102 self.indentwidthSlider.value())
103 Preferences.setEditor(
104 "TabForIndentation",
105 self.tabforindentationCheckBox.isChecked())
106 Preferences.setEditor(
107 "TabIndents",
108 self.tabindentsCheckBox.isChecked())
109 Preferences.setEditor(
110 "ConvertTabsOnLoad",
111 self.converttabsCheckBox.isChecked())
112 Preferences.setEditor(
113 "AutoIndentation",
114 self.autoindentCheckBox.isChecked())
115 Preferences.setEditor(
116 "CommentColumn0",
117 self.comment0CheckBox.isChecked())
118
119 Preferences.setEditor(
120 "ShowSourceOutline",
121 self.sourceOutlineGroupBox.isChecked())
122 Preferences.setEditor(
123 "SourceOutlineWidth",
124 self.sourceOutlineWidthSpinBox.value())
125 Preferences.setEditor(
126 "SourceOutlineStepSize",
127 self.sourceOutlineWidthStepSpinBox.value())
128 Preferences.setEditor(
129 "SourceOutlineShowCoding",
130 self.sourceOutlineShowCodingCheckBox.isChecked())
131
132 Preferences.setEditor(
133 "DocstringType",
134 self.docstringStyleComboBox.currentData())
135 Preferences.setEditor(
136 "DocstringAutoGenerate",
137 self.docstringCompletionCheckBox.isChecked())
138
139 Preferences.setEditor(
140 "MouseHoverHelp",
141 self.mouseHoverHelpGroupBox.isChecked())
142 Preferences.setEditor(
143 "MouseHoverTimeout",
144 self.mouseDwellTimeSpinBox.value())
145
146 virtualSpaceOptions = QsciScintillaBase.SCVS_NONE
147 if self.vsSelectionCheckBox.isChecked():
148 virtualSpaceOptions |= QsciScintillaBase.SCVS_RECTANGULARSELECTION
149 if self.vsUserCheckBox.isChecked():
150 virtualSpaceOptions |= QsciScintillaBase.SCVS_USERACCESSIBLE
151 Preferences.setEditor("VirtualSpaceOptions", virtualSpaceOptions)
152
153 self.__saveLanguageOverrides()
154
155 def on_tabforindentationCheckBox_toggled(self, checked):
156 """
157 Private slot used to set the tab conversion check box.
158
159 @param checked flag received from the signal (boolean)
160 """
161 if checked and self.converttabsCheckBox.isChecked():
162 self.converttabsCheckBox.setChecked(not checked)
163 self.converttabsCheckBox.setEnabled(not checked)
164
165 def __populateLanguageOverrideWidget(self):
166 """
167 Private method to populate the language specific indentation and tab
168 width override widget.
169 """
170 overrides = Preferences.getEditor("TabIndentOverride")
171 for language, (tabWidth, indentWidth) in overrides.items():
172 self.__createOverrideItem(language, tabWidth, indentWidth)
173 self.languageOverrideWidget.sortItems(0, Qt.SortOrder.AscendingOrder)
174 self.__resizeOverrideColumns()
175 self.on_languageOverrideWidget_itemSelectionChanged()
176
177 def __createOverrideItem(self, language, tabWidth, indentWidth):
178 """
179 Private method to create an entry for a language override.
180
181 @param language name of the language
182 @type str
183 @param tabWidth tabulator width
184 @type int
185 @param indentWidth indentation width
186 @type int
187 """
188 itm = QTreeWidgetItem(self.languageOverrideWidget, [
189 language,
190 "{0:2d}".format(tabWidth),
191 "{0:2d}".format(indentWidth)])
192 itm.setTextAlignment(1, Qt.AlignmentFlag.AlignHCenter)
193 itm.setTextAlignment(2, Qt.AlignmentFlag.AlignHCenter)
194
195 def __resizeOverrideColumns(self):
196 """
197 Private method to resize the list columns.
198 """
199 self.languageOverrideWidget.header().resizeSections(
200 QHeaderView.ResizeMode.ResizeToContents)
201 self.languageOverrideWidget.header().setStretchLastSection(True)
202
203 def __saveLanguageOverrides(self):
204 """
205 Private method to save the language specific indentation and tab width
206 overrides.
207 """
208 overrides = {}
209 for row in range(self.languageOverrideWidget.topLevelItemCount()):
210 itm = self.languageOverrideWidget.topLevelItem(row)
211 language = itm.text(0)
212 overrides[language] = [
213 int(itm.text(1)),
214 int(itm.text(2)),
215 ]
216
217 Preferences.setEditor("TabIndentOverride", overrides)
218
219 @pyqtSlot()
220 def on_languageOverrideWidget_itemSelectionChanged(self):
221 """
222 Private slot handling a change of the override selection.
223 """
224 self.deleteButton.setEnabled(
225 len(self.languageOverrideWidget.selectedItems()) > 0)
226 self.editButton.setEnabled(
227 len(self.languageOverrideWidget.selectedItems()) == 1)
228
229 @pyqtSlot()
230 def on_addButton_clicked(self):
231 """
232 Private slot to add a new override entry.
233 """
234 languages = []
235 for row in range(self.languageOverrideWidget.topLevelItemCount()):
236 itm = self.languageOverrideWidget.topLevelItem(row)
237 languages.append(itm.text(0))
238 dlg = EditorLanguageTabIndentOverrideDialog(
239 editMode=False,
240 languages=languages,
241 tabWidth=self.tabwidthSlider.value(),
242 indentWidth=self.indentwidthSlider.value(),
243 )
244 if dlg.exec() == QDialog.DialogCode.Accepted:
245 language, tabWidth, indentWidth = dlg.getData()
246 self.__createOverrideItem(language, tabWidth, indentWidth)
247 self.languageOverrideWidget.sortItems(
248 0, Qt.SortOrder.AscendingOrder)
249 self.__resizeOverrideColumns()
250
251 @pyqtSlot()
252 def on_deleteButton_clicked(self):
253 """
254 Private slot to delete the selected override entries.
255 """
256 ok = EricMessageBox.yesNo(
257 self,
258 self.tr("Tab and Indent Override"),
259 self.tr("""Shall the selected entries really be removed?"""))
260 if ok:
261 for itm in self.languageOverrideWidget.selectedItems():
262 index = self.languageOverrideWidget.indexOfTopLevelItem(itm)
263 self.languageOverrideWidget.takeTopLevelItem(index)
264 del itm
265
266 @pyqtSlot()
267 def on_editButton_clicked(self):
268 """
269 Private slot to edit the selected override entry.
270 """
271 itm = self.languageOverrideWidget.selectedItems()[0]
272 dlg = EditorLanguageTabIndentOverrideDialog(
273 editMode=True,
274 languages=[itm.text(0)],
275 tabWidth=int(itm.text(1)),
276 indentWidth=int(itm.text(2)),
277 )
278 if dlg.exec() == QDialog.DialogCode.Accepted:
279 language, tabWidth, indentWidth = dlg.getData()
280 itm.setText(1, "{0:2d}".format(tabWidth))
281 itm.setText(2, "{0:2d}".format(indentWidth))
282
283
284 def create(dlg):
285 """
286 Module function to create the configuration page.
287
288 @param dlg reference to the configuration dialog
289 @return reference to the instantiated page (ConfigurationPageBase)
290 """
291 page = EditorGeneralPage()
292 return page

eric ide

mercurial