def passphrase_dialog(self, msg, confirm): # If confirm is true, require the user to enter the passphrase twice parent = self.top_level_window() d = WindowModalDialog(parent, _("Enter Passphrase")) if confirm: OK_button = OkButton(d) playout = PasswordLayout(msg=msg, kind=PW_PASSPHRASE, OK_button=OK_button) vbox = QVBoxLayout() vbox.addLayout(playout.layout()) vbox.addLayout(Buttons(CancelButton(d), OK_button)) d.setLayout(vbox) passphrase = playout.new_password() if d.exec_() else None else: pw = QLineEdit() pw.setEchoMode(2) pw.setMinimumWidth(200) vbox = QVBoxLayout() vbox.addWidget(WWLabel(msg)) vbox.addWidget(pw) vbox.addLayout(Buttons(CancelButton(d), OkButton(d))) d.setLayout(vbox) passphrase = pw.text() if d.exec_() else None self.passphrase = passphrase self.done.set()
def settings_dialog(self, window): # Return a settings dialog. d = WindowModalDialog(window, _("Bitpost settings")) vbox = QVBoxLayout(d) d.setMinimumSize(500, 200) vbox.addStretch() vbox.addLayout(Buttons(CloseButton(d), OkButton(d))) d.show()
def settings_dialog(self, window): d = WindowModalDialog(window, _("Email settings")) d.setMinimumSize(500, 200) vbox = QVBoxLayout(d) vbox.addWidget(QLabel(_('Server hosting your email acount'))) grid = QGridLayout() vbox.addLayout(grid) grid.addWidget(QLabel('Server (SMTP)'), 0, 0) server_s = QLineEdit() server_s.setText(self.smtp_server) grid.addWidget(server_s, 0, 1) grid.addWidget(QLabel('Username'), 1, 0) username_e = QLineEdit() username_e.setText(self.username) grid.addWidget(username_e, 1, 1) grid.addWidget(QLabel('Password'), 2, 0) password_e = QLineEdit() password_e.setText(self.password) grid.addWidget(password_e, 2, 1) vbox.addStretch() vbox.addLayout(Buttons(CloseButton(d), OkButton(d))) if not d.exec_(): return smtp_server = str(server_s.text()) self.config.set_key('email_smtp', smtp_server) self.smtp_server = smtp_server username = str(username_e.text()) self.config.set_key('email_username', username) self.username = username password = str(password_e.text()) self.config.set_key('email_password', password) self.password = password self.processor = None if self.smtp_server and self.username and self.password: try: conn = smtplib.SMTP_SSL(self.smtp_server, timeout=5) conn.login(self.username, self.password) self.processor = Processor(self.smtp_server, self.username, self.password, self.on_receive) self.processor.start() except BaseException as e: window.show_message( _("Unable to connect to mail server:\n {}").format(e) + "\n" + _("Please check your connection and credentials.") )
def pin_dialog(self, msg, show_strength): # Needed e.g. when resetting a device self.clear_dialog() dialog = WindowModalDialog(self.top_level_window(), _("Enter PIN")) matrix = self.pin_matrix_widget_class(show_strength) vbox = QVBoxLayout() vbox.addWidget(QLabel(msg)) vbox.addWidget(matrix) vbox.addLayout(Buttons(CancelButton(dialog), OkButton(dialog))) dialog.setLayout(vbox) dialog.exec_() self.response = str(matrix.get_value()) self.done.set()
def pin_dialog(self, msg): # Needed e.g. when resetting a device from trezorlib.qt.pinmatrix import PinMatrixWidget self.clear_dialog() dialog = WindowModalDialog(self.top_level_window(), _("Enter PIN")) matrix = PinMatrixWidget() vbox = QVBoxLayout() vbox.addWidget(QLabel(msg)) vbox.addWidget(matrix) vbox.addLayout(Buttons(CancelButton(dialog), OkButton(dialog))) dialog.setLayout(vbox) dialog.exec_() self.response = str(matrix.get_value()) self.done.set()
def settings_dialog(self, window): d = WindowModalDialog(window, _("Email settings")) d.setMinimumSize(500, 200) vbox = QVBoxLayout(d) vbox.addWidget(QLabel(_('Server hosting your email account'))) grid = QGridLayout() vbox.addLayout(grid) grid.addWidget(QLabel('Server (IMAP)'), 0, 0) server_e = QLineEdit() server_e.setText(self.imap_server) grid.addWidget(server_e, 0, 1) grid.addWidget(QLabel('Username'), 1, 0) username_e = QLineEdit() username_e.setText(self.username) grid.addWidget(username_e, 1, 1) grid.addWidget(QLabel('Password'), 2, 0) password_e = QLineEdit() password_e.setText(self.password) grid.addWidget(password_e, 2, 1) vbox.addStretch() vbox.addLayout(Buttons(CloseButton(d), OkButton(d))) if not d.exec_(): return server = str(server_e.text()) self.config.set_key('email_server', server) self.imap_server = server username = str(username_e.text()) self.config.set_key('email_username', username) self.username = username password = str(password_e.text()) self.config.set_key('email_password', password) self.password = password check_connection = CheckConnectionThread(server, username, password) check_connection.connection_error_signal.connect( lambda e: window.show_message( _("Unable to connect to mail server:\n {error}").format( error=e) + "\n" + _( "Please check your connection and credentials."))) check_connection.start()
def calibration_dialog(self, window): d = WindowModalDialog(window, _("Revealer - Printer calibration settings")) d.setMinimumSize(100, 200) vbox = QVBoxLayout(d) vbox.addWidget( QLabel(''.join([ "<br/>", _("If you have an old printer, or want optimal precision"), "<br/>", _("print the calibration pdf and follow the instructions "), "<br/>", "<br/>", ]))) self.calibration_h = self.config.get('calibration_h') self.calibration_v = self.config.get('calibration_v') cprint = QPushButton(_("Open calibration pdf")) cprint.clicked.connect(self.calibration) vbox.addWidget(cprint) vbox.addWidget(QLabel(_('Calibration values:'))) grid = QGridLayout() vbox.addLayout(grid) grid.addWidget(QLabel(_('Right side')), 0, 0) horizontal = QLineEdit() horizontal.setText(str(self.calibration_h)) grid.addWidget(horizontal, 0, 1) grid.addWidget(QLabel(_('Bottom')), 1, 0) vertical = QLineEdit() vertical.setText(str(self.calibration_v)) grid.addWidget(vertical, 1, 1) vbox.addStretch() vbox.addSpacing(13) vbox.addLayout(Buttons(CloseButton(d), OkButton(d))) if not d.exec_(): return self.calibration_h = int(Decimal(horizontal.text())) self.config.set_key('calibration_h', self.calibration_h) self.calibration_v = int(Decimal(vertical.text())) self.config.set_key('calibration_v', self.calibration_v)
def auth_dialog(self, window): d = WindowModalDialog(window, _("Authorization")) vbox = QVBoxLayout(d) pw = AmountEdit(None, is_int = True) msg = _('Please enter your Google Authenticator code') vbox.addWidget(QLabel(msg)) grid = QGridLayout() grid.setSpacing(8) grid.addWidget(QLabel(_('Code')), 1, 0) grid.addWidget(pw, 1, 1) vbox.addLayout(grid) msg = _('If you have lost your second factor, you need to restore your wallet from seed in order to request a new code.') label = QLabel(msg) label.setWordWrap(1) vbox.addWidget(label) vbox.addLayout(Buttons(CancelButton(d), OkButton(d))) if not d.exec_(): return return pw.get_amount()
def settings_dialog(self, window): wallet = window.parent().wallet d = WindowModalDialog(window, _("Label Settings")) hbox = QHBoxLayout() hbox.addWidget(QLabel("Label sync options:")) upload = ThreadedButton("Force upload", partial(self.push_thread, wallet), partial(self.done_processing, d)) download = ThreadedButton("Force download", partial(self.pull_thread, wallet, True), partial(self.done_processing, d)) vbox = QVBoxLayout() vbox.addWidget(upload) vbox.addWidget(download) hbox.addLayout(vbox) vbox = QVBoxLayout(d) vbox.addLayout(hbox) vbox.addSpacing(20) vbox.addLayout(Buttons(OkButton(d))) return bool(d.exec_())
def _name_multisig_account(self): dialog = WindowModalDialog(None, "Create Multisig Account") vbox = QVBoxLayout() label = QLabel( _("Enter a descriptive name for your multisig account.\nYou should later be able to use the name to uniquely identify this multisig account" )) hl = QHBoxLayout() hl.addWidget(label) name = QLineEdit() name.setMaxLength(30) name.resize(200, 40) he = QHBoxLayout() he.addWidget(name) okButton = OkButton(dialog) hlb = QHBoxLayout() hlb.addWidget(okButton) hlb.addStretch(2) vbox.addLayout(hl) vbox.addLayout(he) vbox.addLayout(hlb) dialog.setLayout(vbox) dialog.exec_() return name.text().strip()
def passphrase_dialog(self, msg, confirm): # If confirm is true, require the user to enter the passphrase twice parent = self.top_level_window() d = WindowModalDialog(parent, _('Enter Passphrase')) OK_button = OkButton(d, _('Enter Passphrase')) OnDevice_button = QPushButton(_('Enter Passphrase on Device')) new_pw = PasswordLineEdit() conf_pw = PasswordLineEdit() vbox = QVBoxLayout() label = QLabel(msg + "\n") label.setWordWrap(True) grid = QGridLayout() grid.setSpacing(8) grid.setColumnMinimumWidth(0, 150) grid.setColumnMinimumWidth(1, 100) grid.setColumnStretch(1,1) vbox.addWidget(label) grid.addWidget(QLabel(_('Passphrase:')), 0, 0) grid.addWidget(new_pw, 0, 1) if confirm: grid.addWidget(QLabel(_('Confirm Passphrase:')), 1, 0) grid.addWidget(conf_pw, 1, 1) vbox.addLayout(grid) def enable_OK(): if not confirm: ok = True else: ok = new_pw.text() == conf_pw.text() OK_button.setEnabled(ok) new_pw.textChanged.connect(enable_OK) conf_pw.textChanged.connect(enable_OK) vbox.addWidget(OK_button) if self.passphrase_on_device: vbox.addWidget(OnDevice_button) d.setLayout(vbox) self.passphrase = None def ok_clicked(): self.passphrase = new_pw.text() def on_device_clicked(): self.passphrase = PASSPHRASE_ON_DEVICE OK_button.clicked.connect(ok_clicked) OnDevice_button.clicked.connect(on_device_clicked) OnDevice_button.clicked.connect(d.accept) d.exec_() self.done.set()
def __init__(self, main_win, outputs): WindowModalDialog.__init__(self, main_win, title=_("New scheduled payment"),) vbox = QVBoxLayout(self) self.setMinimumSize(400, 150) minute_label = HelpLabel(_('minute:'), _(''' Defines a specific minute for an hour. Allowed characters: "*" any value "," value list separator "-" range of values "/" step values 0-59 allowed values ''')) hour_label = HelpLabel(_('hour:'), _(''' Defines a specific hour during the day. Allowed characters: "*" any value "," value list separator "-" range of values "/" step values 0-23 allowed values ''')) day_label = HelpLabel(_('day of month:'), _(''' Defines the day number for the month. Allowed characters: "*" any value "," value list separator "-" range of values "/" step values 0-31 allowed values ''')) month_label = HelpLabel(_('month:'), _(''' Defines a month during the year. Allowed characters: "*" any value "," value list separator "-" range of values "/" step values 1-12 allowed values ''')) week_label = HelpLabel(_('day of week:'), _(''' Specifies the day of the week. Allowed characters: "*" any value "," value list separator "-" range of values "/" step values 0-6 allowed values ''')) self.minute_edit = QLineEdit('*') self.minute_edit.setFixedWidth(30) self.minute_edit.textChanged.connect(self.update_schedule_details) self.hour_edit = QLineEdit('*') self.hour_edit.setFixedWidth(30) self.hour_edit.textChanged.connect(self.update_schedule_details) self.day_edit = QLineEdit('*') self.day_edit.setFixedWidth(30) self.day_edit.textChanged.connect(self.update_schedule_details) self.month_edit = QLineEdit('*') self.month_edit.setFixedWidth(30) self.month_edit.textChanged.connect(self.update_schedule_details) self.week_edit = QLineEdit('*') self.week_edit.setFixedWidth(30) self.week_edit.textChanged.connect(self.update_schedule_details) grid = QGridLayout() grid.addWidget(minute_label, 0, 0, alignment=Qt.AlignCenter) grid.addWidget(hour_label, 0, 1, alignment=Qt.AlignCenter) grid.addWidget(day_label, 0, 2, alignment=Qt.AlignCenter) grid.addWidget(month_label, 0, 3, alignment=Qt.AlignCenter) grid.addWidget(week_label, 0, 4, alignment=Qt.AlignCenter) grid.addWidget(self.minute_edit, 1, 0, alignment=Qt.AlignCenter) grid.addWidget(self.hour_edit, 1, 1, alignment=Qt.AlignCenter) grid.addWidget(self.day_edit, 1, 2, alignment=Qt.AlignCenter) grid.addWidget(self.month_edit, 1, 3, alignment=Qt.AlignCenter) grid.addWidget(self.week_edit, 1, 4, alignment=Qt.AlignCenter) every_day = QPushButton('every day') every_day.clicked.connect(lambda: self.set_as_text('0 0 * * *')) every_week = QPushButton('every week') every_week.clicked.connect(lambda: self.set_as_text('0 0 * * 0')) every_month = QPushButton('every month') every_month.clicked.connect(lambda: self.set_as_text('0 0 1 * *')) every_year = QPushButton('every year') every_year.clicked.connect(lambda: self.set_as_text('0 0 1 1 *')) self.schedule_details = QLabel('') vbox.addLayout(grid) vbox.addLayout(Buttons(every_day, every_week, every_month, every_year)) vbox.addWidget(self.schedule_details) vbox.addStretch() vbox.addLayout(Buttons(CloseButton(self), OkButton(self))) self.update_schedule_details()
def create_settings_window(small_window): window = get_parent_main_window(small_window) d = WindowModalDialog(window, _("Bitpost settings")) vbox = QVBoxLayout(d) d.setMinimumSize(500, 200) hbox_maxfee = QHBoxLayout() hbox_maxfee.addWidget(QLabel("Default max fee to use")) max_fees_e = QLineEdit() max_fees_e.setText(str(window.config.get('bitpost_max_fee'))) hbox_maxfee.addWidget(max_fees_e) fee_combo = QComboBox() fee_combo_values = get_fee_units(window, window.config.get('bitpost_max_fee_unit')) fee_combo.addItems(fee_combo_values) hbox_maxfee.addWidget(fee_combo) help_button__max_fee = QPushButton("?") help_button__max_fee.clicked.connect( lambda: d.show_message(HelpTexts.max_fee)) hbox_maxfee.addWidget(help_button__max_fee) vbox.addLayout(hbox_maxfee) empty_line = QHBoxLayout() empty_line.addWidget(QLabel("")) vbox.addLayout(empty_line) advanced_settings_title = QHBoxLayout() advanced_settings_title.addStretch() advanced_settings_title.addWidget(QLabel("<b>Notifications</b>")) advanced_settings_title.addStretch() vbox.addLayout(advanced_settings_title) telegram_reminder = QLabel( _("<b>Remember to start <a href='https:/t.me/bitpostbot'>@BitpostBot</a></b>" )) telegram_reminder.setVisible(True if window.config.get( 'bitpost_notification_platform') == 'Telegram' else False) telegram_reminder.setOpenExternalLinks(True) platform_address = QHBoxLayout() platform_address.addWidget(QLabel("Platform")) platform_combo = QComboBox() fee_combo_values = ['None', 'Email', 'Twitter', 'Telegram'] platform_combo.addItems(fee_combo_values) platform_combo.setCurrentText( window.config.get('bitpost_notification_platform')) platform_combo.currentTextChanged.connect( lambda: telegram_reminder.setVisible(True) if platform_combo. currentText() == 'Telegram' else telegram_reminder.setVisible(False)) platform_address.addWidget(platform_combo) platform_address.addWidget(QLabel("Address/handle")) vbox.addLayout(platform_address) address_input = QLineEdit() address_input.setText(window.config.get('bitpost_notification_address', '')) platform_address.addWidget(address_input) vbox.addWidget(telegram_reminder) subscription_title = QHBoxLayout() subscription_title.addWidget(QLabel("Subscriptions")) subscriptions_help = QPushButton("?") subscriptions_help.clicked.connect( lambda: d.show_message(HelpTexts.subscriptions)) subscription_title.addWidget(subscriptions_help) subscription_title.addStretch() vbox.addLayout(subscription_title) subscriptions = { subscription['name'] for subscription in window.config.get( 'bitpost_notification_subscriptions') } subscriptions1 = QVBoxLayout() overdue_checkbox = QCheckBox("Overdue") if 'overdue' in subscriptions: overdue_checkbox.setChecked(True) subscriptions1.addWidget(overdue_checkbox) mined_checkbox = QCheckBox("Mined") if 'mine' in subscriptions: mined_checkbox.setChecked(True) subscriptions1.addWidget(mined_checkbox) max_fee_reached_checkbox = QCheckBox("Maximum fee reached") if 'reached' in subscriptions: max_fee_reached_checkbox.setChecked(True) subscriptions1.addWidget(max_fee_reached_checkbox) vbox.addLayout(subscriptions1) reorg_checkbox = QCheckBox("Block reorganization") if 'orphaned_block' in subscriptions: reorg_checkbox.setChecked(True) subscriptions1.addWidget(reorg_checkbox) orphaned_checkbox = QCheckBox("Child transaction orphaned") if '' in subscriptions: orphaned_checkbox.setChecked(True) subscriptions1.addWidget(orphaned_checkbox) advanced_settings_title = QHBoxLayout() advanced_settings_title.addStretch() advanced_settings_title.addWidget(QLabel("<b>Advanced Settings</b>")) advanced_settings_title.addStretch() vbox.addLayout(advanced_settings_title) hbox_ntx = QHBoxLayout() hbox_ntx.addWidget(QLabel("Default number of Txs")) num_txs_e = QLineEdit() num_txs_e.setText(str(window.config.get('bitpost_num_txs'))) hbox_ntx.addWidget(num_txs_e) help_button__num_txs = QPushButton("?") help_button__num_txs.clicked.connect( lambda: d.show_message(HelpTexts.num_txs)) hbox_ntx.addWidget(help_button__num_txs) vbox.addLayout(hbox_ntx) broadcast_policy = QHBoxLayout() broadcast_policy.addWidget(QLabel("First broadcast policy")) broadcast_policy_combo = QComboBox() # 'Broadcast lowest fee transaction immediatly' broadcast_policy_options = [ 'Don\'t delay first broadcast', 'Allow delay of first broadcast' ] if window.config.get('bitpost_delay') == 1: broadcast_policy_options.reverse() broadcast_policy_combo.addItems(broadcast_policy_options) broadcast_policy.addWidget(broadcast_policy_combo) help_button__broadcast_policy = QPushButton("?") help_button__broadcast_policy.clicked.connect( lambda: d.show_message(HelpTexts.delay)) broadcast_policy.addWidget(help_button__broadcast_policy) vbox.addLayout(broadcast_policy) vbox.addStretch() vbox.addLayout(Buttons(CloseButton(d), OkButton(d))) if not d.exec_(): return window.config.set_key('bitpost_max_fee_unit', fee_combo.currentText()) delay = 1 if broadcast_policy_combo.currentText( ) == 'Allow delay of first broadcast' else 0 window.config.set_key('bitpost_delay', delay) platform_text = platform_combo.currentText() window.config.set_key('bitpost_notification_platform', platform_text) subscriptions = [] if overdue_checkbox.isChecked(): subscriptions.append({'name': 'overdue'}) if mined_checkbox.isChecked(): subscriptions.append({'name': 'mine'}) if max_fee_reached_checkbox.isChecked(): subscriptions.append({'name': 'reached'}) if reorg_checkbox.isChecked(): subscriptions.append({'name': 'orphaned_block'}) if orphaned_checkbox.isChecked(): pass # TODO window.config.set_key('bitpost_notification_subscriptions', subscriptions) try: window.config.set_key('bitpost_max_fee', float(max_fees_e.text())) except: d.show_error('Invalid maximum fee, must be a number.') create_settings_window(small_window) try: window.config.set_key('bitpost_num_txs', int(num_txs_e.text())) except: d.show_error( 'Invalid default number of transactions, must be an integer') create_settings_window(small_window) if not valid_address(platform_combo.currentText(), address_input.text()): d.show_error('Invalid handle/address for ' + platform_combo.currentText()) create_settings_window(small_window) window.config.set_key('bitpost_notification_address', address_input.text())