URI: 
       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