tadd can_edit_fee option, and improve settings dialog - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit 54f3c9f35b7f82c92f60a7994a8a743b9bb34e43 DIR parent f643c3b44abd6ddddb6a619b286a2e6609ee306c HTML Author: ThomasV <thomasv@gitorious> Date: Wed, 27 Aug 2014 22:49:35 +0200 add can_edit_fee option, and improve settings dialog Diffstat: M gui/qt/main_window.py | 160 +++++++++++++++++-------------- 1 file changed, 88 insertions(+), 72 deletions(-) --- DIR diff --git a/gui/qt/main_window.py b/gui/qt/main_window.py t@@ -898,13 +898,16 @@ class ElectrumWindow(QMainWindow): grid.addWidget(self.amount_e, 4, 1, 1, 2) grid.addWidget(self.amount_help, 4, 3) + self.fee_e_label = QLabel(_('Fee')) self.fee_e = BTCAmountEdit(self.get_decimal_point) - grid.addWidget(QLabel(_('Fee')), 5, 0) + grid.addWidget(self.fee_e_label, 5, 0) grid.addWidget(self.fee_e, 5, 1, 1, 2) - grid.addWidget(HelpButton( - _('Bitcoin transactions are in general not free. A transaction fee is paid by the sender of the funds.') + '\n\n'\ - + _('The amount of fee can be decided freely by the sender. However, transactions with low fees take more time to be processed.') + '\n\n'\ - + _('A suggested fee is automatically added to this field. You may override it. The suggested fee increases with the size of the transaction.')), 5, 3) + msg = _('Bitcoin transactions are in general not free. A transaction fee is paid by the sender of the funds.') + '\n\n'\ + + _('The amount of fee can be decided freely by the sender. However, transactions with low fees take more time to be processed.') + '\n\n'\ + + _('A suggested fee is automatically added to this field. You may override it. The suggested fee increases with the size of the transaction.') + self.fee_e_help = HelpButton(msg) + grid.addWidget(self.fee_e_help, 5, 3) + self.update_fee_edit() self.send_button = EnterButton(_("Send"), self.do_send) grid.addWidget(self.send_button, 6, 1) t@@ -970,6 +973,12 @@ class ElectrumWindow(QMainWindow): run_hook('create_send_tab', grid) return w + def update_fee_edit(self): + b = self.config.get('can_edit_fees', False) + self.fee_e.setVisible(b) + self.fee_e_label.setVisible(b) + self.fee_e_help.setVisible(b) + def from_list_delete(self, item): i = self.from_list.indexOfTopLevelItem(item) self.pay_from.pop(i) t@@ -1054,10 +1063,14 @@ class ElectrumWindow(QMainWindow): if not self.question(_("send %(amount)s to %(address)s?")%{ 'amount' : self.format_amount(amount) + ' '+ self.base_unit(), 'address' : o}): return - confirm_fee = self.config.get('confirm_fee', 100000) - if fee >= confirm_fee: - if not self.question(_("The fee for this transaction seems unusually high.\nAre you really sure you want to pay %(fee)s in fees?")%{ 'fee' : self.format_amount(fee) + ' '+ self.base_unit()}): + if not self.config.get('can_edit_fees', False): + if not self.question(_("A fee of %(fee)s will be added to this transaction.\nProceed?")%{ 'fee' : self.format_amount(fee) + ' '+ self.base_unit()}): return + else: + confirm_fee = self.config.get('confirm_fee', 100000) + if fee >= confirm_fee: + if not self.question(_("The fee for this transaction seems unusually high.\nAre you really sure you want to pay %(fee)s in fees?")%{ 'fee' : self.format_amount(fee) + ' '+ self.base_unit()}): + return coins = self.get_coins() return outputs, fee, label, coins t@@ -2496,6 +2509,7 @@ class ElectrumWindow(QMainWindow): def settings_dialog(self): + self.need_restart = False d = QDialog(self) d.setWindowTitle(_('Electrum Settings')) d.setModal(1) t@@ -2512,6 +2526,16 @@ class ElectrumWindow(QMainWindow): grid.addWidget(HelpButton(msg), 0, 2) if not self.config.is_modifiable('num_zeros'): for w in [nz_e, nz_label]: w.setEnabled(False) + def on_nz(): + nz = nz_e.get_amount() + if nz>8: + nz = 8 + if self.num_zeros != nz: + self.num_zeros = nz + self.config.set_key('num_zeros', nz, True) + self.update_history_tab() + self.update_address_tab() + nz_e.editingFinished.connect(on_nz) lang_label=QLabel(_('Language') + ':') grid.addWidget(lang_label, 1, 0) t@@ -2527,7 +2551,12 @@ class ElectrumWindow(QMainWindow): grid.addWidget(HelpButton(_('Select which language is used in the GUI (after restart).')+' '), 1, 2) if not self.config.is_modifiable('language'): for w in [lang_combo, lang_label]: w.setEnabled(False) - + def on_lang(x): + lang_request = languages.keys()[lang_combo.currentIndex()] + if lang_request != self.config.get('language'): + self.config.set_key("language", lang_request, True) + self.need_restart = True + lang_combo.currentIndexChanged.connect(on_lang) fee_label = QLabel(_('Transaction fee') + ':') grid.addWidget(fee_label, 2, 0) t@@ -2539,6 +2568,10 @@ class ElectrumWindow(QMainWindow): grid.addWidget(HelpButton(msg), 2, 2) if not self.config.is_modifiable('fee_per_kb'): for w in [fee_e, fee_label]: w.setEnabled(False) + def on_fee(): + fee = fee_e.get_amount() + self.wallet.set_fee(fee) + fee_e.editingFinished.connect(on_fee) units = ['BTC', 'mBTC', 'bits'] unit_label = QLabel(_('Base unit') + ':') t@@ -2547,15 +2580,38 @@ class ElectrumWindow(QMainWindow): unit_combo.addItems(units) unit_combo.setCurrentIndex(units.index(self.base_unit())) grid.addWidget(unit_combo, 3, 1) - grid.addWidget(HelpButton(_('Base unit of your wallet.')\ - + '\n1BTC=1000mBTC.\n' \ - + _(' These settings affects the fields in the Send tab')+' '), 3, 2) + msg = _('Base unit of your wallet.')\ + + '\n1BTC=1000mBTC.\n' \ + + _(' These settings affects the fields in the Send tab')+' ' + grid.addWidget(HelpButton(msg), 3, 2) + def on_unit(x): + unit_result = units[unit_combo.currentIndex()] + if self.base_unit() == unit_result: + return + if unit_result == 'BTC': + self.decimal_point = 8 + elif unit_result == 'mBTC': + self.decimal_point = 5 + elif unit_result == 'bits': + self.decimal_point = 2 + else: + raise Exception('Unknown base unit') + self.config.set_key('decimal_point', self.decimal_point, True) + self.update_history_tab() + self.update_status() + unit_combo.currentIndexChanged.connect(on_unit) usechange_cb = QCheckBox(_('Use change addresses')) usechange_cb.setChecked(self.wallet.use_change) grid.addWidget(usechange_cb, 4, 0) grid.addWidget(HelpButton(_('Using change addresses makes it more difficult for other people to track your transactions.')+' '), 4, 2) if not self.config.is_modifiable('use_change'): usechange_cb.setEnabled(False) + def on_usechange(x): + usechange_result = x == Qt.Checked + if self.wallet.use_change != usechange_result: + self.wallet.use_change = usechange_result + self.wallet.storage.put('use_change', self.wallet.use_change) + usechange_cb.stateChanged.connect(on_usechange) block_explorers = ['Blockchain.info', 'Blockr.io', 'Insight.is', "Blocktrail.com"] block_ex_label = QLabel(_('Online Block Explorer') + ':') t@@ -2565,19 +2621,21 @@ class ElectrumWindow(QMainWindow): block_ex_combo.setCurrentIndex(block_explorers.index(self.config.get('block_explorer', 'Blockchain.info'))) grid.addWidget(block_ex_combo, 5, 1) grid.addWidget(HelpButton(_('Choose which online block explorer to use for functions that open a web browser')+' '), 5, 2) + def on_be(x): + be_result = block_explorers[block_ex_combo.currentIndex()] + self.config.set_key('block_explorer', be_result, True) + block_ex_combo.currentIndexChanged.connect(on_be) show_tx = self.config.get('show_before_broadcast', False) showtx_cb = QCheckBox(_('Show before broadcast')) showtx_cb.setChecked(show_tx) grid.addWidget(showtx_cb, 6, 0) grid.addWidget(HelpButton(_('Display the details of your transactions before broadcasting it.')), 6, 2) - + showtx_cb.stateChanged.connect(lambda x: self.config.set_key('show_before_broadcast', showtx_cb.isChecked())) from electrum import qrscanner system_cameras = qrscanner._find_system_cameras() qr_combo = QComboBox() - on_change = lambda x: self.config.set_key("video_device", str(qr_combo.itemData(x).toString()), True) - qr_combo.currentIndexChanged.connect(on_change) qr_combo.addItem("Default","default") for camera, device in system_cameras.items(): qr_combo.addItem(camera, device) t@@ -2590,74 +2648,32 @@ class ElectrumWindow(QMainWindow): qr_combo.setEnabled(qrscanner.zbar is not None) help_msg = _("Install the zbar package to enable this.\nOn linux, type: 'apt-get install python-zbar'") grid.addWidget(HelpButton(help_msg), 7, 2) + on_video_device = lambda x: self.config.set_key("video_device", str(qr_combo.itemData(x).toString()), True) + qr_combo.currentIndexChanged.connect(on_video_device) + + can_edit_fees_cb = QCheckBox(_('Set transaction fees manually')) + can_edit_fees_cb.setChecked(self.config.get('can_edit_fees', False)) + grid.addWidget(can_edit_fees_cb, 8, 0) + grid.addWidget(HelpButton(_('This option lets you edit fees in the send tab.')+' '), 8, 2) + def on_editfees(x): + self.config.set_key('can_edit_fees', x == Qt.Checked) + self.update_fee_edit() + can_edit_fees_cb.stateChanged.connect(on_editfees) vbox.addLayout(grid) vbox.addStretch(1) - vbox.addLayout(ok_cancel_buttons(d)) + vbox.addLayout(close_button(d)) d.setLayout(vbox) # run the dialog - if not d.exec_(): return - - fee = fee_e.get_amount() - if fee is None: - QMessageBox.warning(self, _('Error'), _('Invalid value') +': %s'%fee, _('OK')) - return - - self.wallet.set_fee(fee) - - nz = unicode(nz_e.text()) - try: - nz = int( nz ) - if nz>8: nz=8 - except Exception: - QMessageBox.warning(self, _('Error'), _('Invalid value')+':%s'%nz, _('OK')) - return - - if self.num_zeros != nz: - self.num_zeros = nz - self.config.set_key('num_zeros', nz, True) - self.update_history_tab() - self.update_address_tab() - - usechange_result = usechange_cb.isChecked() - if self.wallet.use_change != usechange_result: - self.wallet.use_change = usechange_result - self.wallet.storage.put('use_change', self.wallet.use_change) - - if showtx_cb.isChecked() != show_tx: - self.config.set_key('show_before_broadcast', not show_tx) - - unit_result = units[unit_combo.currentIndex()] - if self.base_unit() != unit_result: - if unit_result == 'BTC': - self.decimal_point = 8 - elif unit_result == 'mBTC': - self.decimal_point = 5 - elif unit_result == 'bits': - self.decimal_point = 2 - else: - raise Exception('Unknown base unit') - self.config.set_key('decimal_point', self.decimal_point, True) - self.update_history_tab() - self.update_status() - - need_restart = False - - lang_request = languages.keys()[lang_combo.currentIndex()] - if lang_request != self.config.get('language'): - self.config.set_key("language", lang_request, True) - need_restart = True - - be_result = block_explorers[block_ex_combo.currentIndex()] - self.config.set_key('block_explorer', be_result, True) + d.exec_() run_hook('close_settings_dialog') - - if need_restart: + if self.need_restart: QMessageBox.warning(self, _('Success'), _('Please restart Electrum to activate the new GUI settings'), _('OK')) + def run_network_dialog(self): if not self.network: return