コード例 #1
0
    def createButtonBox(self, cmd_fct):
        def clicked(button):
            command = button.text()
            specsheet = self.specsheet_dict[self.conjugate_type]
            if cmd_fct:
                try:
                    cmd_fct(self, command, specsheet)
                except:
                    QMessageBox.warning(
                        self, self.tr("Ray-Optics"),
                        self.tr("Please provide correct inputs."))
            else:
                print(button.text(), 'button pressed')

        buttonbox = QDialogButtonBox(qt.Horizontal, self)
        buttonbox.addButton('New', QDialogButtonBox.ApplyRole)
        buttonbox.addButton(QDialogButtonBox.Apply)
        buttonbox.addButton('Update', QDialogButtonBox.ApplyRole)
        buttonbox.addButton(QDialogButtonBox.Close)
        for b in buttonbox.buttons():
            b.setAutoDefault(False)


#        buttonbox.setCenterButtons(True)
        buttonbox.clicked.connect(clicked)
        return buttonbox
コード例 #2
0
    def __init__(self, parent=None):
        super(AddUserDialog, self).__init__(parent)

        self.username = QLineEdit()
        self.password = QLineEdit()
        self.confirm_password = QLineEdit()

        self.password.setEchoMode(QLineEdit.Password)
        self.confirm_password.setEchoMode(QLineEdit.Password)

        inputs = QFormLayout()
        inputs.addRow('Username:'******'Password:'******'Confirm password:', self.confirm_password)

        buttons = QDialogButtonBox(
            QDialogButtonBox.Ok | QDialogButtonBox.Cancel, Qt.Horizontal, self)
        buttons.accepted.connect(self.accept)
        buttons.rejected.connect(self.reject)

        self.button_accept = buttons.buttons()[0]
        self.button_accept.setEnabled(False)

        layout = QVBoxLayout()
        layout.addLayout(inputs)
        layout.addWidget(buttons)

        self.setLayout(layout)

        self.username.textChanged.connect(self.validate)
        self.password.textChanged.connect(self.validate)
        self.confirm_password.textChanged.connect(self.validate)
コード例 #3
0
ファイル: base.py プロジェクト: derula/strainer
 def __init__(self, parent):
     super().__init__(parent, Qt.WindowSystemMenuHint | Qt.WindowTitleHint)
     self.setLayout(QFormLayout())
     buttons = QDialogButtonBox(QDialogButtonBox.Ok
                                | QDialogButtonBox.Cancel)
     buttons.accepted.connect(self.accept)
     buttons.rejected.connect(self.reject)
     self.layout().addRow(buttons)
     self._buttons = buttons.buttons()
     self._illegalNames = None
コード例 #4
0
class Dialog(QDialog):
    def __init__(self, parent, text, window_title='Information'):
        super(Dialog, self).__init__(parent)
        self.setModal(True)
        self.screen_resolution = QApplication.desktop().screenGeometry()
        self.screen_width, self.screen_height = self.screen_resolution.width(
        ), self.screen_resolution.height()
        self.parent = parent
        self.text = text
        self.window_title = window_title
        self.setStyleSheet('font-size:20px')
        self.initUI()

    def initUI(self):
        w = QLabel()
        w.setOpenExternalLinks(True)
        w.setText(self.text)
        hbox = QHBoxLayout()
        hbox.addStretch(1)

        self.buttons = QDialogButtonBox(
            QDialogButtonBox.Ok | QDialogButtonBox.Cancel,
            QtCore.Qt.Horizontal, self)

        self.buttons.accepted.connect(self.accept)
        self.buttons.rejected.connect(self.reject)

        for b in self.buttons.buttons():
            b.setMinimumHeight(50)

        hbox.addWidget(self.buttons)
        vbox = QVBoxLayout()
        vbox.addWidget(w)
        vbox.addSpacing(20)
        vbox.addLayout(hbox)
        self.setLayout(vbox)

        width, height = self.sizeHint().width(), self.sizeHint().height()
        if type(self.parent.parent).__name__ != 'TabPad':
            pwidth = self.screen_width
            pheight = self.screen_height
        else:
            pwidth = self.parent.parent.frameGeometry().width()
            pheight = self.parent.frameGeometry().height()
        self.setGeometry((pwidth - width) / 2, (pheight - height) / 2, width,
                         height)
        self.setWindowTitle(self.window_title)

    def close_settings(self):
        self.close()
コード例 #5
0
class NewFileDialog(QDialog):
    def __init__(self, parent, text):
        super(NewFileDialog, self).__init__(parent)
        self.setModal(True)
        self.screen_resolution = QApplication.desktop().screenGeometry()
        self.screen_width, self.screen_height = self.screen_resolution.width(
        ), self.screen_resolution.height()
        self.parent = parent
        self.text = text
        self.setStyleSheet('font-size:20px')
        self.initUI()

    def initUI(self):
        w = QLabel()
        w.setText(self.text)
        self.le = QLineEdit()

        hbox = QHBoxLayout()
        hbox.addStretch(1)

        self.buttons = QDialogButtonBox(
            QDialogButtonBox.Ok | QDialogButtonBox.Cancel,
            QtCore.Qt.Horizontal, self)

        self.buttons.accepted.connect(self.accept)
        self.buttons.rejected.connect(self.reject)

        for b in self.buttons.buttons():
            b.setMinimumHeight(50)

        hbox.addWidget(self.buttons)
        vbox = QVBoxLayout()
        vbox.addWidget(w)
        vbox.addWidget(self.le)
        vbox.addSpacing(20)
        vbox.addLayout(hbox)
        self.setLayout(vbox)

        width, height = self.sizeHint().width(), self.sizeHint().height()
        pwidth = self.parent.parent.frameGeometry().width()
        pheight = self.parent.frameGeometry().height()
        self.setGeometry((pwidth - width) / 2, (pheight - height) / 2, width,
                         height)
        self.setWindowTitle('Create New Layout File')

    def close_settings(self):
        self.close()

    def filename(self):
        return self.le.text()
コード例 #6
0
 def __init__(self):
     super().__init__()
     self.db = pd.DataFrame()
     self.mainLayout = QVBoxLayout()
     self.optionsGroup = QGroupBox("")
     self.optionsLayout = QHBoxLayout()
     self.optionsGroup.setLayout(self.optionsLayout)
     self.create_class_GB()
     self.create_players_GB()
     self.create_slider()
     self.mainLayout.addWidget(self.optionsGroup)
     self.field = Field(self)
     self.mainLayout.addWidget(self.field)
     self.optionsGroup.setMaximumHeight(70)
     buttonbox = QDialogButtonBox(QDialogButtonBox.Open
                                  | QDialogButtonBox.Save
                                  | QDialogButtonBox.Cancel)
     buttonbox.buttons()[1].clicked.connect(self.open)
     buttonbox.buttons()[0].clicked.connect(self.save)
     buttonbox.buttons()[2].clicked.connect(self.cancel)
     self.mainLayout.addWidget(buttonbox)
     self.setLayout(self.mainLayout)
     self.setFocusPolicy(Qt.StrongFocus)
     self.setFocus(True)
コード例 #7
0
    def createButtonBox(self, cmd_fct):
        def clicked(button):
            command = button.text()
            specsheet = self.specsheet_dict[self.conjugate_type]
            if cmd_fct:
                cmd_fct(self, command, specsheet)
            else:
                print(button.text(), 'button pressed')

        buttonbox = QDialogButtonBox(qt.Horizontal, self)
        buttonbox.addButton('New', QDialogButtonBox.ApplyRole)
        buttonbox.addButton(QDialogButtonBox.Apply)
        buttonbox.addButton('Update', QDialogButtonBox.ApplyRole)
        buttonbox.addButton(QDialogButtonBox.Close)
        for b in buttonbox.buttons():
            b.setAutoDefault(False)
#        buttonbox.setCenterButtons(True)
        buttonbox.clicked.connect(clicked)
        return buttonbox
コード例 #8
0
class NetWorkParametersFormDialog(QDialog, forms.FormMixing):
    def __init__(self, parent):
        super().__init__(parent)
        self.parent = parent
        self.object = NetWorkParameters.\
            getObject(parent.connection, parent.customnetwork_id)
        self.customnetwork = CustomNetwork.getObject(parent.connection)
        splinnersGroupBox = self._createSplinnersGroupBox()
        dateGroupBox = self._createDateGroupBox()
        self.buttonBox = QDialogButtonBox(QDialogButtonBox.Ok
                                          | QDialogButtonBox.Cancel)
        self.buttonBox.accepted.connect(self.accepting)
        self.buttonBox.rejected.connect(self.reject)
        mainLayout = QVBoxLayout()
        mainLayout.addWidget(splinnersGroupBox)
        mainLayout.addWidget(dateGroupBox)
        mainLayout.addWidget(self.buttonBox)
        self.setLayout(mainLayout)
        self.setWindowTitle("New CustomNetwork Form")

    def _createDateGroupBox(self):
        dateGroupBox = QGroupBox("Date:")
        self.start_date = forms.TextField()
        validator = QRegExpValidator(QRegExp(utils.DATE_EXP))
        self.start_date.setValidator(validator)

        self.end_date = forms.TextField(self.object.get('end_date', ''))
        self.end_date.setValidator(validator)
        layout = QFormLayout()
        layout.addRow(QLabel("Start date:"), self.start_date)
        layout.addRow(QLabel("End date:"), self.end_date)
        dateGroupBox.setLayout(layout)

        self.start_date.communicate.\
            changeValidationStatus.connect(self.check_state)
        self.end_date.communicate.\
            changeValidationStatus.connect(self.check_state)

        return dateGroupBox

    def _createSplinnersGroupBox(self):
        splinnersGroupBox = QGroupBox("Params:")
        step_lbl = QLabel("Step")
        self.lcd_step = QLCDNumber(self)
        self.lcd_step.setSegmentStyle(QLCDNumber.Flat)

        sld_step = QSlider(Qt.Horizontal, self)
        sld_step.setFocusPolicy(Qt.NoFocus)
        sld_step.setRange(1, 10)

        history_lbl = QLabel("History")
        self.lcd_history = QLCDNumber(self)
        self.lcd_history.setSegmentStyle(QLCDNumber.Flat)
        sld_history = QSlider(Qt.Horizontal, self)
        sld_history.setFocusPolicy(Qt.NoFocus)
        sld_history.setRange(10, 100)
        grid = QGridLayout()
        grid.setSpacing(10)

        grid.addWidget(step_lbl, 1, 0)
        grid.addWidget(sld_step, 1, 1)
        grid.addWidget(self.lcd_step, 1, 2)
        grid.addWidget(history_lbl, 2, 0)
        grid.addWidget(sld_history, 2, 1)
        grid.addWidget(self.lcd_history, 2, 2)

        splinnersGroupBox.setLayout(grid)
        sld_step.valueChanged.connect(self.lcd_step.display)
        sld_history.valueChanged.connect(self.lcd_history.display)

        return splinnersGroupBox

    def accepting(self):
        ok_button = self.buttonBox.buttons()[0]
        validator = NetworkPreferenceValidator(self.parent)
        if len(self.object) > 0:
            state = validator.validate(self, EDITION)
        else:
            state = validator.validate(self, CREATION)

        if state == QValidator.Acceptable:
            ok_button.setEnabled(True)
        else:
            ok_button.setEnabled(False)

        if state == QValidator.Acceptable:
            self.done(QDialog.Accepted)

    #  static method to create the dialog and return (date, time, accepted)
    @staticmethod
    def getData(parent=None, customnetwork_id=-1):

        dialog = NetWorkParametersFormDialog(parent)
        result = dialog.exec_()
        return (dialog.lcd_step.value(), dialog.lcd_history.value(),
                dialog.start_date.text(), dialog.end_date.text(),
                result == QDialog.Accepted)
コード例 #9
0
class CustomNetworkFormDialog(QDialog, forms.FormMixing):
    # NumGridRows = 3
    # NumButtons = 4

    def __init__(self, parent, customnetwork_id):
        super().__init__(parent)
        self.parent = parent
        self.object = CustomNetwork.getObject(parent.connection,
                                              customnetwork_id)
        self._createFormGroupBox()
        self.buttonBox = QDialogButtonBox(QDialogButtonBox.Ok
                                          | QDialogButtonBox.Cancel)

        self.buttonBox.accepted.connect(self.accepting)
        self.buttonBox.rejected.connect(self.reject)

        mainLayout = QVBoxLayout()
        mainLayout.addWidget(self.formGroupBox)
        mainLayout.addWidget(self.buttonBox)

        self.setLayout(mainLayout)
        self.setWindowTitle("New CustomNetwork Form")

    def _createFormGroupBox(self):
        self.formGroupBox = QGroupBox("Data:")
        self.name = forms.TextField(self.object.get('name', ''))
        self.description = forms.TextField(self.object.get('description', ''),
                                           not_null=False)

        self.name.communicate.changeValidationStatus.connect(self.check_state)

        if 'components' in self.object and len(self.object['components']) > 0:
            tickets_text = \
                ' '.join([comp['ticket']
                         for comp in self.object['components']])
        else:
            tickets_text = ''

        self.tickets = forms.TextArea(tickets_text, not_null=False)
        self.name.setPlaceholderText('Enter a name')

        layout = QFormLayout()
        layout.addRow(QLabel("Name:"), self.name)
        layout.addRow(QLabel("Description:"), self.description)
        layout.addRow(QLabel("Tickets:"), self.tickets)
        self.formGroupBox.setLayout(layout)

    def accepting(self):
        ok_button = self.buttonBox.buttons()[0]
        validator = CustomNetworkValidator(self.parent.connection)
        if len(self.object) > 0:
            state = validator.validate(self, EDITION)
        else:
            state = validator.validate(self, CREATION)

        if state == QValidator.Acceptable:
            ok_button.setEnabled(True)
        else:
            ok_button.setEnabled(False)

        if state == QValidator.Acceptable:
            self.done(QDialog.Accepted)

    #  static method to create the dialog and return (date, time, accepted)
    @staticmethod
    def getData(parent=None, customnetwork_id=-1):

        dialog = CustomNetworkFormDialog(parent, customnetwork_id)
        result = dialog.exec_()
        tickets = dialog.tickets.toPlainText().split()
        return (dialog.name.text(), dialog.description.text(), tickets,
                result == QDialog.Accepted)
コード例 #10
0
class QTwoFieldDialog(QDialog):
    """
    Class for creating a dialog with two input fields
    """
    def __init__(self):
        super().__init__()
        self.setWindowFlags(Qt.Window | Qt.CustomizeWindowHint
                            | Qt.WindowTitleHint | Qt.WindowCloseButtonHint)
        # Input Fields
        self.firstInputField = QLineEdit(self)
        self.secondInputField = QTextEdit(self)

        # Labels for Input Fields
        self.firstLabel = QLabel(self)
        self.secondLabel = QLabel(self)

        # Accept & Decline Buttons
        self.button_box = QDialogButtonBox(
            QDialogButtonBox.Ok | QDialogButtonBox.Cancel, self)
        self.button_box.accepted.connect(self.accept)
        self.button_box.rejected.connect(self.reject)

        # Dialog Layout
        self.layout = QFormLayout(self)
        self.init_layout()

        ColorsRegulator().set_colors(
            self, styles.Styles.set_dialog_styles,
            night_styles.NightStyles.set_dialog_styles)

    def init_layout(self):
        self.layout.addRow(self.firstLabel)
        self.layout.addRow(self.firstInputField)
        self.layout.addRow(self.secondLabel)
        self.layout.addRow(self.secondInputField)
        self.layout.addWidget(self.button_box)

    def get_inputs(self):
        """
        Return inputs from users in form of tuple
        :return: tuple
        """
        return self.firstInputField.text(), self.secondInputField.toPlainText()

    def clear_input_fields(self):
        """
        Method to clear fields, so no old data stays in same dialog window.
        :return: None
        """
        self.firstInputField.clear()
        self.secondInputField.clear()

    def set_line_titles(self, first_row, second_row):
        """
        Set text to labels above corresponding input fields
        :param first_row: text to label upper field
        :param second_row: text to label bottom field
        :return: None
        """
        self.firstLabel.setText(first_row)
        self.secondLabel.setText(second_row)

    def set_fields_text(self, first_field, second_field):
        """
        Set text to input field for pre-made 'answers'
        :param first_field: text for first input field
        :param second_field: text for second input field
        :return: None
        """
        self.firstInputField.setText(first_field)
        self.secondInputField.setText(second_field)

    def set_button_text(self, accept, decline):
        """
        Set text for accept/decline buttons
        :param accept: text for accept button
        :param decline: text for decline button
        :return: None
        """
        self.button_box.buttons()[0].setText(accept)
        self.button_box.buttons()[1].setText(decline)
コード例 #11
0
class HelpButtonDialog(QDialog):
    def __init__(self, parent):
        super(HelpButtonDialog, self).__init__(parent)
        self.setWindowFlags(QtCore.Qt.Window)
        self.setModal(True)
        self.screen_resolution = QApplication.desktop().screenGeometry()
        self.screen_width, self.screen_height = self.screen_resolution.width(
        ), self.screen_resolution.height()
        self.parent = parent
        self.setStyleSheet('font-size:20px')
        self.initUI()

    def initUI(self):
        w = QLabel()
        text = 'Big wall of text below.'
        w.setText(text)
        hbox = QHBoxLayout()
        hbox.addStretch(1)

        self.buttons = QDialogButtonBox(
            QDialogButtonBox.Ok | QDialogButtonBox.Cancel,
            QtCore.Qt.Horizontal, self)

        self.buttons.accepted.connect(self.accept)
        self.buttons.rejected.connect(self.reject)

        self.buttons.setMinimumSize(QtCore.QSize(50, 50))
        for b in self.buttons.buttons():
            b.setMinimumHeight(50)

        hbox.addWidget(self.buttons)
        vbox = QVBoxLayout()
        h = QHBoxLayout()
        vbox.addWidget(w)

        l = [
            'Name', 'X Positon', 'Y Position', 'Width', 'Height', 'Color',
            'Behavior', 'Input'
        ]
        behavior_list = ['normal', 'sticky', 'autorepeat', 'combo']

        for i in range(8):
            if i == 0:
                new_vbox = QVBoxLayout()
                new_widget = QWidget()
                lbl = QLabel(l[i])
                b = QLineEdit()
                b.setText('Z1')
                b.setMinimumHeight(50)
                new_vbox.addWidget(lbl)
                new_vbox.addWidget(b)
                new_widget.setLayout(new_vbox)
                h.addWidget(new_widget)
            if i > 0 and i <= 4:
                new_vbox = QVBoxLayout()
                new_widget = QWidget()
                lbl = QLabel(l[i])
                b = QSpinBox()
                b.setMinimum(0)
                b.setMaximum(100)
                b.setSingleStep(1)
                b.setValue(50)
                b.setMinimumHeight(50)
                new_vbox.addWidget(lbl)
                new_vbox.addWidget(b)
                new_widget.setLayout(new_vbox)
                h.addWidget(new_widget)
            if i == 5:
                new_vbox = QVBoxLayout()
                new_widget = QWidget()
                lbl = QLabel(l[i])
                b = QPushButton()
                b.setStyleSheet('background-color:green')
                b.setMinimumHeight(50)
                new_vbox.addWidget(lbl)
                new_vbox.addWidget(b)
                new_widget.setLayout(new_vbox)
                h.addWidget(new_widget)
            if i == 6:
                new_vbox = QVBoxLayout()
                new_widget = QWidget()
                lbl = QLabel(l[i])
                b = QComboBox()
                b.setMinimumHeight(50)
                b.addItem(behavior_list[0])
                b.addItem(behavior_list[1])
                b.addItem(behavior_list[2])
                new_vbox.addWidget(lbl)
                new_vbox.addWidget(b)
                new_widget.setLayout(new_vbox)
                h.addWidget(new_widget)
            if i == 7:
                new_vbox = QVBoxLayout()
                new_widget = QWidget()
                lbl = QLabel(l[i])
                b = QPushButton()
                b.setText('key D click 2')
                b.setMinimumHeight(50)
                new_vbox.addWidget(lbl)
                new_vbox.addWidget(b)
                new_widget.setLayout(new_vbox)
                h.addWidget(new_widget)

        scroll = QScrollArea()
        scroll.setWidgetResizable(True)
        widget = QLabel()
        widget.setWordWrap(True)

        t = (
            "<font color='blue'>Some fields in default buttons are disabled. "
            "This has been done on purpose to define a standard set of buttons. "
            "However, there are no such restrictions on creating a new button. "
            "If you want to hide an existing button, set its width and height to zero.</font><br><br>"
            "<b>Name:</b> Identification label for your button. "
            "You cannot change names of existing buttons. "
            "However you can always create a new button with any name.<br><br>"
            "<b>X Position:</b> Defines horizontal position of a button in terms of percentages of 'Overlay Width'. "
            "E.g., a value of 6 will postion a button horizontally at 6% of total overlay width value. "
            "Please note that overlay width may not be your screen width. "
            "You can change overlay width in settings.<br><br>"
            "<b>Y Position:</b> Defines vertical position of a button in terms of percentages of 'Overlay Height'. "
            "E.g., a value of 30 will postion a button vertically at 30% of total overlay height value. "
            "Please note that overlay height may not be your screen height. "
            "You can change overlay height in settings.<br><br>"
            "<b>Width:</b> Defines width of the button. "
            "If 'Override Button Size' is enabled in settings, this value will have no effect on button.<br><br>"
            "<b>Height:</b> Defines height of the button. "
            "If 'Override Button Size' is enabled in settings, this value will have no effect on button.<br><br>"
            "<font color='blue'><u>Tip:</u> To hide a button, set its width and height to zero.</font><br><br>"
            "<b>Color:</b> Sets the color of the button.<br><br>"
            "<b>Behavior:</b> Defines behavior of the button.<br>"
            "<font color='blue'>Some of the options below will only work if your game/emulator supports it.</font><br>"
            "<u>Normal:</u> Standard tap or long press on a button. "
            "Duplicate keys like 'Up, Up, Down, Down' will not work in this mode.<br>"
            "<u>Sticky:</u> Simulates press and hold behavior on a single press (continues unless stopped). "
            "Duplicate keys like 'Up, Up, Down, Down' will not work in this mode.<br>"
            "<u>Autorepeat:</u> Also known as rapid-fire/turbo. After touching once, it goes on and on, unless stopped. "
            "Duplicate keys like 'Up, Up, Down, Down' will not work in this mode.<br>"
            "<u>Combo:</u> Auto-executes keys one by one in a time interval defined in the settings. "
            "Once a combo starts, it cannot be interrupted until its done. "
            "Duplicate keys like 'Up, Up, Down, Down' will work in this mode if the game/emulator supports it.<br><br>"
            "<font color='blue'><u>Tip:</u> Tap on 'Stop All Inputs' to halt all sticky and autorepeating keys/clicks.</font><br><br>"
            "<b>Input:</b> Choose one or multiple keys/clicks to be executed on a button press. "
            "You can even combine keys and clicks together. "
            "There are more than 150 options, so you can now execute all those 'Soul Calibur' combos in one hit.<br><br>"
            "<font color='blue'><u>Tip:</u> If you find that the app is crashing at startup,"
            " delete 'settings.conf' file in main app folder and 'DefaultLayout.conf'"
            " file in profiles folder and then relaunch the app.</font><br><br>"
        )
        widget.setText(t)
        widget.setContentsMargins(10, 10, 10, 10)
        widget.setAlignment(QtCore.Qt.AlignJustify)
        widget.setStyleSheet('background-color:white;')

        scroll.setWidget(widget)
        scroll.setObjectName('scroll1')
        scroll.setStyleSheet('#scroll1 {background-color:white;}')

        qs = QScroller.scroller(scroll.viewport())
        props = qs.scrollerProperties()
        props.setScrollMetric(QScrollerProperties.DecelerationFactor, 0.35)
        props.setScrollMetric(QScrollerProperties.DragStartDistance, .001)
        qs.setScrollerProperties(props)
        qs.grabGesture(scroll.viewport(), QScroller.TouchGesture)

        vbox.addSpacing(10)
        vbox.addLayout(h)
        vbox.addSpacing(20)
        vbox.addWidget(scroll)
        vbox.addLayout(hbox)
        self.setLayout(vbox)

        w, h = self.screen_width * .9, self.sizeHint().height()
        self.setGeometry((self.screen_width - w) / 2,
                         (self.screen_height - h) / 2, w, h)
        self.setWindowTitle('Help')

    def close_settings(self):
        self.close()
コード例 #12
0
class SettingsDialog(PersistentDialog):
    def __init__(self,
                 accepted_func: Callable,
                 rejected_func: Callable,
                 applied_func: Callable,
                 parent=None,
                 title='Settings Dialog',
                 flags=Qt.WindowStaysOnTopHint):
        super(SettingsDialog, self).__init__(parent)

        self.accepted_func = accepted_func
        self.rejected_func = rejected_func
        self.applied_func = applied_func

        self.setWindowTitle(title)
        self.resize(500, 600)

        self.button_box = QDialogButtonBox(self)
        self.button_box.setOrientation(Qt.Horizontal)
        self.button_box.setStandardButtons(QDialogButtonBox.Cancel
                                           | QDialogButtonBox.Ok
                                           | QDialogButtonBox.Apply)

        self.button_box.accepted.connect(self.accept)  # OK button
        self.button_box.rejected.connect(self.reject)  # Cancel button
        apply_button = self.button_box.buttons()[-1]
        apply_button.pressed.connect(self.apply)

        self.restore_sett_button = QPushButton('Restore Default Settings')
        self.restore_sett_button.pressed.connect(self.restore_settings)

        self.bottom_layout = QHBoxLayout()
        self.bottom_layout.addWidget(self.restore_sett_button)
        self.bottom_layout.addStretch(0)
        self.bottom_layout.addWidget(self.button_box)

        self.VLayout = QVBoxLayout()

        self.tree_model = ConfigTreeModel()
        self.tree_view = ConfigTreeView(self.tree_model)

        self.sett = Settings()
        self.root_cti = RootCti(
            self.sett.find_node_by_xpath('/Public settings'),
            root_xpath='/Public settings')
        self.tree_model.setInvisibleRootItem(self.root_cti)
        self.tree_view.expandBranch()

        self.last_setting_dict = deepcopy(
            self.sett.settings)  # instantiate last settings

        def value_changed(cti: AbstractCti):
            data = cti.data
            if isinstance(cti, PgColorMapCti):
                data = data.key

            # print(f"value of {cti} has changed, new value: {data}")
            self.sett[cti.nodePath] = data

        self.tree_model.value_changed.connect(value_changed)

        self.VLayout.addWidget(self.tree_view)
        self.VLayout.addLayout(self.bottom_layout)

        self.setLayout(self.VLayout)

    def apply(self):
        self.applied_func()

    def accept(self) -> None:
        self.accepted_func()
        super(SettingsDialog, self).accept()

    def restore_settings(self):
        # maybe not necessary
        self.root_cti.resetToDefault(resetChildren=True)
        # TODO redraw Tree View
        # self.tree_model.sigItemChanged.emit(self.root_cti)
        # self.tree_model.dataChanged.emit()

    def reject(self):
        # keep the original settings
        self.sett.settings = self.last_setting_dict
        self.rejected_func()
        super(SettingsDialog, self).reject()
コード例 #13
0
ファイル: client_gui2.py プロジェクト: vsurguch/client
class AuthDialog(QDialog):
    def __init__(self, model, username, hostname, port, parent=None):
        QDialog.__init__(self, parent)
        self.buttonBox = QDialogButtonBox(Qt.Vertical)
        self.buttonBox.addButton('Ok', QDialogButtonBox.ActionRole)
        self.buttonBox.addButton('Cancel', QDialogButtonBox.ActionRole)
        self.buttonBox.addButton('More', QDialogButtonBox.ActionRole)

        # self.buttonBox.accepted.connect(self.accept)
        # self.buttonBox.rejected.connect(self.reject)

        self.topLeft = QFrame()
        topLayout = QGridLayout()
        usernameLabel = QLabel('Username')
        self.username = QLineEdit(username)
        usernameLabel.setBuddy(self.username)
        passwordLabel = QLabel('Password')
        self.password = QLineEdit()
        passwordLabel.setBuddy(self.password)
        topLayout.addWidget(usernameLabel, 0, 0)
        topLayout.addWidget(self.username, 0, 1)
        topLayout.addWidget(passwordLabel, 1, 0)
        topLayout.addWidget(self.password, 1, 1)
        topLayout.setRowMinimumHeight(2, 20)
        self.topLeft.setLayout(topLayout)

        self.extension = QFrame()
        extensionLaytout = QVBoxLayout()
        self.hostLabel = QLabel('Host')
        self.host = QLineEdit(hostname)
        self.portLabel = QLabel('Port')
        self.port = QLineEdit(port)
        extensionLaytout.addWidget(self.hostLabel)
        extensionLaytout.addWidget(self.host)
        extensionLaytout.addWidget(self.portLabel)
        extensionLaytout.addWidget(self.port)
        extensionLaytout.addWidget(self.buttonBox)
        self.extension.setLayout(extensionLaytout)

        mainLayout = QGridLayout()
        mainLayout.setSizeConstraint(QLayout.SetFixedSize)
        mainLayout.addWidget(self.topLeft, 0, 0, alignment=Qt.AlignBottom)
        mainLayout.addWidget(self.buttonBox, 0, 1, alignment=Qt.AlignVCenter)
        mainLayout.addWidget(self.extension, 1, 0, 1, 2)
        # mainLayout.setRowMinimumHeight(0, 80)
        mainLayout.setRowStretch(2, 1)
        self.buttonBox.buttons()[0].clicked.connect(self.accept)
        self.buttonBox.buttons()[1].clicked.connect(self.reject)
        self.buttonBox.buttons()[2].setCheckable(True)
        self.buttonBox.buttons()[2].toggled.connect(self.extension.setVisible)

        self.extension.hide()
        self.setLayout(mainLayout)

        self.model = model
        self.show_all = False

    def accept(self):
        self.model.username = self.username.text()
        password = self.password.text()
        self.model.host = self.host.text()
        self.model.port = int(self.port.text())
        secret_key = b'i_believe_i_can_fly'
        hash = hmac.new(secret_key, password.encode('utf-8'))
        digest = hash.hexdigest()
        self.model.encripted_password = digest
        super().accept()

    def show_more(self):
        if not self.show_all:
            self.extension.setVisible(True)

            # self.hostLabel.setVisible(True)
            # self.host.setVisible(True)
            # self.portLabel.setVisible(True)
            # self.port.setVisible(True)
            self.more.setText('Less - >')
            self.show_all = True
        else:
            # self.hostLabel.setVisible(False)
            # self.host.setVisible(False)
            # self.portLabel.setVisible(False)
            # self.port.setVisible(False)
            self.extension.hide()
            self.extension.setParent(None)
            self.more.setText('More - >')
            self.show_all = False
コード例 #14
0
class NewButtonDialog(QDialog):
    def __init__(self, parent):
        super(NewButtonDialog, self).__init__(parent)
        # self.setWindowFlags(QtCore.Qt.Window)
        self.setModal(True)
        self.screen_resolution = QApplication.desktop().screenGeometry()
        self.screen_width, self.screen_height = self.screen_resolution.width(
        ), self.screen_resolution.height()
        self.parent = parent
        self.values = [None, 50, 50, 50, 50, None, 'normal', None]
        self.setStyleSheet('font-size:20px')
        self.initUI()

    def initUI(self):
        w = QLabel()
        text = 'Define properties of your new button below.'
        w.setText(text)
        hbox = QHBoxLayout()
        hbox.addStretch(1)

        self.buttons = QDialogButtonBox(
            QDialogButtonBox.Ok | QDialogButtonBox.Cancel,
            QtCore.Qt.Horizontal, self)

        self.buttons.accepted.connect(self.accept)
        self.buttons.rejected.connect(self.reject)

        self.buttons.setMinimumSize(QtCore.QSize(50, 50))
        for b in self.buttons.buttons():
            b.setMinimumHeight(50)

        hbox.addWidget(self.buttons)
        vbox = QVBoxLayout()
        h = QHBoxLayout()
        vbox.addWidget(w)

        l = [
            'Name', 'X Positon', 'Y Position', 'Width', 'Height', 'Color',
            'Behavior', 'Input'
        ]
        behavior_list = ['normal', 'sticky', 'autorepeat', 'combo']

        for i in range(8):
            if i == 0:
                new_vbox = QVBoxLayout()
                new_widget = QWidget()
                lbl = QLabel(l[i])
                b = QLineEdit()
                b.setMinimumHeight(50)
                new_vbox.addWidget(lbl)
                new_vbox.addWidget(b)
                new_widget.setLayout(new_vbox)
                h.addWidget(new_widget)
                b.textChanged.connect(
                    partial(self.write_widget_value, i, b.text))
            if i > 0 and i <= 4:
                new_vbox = QVBoxLayout()
                new_widget = QWidget()
                lbl = QLabel(l[i])
                b = QSpinBox()
                b.setMinimum(0)
                b.setMaximum(100)
                b.setSingleStep(1)
                b.setValue(50)
                b.setMinimumHeight(50)
                new_vbox.addWidget(lbl)
                new_vbox.addWidget(b)
                new_widget.setLayout(new_vbox)
                h.addWidget(new_widget)
                b.valueChanged.connect(
                    partial(self.write_widget_value, i, b.value))
            if i == 5:
                new_vbox = QVBoxLayout()
                new_widget = QWidget()
                lbl = QLabel(l[i])
                b = QPushButton()
                b.setMinimumHeight(50)
                new_vbox.addWidget(lbl)
                new_vbox.addWidget(b)
                new_widget.setLayout(new_vbox)
                h.addWidget(new_widget)
                b.clicked.connect(partial(self.get_color, i, b))
            if i == 6:
                new_vbox = QVBoxLayout()
                new_widget = QWidget()
                lbl = QLabel(l[i])
                b = QComboBox()
                b.setMinimumHeight(50)
                b.addItem(behavior_list[0])
                b.addItem(behavior_list[1])
                b.addItem(behavior_list[2])
                new_vbox.addWidget(lbl)
                new_vbox.addWidget(b)
                new_widget.setLayout(new_vbox)
                h.addWidget(new_widget)
                b.currentIndexChanged.connect(
                    partial(self.write_widget_value, i, b.currentText))
            if i == 7:
                new_vbox = QVBoxLayout()
                new_widget = QWidget()
                lbl = QLabel(l[i])
                b = QPushButton()
                b.setMinimumHeight(50)
                new_vbox.addWidget(lbl)
                new_vbox.addWidget(b)
                new_widget.setLayout(new_vbox)
                h.addWidget(new_widget)
                b.clicked.connect(partial(self.keypicker, i, b))

        vbox.addSpacing(10)
        vbox.addLayout(h)
        vbox.addSpacing(20)
        vbox.addLayout(hbox)
        self.setLayout(vbox)

        w, h = self.screen_width * .9, self.sizeHint().height()
        self.setGeometry((self.screen_width - w) / 2,
                         (self.screen_height - h) / 2, w, h)
        self.setWindowTitle('Create a New Button')

    def close_settings(self):
        self.close()

    def write_widget_value(self, index, value):
        value = value()
        self.values[index] = value

    def get_color(self, index, btn):
        color = QColorDialog.getColor()
        if color.isValid():
            color = color.name()
            stl = "background-color:%s;" % color
            btn.setStyleSheet(stl)
            self.values[index] = color

    def keypicker(self, index, btn):
        picker = InputDialog(self)
        result = picker.exec_()
        if result == 1:
            keys = picker.all_input_values()
        else:
            keys = None
        if keys:
            self.values = self.values[:7]
            self.values = self.values + keys
            btn.setText(' '.join(keys))

    def final_list(self):
        for i in self.values:
            if i == None:
                self.values = []
                break
        return self.values
コード例 #15
0
class InputDialog(QDialog):
    def __init__(self, parent):
        super(InputDialog, self).__init__(parent)
        self.setWindowFlags(QtCore.Qt.Window)
        self.setModal(True)
        self.screen_resolution = QApplication.desktop().screenGeometry()
        self.screen_width, self.screen_height = self.screen_resolution.width(
        ), self.screen_resolution.height()
        self.parent = parent
        self.key_list = []
        self.click_list = []
        self.current_selection = []
        self.setStyleSheet('font-size:20px')
        self.initUI()

    def initUI(self):
        widget = QWidget()
        vbox = QVBoxLayout()
        leftlist = QListWidget()
        leftlist.setMaximumWidth(100)
        leftlist.insertItem(0, 'key')
        leftlist.insertItem(1, 'click')

        keystack = QWidget()
        clickstack = QWidget()

        syms = [
            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c',
            'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
            'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C',
            'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
            'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'Up', 'Down',
            'Left', 'Right', 'Alt_L', 'Alt_R', 'BackSpace', 'Cancel',
            'Caps_Lock', 'Control_L', 'Control_R', 'Shift_L', 'Shift_R', 'Tab',
            'space', 'Delete', 'End', 'Super_L', 'Suprer_R', 'Return',
            'Escape', 'Execute', 'F1', 'F2', 'F3', 'F4', 'F5', 'F6', 'F7',
            'F8', 'F9', 'F10', 'F11', 'F12', 'Fi', 'KP_0', 'KP_1', 'KP_2',
            'KP_3', 'KP_4', 'KP_5', 'KP_6', 'KP_7', 'KP_8', 'KP_9', 'KP_Add',
            'KP_Begin', 'KP_Decimal', 'KP_Delete', 'KP_Divide', 'KP_Down',
            'KP_End', 'KP_Enter', 'KP_Home', 'KP_Insert', 'KP_Left',
            'KP_Multiply', 'KP_Next', 'KP_Prior', 'KP_Right', 'KP_Subtract',
            'KP_Up', 'Home', 'Insert', 'Linefeed', 'Next', 'Num_Lock', 'Pause',
            'Print', 'Prior', 'Scroll_Lock', 'exclam', 'quotedbl',
            'numbersign', 'dollar', 'percent', 'ampersand', 'quoteright',
            'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'minus',
            'period', 'slash', 'colon', 'semicolon', 'less', 'equal',
            'greater', 'question', 'at', 'grave', 'bracketleft',
            'bracketright', 'backslash', 'apostrophe'
        ]

        click_types = ['1', '2', '3']

        self.btnstyle = 'background-color:#dddddd;font-size:24px;'

        self.keyUI(syms, keystack)
        self.clickUI(click_types, clickstack)

        self.Stack = QStackedWidget()
        self.Stack.addWidget(keystack)
        self.Stack.addWidget(clickstack)

        hbox = QHBoxLayout(self)
        hbox.addWidget(leftlist)
        hbox.addWidget(self.Stack)
        h = QHBoxLayout()

        deleteButton = QPushButton(" Delete Last Input")
        clearButton = QPushButton(" Clear All ")
        deleteButton.setMinimumHeight(50)
        clearButton.setMinimumHeight(50)

        deleteButton.clicked.connect(self.delete_last)
        clearButton.clicked.connect(self.clear_all)

        self.buttons = QDialogButtonBox(
            QDialogButtonBox.Ok | QDialogButtonBox.Cancel,
            QtCore.Qt.Horizontal, self)

        self.buttons.accepted.connect(self.accept)
        self.buttons.rejected.connect(self.reject)

        self.buttons.setMinimumSize(QtCore.QSize(50, 50))
        for b in self.buttons.buttons():
            b.setMinimumSize(QtCore.QSize(50, 50))

        h.addWidget(clearButton)
        h.addWidget(deleteButton)
        h.addStretch(1)
        h.addWidget(self.buttons)
        widget.setLayout(hbox)

        selection_box = QHBoxLayout()
        self.selection_widget = QLabel(self.input_display_text())
        self.selection_widget.setMinimumHeight(50)
        self.selection_widget.setObjectName('SelectionWidget')
        self.selection_widget.setStyleSheet('#SelectionWidget { \
			background-color:#cccccc;border: 1px solid #aaaaaa; \
			border-radius:5px;color:blue; \
		}')

        selection_box.addStretch(1)
        selection_box.addWidget(self.selection_widget)
        selection_box.addStretch(1)
        vbox.addLayout(selection_box)
        vbox.addWidget(widget)
        vbox.addLayout(h)
        self.setLayout(vbox)
        leftlist.currentRowChanged.connect(self.display)

        w, h = self.screen_width * .9, self.screen_height * .8
        self.setGeometry((self.screen_width - w) / 2,
                         (self.screen_height - h) / 2, w, h)
        self.setWindowTitle(
            'Select Input(s). You can choose multiple keys/clicks.')

    def close_settings(self):
        self.close()

    def keyUI(self, syms, keystack):
        layout = QGridLayout()
        scroll = QScrollArea()
        scroll.setWidgetResizable(True)
        widget = QWidget()
        vbox = QVBoxLayout()
        widget.setLayout(layout)
        btn_list = []
        positions = [(i, j) for i in range(int(len(syms) / 4) + 1)
                     for j in range(4)]
        for position, name in zip(positions, syms):
            kbtn = QPushButton(name)
            kbtn.setMinimumSize(QtCore.QSize(50, 50))
            kbtn.setStyleSheet(self.btnstyle)
            layout.addWidget(kbtn, *position)
            kbtn.clicked.connect(partial(self.all_keys_list, name, kbtn,
                                         'key'))
        scroll.setWidget(widget)

        qs = QScroller.scroller(scroll.viewport())
        props = qs.scrollerProperties()
        props.setScrollMetric(QScrollerProperties.DecelerationFactor, 0.35)
        props.setScrollMetric(QScrollerProperties.DragStartDistance, .001)
        qs.setScrollerProperties(props)
        qs.grabGesture(scroll.viewport(), QScroller.TouchGesture)

        vbox.addWidget(scroll)
        keystack.setLayout(vbox)

    def clickUI(self, click_types, clickstack):
        layout = QVBoxLayout()
        widget = QWidget()
        hbox = QHBoxLayout()

        for name in click_types:
            cbtn = QPushButton(name)
            cbtn.setMinimumSize(QtCore.QSize(100, 50))
            cbtn.setStyleSheet(self.btnstyle)
            cbtn.clicked.connect(
                partial(self.all_keys_list, name, cbtn, 'click'))
            layout.addWidget(cbtn)

        widget.setLayout(layout)
        hbox.addStretch(1)
        hbox.addWidget(widget)
        hbox.addStretch(1)
        clickstack.setLayout(hbox)

    def display(self, i):
        self.Stack.setCurrentIndex(i)

    def all_keys_list(self, name, btn, input_type):
        label = btn.text()
        if label:
            self.key_list.append(input_type)
            self.key_list.append(label)
            self.selection_widget.setText(self.input_display_text())

    def input_display_text(self):
        if self.key_list:
            t = ' '.join(self.key_list)
        else:
            t = 'Nothing Selected'
        return t

    def delete_last(self):
        if self.key_list:
            del self.key_list[-2:]
            self.selection_widget.setText(self.input_display_text())

    def clear_all(self):
        if self.key_list:
            self.key_list = []
            self.selection_widget.setText(self.input_display_text())

    def all_input_values(self):
        return self.key_list
コード例 #16
0
ファイル: qruleeditor.py プロジェクト: simoncozens/flux
    def __init__(self, project, editor,
                 rule):  # Rule is some fontFeatures object
        self.project = project
        self.editor = editor
        self.inputslots = []
        self.precontextslots = []
        self.postcontextslots = []
        self.outputslots = []
        self.buffer_direction = "RTL"
        self.buffer_script = "Latin"
        self.all_valuerecord_editors = []
        self.index = None
        if rule:
            self.backup_rule = Rule.fromXML(rule.toXML())  # Deep copy
        else:
            self.backup_rule = None

        super(QRuleEditor, self).__init__()

        splitter = QSplitter()
        self.slotview = QHBoxLayout()
        scroll = QScrollArea()
        scroll.setLayout(self.slotview)

        self.outputview_before = QBufferRenderer(
            project, VariationAwareBuffer(self.project.font))
        self.outputview_after = QBufferRenderer(
            project, VariationAwareBuffer(self.project.font))
        self.before_after = QWidget()
        self.before_after_layout_v = QVBoxLayout()

        self.asFea = QLabel()

        featureButtons = QWidget()
        self.featureButtonLayout = QHBoxLayout()
        featureButtons.setLayout(self.featureButtonLayout)
        self.selectedFeatures = []

        layoutarea = QWidget()
        self.before_after_layout_h = QHBoxLayout()
        self.before_after_layout_h.addWidget(self.outputview_before)
        self.before_after_layout_h.addWidget(self.outputview_after)
        layoutarea.setLayout(self.before_after_layout_h)

        if self.project.variations:
            self.master_selection = QComboBox()
            for mastername in self.project.variations.masters:
                self.master_selection.addItem(mastername)
            self.master_selection.currentTextChanged.connect(
                self.masterChanged)
            self.before_after_layout_v.addWidget(self.master_selection)
        else:
            self.master_selection = None

        self.before_after_layout_v.addWidget(featureButtons)
        self.before_after_layout_v.addWidget(self.asFea)
        self.before_after_layout_v.addWidget(layoutarea)

        self.before_after.setLayout(self.before_after_layout_v)

        splitter.setOrientation(Qt.Vertical)
        splitter.addWidget(scroll)

        splitter.addWidget(self.before_after)
        buttons = QDialogButtonBox(
            QDialogButtonBox.Ok | QDialogButtonBox.Cancel, Qt.Horizontal, self)
        for button in buttons.buttons():
            button.setDefault(False)
            button.setAutoDefault(False)
        buttons.accepted.connect(self.accept)
        buttons.rejected.connect(self.reject)
        v_box_1 = QVBoxLayout()
        self.setLayout(v_box_1)
        v_box_1.addWidget(splitter)
        v_box_1.addWidget(buttons)
        self.setRule(rule)
コード例 #17
0
class UrlDialog(QDialog):
    def __init__(self, parent=None):
        super(UrlDialog, self).__init__(parent)
        self.setWindowTitle("Enter URL")

        vbox = QVBoxLayout(self)

        grid = QGridLayout()
        vbox.addLayout(grid)

        grid.addWidget(QLabel("URL of web page"), 0, 0)

        self.url_edit = QLineEdit(self)
        self.url_edit.setPlaceholderText("https://duckduckgo.com")
        self.url_edit.textChanged.connect(self.lineEditTextChanged)
        self.url_edit.setValidator(NotEmptyValidator())
        self.url_edit.setToolTip("Must not be empty")
        grid.addWidget(self.url_edit, 0, 1)

        grid.addWidget(QLabel("Static size"), 1, 0)
        self.static_size_edit = QCheckBox()
        self.static_size_edit.stateChanged.connect(self.staticSizeChanged)
        grid.addWidget(self.static_size_edit, 1, 1)

        grid.addWidget(QLabel("Width of page"), 2, 0)
        self.width_edit = QLineEdit()
        self.width_edit.setText("1280")
        self.width_edit.setValidator(QIntValidator(640, 20000))
        self.width_edit.setToolTip("Must be between 640 and 20000")
        self.width_edit.textChanged.connect(self.lineEditTextChanged)
        self.width_edit.setDisabled(True)
        grid.addWidget(self.width_edit, 2, 1)

        grid.addWidget(QLabel("Height of page"), 3, 0)
        self.height_edit = QLineEdit()
        self.height_edit.setText("1024")
        self.height_edit.setValidator(QIntValidator(480, 20000))
        self.height_edit.setToolTip("Must be between 480 and 20000")
        self.height_edit.textChanged.connect(self.lineEditTextChanged)
        self.height_edit.setDisabled(True)
        grid.addWidget(self.height_edit, 3, 1)

        grid.addWidget(QLabel("Delay before screenshot [ms]"), 4, 0)
        self.delay_edit = QLineEdit()
        self.delay_edit.setText("350")
        self.delay_edit.setValidator(QIntValidator(200, 20000))
        self.delay_edit.setToolTip("Must be between 200 and 20000")
        self.delay_edit.textChanged.connect(self.lineEditTextChanged)
        grid.addWidget(self.delay_edit, 4, 1)

        # OK and Cancel buttons
        self.buttons = QDialogButtonBox(
            QDialogButtonBox.Ok | QDialogButtonBox.Cancel, Qt.Horizontal, self)
        self.buttons.accepted.connect(self.accept)
        self.buttons.rejected.connect(self.reject)
        vbox.addWidget(self.buttons)

        # initially disable OK button b/c no URL has been entered yet
        self.buttons.buttons()[0].setDisabled(True)

    def staticSizeChanged(self, enable):
        self.width_edit.setDisabled(not enable)
        self.height_edit.setDisabled(not enable)

        if not enable:
            # reset default values of fields below so that invalid values do not keep the user from proceeding
            self.width_edit.setText("1280")
            self.height_edit.setText("1024")

    def lineEditTextChanged(self, *args, **kwargs):
        """ After user edits a QLineEdit, set a color according to the field's current validity """
        sender = self.sender()
        state = self.getLineEditValidity(sender)
        if state == QValidator.Acceptable:
            sender.setStyleSheet("")  # reset background to default
        else:
            color = '#f6989d'  # red
            sender.setStyleSheet(
                "QLineEdit {{ background-color: {} }}".format(color))

        # check whether all fields are acceptable
        all_fields_valid = True
        for line_edit in [
                self.url_edit, self.width_edit, self.height_edit,
                self.delay_edit
        ]:
            if not self.getLineEditValidity(
                    line_edit) == QValidator.Acceptable:
                all_fields_valid = False
                break

        # disable OK button if not all fields are valid
        self.buttons.buttons()[0].setDisabled(not all_fields_valid)

    @staticmethod
    def getLineEditValidity(line_edit: QLineEdit) -> QValidator.State:
        validator = line_edit.validator()
        state = validator.validate(line_edit.text(), 0)[0]
        return state

    @staticmethod
    def getUrl(parent=None):
        dialog = UrlDialog(parent)
        result = dialog.exec_()

        resultdict = {
            "ok": result == QDialog.Accepted,
            "url": dialog.url_edit.text(),
            "static_size": dialog.static_size_edit.isChecked(),
            "height": dialog.height_edit.text(),
            "width": dialog.width_edit.text(),
            "delay": dialog.delay_edit.text()
        }

        return resultdict