Browse Source

Bring the network dialog into the new framework

283
Neil Booth 9 years ago
parent
commit
9390a97e9e
  1. 65
      gui/qt/installwizard.py
  2. 34
      gui/qt/network_dialog.py
  3. 10
      lib/wizard.py

65
gui/qt/installwizard.py

@ -8,7 +8,7 @@ import electrum
from electrum.i18n import _ from electrum.i18n import _
from seed_dialog import SeedDisplayLayout, SeedWarningLayout, SeedInputLayout from seed_dialog import SeedDisplayLayout, SeedWarningLayout, SeedInputLayout
from network_dialog import NetworkDialog from network_dialog import NetworkChoiceLayout
from util import * from util import *
from password_dialog import PasswordLayout, PW_NEW, PW_PASSPHRASE from password_dialog import PasswordLayout, PW_NEW, PW_PASSPHRASE
@ -110,12 +110,17 @@ class InstallWizard(WindowModalDialog, WizardBase):
self.show() self.show()
self.raise_() self.raise_()
def finished(self):
'''Ensure the dialog is closed.'''
self.accept()
self.refresh_gui()
def set_icon(self, filename): def set_icon(self, filename):
prior_filename, self.icon_filename = self.icon_filename, filename prior_filename, self.icon_filename = self.icon_filename, filename
self.logo.setPixmap(QPixmap(filename).scaledToWidth(70)) self.logo.setPixmap(QPixmap(filename).scaledToWidth(70))
return prior_filename return prior_filename
def set_main_layout(self, layout, title=None): def set_main_layout(self, layout, title=None, raise_on_cancel=True):
self.title.setText(title or "") self.title.setText(title or "")
self.title.setVisible(bool(title)) self.title.setVisible(bool(title))
# Get rid of any prior layout # Get rid of any prior layout
@ -127,7 +132,8 @@ class InstallWizard(WindowModalDialog, WizardBase):
self.next_button.setEnabled(True) self.next_button.setEnabled(True)
self.main_widget.setVisible(True) self.main_widget.setVisible(True)
self.please_wait.setVisible(False) self.please_wait.setVisible(False)
if not self.loop.exec_(): result = self.loop.exec_()
if not result and raise_on_cancel:
raise UserCancelled raise UserCancelled
self.title.setVisible(False) self.title.setVisible(False)
self.cancel_button.setEnabled(False) self.cancel_button.setEnabled(False)
@ -135,6 +141,7 @@ class InstallWizard(WindowModalDialog, WizardBase):
self.main_widget.setVisible(False) self.main_widget.setVisible(False)
self.please_wait.setVisible(True) self.please_wait.setVisible(True)
self.refresh_gui() self.refresh_gui()
return result
def refresh_gui(self): def refresh_gui(self):
# For some reason, to refresh the GUI this needs to be called twice # For some reason, to refresh the GUI this needs to be called twice
@ -204,9 +211,6 @@ class InstallWizard(WindowModalDialog, WizardBase):
the password or None for no password.""" the password or None for no password."""
return self.pw_layout(msg or MSG_ENTER_PASSWORD, PW_NEW) return self.pw_layout(msg or MSG_ENTER_PASSWORD, PW_NEW)
def choose_server(self, network):
self.network_dialog(network)
def show_restore(self, wallet, network): def show_restore(self, wallet, network):
if network: if network:
def task(): def task():
@ -295,35 +299,26 @@ class InstallWizard(WindowModalDialog, WizardBase):
self.set_main_layout(vbox) self.set_main_layout(vbox)
return get_texts() return get_texts()
def network_dialog(self, network): def choose_server(self, network):
grid = QGridLayout() title = _("Electrum communicates with remote servers to get "
grid.setSpacing(5) "information about your transactions and addresses. The "
label = QLabel(_("Electrum communicates with remote servers to get information about your transactions and addresses. The servers all fulfil the same purpose only differing in hardware. In most cases you simply want to let Electrum pick one at random if you have a preference though feel free to select a server manually.") + "\n\n" \ "servers all fulfil the same purpose only differing in "
+ _("How do you want to connect to a server:")+" ") "hardware. In most cases you simply want to let Electrum "
label.setWordWrap(True) "pick one at random. However if you prefer feel free to "
grid.addWidget(label, 0, 0) "select a server manually.")
gb = QGroupBox() choices = [_("Auto connect"), _("Select server manually")]
b1 = QRadioButton(gb) choices_title = _("How do you want to connect to a server? ")
b1.setText(_("Auto connect")) clayout = ChoicesLayout(choices_title, choices)
b1.setChecked(True) self.set_main_layout(clayout.layout(), title)
b2 = QRadioButton(gb)
b2.setText(_("Select server manually")) auto_connect = True
grid.addWidget(b1,1,0) if clayout.selected_index() == 1:
grid.addWidget(b2,2,0) nlayout = NetworkChoiceLayout(network, self.config, wizard=True)
vbox = QVBoxLayout() if self.set_main_layout(nlayout.layout(), raise_on_cancel=False):
vbox.addLayout(grid) nlayout.accept()
vbox.addStretch(1) auto_connect = False
vbox.addLayout(Buttons(CancelButton(self), OkButton(self, _('Next')))) self.config.set_key('auto_connect', auto_connect, True)
network.auto_connect = auto_connect
self.set_layout(vbox)
if not self.exec_():
return
if b2.isChecked():
NetworkDialog(network, self.config, None).do_exec()
else:
self.config.set_key('auto_connect', True, True)
network.auto_connect = True
def query_choice(self, msg, choices): def query_choice(self, msg, choices):
clayout = ChoicesLayout(msg, choices) clayout = ChoicesLayout(msg, choices)

34
gui/qt/network_dialog.py

@ -32,7 +32,20 @@ class NetworkDialog(WindowModalDialog):
def __init__(self, network, config, parent): def __init__(self, network, config, parent):
WindowModalDialog.__init__(self, parent, _('Network')) WindowModalDialog.__init__(self, parent, _('Network'))
self.setMinimumSize(375, 20) self.setMinimumSize(375, 20)
self.nlayout = NetworkChoiceLayout(network, config)
vbox = QVBoxLayout(self)
vbox.addLayout(nlayout.layout())
vbox.addLayout(Buttons(CancelButton(self), OkButton(self)))
def do_exec(self):
result = self.exec_()
if result:
self.nlayout.accept()
return result
class NetworkChoiceLayout(object):
def __init__(self, network, config, wizard=False):
self.network = network self.network = network
self.config = config self.config = config
self.protocol = None self.protocol = None
@ -42,7 +55,7 @@ class NetworkDialog(WindowModalDialog):
if not proxy_config: if not proxy_config:
proxy_config = { "mode":"none", "host":"localhost", "port":"9050"} proxy_config = { "mode":"none", "host":"localhost", "port":"9050"}
if parent: if not wizard:
n = len(network.get_interfaces()) n = len(network.get_interfaces())
if n: if n:
status = _("Blockchain") + ": " + "%d "%(network.get_local_height()) + _("blocks") + ".\n" + _("Getting block headers from %d nodes.")%n status = _("Blockchain") + ": " + "%d "%(network.get_local_height()) + _("blocks") + ".\n" + _("Getting block headers from %d nodes.")%n
@ -56,7 +69,6 @@ class NetworkDialog(WindowModalDialog):
status = _("Please choose a server.") + "\n" + _("Select 'Cancel' if you are offline.") status = _("Please choose a server.") + "\n" + _("Select 'Cancel' if you are offline.")
vbox = QVBoxLayout() vbox = QVBoxLayout()
vbox.setSpacing(30)
hbox = QHBoxLayout() hbox = QHBoxLayout()
l = QLabel() l = QLabel()
l.setPixmap(QPixmap(":icons/network.png")) l.setPixmap(QPixmap(":icons/network.png"))
@ -69,6 +81,7 @@ class NetworkDialog(WindowModalDialog):
+ _("This blockchain is used to verify the transactions sent by the address server.") + _("This blockchain is used to verify the transactions sent by the address server.")
hbox.addWidget(HelpButton(msg)) hbox.addWidget(HelpButton(msg))
vbox.addLayout(hbox) vbox.addLayout(hbox)
vbox.addSpacing(15)
# grid layout # grid layout
grid = QGridLayout() grid = QGridLayout()
@ -101,7 +114,7 @@ class NetworkDialog(WindowModalDialog):
self.autoconnect_cb.setToolTip(msg) self.autoconnect_cb.setToolTip(msg)
label = _('Active Servers') if network.is_connected() else _('Default Servers') label = _('Active Servers') if network.is_connected() else _('Default Servers')
self.servers_list_widget = QTreeWidget(parent) self.servers_list_widget = QTreeWidget()
self.servers_list_widget.setHeaderLabels( [ label, _('Limit') ] ) self.servers_list_widget.setHeaderLabels( [ label, _('Limit') ] )
self.servers_list_widget.setMaximumHeight(150) self.servers_list_widget.setMaximumHeight(150)
self.servers_list_widget.setColumnWidth(0, 240) self.servers_list_widget.setColumnWidth(0, 240)
@ -155,11 +168,10 @@ class NetworkDialog(WindowModalDialog):
grid.addWidget(self.proxy_mode, 4, 1) grid.addWidget(self.proxy_mode, 4, 1)
grid.addWidget(self.proxy_host, 4, 2) grid.addWidget(self.proxy_host, 4, 2)
grid.addWidget(self.proxy_port, 4, 3) grid.addWidget(self.proxy_port, 4, 3)
self.layout_ = vbox
# buttons def layout(self):
vbox.addLayout(Buttons(CancelButton(self), OkButton(self))) return self.layout_
self.setLayout(vbox)
def init_servers_list(self): def init_servers_list(self):
self.servers_list_widget.clear() self.servers_list_widget.clear()
@ -211,12 +223,7 @@ class NetworkDialog(WindowModalDialog):
self.server_port.setText( port ) self.server_port.setText( port )
self.ssl_cb.setChecked(protocol=='s') self.ssl_cb.setChecked(protocol=='s')
def accept(self):
def do_exec(self):
if not self.exec_():
return
host = str(self.server_host.text()) host = str(self.server_host.text())
port = str(self.server_port.text()) port = str(self.server_port.text())
protocol = 's' if self.ssl_cb.isChecked() else 't' protocol = 's' if self.ssl_cb.isChecked() else 't'
@ -236,4 +243,3 @@ class NetworkDialog(WindowModalDialog):
auto_connect = self.autoconnect_cb.isChecked() auto_connect = self.autoconnect_cb.isChecked()
self.network.set_parameters(host, port, protocol, proxy, auto_connect) self.network.set_parameters(host, port, protocol, proxy, auto_connect)
return True

10
lib/wizard.py

@ -119,6 +119,10 @@ class WizardBase(PrintError):
"""Show restore result""" """Show restore result"""
pass pass
def finished(self):
"""Called when the wizard is done."""
pass
@classmethod @classmethod
def open_wallet(self, network, filename, config, create_wizard): def open_wallet(self, network, filename, config, create_wizard):
'''The main entry point of the wizard. Open a wallet from the given '''The main entry point of the wizard. Open a wallet from the given
@ -156,7 +160,7 @@ class WizardBase(PrintError):
if network: if network:
# Show network dialog if config does not exist # Show network dialog if config does not exist
if config.get('server') is None: if config.get('auto_connect') is None:
wizard().choose_server(network) wizard().choose_server(network)
else: else:
wizard().show_warning(_('You are offline')) wizard().show_warning(_('You are offline'))
@ -171,7 +175,9 @@ class WizardBase(PrintError):
if is_restore: if is_restore:
wizard().show_restore(wallet, network) wizard().show_restore(wallet, network)
self.my_wizard = None if self.my_wizard:
self.my_wizard.finished()
self.my_wizard = None
return wallet return wallet

Loading…
Cancel
Save