URI: 
       tkivy: show payment log details - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 6c2ef176cceb7a1cb1c08550a22d0ee4c1b27d6b
   DIR parent d19fc56eb8875c16ced4ee7be0f048277f95189a
  HTML Author: ThomasV <thomasv@electrum.org>
       Date:   Tue, 10 Mar 2020 16:44:23 +0100
       
       kivy: show payment log details
       
       Diffstat:
         M electrum/gui/kivy/uix/dialogs/invo… |       5 ++++-
         M electrum/gui/qt/invoice_list.py     |      31 +++++++------------------------
         M electrum/lnutil.py                  |      20 ++++++++++++++++++++
       
       3 files changed, 31 insertions(+), 25 deletions(-)
       ---
   DIR diff --git a/electrum/gui/kivy/uix/dialogs/invoice_dialog.py b/electrum/gui/kivy/uix/dialogs/invoice_dialog.py
       t@@ -137,5 +137,8 @@ class InvoiceDialog(Factory.Popup):
        
            def show_log(self):
                if self.log:
       -            log_str = _('Payment log:') + '\n\n' + '\n'.join([str(x.exception) for x in self.log])
       +            log_str = _('Payment log:') + '\n\n'
       +            for payment_attempt_log in self.log:
       +                route_str, chan_str, message = payment_attempt_log.formatted_tuple()
       +                log_str += chan_str + '  ---  ' + message + '\n'
                    self.app.show_info(log_str)
   DIR diff --git a/electrum/gui/qt/invoice_list.py b/electrum/gui/qt/invoice_list.py
       t@@ -29,7 +29,7 @@ from typing import Sequence
        from PyQt5.QtCore import Qt, QItemSelectionModel
        from PyQt5.QtGui import QStandardItemModel, QStandardItem
        from PyQt5.QtWidgets import QAbstractItemView
       -from PyQt5.QtWidgets import QMenu, QVBoxLayout, QTreeWidget, QTreeWidgetItem
       +from PyQt5.QtWidgets import QMenu, QVBoxLayout, QTreeWidget, QTreeWidgetItem, QHeaderView
        
        from electrum.i18n import _
        from electrum.util import format_time, PR_UNPAID, PR_PAID, PR_INFLIGHT, PR_FAILED
       t@@ -173,32 +173,15 @@ class InvoiceList(MyTreeView):
        
            def show_log(self, key, log: Sequence[PaymentAttemptLog]):
                d = WindowModalDialog(self, _("Payment log"))
       -        d.setMinimumWidth(800)
       +        d.setMinimumWidth(600)
                vbox = QVBoxLayout(d)
                log_w = QTreeWidget()
       -        log_w.setHeaderLabels([_('Route'), _('Channel ID'), _('Message'), _('Blacklist')])
       +        log_w.setHeaderLabels([_('Hops'), _('Channel ID'), _('Message')])
       +        log_w.header().setSectionResizeMode(2, QHeaderView.Stretch)
       +        log_w.header().setSectionResizeMode(1, QHeaderView.ResizeToContents)
                for payment_attempt_log in log:
       -            if not payment_attempt_log.exception:
       -                route = payment_attempt_log.route
       -                route_str = '%d'%len(route)
       -                if not payment_attempt_log.success:
       -                    sender_idx = payment_attempt_log.failure_details.sender_idx
       -                    failure_msg = payment_attempt_log.failure_details.failure_msg
       -                    blacklist_msg = str(payment_attempt_log.failure_details.is_blacklisted)
       -                    short_channel_id = route[sender_idx+1].short_channel_id
       -                    data = failure_msg.data
       -                    message = repr(failure_msg.code)
       -                else:
       -                    short_channel_id = route[-1].short_channel_id
       -                    message = _('Success')
       -                    blacklist_msg = str(False)
       -                chan_str = str(short_channel_id)
       -            else:
       -                route_str = 'None'
       -                chan_str = 'N/A'
       -                message = str(payment_attempt_log.exception)
       -                blacklist_msg = 'N/A'
       -            x = QTreeWidgetItem([route_str, chan_str, message, blacklist_msg])
       +            route_str, chan_str, message = payment_attempt_log.formatted_tuple()
       +            x = QTreeWidgetItem([route_str, chan_str, message])
                    log_w.addTopLevelItem(x)
                vbox.addWidget(log_w)
                vbox.addLayout(Buttons(CloseButton(d)))
   DIR diff --git a/electrum/lnutil.py b/electrum/lnutil.py
       t@@ -119,6 +119,26 @@ class PaymentAttemptLog(NamedTuple):
            failure_details: Optional[PaymentAttemptFailureDetails] = None
            exception: Optional[Exception] = None
        
       +    def formatted_tuple(self):
       +        if not self.exception:
       +            route = self.route
       +            route_str = '%d'%len(route)
       +            if not self.success:
       +                sender_idx = self.failure_details.sender_idx
       +                failure_msg = self.failure_details.failure_msg
       +                short_channel_id = route[sender_idx+1].short_channel_id
       +                data = failure_msg.data
       +                message = str(failure_msg.code.name)
       +            else:
       +                short_channel_id = route[-1].short_channel_id
       +                message = _('Success')
       +            chan_str = str(short_channel_id)
       +        else:
       +            route_str = 'None'
       +            chan_str = 'N/A'
       +            message = str(self.exception)
       +        return route_str, chan_str, message
       +
        
        class LightningError(Exception): pass
        class LightningPeerConnectionClosed(LightningError): pass