use named callbacks with the interface
[electrum-nvc.git] / lib / gui_qt.py
index d7a13d5..31542bd 100644 (file)
@@ -168,6 +168,26 @@ class QRCodeWidget(QWidget):
         qp.end()
         
 
+def waiting_dialog(f):
+
+    s = Timer()
+    s.start()
+    w = QDialog()
+    w.resize(200, 70)
+    w.setWindowTitle('Electrum')
+    l = QLabel('')
+    vbox = QVBoxLayout()
+    vbox.addWidget(l)
+    w.setLayout(vbox)
+    w.show()
+    def ff():
+        s = f()
+        if s: l.setText(s)
+        else: w.close()
+    w.connect(s, QtCore.SIGNAL('timersignal'), ff)
+    w.exec_()
+    w.destroy()
+
 
 def ok_cancel_buttons(dialog):
     hbox = QHBoxLayout()
@@ -187,7 +207,7 @@ class ElectrumWindow(QMainWindow):
         QMainWindow.__init__(self)
         self.wallet = wallet
         self.config = config
-        self.wallet.register_callback(self.update_callback)
+        self.wallet.interface.register_callback('updated', self.update_callback)
 
         self.detailed_view = config.get('qt_detailed_view', False)
 
@@ -388,19 +408,29 @@ class ElectrumWindow(QMainWindow):
     def address_label_changed(self, item, column, l, column_addr, column_label):
         addr = unicode( item.text(column_addr) )
         text = unicode( item.text(column_label) )
+        changed = False
+
         if text:
             if text not in self.wallet.aliases.keys():
-                self.wallet.labels[addr] = text
+                old_addr = self.wallet.labels.get(text)
+                if old_addr != addr:
+                    self.wallet.labels[addr] = text
+                    changed = True
             else:
                 print_error("Error: This is one of your aliases")
                 label = self.wallet.labels.get(addr,'')
                 item.setText(column_label, QString(label))
         else:
             s = self.wallet.labels.get(addr)
-            if s: self.wallet.labels.pop(addr)
+            if s: 
+                self.wallet.labels.pop(addr)
+                changed = True
+
+        if changed:
+            self.wallet.update_tx_labels()
+            self.update_history_tab()
+            self.update_completions()
 
-        self.update_history_tab()
-        self.update_completions()
 
     def update_history_tab(self):
         self.history_list.clear()
@@ -598,7 +628,10 @@ class ElectrumWindow(QMainWindow):
             self.show_message(str(e))
             return
             
-        status, msg = self.wallet.sendtx( tx )
+        h = self.wallet.send_tx(tx)
+        waiting_dialog(lambda: False if self.wallet.tx_event.isSet() else _("Please wait..."))
+        status, msg = self.wallet.receive_tx( h )
+
         if status:
             QMessageBox.information(self, '', _('Payment sent.')+'\n'+msg, _('OK'))
             self.do_clear()
@@ -970,6 +1003,7 @@ class ElectrumWindow(QMainWindow):
         qr_button.clicked.connect(show_qr_function)
 
         ok_button = QPushButton(_("OK"))
+        ok_button.setDefault(True)
         ok_button.clicked.connect(dialog.accept)
 
         main_layout = QGridLayout()
@@ -1265,8 +1299,8 @@ class ElectrumWindow(QMainWindow):
         gui_label=QLabel(_('Default GUI') + ':')
         grid.addWidget(gui_label , 7, 0)
         gui_combo = QComboBox()
-        gui_combo.addItems(['Lite', 'Qt', 'Gtk'])
-        gui_combo.setCurrentIndex(gui_combo.findText(self.config.get("gui","lite").capitalize()))
+        gui_combo.addItems(['Lite', 'Classic', 'Gtk', 'Text'])
+        gui_combo.setCurrentIndex(gui_combo.findText(self.config.get("gui","classic").capitalize()))
         grid.addWidget(gui_combo, 7, 1)
         grid.addWidget(HelpButton(_('Select which GUI mode to use at start up. ')), 7, 2)
         if not self.config.is_modifiable('gui'):
@@ -1333,11 +1367,11 @@ class ElectrumWindow(QMainWindow):
                 status = _("Connected to")+" %s\n%d blocks"%(interface.host, wallet.blocks)
             else:
                 status = _("Not connected")
-            server = interface.server
         else:
             import random
             status = _("Please choose a server.")
-            server = random.choice( DEFAULT_SERVERS )
+
+        server = interface.server
 
         if not wallet.interface.servers:
             servers_list = []
@@ -1349,12 +1383,12 @@ class ElectrumWindow(QMainWindow):
             
         plist = {}
         for item in servers_list:
-            host, pp = item
+            _host, pp = item
             z = {}
             for item2 in pp:
-                protocol, port = item2
-                z[protocol] = port
-            plist[host] = z
+                _protocol, _port = item2
+                z[_protocol] = _port
+            plist[_host] = z
 
         d = QDialog(parent)
         d.setModal(1)
@@ -1385,20 +1419,20 @@ class ElectrumWindow(QMainWindow):
         server_host.setFixedWidth(200)
         server_port = QLineEdit()
         server_port.setFixedWidth(60)
-        server_protocol.addItems(['TCP', 'HTTP'])
 
-        host, port, protocol = server.split(':')
-        server_host.setText(host)
-        server_port.setText(port)
-        server_protocol.setCurrentIndex(0 if protocol=='t' else 1)
+        protocol_names = ['TCP', 'HTTP', 'TCP/SSL', 'HTTPS']
+        protocol_letters = 'thsg'
+        server_protocol.addItems(protocol_names)
 
         grid.addWidget(QLabel(_('Server') + ':'), 0, 0)
         grid.addWidget(server_protocol, 0, 1)
         grid.addWidget(server_host, 0, 2)
         grid.addWidget(server_port, 0, 3)
 
+        host, port, protocol = server.split(':')
+
         def change_protocol(p):
-            protocol = 't' if p == 0 else 'h'
+            protocol = protocol_letters[p]
             host = unicode(server_host.text())
             pp = plist[host]
             if protocol not in pp.keys():
@@ -1408,32 +1442,49 @@ class ElectrumWindow(QMainWindow):
             server_port.setText( port )
 
         server_protocol.connect(server_protocol, SIGNAL('currentIndexChanged(int)'), change_protocol)
-
-        
-        if wallet.interface.servers:
-            label = _('Active Servers')
-        else:
-            label = _('Default Servers')
         
+        label = _('Active Servers') if wallet.interface.servers else _('Default Servers')
         servers_list_widget = QTreeWidget(parent)
         servers_list_widget.setHeaderLabels( [ label ] )
         servers_list_widget.setMaximumHeight(150)
-        for host in plist.keys():
-            servers_list_widget.addTopLevelItem(QTreeWidgetItem( [ host ] ))
+        for _host in plist.keys():
+            servers_list_widget.addTopLevelItem(QTreeWidgetItem( [ _host ] ))
 
-        def change_server(x):
-            host = unicode(x.text(0))
-            pp = plist[host]
-            if 't' in pp.keys():
-                protocol = 't'
-            else:
-                protocol = pp.keys()[0]
-            port = pp[protocol]
+
+        def change_server(host, protocol=None):
+            pp = plist.get(host,{})
+            if protocol:
+                port = pp.get(protocol)
+                if not port: protocol = None
+                    
+            if not protocol:
+                if not pp:
+                    protocol = 't'
+                    port = '50001'
+                elif 't' in pp.keys():
+                    protocol = 't'
+                    port = pp.get(protocol)
+                else:
+                    protocol = pp.keys()[0]
+                    port = pp.get(protocol)
+
+            
             server_host.setText( host )
             server_port.setText( port )
-            server_protocol.setCurrentIndex(0 if protocol == 't' else 1)
+            server_protocol.setCurrentIndex(protocol_letters.index(protocol))
+
+            for p in protocol_letters:
+                i = protocol_letters.index(p)
+                j = server_protocol.model().index(i,0)
+                if p not in pp.keys():
+                    server_protocol.model().setData(j, QtCore.QVariant(0), QtCore.Qt.UserRole-1)
+                else:
+                    server_protocol.model().setData(j, QtCore.QVariant(0,False), QtCore.Qt.UserRole-1)
 
-        servers_list_widget.connect(servers_list_widget, SIGNAL('itemClicked(QTreeWidgetItem*, int)'), change_server)
+        change_server(host,protocol)
+
+
+        servers_list_widget.connect(servers_list_widget, SIGNAL('itemClicked(QTreeWidgetItem*, int)'), lambda x: change_server(unicode(x.text(0))))
         grid.addWidget(servers_list_widget, 1, 1, 1, 3)
 
         if not wallet.config.is_modifiable('server'):
@@ -1477,7 +1528,7 @@ class ElectrumWindow(QMainWindow):
 
         if not d.exec_(): return
 
-        server = unicode( server_host.text() ) + ':' + unicode( server_port.text() ) + ':' + ('t' if server_protocol.currentIndex() == 0 else 'h')
+        server = unicode( server_host.text() ) + ':' + unicode( server_port.text() ) + ':' + (protocol_letters[server_protocol.currentIndex()])
         if proxy_mode.currentText() != 'NONE':
             proxy = { u'mode':unicode(proxy_mode.currentText()).lower(), u'host':unicode(proxy_host.text()), u'port':unicode(proxy_port.text()) }
         else:
@@ -1506,30 +1557,6 @@ class ElectrumGui:
     def server_list_changed(self):
         pass
 
-    def waiting_dialog(self):
-
-        s = Timer()
-        s.start()
-        w = QDialog()
-        w.resize(200, 70)
-        w.setWindowTitle('Electrum')
-        l = QLabel('')
-        vbox = QVBoxLayout()
-        vbox.addWidget(l)
-        w.setLayout(vbox)
-        w.show()
-        def f():
-            if self.wallet.up_to_date: 
-                w.close()
-            else:
-                l.setText("Please wait...\nAddresses generated: %d\nKilobytes received: %.1f"\
-                              %(len(self.wallet.all_addresses()), self.wallet.interface.bytes_received/1024.))
-
-        w.connect(s, QtCore.SIGNAL('timersignal'), f)
-        self.wallet.interface.poke()
-        w.exec_()
-        w.destroy()
-
 
     def restore_or_create(self):
 
@@ -1542,12 +1569,16 @@ class ElectrumGui:
         # ask for the server.
         if not ElectrumWindow.network_dialog( wallet, parent=None ): return False
 
+        waiting = lambda: False if wallet.up_to_date else "Please wait...\nAddresses generated: %d\nKilobytes received: %.1f"\
+            %(len(wallet.all_addresses()), wallet.interface.bytes_received/1024.)
+
         if not is_recovery:
             wallet.new_seed(None)
             wallet.init_mpk( wallet.seed )
             wallet.up_to_date_event.clear()
             wallet.up_to_date = False
-            self.waiting_dialog()
+            wallet.interface.poke('synchronizer')
+            waiting_dialog(waiting)
             # run a dialog indicating the seed, ask the user to remember it
             ElectrumWindow.show_seed_dialog(wallet)
             #ask for password
@@ -1558,7 +1589,8 @@ class ElectrumGui:
             wallet.init_mpk( wallet.seed )
             wallet.up_to_date_event.clear()
             wallet.up_to_date = False
-            self.waiting_dialog()
+            wallet.interface.poke('synchronizer')
+            waiting_dialog(waiting)
             if wallet.is_found():
                 # history and addressbook
                 wallet.update_tx_history()