--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/eric7/Plugins/WizardPlugins/InputDialogWizard/InputDialogWizardDialog.py Sun Jul 24 11:29:56 2022 +0200 @@ -0,0 +1,278 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2003 - 2022 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing the input dialog wizard dialog. +""" + +import os + +from PyQt6.QtCore import pyqtSlot +from PyQt6.QtGui import QDoubleValidator +from PyQt6.QtWidgets import QLineEdit, QDialog, QInputDialog, QDialogButtonBox + +from .Ui_InputDialogWizardDialog import Ui_InputDialogWizardDialog + + +class InputDialogWizardDialog(QDialog, Ui_InputDialogWizardDialog): + """ + Class implementing the input dialog wizard dialog. + + It displays a dialog for entering the parameters + for the QInputDialog code generator. + """ + + def __init__(self, parent=None): + """ + Constructor + + @param parent parent widget (QWidget) + """ + super().__init__(parent) + self.setupUi(self) + + # set the validators for the double line edits + self.eDoubleDefault.setValidator( + QDoubleValidator(-2147483647, 2147483647, 99, self.eDoubleDefault) + ) + self.eDoubleFrom.setValidator( + QDoubleValidator(-2147483647, 2147483647, 99, self.eDoubleFrom) + ) + self.eDoubleTo.setValidator( + QDoubleValidator(-2147483647, 2147483647, 99, self.eDoubleTo) + ) + + self.rText.toggled.connect(self.__typeSelectButtonToggled) + self.rMultiLineText.toggled.connect(self.__typeSelectButtonToggled) + self.rInteger.toggled.connect(self.__typeSelectButtonToggled) + self.rDouble.toggled.connect(self.__typeSelectButtonToggled) + self.rItem.toggled.connect(self.__typeSelectButtonToggled) + + self.bTest = self.buttonBox.addButton( + self.tr("Test"), QDialogButtonBox.ButtonRole.ActionRole + ) + + # simulate a dialog type selection + self.__typeSelectButtonToggled(True) + + msh = self.minimumSizeHint() + self.resize(max(self.width(), msh.width()), msh.height()) + + @pyqtSlot(bool) + def __typeSelectButtonToggled(self, checked): + """ + Private slot to modify the dialog according to the selected type. + + Note: This is a multiplexed slot. Therefore it just reacts upon a + positive check state (i.e. checked == True). + + @param checked flag indicating the checked state + @type bool + """ + self.bTest.setEnabled(True) + if checked: + if self.rText.isChecked(): + self.specificsStack.setCurrentWidget(self.textPage) + elif self.rMultiLineText.isChecked(): + self.specificsStack.setCurrentWidget(self.multiLineTextPage) + elif self.rInteger.isChecked(): + self.specificsStack.setCurrentWidget(self.integerPage) + elif self.rDouble.isChecked(): + self.specificsStack.setCurrentWidget(self.doublePage) + elif self.rItem.isChecked(): + self.specificsStack.setCurrentWidget(self.itemPage) + self.bTest.setEnabled(False) + + def on_buttonBox_clicked(self, button): + """ + Private slot called by a button of the button box clicked. + + @param button button that was clicked (QAbstractButton) + """ + if button == self.bTest: + self.on_bTest_clicked() + + @pyqtSlot() + def on_bTest_clicked(self): + """ + Private method to test the selected options. + """ + if self.rText.isChecked(): + if self.rEchoNormal.isChecked(): + echomode = QLineEdit.EchoMode.Normal + elif self.rEchoNoEcho.isChecked(): + echomode = QLineEdit.EchoMode.NoEcho + else: + echomode = QLineEdit.EchoMode.Password + QInputDialog.getText( + None, + self.eCaption.text(), + self.eLabel.text(), + echomode, + self.eTextDefault.text(), + ) + elif self.rMultiLineText.isChecked(): + QInputDialog.getMultiLineText( + None, + self.eCaption.text(), + self.eLabel.text(), + self.eMultiTextDefault.toPlainText(), + ) + elif self.rInteger.isChecked(): + QInputDialog.getInt( + None, + self.eCaption.text(), + self.eLabel.text(), + self.sIntDefault.value(), + self.sIntFrom.value(), + self.sIntTo.value(), + self.sIntStep.value(), + ) + elif self.rDouble.isChecked(): + try: + doubleDefault = float(self.eDoubleDefault.text()) + except ValueError: + doubleDefault = 0 + try: + doubleFrom = float(self.eDoubleFrom.text()) + except ValueError: + doubleFrom = -2147483647 + try: + doubleTo = float(self.eDoubleTo.text()) + except ValueError: + doubleTo = 2147483647 + QInputDialog.getDouble( + None, + self.eCaption.text(), + self.eLabel.text(), + doubleDefault, + doubleFrom, + doubleTo, + self.sDoubleDecimals.value(), + ) + + def getCode(self, indLevel, indString): + """ + Public method to get the source code for Qt6. + + @param indLevel indentation level (int) + @param indString string used for indentation (space or tab) (string) + @return generated code (string) + """ + # calculate our indentation level and the indentation string + il = indLevel + 1 + istring = il * indString + estring = os.linesep + indLevel * indString + + # now generate the code + if self.parentSelf.isChecked(): + parent = "self" + elif self.parentNone.isChecked(): + parent = "None" + elif self.parentOther.isChecked(): + parent = self.parentEdit.text() + if parent == "": + parent = "None" + + resvar = self.eResultVar.text() + if not resvar: + resvar = "result" + code = "{0}, ok = QInputDialog.".format(resvar) + if self.rText.isChecked(): + code += "getText({0}{1}".format(os.linesep, istring) + code += "{0},{1}{2}".format(parent, os.linesep, istring) + code += 'self.tr("{0}"),{1}{2}'.format( + self.eCaption.text(), os.linesep, istring + ) + code += 'self.tr("{0}"),{1}{2}'.format( + self.eLabel.text(), os.linesep, istring + ) + if self.rEchoNormal.isChecked(): + code += "QLineEdit.EchoMode.Normal" + elif self.rEchoNoEcho.isChecked(): + code += "QLineEdit.EchoMode.NoEcho" + else: + code += "QLineEdit.EchoMode.Password" + if self.eTextDefault.text(): + if self.cTranslateTextDefault.isChecked(): + code += ',{0}{1}self.tr("{2}")'.format( + os.linesep, istring, self.eTextDefault.text() + ) + else: + code += ',{0}{1}"{2}"'.format( + os.linesep, istring, self.eTextDefault.text() + ) + code += "{0}){0}".format(estring) + elif self.rMultiLineText.isChecked(): + code += "getMultiLineText({0}{1}".format(os.linesep, istring) + code += "{0},{1}{2}".format(parent, os.linesep, istring) + code += 'self.tr("{0}"),{1}{2}'.format( + self.eCaption.text(), os.linesep, istring + ) + code += 'self.tr("{0}")'.format(self.eLabel.text()) + if self.eMultiTextDefault.toPlainText(): + defTxt = "\\n".join(self.eMultiTextDefault.toPlainText().splitlines()) + if self.cTranslateMultiTextDefault.isChecked(): + code += ',{0}{1}self.tr("{2}")'.format(os.linesep, istring, defTxt) + else: + code += ',{0}{1}"{2}"'.format(os.linesep, istring, defTxt) + code += "{0}){0}".format(estring) + elif self.rInteger.isChecked(): + code += "getInt({0}{1}".format(os.linesep, istring) + code += "{0},{1}{2}".format(parent, os.linesep, istring) + code += 'self.tr("{0}"),{1}{2}'.format( + self.eCaption.text(), os.linesep, istring + ) + code += 'self.tr("{0}"),{1}{2}'.format( + self.eLabel.text(), os.linesep, istring + ) + code += "{0:d}, {1:d}, {2:d}, {3:d}".format( + self.sIntDefault.value(), + self.sIntFrom.value(), + self.sIntTo.value(), + self.sIntStep.value(), + ) + code += "{0}){0}".format(estring) + elif self.rDouble.isChecked(): + try: + doubleDefault = float(self.eDoubleDefault.text()) + except ValueError: + doubleDefault = 0 + try: + doubleFrom = float(self.eDoubleFrom.text()) + except ValueError: + doubleFrom = -2147483647 + try: + doubleTo = float(self.eDoubleTo.text()) + except ValueError: + doubleTo = 2147483647 + code += "getDouble({0}{1}".format(os.linesep, istring) + code += "{0},{1}{2}".format(parent, os.linesep, istring) + code += 'self.tr("{0}"),{1}{2}'.format( + self.eCaption.text(), os.linesep, istring + ) + code += 'self.tr("{0}"),{1}{2}'.format( + self.eLabel.text(), os.linesep, istring + ) + code += "{0}, {1}, {2}, {3:d}".format( + doubleDefault, doubleFrom, doubleTo, self.sDoubleDecimals.value() + ) + code += "{0}){0}".format(estring) + elif self.rItem.isChecked(): + code += "getItem({0}{1}".format(os.linesep, istring) + code += "{0},{1}{2}".format(parent, os.linesep, istring) + code += 'self.tr("{0}"),{1}{2}'.format( + self.eCaption.text(), os.linesep, istring + ) + code += 'self.tr("{0}"),{1}{2}'.format( + self.eLabel.text(), os.linesep, istring + ) + code += "{0},{1}{2}".format(self.eVariable.text(), os.linesep, istring) + code += "{0:d}, {1}".format( + self.sCurrentItem.value(), self.cEditable.isChecked() + ) + code += "{0}){0}".format(estring) + + return code