electrum

Electrum Bitcoin wallet
git clone https://git.parazyd.org/electrum
Log | Files | Refs | Submodules

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:
Melectrum/gui/kivy/uix/dialogs/lightning_channels.py | 33++++++++++++++++++++++++++++-----
Melectrum/gui/qt/channels_list.py | 11+++++++++++
Melectrum/lnchannel.py | 3+++
Melectrum/lnworker.py | 8++++++++
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: