From 3149ccf729f01de928c58b74a3e70ef610e8bed8 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Thu, 30 Mar 2023 00:40:55 +0000 Subject: [PATCH] qml: update server in network dialog on more events "defaultServerChanged" was not the right event to listen to. It is only sent *after* the interface is ready. "network_updated" is a bit overkill as it is triggered every time any of the interfaces goes down or a new one is created, still, better to trigger a few more times than to be stale. In particular, if there is no internet connection, the server string is now updated as expected, instead of showing stale values and ignoring trying to change servers. Also, a further state that did not exist before: just like it worked in the kivy GUI, if the main server was changed but it is not yet connected, instead of showing the old server still, we now show f"{new_server} (connecting...)". --- .../gui/qml/components/NetworkOverview.qml | 2 +- electrum/gui/qml/qenetwork.py | 33 ++++++++++++------- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/electrum/gui/qml/components/NetworkOverview.qml b/electrum/gui/qml/components/NetworkOverview.qml index 30327c5e7..f58978d59 100644 --- a/electrum/gui/qml/components/NetworkOverview.qml +++ b/electrum/gui/qml/components/NetworkOverview.qml @@ -55,7 +55,7 @@ Pane { color: Material.accentColor } Label { - text: Network.server + text: Network.serverWithStatus wrapMode: Text.WrapAnywhere Layout.fillWidth: true } diff --git a/electrum/gui/qml/qenetwork.py b/electrum/gui/qml/qenetwork.py index 33ed405bb..59d327c8b 100644 --- a/electrum/gui/qml/qenetwork.py +++ b/electrum/gui/qml/qenetwork.py @@ -21,7 +21,6 @@ class QENetwork(QObject, QtEventListener): networkUpdated = pyqtSignal() blockchainUpdated = pyqtSignal() heightChanged = pyqtSignal([int], arguments=['height']) - defaultServerChanged = pyqtSignal() proxySet = pyqtSignal() proxyChanged = pyqtSignal() statusChanged = pyqtSignal() @@ -34,6 +33,7 @@ class QENetwork(QObject, QtEventListener): dataChanged = pyqtSignal() _height = 0 + _server = "" _server_status = "" _network_status = "" _chaintips = 1 @@ -59,7 +59,7 @@ class QENetwork(QObject, QtEventListener): @event_listener def on_event_network_updated(self, *args): self.networkUpdated.emit() - self._update_network_status() + self._update_status() @event_listener def on_event_blockchain_updated(self): @@ -71,7 +71,7 @@ class QENetwork(QObject, QtEventListener): @event_listener def on_event_default_server_changed(self, *args): - self.defaultServerChanged.emit() + self._update_status() @event_listener def on_event_proxy_set(self, *args): @@ -79,15 +79,15 @@ class QENetwork(QObject, QtEventListener): self.proxySet.emit() self.proxyTorChanged.emit() - def _update_network_status(self): + def _update_status(self): + server = str(self.network.get_parameters().server) + if self._server != server: + self._server = server + self.statusChanged.emit() network_status = self.network.get_status() if self._network_status != network_status: self._network_status = network_status self.statusChanged.emit() - - @event_listener - def on_event_status(self, *args): - self._update_network_status() server_status = self.network.connection_status self._logger.debug('server_status updated: %s' % server_status) if self._server_status != server_status: @@ -104,6 +104,10 @@ class QENetwork(QObject, QtEventListener): self._islagging = server_lag > 1 self.isLaggingChanged.emit() + @event_listener + def on_event_status(self, *args): + self._update_status() + @event_listener def on_event_fee_histogram(self, histogram): self._logger.debug(f'fee histogram updated: {repr(histogram)}') @@ -167,12 +171,12 @@ class QENetwork(QObject, QtEventListener): def height(self): return self._height - @pyqtProperty(str, notify=defaultServerChanged) + @pyqtProperty(str, notify=statusChanged) def server(self): - return str(self.network.get_parameters().server) + return self._server @server.setter - def server(self, server): + def server(self, server: str): net_params = self.network.get_parameters() try: server = ServerAddr.from_str_with_inference(server) @@ -182,6 +186,13 @@ class QENetwork(QObject, QtEventListener): net_params = net_params._replace(server=server, auto_connect=self._qeconfig.autoConnect) self.network.run_from_another_thread(self.network.set_parameters(net_params)) + @pyqtProperty(str, notify=statusChanged) + def serverWithStatus(self): + server = self._server + if self._server_status != "connected": # connecting or disconnected + return f"{server} (connecting...)" + return server + @pyqtProperty(str, notify=statusChanged) def status(self): return self._network_status