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