gui: show incoming lightning requests, add on-chain icon
This commit is contained in:
@@ -30,7 +30,9 @@ from PyQt5.QtGui import QStandardItemModel, QStandardItem, QFont
|
||||
from PyQt5.QtWidgets import QHeaderView, QMenu
|
||||
|
||||
from electrum.i18n import _
|
||||
from electrum.util import format_time
|
||||
from electrum.util import format_time, pr_tooltips, PR_UNPAID
|
||||
from electrum.lnutil import lndecode
|
||||
from electrum.bitcoin import COIN
|
||||
|
||||
from .util import (MyTreeView, read_QIcon, MONOSPACE_FONT, PR_UNPAID,
|
||||
pr_tooltips, import_meta_gui, export_meta_gui, pr_icons)
|
||||
@@ -40,26 +42,23 @@ class InvoiceList(MyTreeView):
|
||||
|
||||
class Columns(IntEnum):
|
||||
DATE = 0
|
||||
REQUESTOR = 1
|
||||
DESCRIPTION = 2
|
||||
AMOUNT = 3
|
||||
STATUS = 4
|
||||
DESCRIPTION = 1
|
||||
AMOUNT = 2
|
||||
STATUS = 3
|
||||
|
||||
headers = {
|
||||
Columns.DATE: _('Expires'),
|
||||
Columns.REQUESTOR: _('Requestor'),
|
||||
Columns.DESCRIPTION: _('Description'),
|
||||
Columns.AMOUNT: _('Amount'),
|
||||
Columns.STATUS: _('Status'),
|
||||
}
|
||||
filter_columns = [Columns.DATE, Columns.REQUESTOR, Columns.DESCRIPTION, Columns.AMOUNT]
|
||||
filter_columns = [Columns.DATE, Columns.DESCRIPTION, Columns.AMOUNT]
|
||||
|
||||
def __init__(self, parent):
|
||||
super().__init__(parent, self.create_menu,
|
||||
stretch_column=self.Columns.DESCRIPTION,
|
||||
editable_columns=[])
|
||||
self.setSortingEnabled(True)
|
||||
self.setColumnWidth(self.Columns.REQUESTOR, 200)
|
||||
self.setModel(QStandardItemModel(self))
|
||||
self.update()
|
||||
|
||||
@@ -67,26 +66,50 @@ class InvoiceList(MyTreeView):
|
||||
inv_list = self.parent.invoices.unpaid_invoices()
|
||||
self.model().clear()
|
||||
self.update_headers(self.__class__.headers)
|
||||
self.header().setSectionResizeMode(self.Columns.REQUESTOR, QHeaderView.Interactive)
|
||||
for idx, pr in enumerate(inv_list):
|
||||
key = pr.get_id()
|
||||
status = self.parent.invoices.get_status(key)
|
||||
if status is None:
|
||||
continue
|
||||
requestor = pr.get_requestor()
|
||||
exp = pr.get_expiration_date()
|
||||
exp = pr.get_time()
|
||||
date_str = format_time(exp) if exp else _('Never')
|
||||
labels = [date_str, requestor, pr.memo, self.parent.format_amount(pr.get_amount(), whitespaces=True), pr_tooltips.get(status,'')]
|
||||
labels = [date_str, '[%s] '%requestor + pr.memo, self.parent.format_amount(pr.get_amount(), whitespaces=True), pr_tooltips.get(status,'')]
|
||||
items = [QStandardItem(e) for e in labels]
|
||||
self.set_editability(items)
|
||||
items[self.Columns.DATE].setIcon(read_QIcon('bitcoin.png'))
|
||||
items[self.Columns.STATUS].setIcon(read_QIcon(pr_icons.get(status)))
|
||||
items[self.Columns.DATE].setData(key, role=Qt.UserRole)
|
||||
items[self.Columns.REQUESTOR].setFont(QFont(MONOSPACE_FONT))
|
||||
items[self.Columns.AMOUNT].setFont(QFont(MONOSPACE_FONT))
|
||||
self.model().insertRow(idx, items)
|
||||
|
||||
lnworker = self.parent.wallet.lnworker
|
||||
for key, (preimage_hex, invoice, is_received, pay_timestamp) in lnworker.invoices.items():
|
||||
if is_received:
|
||||
continue
|
||||
status = lnworker.get_invoice_status(key)
|
||||
lnaddr = lndecode(invoice, expected_hrp=constants.net.SEGWIT_HRP)
|
||||
amount_sat = lnaddr.amount*COIN if lnaddr.amount else None
|
||||
amount_str = self.parent.format_amount(amount_sat) if amount_sat else ''
|
||||
description = ''
|
||||
for k,v in lnaddr.tags:
|
||||
if k == 'd':
|
||||
description = v
|
||||
break
|
||||
date_str = format_time(lnaddr.date)
|
||||
labels = [date_str, description, amount_str, pr_tooltips.get(status,'')]
|
||||
items = [QStandardItem(e) for e in labels]
|
||||
#items[0].setData(REQUEST_TYPE_LN, ROLE_REQUEST_TYPE)
|
||||
#items[0].setData(key, ROLE_RHASH_OR_ADDR)
|
||||
items[0].setIcon(self.icon_cache.get(':icons/lightning.png'))
|
||||
items[3].setIcon(self.icon_cache.get(pr_icons.get(status)))
|
||||
self.model().insertRow(self.model().rowCount(), items)
|
||||
|
||||
self.selectionModel().select(self.model().index(0,0), QItemSelectionModel.SelectCurrent)
|
||||
# sort requests by date
|
||||
self.model().sort(0)
|
||||
# hide list if empty
|
||||
if self.parent.isVisible():
|
||||
b = len(inv_list) > 0
|
||||
b = self.model().rowCount() > 0
|
||||
self.setVisible(b)
|
||||
self.parent.invoices_label.setVisible(b)
|
||||
self.filter()
|
||||
|
||||
Reference in New Issue
Block a user