store output type explicitly in tuple
[electrum-nvc.git] / gui / qt / transaction_dialog.py
index dc315a9..a2bd33b 100644 (file)
@@ -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)
 
@@ -92,21 +95,32 @@ class TxDialog(QDialog):
         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):
-        name = 'signed_%s.txn' % (self.tx.hash()[0:8]) if self.tx.is_complete else 'unsigned.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:
@@ -118,10 +132,13 @@ class TxDialog(QDialog):
     def update(self):
 
         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():
@@ -130,24 +147,21 @@ class TxDialog(QDialog):
                     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
-            if not self.wallet.is_watching_only():
-                self.sign_button.show()
-            else:
-                self.sign_button.hide()
             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)
@@ -155,6 +169,12 @@ 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: 
@@ -168,29 +188,31 @@ class TxDialog(QDialog):
         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)
@@ -199,14 +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))
-        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'))