From dec0cdd0d3a58645a58e7b9463f9c4c1377be463 Mon Sep 17 00:00:00 2001 From: Sander van Grieken Date: Mon, 21 Mar 2022 19:28:39 +0100 Subject: [PATCH] refactor QEAddressListModel and QETransactionListModel to their own files --- electrum/gui/qml/qeaddresslistmodel.py | 72 ++++++++++++ electrum/gui/qml/qetransactionlistmodel.py | 56 ++++++++++ electrum/gui/qml/qewallet.py | 121 +-------------------- 3 files changed, 131 insertions(+), 118 deletions(-) create mode 100644 electrum/gui/qml/qeaddresslistmodel.py create mode 100644 electrum/gui/qml/qetransactionlistmodel.py diff --git a/electrum/gui/qml/qeaddresslistmodel.py b/electrum/gui/qml/qeaddresslistmodel.py new file mode 100644 index 000000000..a9b60fd7b --- /dev/null +++ b/electrum/gui/qml/qeaddresslistmodel.py @@ -0,0 +1,72 @@ +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 + +class QEAddressListModel(QAbstractListModel): + def __init__(self, wallet, parent=None): + super().__init__(parent) + self.wallet = wallet + self.receive_addresses = [] + self.change_addresses = [] + + + _logger = get_logger(__name__) + + # define listmodel rolemap + _ROLE_NAMES=('type','address','label','balance','numtx', 'held') + _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])) + + def rowCount(self, index): + return len(self.receive_addresses) + len(self.change_addresses) + + def roleNames(self): + return self._ROLE_MAP + + def data(self, index, role): + if index.row() > len(self.receive_addresses) - 1: + address = self.change_addresses[index.row() - len(self.receive_addresses)] + else: + address = self.receive_addresses[index.row()] + role_index = role - (Qt.UserRole + 1) + value = address[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.receive_addresses = [] + self.change_addresses = [] + self.endResetModel() + + # initial model data + @pyqtSlot() + def init_model(self): + r_addresses = self.wallet.get_receiving_addresses() + c_addresses = self.wallet.get_change_addresses() + n_addresses = len(r_addresses) + len(c_addresses) + + def insert_row(atype, alist, address): + item = {} + item['type'] = atype + item['address'] = address + item['numtx'] = self.wallet.get_address_history_len(address) + item['label'] = self.wallet.get_label(address) + c, u, x = self.wallet.get_addr_balance(address) + item['balance'] = c + u + x + item['held'] = self.wallet.is_frozen_address(address) + alist.append(item) + + self.clear() + self.beginInsertRows(QModelIndex(), 0, n_addresses - 1) + for address in r_addresses: + insert_row('receive', self.receive_addresses, address) + for address in c_addresses: + insert_row('change', self.change_addresses, address) + self.endInsertRows() + diff --git a/electrum/gui/qml/qetransactionlistmodel.py b/electrum/gui/qml/qetransactionlistmodel.py new file mode 100644 index 000000000..e95bd588e --- /dev/null +++ b/electrum/gui/qml/qetransactionlistmodel.py @@ -0,0 +1,56 @@ +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 + +class QETransactionListModel(QAbstractListModel): + def __init__(self, wallet, parent=None): + super().__init__(parent) + self.wallet = wallet + self.tx_history = [] + + _logger = get_logger(__name__) + + # define listmodel rolemap + _ROLE_NAMES=('txid','fee_sat','height','confirmations','timestamp','monotonic_timestamp','incoming','bc_value', + 'bc_balance','date','label','txpos_in_block','fee','inputs','outputs') + _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])) + + def rowCount(self, index): + return len(self.tx_history) + + def roleNames(self): + return self._ROLE_MAP + + def data(self, index, role): + tx = self.tx_history[index.row()] + role_index = role - (Qt.UserRole + 1) + value = tx[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.tx_history = [] + self.endResetModel() + + # initial model data + def init_model(self): + history = self.wallet.get_detailed_history(show_addresses = True) + txs = history['transactions'] + # use primitives + for tx in txs: + for output in tx['outputs']: + output['value'] = output['value'].value + + self.clear() + self.beginInsertRows(QModelIndex(), 0, len(txs) - 1) + self.tx_history = txs + self.tx_history.reverse() + self.endInsertRows() + diff --git a/electrum/gui/qml/qewallet.py b/electrum/gui/qml/qewallet.py index 214b4df03..7b7c7694f 100644 --- a/electrum/gui/qml/qewallet.py +++ b/electrum/gui/qml/qewallet.py @@ -1,5 +1,4 @@ from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QObject, QUrl -from PyQt5.QtCore import Qt, QAbstractListModel, QModelIndex, QByteArray from typing import Optional, TYPE_CHECKING, Sequence, List, Union @@ -8,127 +7,13 @@ from electrum.util import register_callback, Satoshis, format_time from electrum.logging import get_logger from electrum.wallet import Wallet, Abstract_Wallet from electrum import bitcoin -from electrum.transaction import Transaction, tx_from_any, PartialTransaction, PartialTxOutput +from electrum.transaction import PartialTxOutput from electrum.invoices import (Invoice, InvoiceError, PR_TYPE_ONCHAIN, PR_TYPE_LN, PR_DEFAULT_EXPIRATION_WHEN_CREATING, PR_PAID, PR_UNPAID, PR_UNKNOWN, PR_EXPIRED, PR_UNCONFIRMED, PR_TYPE_ONCHAIN, PR_TYPE_LN) from .qerequestlistmodel import QERequestListModel - -class QETransactionListModel(QAbstractListModel): - def __init__(self, wallet, parent=None): - super().__init__(parent) - self.wallet = wallet - self.tx_history = [] - - _logger = get_logger(__name__) - - # define listmodel rolemap - _ROLE_NAMES=('txid','fee_sat','height','confirmations','timestamp','monotonic_timestamp','incoming','bc_value', - 'bc_balance','date','label','txpos_in_block','fee','inputs','outputs') - _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])) - - def rowCount(self, index): - return len(self.tx_history) - - def roleNames(self): - return self._ROLE_MAP - - def data(self, index, role): - tx = self.tx_history[index.row()] - role_index = role - (Qt.UserRole + 1) - value = tx[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.tx_history = [] - self.endResetModel() - - # initial model data - def init_model(self): - history = self.wallet.get_detailed_history(show_addresses = True) - txs = history['transactions'] - # use primitives - for tx in txs: - for output in tx['outputs']: - output['value'] = output['value'].value - - self.clear() - self.beginInsertRows(QModelIndex(), 0, len(txs) - 1) - self.tx_history = txs - self.tx_history.reverse() - self.endInsertRows() - -class QEAddressListModel(QAbstractListModel): - def __init__(self, wallet, parent=None): - super().__init__(parent) - self.wallet = wallet - self.receive_addresses = [] - self.change_addresses = [] - - - _logger = get_logger(__name__) - - # define listmodel rolemap - _ROLE_NAMES=('type','address','label','balance','numtx', 'held') - _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])) - - def rowCount(self, index): - return len(self.receive_addresses) + len(self.change_addresses) - - def roleNames(self): - return self._ROLE_MAP - - def data(self, index, role): - if index.row() > len(self.receive_addresses) - 1: - address = self.change_addresses[index.row() - len(self.receive_addresses)] - else: - address = self.receive_addresses[index.row()] - role_index = role - (Qt.UserRole + 1) - value = address[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.receive_addresses = [] - self.change_addresses = [] - self.endResetModel() - - # initial model data - @pyqtSlot() - def init_model(self): - r_addresses = self.wallet.get_receiving_addresses() - c_addresses = self.wallet.get_change_addresses() - n_addresses = len(r_addresses) + len(c_addresses) - - def insert_row(atype, alist, address): - item = {} - item['type'] = atype - item['address'] = address - item['numtx'] = self.wallet.get_address_history_len(address) - item['label'] = self.wallet.get_label(address) - c, u, x = self.wallet.get_addr_balance(address) - item['balance'] = c + u + x - item['held'] = self.wallet.is_frozen_address(address) - alist.append(item) - - self.clear() - self.beginInsertRows(QModelIndex(), 0, n_addresses - 1) - for address in r_addresses: - insert_row('receive', self.receive_addresses, address) - for address in c_addresses: - insert_row('change', self.change_addresses, address) - self.endInsertRows() +from .qetransactionlistmodel import QETransactionListModel +from .qeaddresslistmodel import QEAddressListModel class QEWallet(QObject): def __init__(self, wallet, parent=None):