From 08c478f8d2927599ecac74e68dce7090b8723b96 Mon Sep 17 00:00:00 2001 From: ThomasV Date: Fri, 14 Apr 2023 15:55:03 +0200 Subject: [PATCH] network: use IntEnum for connection states. Export user-visible strings in get_connection_status_for_GUI --- .../gui/qml/components/BalanceDetails.qml | 2 +- .../components/controls/BalanceSummary.qml | 8 +++--- .../OnchainNetworkStatusIndicator.qml | 2 +- electrum/gui/qml/qenetwork.py | 15 ++++++++--- electrum/network.py | 25 +++++++++++++++---- 5 files changed, 38 insertions(+), 14 deletions(-) diff --git a/electrum/gui/qml/components/BalanceDetails.qml b/electrum/gui/qml/components/BalanceDetails.qml index 138c79d19..e2abc0a9d 100644 --- a/electrum/gui/qml/components/BalanceDetails.qml +++ b/electrum/gui/qml/components/BalanceDetails.qml @@ -38,7 +38,7 @@ Pane { InfoTextArea { Layout.fillWidth: true Layout.bottomMargin: constants.paddingLarge - visible: Daemon.currentWallet.synchronizing || Network.server_status != 'connected' + visible: Daemon.currentWallet.synchronizing || !Network.is_connected text: Daemon.currentWallet.synchronizing ? qsTr('Your wallet is not synchronized. The displayed balance may be inaccurate.') : qsTr('Your wallet is not connected to an Electrum server. The displayed balance may be outdated.') diff --git a/electrum/gui/qml/components/controls/BalanceSummary.qml b/electrum/gui/qml/components/controls/BalanceSummary.qml index 0559b9a5d..e02ef92fe 100644 --- a/electrum/gui/qml/components/controls/BalanceSummary.qml +++ b/electrum/gui/qml/components/controls/BalanceSummary.qml @@ -31,7 +31,7 @@ Item { GridLayout { id: balanceLayout columns: 3 - opacity: Daemon.currentWallet.synchronizing || Network.server_status != 'connected' ? 0 : 1 + opacity: Daemon.currentWallet.synchronizing || !Network.is_connected ? 0 : 1 Label { font.pixelSize: constants.fontSizeXLarge @@ -129,7 +129,7 @@ Item { } Label { - opacity: Daemon.currentWallet.synchronizing && Network.server_status == 'connected' ? 1 : 0 + opacity: Daemon.currentWallet.synchronizing && Network.is_connected ? 1 : 0 anchors.centerIn: balancePane text: Daemon.currentWallet.synchronizingProgress color: Material.accentColor @@ -137,9 +137,9 @@ Item { } Label { - opacity: Network.server_status != 'connected' ? 1 : 0 + opacity: !Network.is_connected ? 1 : 0 anchors.centerIn: balancePane - text: qsTr('Disconnected') + text: Network.server_status color: Material.accentColor font.pixelSize: constants.fontSizeLarge } diff --git a/electrum/gui/qml/components/controls/OnchainNetworkStatusIndicator.qml b/electrum/gui/qml/components/controls/OnchainNetworkStatusIndicator.qml index 690639e63..54242040b 100644 --- a/electrum/gui/qml/components/controls/OnchainNetworkStatusIndicator.qml +++ b/electrum/gui/qml/components/controls/OnchainNetworkStatusIndicator.qml @@ -6,7 +6,7 @@ Image { sourceSize.width: constants.iconSizeMedium sourceSize.height: constants.iconSizeMedium - property bool connected: Network.server_status == 'connected' + property bool connected: Network.is_connected property bool lagging: connected && Network.isLagging property bool fork: connected && Network.chaintips > 1 property bool syncing: connected && Daemon.currentWallet && Daemon.currentWallet.synchronizing diff --git a/electrum/gui/qml/qenetwork.py b/electrum/gui/qml/qenetwork.py index eeef2d096..c72a91bff 100644 --- a/electrum/gui/qml/qenetwork.py +++ b/electrum/gui/qml/qenetwork.py @@ -35,6 +35,7 @@ class QENetwork(QObject, QtEventListener): _height = 0 _server = "" + _is_connected = False _server_status = "" _network_status = "" _chaintips = 1 @@ -95,7 +96,11 @@ class QENetwork(QObject, QtEventListener): self._logger.debug('network_status updated: %s' % network_status) self._network_status = network_status self.statusChanged.emit() - server_status = self.network.connection_status + is_connected = self.network.is_connected() + if self._is_connected != is_connected: + self._is_connected = is_connected + self.statusChanged.emit() + server_status = self.network.get_connection_status_for_GUI() if self._server_status != server_status: self._logger.debug('server_status updated: %s' % server_status) self._server_status = server_status @@ -209,7 +214,7 @@ class QENetwork(QObject, QtEventListener): @pyqtProperty(str, notify=statusChanged) def serverWithStatus(self): server = self._server - if self._server_status != "connected": # connecting or disconnected + if not self.network.is_connected(): # connecting or disconnected return f"{server} (connecting...)" return server @@ -219,7 +224,11 @@ class QENetwork(QObject, QtEventListener): @pyqtProperty(str, notify=statusChanged) def server_status(self): - return self._server_status + return self.network.get_connection_status_for_GUI() + + @pyqtProperty(bool, notify=statusChanged) + def is_connected(self): + return self._is_connected @pyqtProperty(int, notify=chaintipsChanged) def chaintips(self): diff --git a/electrum/network.py b/electrum/network.py index 52fc7948d..b288a5578 100644 --- a/electrum/network.py +++ b/electrum/network.py @@ -37,6 +37,7 @@ import concurrent from concurrent import futures import copy import functools +from enum import IntEnum import aiorpcx from aiorpcx import ignore_after @@ -82,6 +83,12 @@ NUM_RECENT_SERVERS = 20 T = TypeVar('T') +class ConnectionState(IntEnum): + DISCONNECTED = 0 + CONNECTING = 1 + CONNECTED = 2 + + def parse_servers(result: Sequence[Tuple[str, str, List[str]]]) -> Dict[str, dict]: """Convert servers list (from protocol method "server.peers.subscribe") into dict format. Also validate values, such as IP addresses and ports. @@ -330,7 +337,7 @@ class Network(Logger, NetworkRetryManager[ServerAddr]): # Dump network messages (all interfaces). Set at runtime from the console. self.debug = False - self._set_status('disconnected') + self._set_status(ConnectionState.DISCONNECTED) self._has_ever_managed_to_connect_to_server = False self._was_started = False @@ -432,7 +439,15 @@ class Network(Logger, NetworkRetryManager[ServerAddr]): return interface is not None and interface.is_connected_and_ready() def is_connecting(self): - return self.connection_status == 'connecting' + return self.connection_status == ConnectionState.CONNECTING + + def get_connection_status_for_GUI(self): + ConnectionStates = { + ConnectionState.DISCONNECTED: _('Disconnected'), + ConnectionState.CONNECTING: _('Connecting'), + ConnectionState.CONNECTED: _('Connected'), + } + return ConnectionStates[self.connection_status] async def _request_server_info(self, interface: 'Interface'): await interface.ready @@ -731,7 +746,7 @@ class Network(Logger, NetworkRetryManager[ServerAddr]): util.trigger_callback('default_server_changed') self.default_server_changed_event.set() self.default_server_changed_event.clear() - self._set_status('connected') + self._set_status(ConnectionState.CONNECTED) util.trigger_callback('network_updated') if blockchain_updated: util.trigger_callback('blockchain_updated') @@ -769,7 +784,7 @@ class Network(Logger, NetworkRetryManager[ServerAddr]): We distinguish by whether it is in self.interfaces.''' if not interface: return if interface.server == self.default_server: - self._set_status('disconnected') + self._set_status(ConnectionState.DISCONNECTED) await self._close_interface(interface) util.trigger_callback('network_updated') @@ -792,7 +807,7 @@ class Network(Logger, NetworkRetryManager[ServerAddr]): self._connecting_ifaces.add(server) if server == self.default_server: self.logger.info(f"connecting to {server} as new interface") - self._set_status('connecting') + self._set_status(ConnectionState.CONNECTING) self._trying_addr_now(server) interface = Interface(network=self, server=server, proxy=self.proxy)