URI: 
       tLightning: Show sending and receiving capacity. Fixes #5967 - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 238fb46d878149b03ffc7e4b530cee0a22d8ebd2
   DIR parent 3d42fca86ee8a62baad85772b9a0a3e7427ba9d0
  HTML Author: ThomasV <thomasv@electrum.org>
       Date:   Wed, 19 Feb 2020 16:03:21 +0100
       
       Lightning: Show sending and receiving capacity. Fixes #5967
       
       Diffstat:
         M electrum/gui/kivy/uix/dialogs/ligh… |      33 ++++++++++++++++++++++++++-----
         M electrum/gui/qt/channels_list.py    |      11 +++++++++++
         M electrum/lnchannel.py               |       3 +++
         M electrum/lnworker.py                |       8 ++++++++
       
       4 files changed, 50 insertions(+), 5 deletions(-)
       ---
   DIR diff --git a/electrum/gui/kivy/uix/dialogs/lightning_channels.py b/electrum/gui/kivy/uix/dialogs/lightning_channels.py
       t@@ -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
       t@@ -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']
       t@@ -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),
       t@@ -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):
       t@@ -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
       t@@ -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())
   DIR diff --git a/electrum/gui/qt/channels_list.py b/electrum/gui/qt/channels_list.py
       t@@ -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):
       t@@ -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():
       t@@ -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
   DIR diff --git a/electrum/lnchannel.py b/electrum/lnchannel.py
       t@@ -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]
        
   DIR diff --git a/electrum/lnworker.py b/electrum/lnworker.py
       t@@ -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: