change remove tabs for verify/sign
[electrum-nvc.git] / gui / qt / main_window.py
index c818952..bba7e8f 100644 (file)
@@ -20,6 +20,7 @@ import sys, time, datetime, re, threading
 from electrum.i18n import _, set_language
 from electrum.util import print_error, print_msg
 import os.path, json, ast, traceback
+import webbrowser
 import shutil
 import StringIO
 
@@ -408,6 +409,9 @@ class ElectrumWindow(QMainWindow):
         plugins_labels = tools_menu.addAction(_("&Plugins"))
         plugins_labels.triggered.connect(self.plugins_dialog)
 
+        verifymessage = tools_menu.addAction(_("&Verify message"))
+        verifymessage.triggered.connect(self.verify_message)
+
         tools_menu.addSeparator()
 
         csv_transaction_menu = tools_menu.addMenu(_("&Create transaction"))
@@ -594,6 +598,7 @@ class ElectrumWindow(QMainWindow):
         menu.addAction(_("Copy ID to Clipboard"), lambda: self.app.clipboard().setText(tx_hash))
         menu.addAction(_("Details"), lambda: self.show_transaction(self.wallet.transactions.get(tx_hash)))
         menu.addAction(_("Edit description"), lambda: self.tx_label_clicked(item,2))
+        menu.addAction(_("View on Blockchain.info"), lambda: webbrowser.open("https://blockchain.info/tx/" + tx_hash))
         menu.exec_(self.contacts_list.viewport().mapToGlobal(position))
 
 
@@ -1149,7 +1154,7 @@ class ElectrumWindow(QMainWindow):
             menu.addAction(_("Edit label"), lambda: self.edit_label(True))
             if self.wallet.seed:
                 menu.addAction(_("Private key"), lambda: self.show_private_key(addr))
-                menu.addAction(_("Sign message"), lambda: self.sign_message(addr))
+                menu.addAction(_("Sign message"), lambda: self.sign_message(True,addr))
             if addr in self.wallet.imported_keys:
                 menu.addAction(_("Remove from wallet"), lambda: self.delete_imported_key(addr))
 
@@ -1700,6 +1705,7 @@ class ElectrumWindow(QMainWindow):
         keys.setReadOnly(True)
         keys.setText('\n'.join(pk_list))
         vbox.addWidget(keys)
+        vbox.addWidget( QRCodeWidget('\n'.join(pk_list)) )
         vbox.addLayout(close_button(d))
         d.setLayout(vbox)
         d.exec_()
@@ -1715,16 +1721,26 @@ class ElectrumWindow(QMainWindow):
         except Exception as e:
             self.show_message(str(e))
 
-    def sign_message(self, address):
-        if not address: return
+    def do_verify(self, address, message, signature):
+        message = unicode(message.toPlainText())
+        message = message.encode('utf-8')
+        if bitcoin.verify_message(address.text(), str(signature.toPlainText()), message):
+            self.show_message(_("Signature verified"))
+        else:
+            self.show_message(_("Error: wrong signature"))
+
+
+    def sign_message(self, sign, address):
+        if sign and not address: return
         d = QDialog(self)
         d.setModal(1)
-        d.setWindowTitle(_('Sign Message'))
+        if sign:
+            d.setWindowTitle(_('Sign Message'))
+        elif not sign:
+            d.setWindowTitle(_('Verify Message'))
         d.setMinimumSize(410, 290)
 
-        tab_widget = QTabWidget()
-        tab = QWidget()
-        layout = QGridLayout(tab)
+        layout = QGridLayout(d)
 
         sign_address = QLineEdit()
 
@@ -1742,61 +1758,23 @@ class ElectrumWindow(QMainWindow):
         layout.addWidget(sign_signature, 3, 1)
         layout.setRowStretch(3,1)
 
-
-        hbox = QHBoxLayout()
-        b = QPushButton(_("Sign"))
-        hbox.addWidget(b)
-        b.clicked.connect(lambda: self.do_sign(sign_address, sign_message, sign_signature))
-        b = QPushButton(_("Close"))
-        b.clicked.connect(d.accept)
-        hbox.addWidget(b)
-        layout.addLayout(hbox, 4, 1)
-        tab_widget.addTab(tab, _("Sign"))
-
-
-        tab = QWidget()
-        layout = QGridLayout(tab)
-
-        verify_address = QLineEdit()
-        layout.addWidget(QLabel(_('Address')), 1, 0)
-        layout.addWidget(verify_address, 1, 1)
-
-        verify_message = QTextEdit()
-        layout.addWidget(QLabel(_('Message')), 2, 0)
-        layout.addWidget(verify_message, 2, 1)
-        layout.setRowStretch(2,3)
-
-        verify_signature = QTextEdit()
-        layout.addWidget(QLabel(_('Signature')), 3, 0)
-        layout.addWidget(verify_signature, 3, 1)
-        layout.setRowStretch(3,1)
-
-        def do_verify():
-            message = unicode(verify_message.toPlainText())
-            message = message.encode('utf-8')
-            if bitcoin.verify_message(verify_address.text(), str(verify_signature.toPlainText()), message):
-                self.show_message(_("Signature verified"))
-            else:
-                self.show_message(_("Error: wrong signature"))
-
         hbox = QHBoxLayout()
-        b = QPushButton(_("Verify"))
-        b.clicked.connect(do_verify)
+        if sign:
+            b = QPushButton(_("Sign"))
+        elif not sign:
+            b = QPushButton(_("Verify"))
         hbox.addWidget(b)
+        if sign:
+            b.clicked.connect(lambda: self.do_sign(sign_address, sign_message, sign_signature))
+        elif not sign:
+            b.clicked.connect(lambda: self.do_verify(sign_address, sign_message, sign_signature))
         b = QPushButton(_("Close"))
         b.clicked.connect(d.accept)
         hbox.addWidget(b)
         layout.addLayout(hbox, 4, 1)
-        tab_widget.addTab(tab, _("Verify"))
-
-        vbox = QVBoxLayout()
-        vbox.addWidget(tab_widget)
-        d.setLayout(vbox)
         d.exec_()
 
 
-
-
     def question(self, msg):
         return QMessageBox.question(self, _('Message'), msg, QMessageBox.Yes | QMessageBox.No, QMessageBox.No) == QMessageBox.Yes
 
@@ -1904,15 +1882,25 @@ class ElectrumWindow(QMainWindow):
 
     def do_process_from_csvReader(self, csvReader):
         outputs = []
+        errors = []
+        errtext = ""
         try:
-            for row in csvReader:
+            for position, row in enumerate(csvReader):
                 address = row[0]
+                if not is_valid(address):
+                    errors.append((position, address))
+                    continue
                 amount = Decimal(row[1])
                 amount = int(100000000*amount)
                 outputs.append((address, amount))
         except (ValueError, IOError, os.error), reason:
             QMessageBox.critical(None, _("Unable to read file or no transaction found"), _("Electrum was unable to open your transaction file") + "\n" + str(reason))
             return
+        if errors != []:
+            for x in errors:
+                errtext += "CSV Row " + str(x[0]+1) + ": " + x[1] + "\n"
+            QMessageBox.critical(None, _("Invalid Addresses"), _("ABORTING! Invalid Addresses found:") + "\n\n" + errtext)
+            return
 
         try:
             tx = self.wallet.make_unsigned_transaction(outputs, None, None)
@@ -2095,7 +2083,7 @@ class ElectrumWindow(QMainWindow):
         grid.addWidget(unit_combo, 3, 1)
         grid.addWidget(HelpButton(_('Base unit of your wallet.')\
                                              + '\n1BTC=1000mBTC.\n' \
-                                             + _(' This settings affects the fields in the Send tab')+' '), 3, 2)
+                                             + _(' These settings affects the fields in the Send tab')+' '), 3, 2)
 
         usechange_cb = QCheckBox(_('Use change addresses'))
         usechange_cb.setChecked(self.wallet.use_change)
@@ -2175,6 +2163,8 @@ class ElectrumWindow(QMainWindow):
         event.accept()
 
 
+    def verify_message(self):
+        self.sign_message(False, "")
 
     def plugins_dialog(self):
         from electrum.plugins import plugins