commit 238fb46d878149b03ffc7e4b530cee0a22d8ebd2
parent 3d42fca86ee8a62baad85772b9a0a3e7427ba9d0
Author: ThomasV <thomasv@electrum.org>
Date: Wed, 19 Feb 2020 16:03:21 +0100
Lightning: Show sending and receiving capacity. Fixes #5967
Diffstat:
4 files changed, 50 insertions(+), 5 deletions(-)
diff --git a/electrum/gui/kivy/uix/dialogs/lightning_channels.py b/electrum/gui/kivy/uix/dialogs/lightning_channels.py
@@ -52,11 +52,20 @@ Builder.load_string(r'''
<LightningChannelsDialog@Popup>:
name: 'lightning_channels'
title: _('Lightning channels.')
+ can_send: ''
+ can_receive: ''
id: popup
BoxLayout:
id: box
orientation: 'vertical'
- spacing: '1dp'
+ spacing: '2dp'
+ padding: '12dp'
+ BoxLabel:
+ text: _('Can send') + ':'
+ value: root.can_send
+ BoxLabel:
+ text: _('Can receive') + ':'
+ value: root.can_receive
ScrollView:
GridLayout:
cols: 1
@@ -64,12 +73,17 @@ Builder.load_string(r'''
size_hint: 1, None
height: self.minimum_height
spacing: '2dp'
- padding: '12dp'
- Button:
+ BoxLayout:
size_hint: 1, None
height: '48dp'
- text: _('New channel...')
- on_press: popup.app.popup_dialog('lightning_open_channel_dialog')
+ Widget:
+ size_hint: 0.7, None
+ height: '48dp'
+ Button:
+ size_hint: 0.3, None
+ height: '48dp'
+ text: _('New...')
+ on_press: popup.app.popup_dialog('lightning_open_channel_dialog')
<ChannelDetailsList@RecycleView>:
scroll_type: ['bars', 'content']
@@ -147,6 +161,7 @@ class ChannelDetailsPopup(Popup):
_('Remote CTN'): chan.get_latest_ctn(REMOTE),
_('Capacity'): self.app.format_amount_and_units(chan.constraints.capacity),
_('Can send'): self.app.format_amount_and_units(chan.available_to_spend(LOCAL) // 1000),
+ _('Can receive'): self.app.format_amount_and_units(chan.available_to_spend(REMOTE) // 1000),
_('Current feerate'): str(chan.get_latest_feerate(LOCAL)),
_('Node ID'): bh2u(chan.node_id),
_('Channel ID'): bh2u(chan.channel_id),
@@ -202,6 +217,7 @@ class LightningChannelsDialog(Factory.Popup):
super(LightningChannelsDialog, self).__init__()
self.clocks = []
self.app = app
+ self.can_send = ''
self.update()
def show_item(self, obj):
@@ -231,6 +247,7 @@ class LightningChannelsDialog(Factory.Popup):
l, r = self.format_fields(chan)
item.local_balance = _('Local') + ':' + l
item.remote_balance = _('Remote') + ': ' + r
+ self.update_can_send()
def update(self):
channel_cards = self.ids.lightning_channels_container
@@ -245,3 +262,9 @@ class LightningChannelsDialog(Factory.Popup):
item._chan = i
self.update_item(item)
channel_cards.add_widget(item)
+ self.update_can_send()
+
+ def update_can_send(self):
+ lnworker = self.app.wallet.lnworker
+ self.can_send = self.app.format_amount_and_units(lnworker.can_send())
+ self.can_receive = self.app.format_amount_and_units(lnworker.can_receive())
diff --git a/electrum/gui/qt/channels_list.py b/electrum/gui/qt/channels_list.py
@@ -130,6 +130,7 @@ class ChannelsList(MyTreeView):
if item.data(ROLE_CHANNEL_ID) == chan.channel_id:
for column, v in enumerate(self.format_fields(chan)):
self.model().item(row, column).setData(v, QtCore.Qt.DisplayRole)
+ self.update_can_send(self.parent.wallet.lnworker)
@QtCore.pyqtSlot(Abstract_Wallet)
def do_update_rows(self, wallet):
@@ -138,6 +139,7 @@ class ChannelsList(MyTreeView):
lnworker = self.parent.wallet.lnworker
if not lnworker:
return
+ self.update_can_send(lnworker)
self.model().clear()
self.update_headers(self.headers)
for chan in lnworker.channels.values():
@@ -149,8 +151,17 @@ class ChannelsList(MyTreeView):
items[self.Columns.REMOTE_BALANCE].setFont(QFont(MONOSPACE_FONT))
self.model().insertRow(0, items)
+ def update_can_send(self, lnworker):
+ msg = _('Can send') + ' ' + self.parent.format_amount(lnworker.can_send())\
+ + ' ' + self.parent.base_unit() + '; '\
+ + _('can receive') + ' ' + self.parent.format_amount(lnworker.can_receive())\
+ + ' ' + self.parent.base_unit()
+ self.can_send_label.setText(msg)
+
def get_toolbar(self):
h = QHBoxLayout()
+ self.can_send_label = QLabel('')
+ h.addWidget(self.can_send_label)
h.addStretch()
h.addWidget(EnterButton(_('Open Channel'), self.new_channel_dialog))
return h
diff --git a/electrum/lnchannel.py b/electrum/lnchannel.py
@@ -298,6 +298,9 @@ class Channel(Logger):
def get_state(self):
return self._state
+ def is_open(self):
+ return self.get_state() == channel_states.OPEN
+
def is_closing(self):
return self.get_state() in [channel_states.CLOSING, channel_states.FORCE_CLOSING]
diff --git a/electrum/lnworker.py b/electrum/lnworker.py
@@ -1163,6 +1163,14 @@ class LNWallet(LNWorker):
with self.lock:
return Decimal(sum(chan.balance(LOCAL) if not chan.is_closed() else 0 for chan in self.channels.values()))/1000
+ def can_send(self):
+ with self.lock:
+ return Decimal(max(chan.available_to_spend(LOCAL) if chan.is_open() else 0 for chan in self.channels.values()))/1000
+
+ def can_receive(self):
+ with self.lock:
+ return Decimal(max(chan.available_to_spend(REMOTE) if chan.is_open() else 0 for chan in self.channels.values()))/1000
+
def list_channels(self):
encoder = MyEncoder()
with self.lock: