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
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)
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
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()
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()
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)
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
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)
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)
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)
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()
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()
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
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
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
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)
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