Browse Source

network: use IntEnum for connection states. Export user-visible strings in get_connection_status_for_GUI

master
ThomasV 3 years ago
parent
commit
08c478f8d2
  1. 2
      electrum/gui/qml/components/BalanceDetails.qml
  2. 8
      electrum/gui/qml/components/controls/BalanceSummary.qml
  3. 2
      electrum/gui/qml/components/controls/OnchainNetworkStatusIndicator.qml
  4. 15
      electrum/gui/qml/qenetwork.py
  5. 25
      electrum/network.py

2
electrum/gui/qml/components/BalanceDetails.qml

@ -38,7 +38,7 @@ Pane {
InfoTextArea { InfoTextArea {
Layout.fillWidth: true Layout.fillWidth: true
Layout.bottomMargin: constants.paddingLarge Layout.bottomMargin: constants.paddingLarge
visible: Daemon.currentWallet.synchronizing || Network.server_status != 'connected' visible: Daemon.currentWallet.synchronizing || !Network.is_connected
text: Daemon.currentWallet.synchronizing text: Daemon.currentWallet.synchronizing
? qsTr('Your wallet is not synchronized. The displayed balance may be inaccurate.') ? 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.') : qsTr('Your wallet is not connected to an Electrum server. The displayed balance may be outdated.')

8
electrum/gui/qml/components/controls/BalanceSummary.qml

@ -31,7 +31,7 @@ Item {
GridLayout { GridLayout {
id: balanceLayout id: balanceLayout
columns: 3 columns: 3
opacity: Daemon.currentWallet.synchronizing || Network.server_status != 'connected' ? 0 : 1 opacity: Daemon.currentWallet.synchronizing || !Network.is_connected ? 0 : 1
Label { Label {
font.pixelSize: constants.fontSizeXLarge font.pixelSize: constants.fontSizeXLarge
@ -129,7 +129,7 @@ Item {
} }
Label { Label {
opacity: Daemon.currentWallet.synchronizing && Network.server_status == 'connected' ? 1 : 0 opacity: Daemon.currentWallet.synchronizing && Network.is_connected ? 1 : 0
anchors.centerIn: balancePane anchors.centerIn: balancePane
text: Daemon.currentWallet.synchronizingProgress text: Daemon.currentWallet.synchronizingProgress
color: Material.accentColor color: Material.accentColor
@ -137,9 +137,9 @@ Item {
} }
Label { Label {
opacity: Network.server_status != 'connected' ? 1 : 0 opacity: !Network.is_connected ? 1 : 0
anchors.centerIn: balancePane anchors.centerIn: balancePane
text: qsTr('Disconnected') text: Network.server_status
color: Material.accentColor color: Material.accentColor
font.pixelSize: constants.fontSizeLarge font.pixelSize: constants.fontSizeLarge
} }

2
electrum/gui/qml/components/controls/OnchainNetworkStatusIndicator.qml

@ -6,7 +6,7 @@ Image {
sourceSize.width: constants.iconSizeMedium sourceSize.width: constants.iconSizeMedium
sourceSize.height: 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 lagging: connected && Network.isLagging
property bool fork: connected && Network.chaintips > 1 property bool fork: connected && Network.chaintips > 1
property bool syncing: connected && Daemon.currentWallet && Daemon.currentWallet.synchronizing property bool syncing: connected && Daemon.currentWallet && Daemon.currentWallet.synchronizing

15
electrum/gui/qml/qenetwork.py

@ -35,6 +35,7 @@ class QENetwork(QObject, QtEventListener):
_height = 0 _height = 0
_server = "" _server = ""
_is_connected = False
_server_status = "" _server_status = ""
_network_status = "" _network_status = ""
_chaintips = 1 _chaintips = 1
@ -95,7 +96,11 @@ class QENetwork(QObject, QtEventListener):
self._logger.debug('network_status updated: %s' % network_status) self._logger.debug('network_status updated: %s' % network_status)
self._network_status = network_status self._network_status = network_status
self.statusChanged.emit() 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: if self._server_status != server_status:
self._logger.debug('server_status updated: %s' % server_status) self._logger.debug('server_status updated: %s' % server_status)
self._server_status = server_status self._server_status = server_status
@ -209,7 +214,7 @@ class QENetwork(QObject, QtEventListener):
@pyqtProperty(str, notify=statusChanged) @pyqtProperty(str, notify=statusChanged)
def serverWithStatus(self): def serverWithStatus(self):
server = self._server 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 f"{server} (connecting...)"
return server return server
@ -219,7 +224,11 @@ class QENetwork(QObject, QtEventListener):
@pyqtProperty(str, notify=statusChanged) @pyqtProperty(str, notify=statusChanged)
def server_status(self): 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) @pyqtProperty(int, notify=chaintipsChanged)
def chaintips(self): def chaintips(self):

25
electrum/network.py

@ -37,6 +37,7 @@ import concurrent
from concurrent import futures from concurrent import futures
import copy import copy
import functools import functools
from enum import IntEnum
import aiorpcx import aiorpcx
from aiorpcx import ignore_after from aiorpcx import ignore_after
@ -82,6 +83,12 @@ NUM_RECENT_SERVERS = 20
T = TypeVar('T') 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]: 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. """Convert servers list (from protocol method "server.peers.subscribe") into dict format.
Also validate values, such as IP addresses and ports. 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. # Dump network messages (all interfaces). Set at runtime from the console.
self.debug = False self.debug = False
self._set_status('disconnected') self._set_status(ConnectionState.DISCONNECTED)
self._has_ever_managed_to_connect_to_server = False self._has_ever_managed_to_connect_to_server = False
self._was_started = 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() return interface is not None and interface.is_connected_and_ready()
def is_connecting(self): 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'): async def _request_server_info(self, interface: 'Interface'):
await interface.ready await interface.ready
@ -731,7 +746,7 @@ class Network(Logger, NetworkRetryManager[ServerAddr]):
util.trigger_callback('default_server_changed') util.trigger_callback('default_server_changed')
self.default_server_changed_event.set() self.default_server_changed_event.set()
self.default_server_changed_event.clear() self.default_server_changed_event.clear()
self._set_status('connected') self._set_status(ConnectionState.CONNECTED)
util.trigger_callback('network_updated') util.trigger_callback('network_updated')
if blockchain_updated: if blockchain_updated:
util.trigger_callback('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.''' We distinguish by whether it is in self.interfaces.'''
if not interface: return if not interface: return
if interface.server == self.default_server: if interface.server == self.default_server:
self._set_status('disconnected') self._set_status(ConnectionState.DISCONNECTED)
await self._close_interface(interface) await self._close_interface(interface)
util.trigger_callback('network_updated') util.trigger_callback('network_updated')
@ -792,7 +807,7 @@ class Network(Logger, NetworkRetryManager[ServerAddr]):
self._connecting_ifaces.add(server) self._connecting_ifaces.add(server)
if server == self.default_server: if server == self.default_server:
self.logger.info(f"connecting to {server} as new interface") self.logger.info(f"connecting to {server} as new interface")
self._set_status('connecting') self._set_status(ConnectionState.CONNECTING)
self._trying_addr_now(server) self._trying_addr_now(server)
interface = Interface(network=self, server=server, proxy=self.proxy) interface = Interface(network=self, server=server, proxy=self.proxy)

Loading…
Cancel
Save