Browse Source

qml: add status update timer for invoice listmodel

master
Sander van Grieken 3 years ago
parent
commit
3aa10b483f
  1. 46
      electrum/gui/qml/qeinvoicelistmodel.py

46
electrum/gui/qml/qeinvoicelistmodel.py

@ -1,13 +1,13 @@
from abc import abstractmethod from abc import abstractmethod
from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QObject from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QObject, QTimer
from PyQt5.QtCore import Qt, QAbstractListModel, QModelIndex from PyQt5.QtCore import Qt, QAbstractListModel, QModelIndex
from electrum.logging import get_logger from electrum.logging import get_logger
from electrum.util import Satoshis, format_time from electrum.util import Satoshis, format_time
from electrum.invoices import Invoice from electrum.invoices import Invoice, PR_EXPIRED, LN_EXPIRY_NEVER
from .util import QtEventListener, qt_event_listener from .util import QtEventListener, qt_event_listener, status_update_timer_interval
from .qetypes import QEAmount from .qetypes import QEAmount
class QEAbstractInvoiceListModel(QAbstractListModel): class QEAbstractInvoiceListModel(QAbstractListModel):
@ -24,6 +24,11 @@ class QEAbstractInvoiceListModel(QAbstractListModel):
def __init__(self, wallet, parent=None): def __init__(self, wallet, parent=None):
super().__init__(parent) super().__init__(parent)
self.wallet = wallet self.wallet = wallet
self._timer = QTimer(self)
self._timer.setSingleShot(True)
self._timer.timeout.connect(self.updateStatusStrings)
self.init_model() self.init_model()
def rowCount(self, index): def rowCount(self, index):
@ -60,6 +65,8 @@ class QEAbstractInvoiceListModel(QAbstractListModel):
self.invoices = invoices self.invoices = invoices
self.endInsertRows() self.endInsertRows()
self.set_status_timer()
def add_invoice(self, invoice: Invoice): def add_invoice(self, invoice: Invoice):
item = self.invoice_to_model(invoice) item = self.invoice_to_model(invoice)
self._logger.debug(str(item)) self._logger.debug(str(item))
@ -68,6 +75,8 @@ class QEAbstractInvoiceListModel(QAbstractListModel):
self.invoices.insert(0, item) self.invoices.insert(0, item)
self.endInsertRows() self.endInsertRows()
self.set_status_timer()
@pyqtSlot(str) @pyqtSlot(str)
def addInvoice(self, key): def addInvoice(self, key):
self.add_invoice(self.get_invoice_for_key(key)) self.add_invoice(self.get_invoice_for_key(key))
@ -81,6 +90,7 @@ class QEAbstractInvoiceListModel(QAbstractListModel):
self.endRemoveRows() self.endRemoveRows()
break break
i = i + 1 i = i + 1
self.set_status_timer()
def get_model_invoice(self, key: str): def get_model_invoice(self, key: str):
for invoice in self.invoices: for invoice in self.invoices:
@ -104,7 +114,7 @@ class QEAbstractInvoiceListModel(QAbstractListModel):
def invoice_to_model(self, invoice: Invoice): def invoice_to_model(self, invoice: Invoice):
item = self.get_invoice_as_dict(invoice) item = self.get_invoice_as_dict(invoice)
#item['key'] = invoice.get_id() item['key'] = invoice.get_id()
item['is_lightning'] = invoice.is_lightning() item['is_lightning'] = invoice.is_lightning()
if invoice.is_lightning() and 'address' not in item: if invoice.is_lightning() and 'address' not in item:
item['address'] = '' item['address'] = ''
@ -115,6 +125,32 @@ class QEAbstractInvoiceListModel(QAbstractListModel):
return item return item
def set_status_timer(self):
nearest_interval = LN_EXPIRY_NEVER
for invoice in self.invoices:
if invoice['status'] != PR_EXPIRED:
if invoice['expiration'] > 0 and invoice['expiration'] != LN_EXPIRY_NEVER:
interval = status_update_timer_interval(invoice['timestamp'] + invoice['expiration'])
if interval > 0:
nearest_interval = nearest_interval if nearest_interval < interval else interval
if nearest_interval != LN_EXPIRY_NEVER:
self._timer.setInterval(nearest_interval) # msec
self._timer.start()
@pyqtSlot()
def updateStatusStrings(self):
i = 0
for item in self.invoices:
invoice = self.get_invoice_for_key(item['key'])
item['status'] = self.wallet.get_invoice_status(invoice)
item['status_str'] = invoice.get_status_str(item['status'])
index = self.index(i,0)
self.dataChanged.emit(index, index, [self._ROLE_RMAP['status'], self._ROLE_RMAP['status_str']])
i = i + 1
self.set_status_timer()
@abstractmethod @abstractmethod
def get_invoice_for_key(self, key: str): def get_invoice_for_key(self, key: str):
raise Exception('provide impl') raise Exception('provide impl')
@ -148,7 +184,6 @@ class QEInvoiceListModel(QEAbstractInvoiceListModel, QtEventListener):
def invoice_to_model(self, invoice: Invoice): def invoice_to_model(self, invoice: Invoice):
item = super().invoice_to_model(invoice) item = super().invoice_to_model(invoice)
item['type'] = 'invoice' item['type'] = 'invoice'
item['key'] = invoice.get_id()
return item return item
@ -181,7 +216,6 @@ class QERequestListModel(QEAbstractInvoiceListModel, QtEventListener):
def invoice_to_model(self, invoice: Invoice): def invoice_to_model(self, invoice: Invoice):
item = super().invoice_to_model(invoice) item = super().invoice_to_model(invoice)
item['type'] = 'request' item['type'] = 'request'
item['key'] = invoice.get_id()
return item return item

Loading…
Cancel
Save