|
1 # -*- coding: utf-8 -*- |
|
2 |
|
3 # Copyright (c) 2003 - 2022 Detlev Offenbach <detlev@die-offenbachs.de> |
|
4 # |
|
5 |
|
6 """ |
|
7 Module implementing the input dialog wizard dialog. |
|
8 """ |
|
9 |
|
10 import os |
|
11 |
|
12 from PyQt6.QtCore import pyqtSlot |
|
13 from PyQt6.QtGui import QDoubleValidator |
|
14 from PyQt6.QtWidgets import QLineEdit, QDialog, QInputDialog, QDialogButtonBox |
|
15 |
|
16 from .Ui_InputDialogWizardDialog import Ui_InputDialogWizardDialog |
|
17 |
|
18 |
|
19 class InputDialogWizardDialog(QDialog, Ui_InputDialogWizardDialog): |
|
20 """ |
|
21 Class implementing the input dialog wizard dialog. |
|
22 |
|
23 It displays a dialog for entering the parameters |
|
24 for the QInputDialog code generator. |
|
25 """ |
|
26 |
|
27 def __init__(self, parent=None): |
|
28 """ |
|
29 Constructor |
|
30 |
|
31 @param parent parent widget (QWidget) |
|
32 """ |
|
33 super().__init__(parent) |
|
34 self.setupUi(self) |
|
35 |
|
36 # set the validators for the double line edits |
|
37 self.eDoubleDefault.setValidator( |
|
38 QDoubleValidator(-2147483647, 2147483647, 99, self.eDoubleDefault) |
|
39 ) |
|
40 self.eDoubleFrom.setValidator( |
|
41 QDoubleValidator(-2147483647, 2147483647, 99, self.eDoubleFrom) |
|
42 ) |
|
43 self.eDoubleTo.setValidator( |
|
44 QDoubleValidator(-2147483647, 2147483647, 99, self.eDoubleTo) |
|
45 ) |
|
46 |
|
47 self.rText.toggled.connect(self.__typeSelectButtonToggled) |
|
48 self.rMultiLineText.toggled.connect(self.__typeSelectButtonToggled) |
|
49 self.rInteger.toggled.connect(self.__typeSelectButtonToggled) |
|
50 self.rDouble.toggled.connect(self.__typeSelectButtonToggled) |
|
51 self.rItem.toggled.connect(self.__typeSelectButtonToggled) |
|
52 |
|
53 self.bTest = self.buttonBox.addButton( |
|
54 self.tr("Test"), QDialogButtonBox.ButtonRole.ActionRole |
|
55 ) |
|
56 |
|
57 # simulate a dialog type selection |
|
58 self.__typeSelectButtonToggled(True) |
|
59 |
|
60 msh = self.minimumSizeHint() |
|
61 self.resize(max(self.width(), msh.width()), msh.height()) |
|
62 |
|
63 @pyqtSlot(bool) |
|
64 def __typeSelectButtonToggled(self, checked): |
|
65 """ |
|
66 Private slot to modify the dialog according to the selected type. |
|
67 |
|
68 Note: This is a multiplexed slot. Therefore it just reacts upon a |
|
69 positive check state (i.e. checked == True). |
|
70 |
|
71 @param checked flag indicating the checked state |
|
72 @type bool |
|
73 """ |
|
74 self.bTest.setEnabled(True) |
|
75 if checked: |
|
76 if self.rText.isChecked(): |
|
77 self.specificsStack.setCurrentWidget(self.textPage) |
|
78 elif self.rMultiLineText.isChecked(): |
|
79 self.specificsStack.setCurrentWidget(self.multiLineTextPage) |
|
80 elif self.rInteger.isChecked(): |
|
81 self.specificsStack.setCurrentWidget(self.integerPage) |
|
82 elif self.rDouble.isChecked(): |
|
83 self.specificsStack.setCurrentWidget(self.doublePage) |
|
84 elif self.rItem.isChecked(): |
|
85 self.specificsStack.setCurrentWidget(self.itemPage) |
|
86 self.bTest.setEnabled(False) |
|
87 |
|
88 def on_buttonBox_clicked(self, button): |
|
89 """ |
|
90 Private slot called by a button of the button box clicked. |
|
91 |
|
92 @param button button that was clicked (QAbstractButton) |
|
93 """ |
|
94 if button == self.bTest: |
|
95 self.on_bTest_clicked() |
|
96 |
|
97 @pyqtSlot() |
|
98 def on_bTest_clicked(self): |
|
99 """ |
|
100 Private method to test the selected options. |
|
101 """ |
|
102 if self.rText.isChecked(): |
|
103 if self.rEchoNormal.isChecked(): |
|
104 echomode = QLineEdit.EchoMode.Normal |
|
105 elif self.rEchoNoEcho.isChecked(): |
|
106 echomode = QLineEdit.EchoMode.NoEcho |
|
107 else: |
|
108 echomode = QLineEdit.EchoMode.Password |
|
109 QInputDialog.getText( |
|
110 None, |
|
111 self.eCaption.text(), |
|
112 self.eLabel.text(), |
|
113 echomode, |
|
114 self.eTextDefault.text(), |
|
115 ) |
|
116 elif self.rMultiLineText.isChecked(): |
|
117 QInputDialog.getMultiLineText( |
|
118 None, |
|
119 self.eCaption.text(), |
|
120 self.eLabel.text(), |
|
121 self.eMultiTextDefault.toPlainText(), |
|
122 ) |
|
123 elif self.rInteger.isChecked(): |
|
124 QInputDialog.getInt( |
|
125 None, |
|
126 self.eCaption.text(), |
|
127 self.eLabel.text(), |
|
128 self.sIntDefault.value(), |
|
129 self.sIntFrom.value(), |
|
130 self.sIntTo.value(), |
|
131 self.sIntStep.value(), |
|
132 ) |
|
133 elif self.rDouble.isChecked(): |
|
134 try: |
|
135 doubleDefault = float(self.eDoubleDefault.text()) |
|
136 except ValueError: |
|
137 doubleDefault = 0 |
|
138 try: |
|
139 doubleFrom = float(self.eDoubleFrom.text()) |
|
140 except ValueError: |
|
141 doubleFrom = -2147483647 |
|
142 try: |
|
143 doubleTo = float(self.eDoubleTo.text()) |
|
144 except ValueError: |
|
145 doubleTo = 2147483647 |
|
146 QInputDialog.getDouble( |
|
147 None, |
|
148 self.eCaption.text(), |
|
149 self.eLabel.text(), |
|
150 doubleDefault, |
|
151 doubleFrom, |
|
152 doubleTo, |
|
153 self.sDoubleDecimals.value(), |
|
154 ) |
|
155 |
|
156 def getCode(self, indLevel, indString): |
|
157 """ |
|
158 Public method to get the source code for Qt6. |
|
159 |
|
160 @param indLevel indentation level (int) |
|
161 @param indString string used for indentation (space or tab) (string) |
|
162 @return generated code (string) |
|
163 """ |
|
164 # calculate our indentation level and the indentation string |
|
165 il = indLevel + 1 |
|
166 istring = il * indString |
|
167 estring = os.linesep + indLevel * indString |
|
168 |
|
169 # now generate the code |
|
170 if self.parentSelf.isChecked(): |
|
171 parent = "self" |
|
172 elif self.parentNone.isChecked(): |
|
173 parent = "None" |
|
174 elif self.parentOther.isChecked(): |
|
175 parent = self.parentEdit.text() |
|
176 if parent == "": |
|
177 parent = "None" |
|
178 |
|
179 resvar = self.eResultVar.text() |
|
180 if not resvar: |
|
181 resvar = "result" |
|
182 code = "{0}, ok = QInputDialog.".format(resvar) |
|
183 if self.rText.isChecked(): |
|
184 code += "getText({0}{1}".format(os.linesep, istring) |
|
185 code += "{0},{1}{2}".format(parent, os.linesep, istring) |
|
186 code += 'self.tr("{0}"),{1}{2}'.format( |
|
187 self.eCaption.text(), os.linesep, istring |
|
188 ) |
|
189 code += 'self.tr("{0}"),{1}{2}'.format( |
|
190 self.eLabel.text(), os.linesep, istring |
|
191 ) |
|
192 if self.rEchoNormal.isChecked(): |
|
193 code += "QLineEdit.EchoMode.Normal" |
|
194 elif self.rEchoNoEcho.isChecked(): |
|
195 code += "QLineEdit.EchoMode.NoEcho" |
|
196 else: |
|
197 code += "QLineEdit.EchoMode.Password" |
|
198 if self.eTextDefault.text(): |
|
199 if self.cTranslateTextDefault.isChecked(): |
|
200 code += ',{0}{1}self.tr("{2}")'.format( |
|
201 os.linesep, istring, self.eTextDefault.text() |
|
202 ) |
|
203 else: |
|
204 code += ',{0}{1}"{2}"'.format( |
|
205 os.linesep, istring, self.eTextDefault.text() |
|
206 ) |
|
207 code += "{0}){0}".format(estring) |
|
208 elif self.rMultiLineText.isChecked(): |
|
209 code += "getMultiLineText({0}{1}".format(os.linesep, istring) |
|
210 code += "{0},{1}{2}".format(parent, os.linesep, istring) |
|
211 code += 'self.tr("{0}"),{1}{2}'.format( |
|
212 self.eCaption.text(), os.linesep, istring |
|
213 ) |
|
214 code += 'self.tr("{0}")'.format(self.eLabel.text()) |
|
215 if self.eMultiTextDefault.toPlainText(): |
|
216 defTxt = "\\n".join(self.eMultiTextDefault.toPlainText().splitlines()) |
|
217 if self.cTranslateMultiTextDefault.isChecked(): |
|
218 code += ',{0}{1}self.tr("{2}")'.format(os.linesep, istring, defTxt) |
|
219 else: |
|
220 code += ',{0}{1}"{2}"'.format(os.linesep, istring, defTxt) |
|
221 code += "{0}){0}".format(estring) |
|
222 elif self.rInteger.isChecked(): |
|
223 code += "getInt({0}{1}".format(os.linesep, istring) |
|
224 code += "{0},{1}{2}".format(parent, os.linesep, istring) |
|
225 code += 'self.tr("{0}"),{1}{2}'.format( |
|
226 self.eCaption.text(), os.linesep, istring |
|
227 ) |
|
228 code += 'self.tr("{0}"),{1}{2}'.format( |
|
229 self.eLabel.text(), os.linesep, istring |
|
230 ) |
|
231 code += "{0:d}, {1:d}, {2:d}, {3:d}".format( |
|
232 self.sIntDefault.value(), |
|
233 self.sIntFrom.value(), |
|
234 self.sIntTo.value(), |
|
235 self.sIntStep.value(), |
|
236 ) |
|
237 code += "{0}){0}".format(estring) |
|
238 elif self.rDouble.isChecked(): |
|
239 try: |
|
240 doubleDefault = float(self.eDoubleDefault.text()) |
|
241 except ValueError: |
|
242 doubleDefault = 0 |
|
243 try: |
|
244 doubleFrom = float(self.eDoubleFrom.text()) |
|
245 except ValueError: |
|
246 doubleFrom = -2147483647 |
|
247 try: |
|
248 doubleTo = float(self.eDoubleTo.text()) |
|
249 except ValueError: |
|
250 doubleTo = 2147483647 |
|
251 code += "getDouble({0}{1}".format(os.linesep, istring) |
|
252 code += "{0},{1}{2}".format(parent, os.linesep, istring) |
|
253 code += 'self.tr("{0}"),{1}{2}'.format( |
|
254 self.eCaption.text(), os.linesep, istring |
|
255 ) |
|
256 code += 'self.tr("{0}"),{1}{2}'.format( |
|
257 self.eLabel.text(), os.linesep, istring |
|
258 ) |
|
259 code += "{0}, {1}, {2}, {3:d}".format( |
|
260 doubleDefault, doubleFrom, doubleTo, self.sDoubleDecimals.value() |
|
261 ) |
|
262 code += "{0}){0}".format(estring) |
|
263 elif self.rItem.isChecked(): |
|
264 code += "getItem({0}{1}".format(os.linesep, istring) |
|
265 code += "{0},{1}{2}".format(parent, os.linesep, istring) |
|
266 code += 'self.tr("{0}"),{1}{2}'.format( |
|
267 self.eCaption.text(), os.linesep, istring |
|
268 ) |
|
269 code += 'self.tr("{0}"),{1}{2}'.format( |
|
270 self.eLabel.text(), os.linesep, istring |
|
271 ) |
|
272 code += "{0},{1}{2}".format(self.eVariable.text(), os.linesep, istring) |
|
273 code += "{0:d}, {1}".format( |
|
274 self.sCurrentItem.value(), self.cEditable.isChecked() |
|
275 ) |
|
276 code += "{0}){0}".format(estring) |
|
277 |
|
278 return code |