The `ServerWidget` didn't validate the input of server_e, which allowed the user to enter an invalid server connection string and exit the dialog without knowing they entered an invalid string. In the wizard this behavior is very misleading as the user explicitly wanted to use a custom server, can click next after entering an invalid server, and we will just silently fall back to automatic server selection. This change will disable the "Next" button in the wizard if an invalid address has been entered and show a red background in the server_e while the input is not valid, so the user clearly sees that this input is not going to be used.
103 lines
4.0 KiB
Python
103 lines
4.0 KiB
Python
from typing import TYPE_CHECKING
|
|
|
|
from PyQt6.QtCore import Qt
|
|
from PyQt6.QtGui import QPixmap
|
|
from PyQt6.QtWidgets import QCheckBox, QLabel, QHBoxLayout, QVBoxLayout, QWidget
|
|
|
|
from electrum.i18n import _
|
|
from electrum.wizard import ServerConnectWizard
|
|
from electrum.gui.qt.network_dialog import ProxyWidget, ServerWidget
|
|
from electrum.gui.qt.util import icon_path
|
|
from .wizard import QEAbstractWizard, WizardComponent
|
|
|
|
if TYPE_CHECKING:
|
|
from electrum.simple_config import SimpleConfig
|
|
from electrum.plugin import Plugins
|
|
from electrum.daemon import Daemon
|
|
from electrum.gui.qt import QElectrumApplication
|
|
|
|
|
|
class QEServerConnectWizard(ServerConnectWizard, QEAbstractWizard):
|
|
|
|
def __init__(self, config: 'SimpleConfig', app: 'QElectrumApplication', plugins: 'Plugins', daemon: 'Daemon', parent=None):
|
|
ServerConnectWizard.__init__(self, daemon)
|
|
QEAbstractWizard.__init__(self, config, app)
|
|
self.window_title = _('Network and server configuration')
|
|
self.finish_label = _('Next')
|
|
|
|
# attach gui classes
|
|
self.navmap_merge({
|
|
'welcome': {'gui': WCWelcome},
|
|
'proxy_config': {'gui': WCProxyConfig},
|
|
'server_config': {'gui': WCServerConfig},
|
|
})
|
|
|
|
|
|
class WCWelcome(WizardComponent):
|
|
def __init__(self, parent, wizard):
|
|
WizardComponent.__init__(self, parent, wizard, title='Network Configuration')
|
|
self.wizard_title = _('Electrum Bitcoin Wallet')
|
|
|
|
self.first_help_label = QLabel()
|
|
self.first_help_label.setText(_("Optional settings to customize your network connection") + ":")
|
|
self.first_help_label.setWordWrap(True)
|
|
|
|
self.config_proxy_w = QCheckBox(_('Use Proxy'))
|
|
self.config_proxy_w.setChecked(False)
|
|
self.config_proxy_w.stateChanged.connect(self.on_updated)
|
|
self.config_server_w = QCheckBox(_('Select Electrum Server'))
|
|
self.config_server_w.setChecked(False)
|
|
self.config_server_w.stateChanged.connect(self.on_updated)
|
|
options_w = QWidget()
|
|
vbox = QVBoxLayout()
|
|
vbox.addWidget(self.config_proxy_w)
|
|
vbox.addWidget(self.config_server_w)
|
|
options_w.setLayout(vbox)
|
|
|
|
self.second_help_label = QLabel()
|
|
self.second_help_label.setText(
|
|
_("If you are unsure what these options are, leave them unchecked.")
|
|
)
|
|
self.second_help_label.setWordWrap(True)
|
|
|
|
self.layout().addWidget(self.first_help_label)
|
|
self.layout().addWidget(options_w)
|
|
self.layout().addWidget(self.second_help_label)
|
|
self.layout().addStretch(1)
|
|
self._valid = True
|
|
|
|
def apply(self):
|
|
self.wizard_data['use_defaults'] = not (self.config_server_w.isChecked() or self.config_proxy_w.isChecked())
|
|
self.wizard_data['want_proxy'] = self.config_proxy_w.isChecked()
|
|
self.wizard_data['autoconnect'] = not self.config_server_w.isChecked()
|
|
|
|
|
|
class WCProxyConfig(WizardComponent):
|
|
def __init__(self, parent, wizard):
|
|
WizardComponent.__init__(self, parent, wizard, title=_('Proxy'))
|
|
self.pw = ProxyWidget(wizard._daemon.network, self)
|
|
self.pw.proxy_cb.setChecked(True)
|
|
self.pw.proxy_host.setText('localhost')
|
|
self.pw.proxy_port.setText('9050')
|
|
self.layout().addWidget(self.pw)
|
|
self._valid = True
|
|
|
|
def apply(self):
|
|
self.wizard_data['proxy'] = self.pw.get_proxy_settings().to_dict()
|
|
|
|
|
|
class WCServerConfig(WizardComponent):
|
|
def __init__(self, parent, wizard):
|
|
WizardComponent.__init__(self, parent, wizard, title=_('Server'))
|
|
self.sw = ServerWidget(wizard._daemon.network, self)
|
|
self.layout().addWidget(self.sw)
|
|
self.sw.server_e_valid.connect(self.on_server_e_valid)
|
|
|
|
def on_server_e_valid(self, valid):
|
|
self.valid = valid
|
|
|
|
def apply(self):
|
|
self.wizard_data['autoconnect'] = self.sw.server_e.text().strip() == ''
|
|
self.wizard_data['server'] = self.sw.server_e.text()
|
|
self.wizard_data['one_server'] = self.wizard.config.NETWORK_ONESERVER
|