From 3a648f9119a6716290c078b8fa1c8d96c8ac04a4 Mon Sep 17 00:00:00 2001 From: Amir Taaki Date: Mon, 20 Aug 2012 10:20:40 +0100 Subject: [PATCH 1/4] Show list of all the servers available in the menubar. --- lib/gui_lite.py | 45 +++++++++++++++++++++++++++++++++++++++++++-- lib/interface.py | 2 ++ 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/lib/gui_lite.py b/lib/gui_lite.py index 738d328d3..51ad4fcff 100644 --- a/lib/gui_lite.py +++ b/lib/gui_lite.py @@ -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 @@ -174,8 +175,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) @@ -516,6 +519,44 @@ class MiniActuator: def set_config_currency(self, conversion_currency): 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 + + 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" + servers_list = [] + for x in DEFAULT_SERVERS: + h,port,protocol = x.split(':') + servers_list.append( (h,[(protocol,port)] ) ) + else: + servers_list = interface.servers + server_names = [details[0] for details in 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, servers_list): + # self.server_name = server_name + # self.servers_list = servers_list + # def __call__(self, checked): + # if checked: + # # call server_list_changed + # self. + self.servers_group.addAction(server_action) + + def server_list_changed(self): + # clear servers_menu + # clear servers_group? + # call populate_servers_menu + print "hello" + def copy_address(self, receive_popup): addrs = [addr for addr in self.wallet.all_addresses() if not self.wallet.is_change(addr)] diff --git a/lib/interface.py b/lib/interface.py index 76a3e4c85..7062beef6 100644 --- a/lib/interface.py +++ b/lib/interface.py @@ -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] From 58e6050f5257550702ed99b5b67e2303b878ab5d Mon Sep 17 00:00:00 2001 From: Amir Taaki Date: Fri, 24 Aug 2012 09:34:30 +0100 Subject: [PATCH 2/4] Better looking set_path(wallet_path) method. Flattened function that's easier to read. --- lib/wallet.py | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/lib/wallet.py b/lib/wallet.py index cbf0cdcb5..023daf74a 100644 --- a/lib/wallet.py +++ b/lib/wallet.py @@ -354,19 +354,21 @@ class Wallet: """Set the path of the wallet.""" if wallet_path is not None: self.path = wallet_path + return + # Look for wallet file in the default data directory. + # Keeps backwards compatibility. + if "HOME" in os.environ: + wallet_dir = os.path.join(os.environ["HOME"], ".electrum") + elif "LOCALAPPDATA" in os.environ: + wallet_dir = os.path.join(os.environ["LOCALAPPDATA"], "Electrum") + elif "APPDATA" in os.environ: + wallet_dir = os.path.join(os.environ["APPDATA"], "Electrum") else: - # backward compatibility: look for wallet file in the default data directory - if "HOME" in os.environ: - wallet_dir = os.path.join( os.environ["HOME"], '.electrum') - elif "LOCALAPPDATA" in os.environ: - wallet_dir = os.path.join( os.environ["LOCALAPPDATA"], 'Electrum' ) - elif "APPDATA" in os.environ: - wallet_dir = os.path.join( os.environ["APPDATA"], 'Electrum' ) - else: - raise BaseException("No home directory found in environment variables.") - - if not os.path.exists( wallet_dir ): os.mkdir( wallet_dir ) - self.path = os.path.join( wallet_dir, 'electrum.dat' ) + raise BaseException("No home directory found in environment variables.") + # Make wallet directory if it does not yet exist. + if not os.path.exists(wallet_dir): + os.mkdir(wallet_dir) + self.path = os.path.join(wallet_dir, "electrum.dat") def import_key(self, keypair, password): address, key = keypair.split(':') From b25e93c4bc1af718fad780a2bf6482d5e82eac01 Mon Sep 17 00:00:00 2001 From: Amir Taaki Date: Mon, 27 Aug 2012 03:32:31 +0200 Subject: [PATCH 3/4] Update servers list once fetched from remote. --- lib/gui_lite.py | 40 ++++++++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/lib/gui_lite.py b/lib/gui_lite.py index 51ad4fcff..c7909a3fe 100644 --- a/lib/gui_lite.py +++ b/lib/gui_lite.py @@ -469,7 +469,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) @@ -482,9 +483,11 @@ class ReceivePopup(QDialog): QCursor.setPos(center_mouse_pos) self.show() -class MiniActuator: +class MiniActuator(QObject): def __init__(self, wallet): + super(QObject, self).__init__() + self.wallet = wallet self.theme_name = self.wallet.theme @@ -522,6 +525,7 @@ class MiniActuator: 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 @@ -541,21 +545,29 @@ class MiniActuator: server_action.setCheckable(True) if server_name == current_server: server_action.setChecked(True) - #class SelectServerFunctor: - # def __init__(self, server_name, servers_list): - # self.server_name = server_name - # self.servers_list = servers_list - # def __call__(self, checked): - # if checked: - # # call server_list_changed - # self. + 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): - # clear servers_menu - # clear servers_group? - # call populate_servers_menu - print "hello" + 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): + print server_name def copy_address(self, receive_popup): addrs = [addr for addr in self.wallet.all_addresses() From 2b6d5ebd5508437870b86e309610236043f9d6f1 Mon Sep 17 00:00:00 2001 From: Amir Taaki Date: Mon, 27 Aug 2012 03:47:40 +0200 Subject: [PATCH 4/4] Change server in lite mode. --- lib/gui_lite.py | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/lib/gui_lite.py b/lib/gui_lite.py index c7909a3fe..a703f8d63 100644 --- a/lib/gui_lite.py +++ b/lib/gui_lite.py @@ -531,14 +531,16 @@ class MiniActuator(QObject): interface = self.wallet.interface interface.servers_loaded_callback = self.server_list_changed if not interface.servers: - print "no servers loaded yet" - servers_list = [] - for x in DEFAULT_SERVERS: - h,port,protocol = x.split(':') - servers_list.append( (h,[(protocol,port)] ) ) + 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: - servers_list = interface.servers - server_names = [details[0] for details in servers_list] + 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) @@ -567,7 +569,22 @@ class MiniActuator(QObject): self.populate_servers_menu() def server_selected(self, server_name): - print 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): addrs = [addr for addr in self.wallet.all_addresses()