URI: 
       tMerge branch 'servers' - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 10e3aa7c1e435a2911d964890f5686b9754f8703
   DIR parent f2fb2356433ebc1f0daf76b33d5564cc23cb2881
  HTML Author: Amir Taaki <genjix@riseup.net>
       Date:   Mon, 27 Aug 2012 03:48:57 +0200
       
       Merge branch 'servers'
       
       Conflicts:
               lib/gui_lite.py
       
       Diffstat:
         M lib/gui_lite.py                     |      76 +++++++++++++++++++++++++++++--
         M lib/interface.py                    |       2 ++
       
       2 files changed, 75 insertions(+), 3 deletions(-)
       ---
   DIR diff --git a/lib/gui_lite.py b/lib/gui_lite.py
       t@@ -4,6 +4,7 @@ from PyQt4.QtCore import *
        from PyQt4.QtGui import *
        
        from decimal import Decimal as D
       +from interface import DEFAULT_SERVERS
        from util import get_resource_path as rsrc
        from i18n import _
        import decimal
       t@@ -175,8 +176,10 @@ class MiniWindow(QDialog):
        
                menubar = QMenuBar()
                electrum_menu = menubar.addMenu(_("&Bitcoin"))
       -        self.servers_menu = electrum_menu.addMenu(_("&Servers"))
       -        self.servers_menu.addAction(_("Foo"))
       +        servers_menu = electrum_menu.addMenu(_("&Servers"))
       +        servers_group = QActionGroup(self)
       +        self.actuator.set_servers_gui_stuff(servers_menu, servers_group)
       +        self.actuator.populate_servers_menu()
                electrum_menu.addSeparator()
                brain_seed = electrum_menu.addAction(_("&BrainWallet Info"))
                brain_seed.triggered.connect(self.actuator.show_seed_dialog)
       t@@ -478,7 +481,8 @@ class ReceivePopup(QDialog):
        
                self.setMouseTracking(True)
                self.setWindowTitle("Electrum - " + _("Receive Bitcoin payment"))
       -        self.setWindowFlags(Qt.Window|Qt.FramelessWindowHint|Qt.MSWindowsFixedSizeDialogHint)
       +        self.setWindowFlags(Qt.Window|Qt.FramelessWindowHint|
       +                            Qt.MSWindowsFixedSizeDialogHint)
                self.layout().setSizeConstraint(QLayout.SetFixedSize)
                #self.setFrameStyle(QFrame.WinPanel|QFrame.Raised)
                #self.setAlignment(Qt.AlignCenter)
       t@@ -499,6 +503,8 @@ class MiniActuator:
            
            def __init__(self, wallet):
                """Retrieve the gui theme used in previous session."""
       +        super(QObject, self).__init__()
       +
                self.wallet = wallet
                self.theme_name = self.wallet.theme
                self.themes = util.load_theme_paths()
       t@@ -540,6 +546,70 @@ class MiniActuator:
                """Change the wallet fiat currency country."""
                self.wallet.conversion_currency = conversion_currency
        
       +    def set_servers_gui_stuff(self, servers_menu, servers_group):
       +        self.servers_menu = servers_menu
       +        self.servers_group = servers_group
       +        self.connect(self, SIGNAL("updateservers()"), self.update_servers_list)
       +
       +    def populate_servers_menu(self):
       +        interface = self.wallet.interface
       +        interface.servers_loaded_callback = self.server_list_changed
       +        if not interface.servers:
       +            print "No servers loaded yet."
       +            self.servers_list = []
       +            for server_string in DEFAULT_SERVERS:
       +                host, port, protocol = server_string.split(':')
       +                transports = [(protocol,port)]
       +                self.servers_list.append((host, transports))
       +        else:
       +            print "Servers loaded."
       +            self.servers_list = interface.servers
       +        server_names = [details[0] for details in self.servers_list]
       +        current_server = self.wallet.server.split(":")[0]
       +        for server_name in server_names:
       +            server_action = self.servers_menu.addAction(server_name)
       +            server_action.setCheckable(True)
       +            if server_name == current_server:
       +                server_action.setChecked(True)
       +            class SelectServerFunctor:
       +                def __init__(self, server_name, server_selected):
       +                    self.server_name = server_name
       +                    self.server_selected = server_selected
       +                def __call__(self, checked):
       +                    if checked:
       +                        # call server_selected
       +                        self.server_selected(self.server_name)
       +            delegate = SelectServerFunctor(server_name, self.server_selected)
       +            server_action.toggled.connect(delegate)
       +            self.servers_group.addAction(server_action)
       +
       +    def server_list_changed(self):
       +        self.emit(SIGNAL("updateservers()"))
       +
       +    def update_servers_list(self):
       +        # Clear servers_group
       +        for action in self.servers_group.actions():
       +            self.servers_group.removeAction(action)
       +        self.populate_servers_menu()
       +
       +    def server_selected(self, server_name):
       +        match = [transports for (host, transports) in self.servers_list
       +                 if host == server_name]
       +        assert len(match) == 1
       +        match = match[0]
       +        # Default to TCP if available else use anything
       +        # TODO: protocol should be selectable.
       +        tcp_port = [port for (protocol, port) in match if protocol == "t"]
       +        if len(tcp_port) == 0:
       +            protocol = match[0][0]
       +            port = match[0][1]
       +        else:
       +            protocol = "t"
       +            port = tcp_port[0]
       +        server_line = "%s:%s:%s" % (server_name, port, protocol)
       +        # Should this have exception handling?
       +        self.wallet.set_server(server_line)
       +
            def copy_address(self, receive_popup):
                """Copy the wallet addresses into the client."""
                addrs = [addr for addr in self.wallet.all_addresses()
   DIR diff --git a/lib/interface.py b/lib/interface.py
       t@@ -363,6 +363,8 @@ class WalletSynchronizer(threading.Thread):
                        if ports and version:
                            servers.append( (host, ports) )
                    self.interface.servers = servers
       +            assert self.interface.servers_loaded_callback
       +            self.interface.servers_loaded_callback()
        
                elif method == 'blockchain.address.subscribe':
                    addr = params[0]