You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
102 lines
3.5 KiB
102 lines
3.5 KiB
from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QObject
|
|
from PyQt5.QtCore import Qt, QAbstractListModel, QModelIndex
|
|
|
|
from electrum.logging import get_logger
|
|
from electrum.util import Satoshis, format_time
|
|
from electrum.invoices import Invoice
|
|
|
|
class QERequestListModel(QAbstractListModel):
|
|
def __init__(self, wallet, parent=None):
|
|
super().__init__(parent)
|
|
self.wallet = wallet
|
|
self.requests = []
|
|
|
|
_logger = get_logger(__name__)
|
|
|
|
# define listmodel rolemap
|
|
_ROLE_NAMES=('key','type','timestamp','message','amount','status','address')
|
|
_ROLE_KEYS = range(Qt.UserRole + 1, Qt.UserRole + 1 + len(_ROLE_NAMES))
|
|
_ROLE_MAP = dict(zip(_ROLE_KEYS, [bytearray(x.encode()) for x in _ROLE_NAMES]))
|
|
_ROLE_RMAP = dict(zip(_ROLE_NAMES, _ROLE_KEYS))
|
|
|
|
def rowCount(self, index):
|
|
return len(self.requests)
|
|
|
|
def roleNames(self):
|
|
return self._ROLE_MAP
|
|
|
|
def data(self, index, role):
|
|
request = self.requests[index.row()]
|
|
role_index = role - (Qt.UserRole + 1)
|
|
value = request[self._ROLE_NAMES[role_index]]
|
|
if isinstance(value, bool) or isinstance(value, list) or isinstance(value, int) or value is None:
|
|
return value
|
|
if isinstance(value, Satoshis):
|
|
return value.value
|
|
return str(value)
|
|
|
|
def clear(self):
|
|
self.beginResetModel()
|
|
self.requests = []
|
|
self.endResetModel()
|
|
|
|
def request_to_model(self, req: Invoice):
|
|
item = {}
|
|
key = self.wallet.get_key_for_receive_request(req) # (verified) address for onchain, rhash for LN
|
|
status = self.wallet.get_request_status(key)
|
|
item['status'] = req.get_status_str(status)
|
|
item['type'] = req.type # 0=onchain, 2=LN
|
|
timestamp = req.time
|
|
item['timestamp'] = format_time(timestamp)
|
|
item['amount'] = req.get_amount_sat()
|
|
item['message'] = req.message
|
|
if req.type == 0: # OnchainInvoice
|
|
item['key'] = item['address'] = req.get_address()
|
|
elif req.type == 2: # LNInvoice
|
|
#item['key'] = req.getrhash()
|
|
pass
|
|
|
|
return item
|
|
|
|
@pyqtSlot()
|
|
def init_model(self):
|
|
requests = []
|
|
for req in self.wallet.get_unpaid_requests():
|
|
item = self.request_to_model(req)
|
|
self._logger.debug(str(item))
|
|
requests.append(item)
|
|
|
|
self.clear()
|
|
self.beginInsertRows(QModelIndex(), 0, len(self.requests) - 1)
|
|
self.requests = requests
|
|
self.endInsertRows()
|
|
|
|
def add_request(self, request: Invoice):
|
|
item = self.request_to_model(request)
|
|
self._logger.debug(str(item))
|
|
|
|
self.beginInsertRows(QModelIndex(), 0, 0)
|
|
self.requests.insert(0, item)
|
|
self.endInsertRows()
|
|
|
|
def delete_request(self, key: str):
|
|
i = 0
|
|
for request in self.requests:
|
|
if request['key'] == key:
|
|
self.beginRemoveRows(QModelIndex(), i, i)
|
|
self.requests.pop(i)
|
|
self.endRemoveRows()
|
|
break
|
|
i = i + 1
|
|
|
|
@pyqtSlot(str, int)
|
|
def updateRequest(self, key, status):
|
|
self._logger.debug('updating request for %s to %d' % (key,status))
|
|
i = 0
|
|
for item in self.requests:
|
|
if item['key'] == key:
|
|
req = self.wallet.get_request(key)
|
|
item['status'] = req.get_status_str(status)
|
|
index = self.index(i,0)
|
|
self.dataChanged.emit(index, index, [self._ROLE_RMAP['status']])
|
|
i = i + 1
|
|
|