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 {
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.')

8
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
}

2
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

15
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):

25
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)

Loading…
Cancel
Save