X-Git-Url: https://git.novaco.in/?a=blobdiff_plain;f=gui%2Fqt%2Ftransaction_dialog.py;h=a2bd33b22ac9b8bf3249efe23fe052aa09c5073a;hb=1bb00ff5af3a7f23f23c92b69cc2ff412731a7f3;hp=ec184eb40fc0dfbc808dc54d807ffe55f0b829c8;hpb=4524c107cf867eec17c1d1f2cd51d872ca79914f;p=electrum-nvc.git diff --git a/gui/qt/transaction_dialog.py b/gui/qt/transaction_dialog.py index ec184eb..a2bd33b 100644 --- a/gui/qt/transaction_dialog.py +++ b/gui/qt/transaction_dialog.py @@ -26,7 +26,7 @@ import StringIO try: import PyQt4 -except: +except Exception: sys.exit("Error: Could not import PyQt4 on Linux systems, you may try 'sudo apt-get install python-qt4'") from PyQt4.QtGui import * @@ -34,6 +34,8 @@ from PyQt4.QtCore import * import PyQt4.QtCore as QtCore from electrum import transaction +from electrum.plugins import run_hook + from util import MyTreeWidget class TxDialog(QDialog): @@ -70,7 +72,7 @@ class TxDialog(QDialog): vbox.addStretch(1) - buttons = QHBoxLayout() + self.buttons = buttons = QHBoxLayout() vbox.addLayout( buttons ) buttons.addStretch(1) @@ -80,7 +82,8 @@ class TxDialog(QDialog): buttons.addWidget(b) self.broadcast_button = b = QPushButton(_("Broadcast")) - b.clicked.connect(self.broadcast) + b.clicked.connect(lambda: self.parent.broadcast_transaction(self.tx)) + b.hide() buttons.addWidget(b) @@ -91,21 +94,34 @@ class TxDialog(QDialog): cancelButton = QPushButton(_("Close")) cancelButton.clicked.connect(lambda: self.done(0)) buttons.addWidget(cancelButton) + cancelButton.setDefault(True) + + b = QPushButton() + b.setIcon(QIcon(":icons/qrcode.png")) + b.clicked.connect(self.show_qr) + buttons.insertWidget(1,b) + run_hook('transaction_dialog', self) + self.update() + def show_qr(self): + text = self.tx.raw.decode('hex') + try: + self.parent.show_qrcode(text, 'Transaction') + except Exception as e: + self.show_message(str(e)) def sign(self): - tx_dict = self.tx.as_dict() - input_info = json.loads(tx_dict["input_info"]) - self.parent.sign_raw_transaction(self.tx, input_info) + self.parent.sign_raw_transaction(self.tx) self.update() def save(self): - fileName = self.parent.getSaveFileName(_("Select where to save your signed transaction"), 'signed_%s.txn' % (self.tx.hash()[0:8]), "*.txn") + name = 'signed_%s.txn' % (self.tx.hash()[0:8]) if self.tx.is_complete() else 'unsigned.txn' + fileName = self.parent.getSaveFileName(_("Select where to save your signed transaction"), name, "*.txn") if fileName: with open(fileName, "w+") as f: f.write(json.dumps(self.tx.as_dict(),indent=4) + '\n') @@ -114,34 +130,38 @@ class TxDialog(QDialog): def update(self): - tx_hash = self.tx.hash() is_relevant, is_mine, v, fee = self.wallet.get_tx_value(self.tx) - - if self.tx.is_complete: - status = _("Status: Signed") + if self.wallet.can_sign(self.tx): + self.sign_button.show() + else: self.sign_button.hide() + if self.tx.is_complete(): + status = _("Signed") + tx_hash = self.tx.hash() + if tx_hash in self.wallet.transactions.keys(): conf, timestamp = self.wallet.verifier.get_confirmations(tx_hash) if timestamp: time_str = datetime.datetime.fromtimestamp(timestamp).isoformat(' ')[:-3] else: time_str = 'pending' - status = _("Status: %d confirmations")%conf + status = _("%d confirmations")%conf self.broadcast_button.hide() else: time_str = None conf = 0 self.broadcast_button.show() else: - status = _("Status: Unsigned") + s, r = self.tx.signature_count() + status = _("Unsigned") if s == 0 else _('Partially signed (%d/%d)'%(s,r)) time_str = None - self.sign_button.show() self.broadcast_button.hide() + tx_hash = 'unknown' self.tx_hash_e.setText(tx_hash) - self.status_label.setText(status) + self.status_label.setText(_('Status:') + ' ' + status) if time_str is not None: self.date_label.setText(_("Date: %s")%time_str) @@ -149,42 +169,50 @@ class TxDialog(QDialog): else: self.date_label.hide() + # if we are not synchronized, we cannot tell + if self.parent.network is None or not self.parent.network.is_running() or not self.parent.network.is_connected(): + return + if not self.wallet.up_to_date: + return + if is_relevant: if is_mine: if fee is not None: self.amount_label.setText(_("Amount sent:")+' %s'% self.parent.format_amount(v-fee) + ' ' + self.parent.base_unit()) - self.fee_label.setText(_("Transaction fee:")+' %s'% self.parent.format_amount(fee) + ' ' + self.parent.base_unit()) + self.fee_label.setText(_("Transaction fee")+': %s'% self.parent.format_amount(fee) + ' ' + self.parent.base_unit()) else: self.amount_label.setText(_("Amount sent:")+' %s'% self.parent.format_amount(v) + ' ' + self.parent.base_unit()) - self.fee_label.setText(_("Transaction fee: unknown")) + self.fee_label.setText(_("Transaction fee")+': '+ _("unknown")) else: self.amount_label.setText(_("Amount received:")+' %s'% self.parent.format_amount(v) + ' ' + self.parent.base_unit()) else: self.amount_label.setText(_("Transaction unrelated to your wallet")) + run_hook('transaction_dialog_update', self) - def exec_menu(self, position,l): - item = l.itemAt(position) - if not item: return - addr = unicode(item.text(0)) - menu = QMenu() - menu.addAction(_("Copy to clipboard"), lambda: self.parent.app.clipboard().setText(addr)) - menu.exec_(l.viewport().mapToGlobal(position)) def add_io(self, vbox): - vbox.addWidget(QLabel(_("Inputs"))) - lines = map(lambda x: x.get('address') , self.tx.inputs ) + if self.tx.locktime > 0: + vbox.addWidget(QLabel("LockTime: %d\n" % self.tx.locktime)) - i_text = QTextEdit('\n'.join(lines)) + vbox.addWidget(QLabel(_("Inputs"))) + def format_input(x): + if x.get('is_coinbase'): + return 'coinbase' + else: + _hash = x.get('prevout_hash') + return _hash[0:16] + '...' + _hash[-8:] + ":%d"%x.get('prevout_n') + u'\t' + "%s"%x.get('address') + lines = map(format_input, self.tx.inputs ) + i_text = QTextEdit() + i_text.setText('\n'.join(lines)) i_text.setReadOnly(True) i_text.setMaximumHeight(100) vbox.addWidget(i_text) vbox.addWidget(QLabel(_("Outputs"))) - lines = map(lambda x: x[0] + u'\t\t' + self.parent.format_amount(x[1]), self.tx.outputs) - + lines = map(lambda x: x[0] + u'\t\t' + self.parent.format_amount(x[1]), self.tx.get_outputs()) o_text = QTextEdit() o_text.setText('\n'.join(lines)) o_text.setReadOnly(True) @@ -193,16 +221,6 @@ class TxDialog(QDialog): - - def broadcast(self): - result, result_message = self.wallet.sendtx( self.tx ) - if result: - self.show_message(_("Transaction successfully sent:")+' %s' % (result_message)) - if dialog: - dialog.done(0) - else: - self.show_message(_("There was a problem sending your transaction:") + '\n %s' % (result_message)) - def show_message(self, msg): QMessageBox.information(self, _('Message'), msg, _('OK'))