4 changed files with 135 additions and 69 deletions
@ -0,0 +1,115 @@
|
||||
import os |
||||
|
||||
from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QObject, QUrl |
||||
from PyQt5.QtCore import Qt, QAbstractListModel, QModelIndex |
||||
|
||||
from electrum.util import register_callback, get_new_wallet_name |
||||
from electrum.logging import get_logger |
||||
from electrum.wallet import Wallet, Abstract_Wallet |
||||
|
||||
from .qewallet import QEWallet |
||||
|
||||
# wallet list model. supports both wallet basenames (wallet file basenames) |
||||
# and whole Wallet instances (loaded wallets) |
||||
class QEWalletListModel(QAbstractListModel): |
||||
_logger = get_logger(__name__) |
||||
def __init__(self, parent=None): |
||||
QAbstractListModel.__init__(self, parent) |
||||
self.wallets = [] |
||||
|
||||
# define listmodel rolemap |
||||
_ROLE_NAMES= ('name','path','active') |
||||
_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.wallets) |
||||
|
||||
def roleNames(self): |
||||
return self._ROLE_MAP |
||||
|
||||
def data(self, index, role): |
||||
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 data(self, index, role): |
||||
(wallet_name, wallet_path, wallet) = self.wallets[index.row()] |
||||
role_index = role - (Qt.UserRole + 1) |
||||
role_name = self._ROLE_NAMES[role_index] |
||||
if role_name == 'name': |
||||
return wallet_name |
||||
if role_name == 'path': |
||||
return wallet_name |
||||
if role_name == 'active': |
||||
return wallet != None |
||||
|
||||
def add_wallet(self, wallet_path = None, wallet: Abstract_Wallet = None): |
||||
if wallet_path == None and wallet == None: |
||||
return |
||||
self.beginInsertRows(QModelIndex(), len(self.wallets), len(self.wallets)); |
||||
if wallet == None: |
||||
wallet_name = os.path.basename(wallet_path) |
||||
else: |
||||
wallet_name = wallet.basename() |
||||
item = (wallet_name, wallet_path, wallet) |
||||
self.wallets.append(item); |
||||
self.endInsertRows(); |
||||
|
||||
|
||||
class QEDaemon(QObject): |
||||
def __init__(self, daemon, parent=None): |
||||
super().__init__(parent) |
||||
self.daemon = daemon |
||||
|
||||
_logger = get_logger(__name__) |
||||
_loaded_wallets = QEWalletListModel() |
||||
|
||||
walletLoaded = pyqtSignal() |
||||
walletRequiresPassword = pyqtSignal() |
||||
|
||||
@pyqtSlot() |
||||
def load_wallet(self, path=None, password=None): |
||||
if path == None: |
||||
path = self.daemon.config.get('gui_last_wallet') |
||||
wallet = self.daemon.load_wallet(path, password) |
||||
if wallet != None: |
||||
self._loaded_wallets.add_wallet(wallet=wallet) |
||||
self._current_wallet = QEWallet(wallet) |
||||
self.walletLoaded.emit() |
||||
else: |
||||
self._logger.info('fail open wallet') |
||||
self.walletRequiresPassword.emit() |
||||
|
||||
@pyqtProperty(QEWallet,notify=walletLoaded) |
||||
def currentWallet(self): |
||||
return self._current_wallet |
||||
|
||||
@pyqtProperty('QString',notify=walletLoaded) |
||||
def walletName(self): |
||||
return self._current_wallet.wallet.basename() |
||||
|
||||
@pyqtProperty(QEWalletListModel) |
||||
def activeWallets(self): |
||||
return self._loaded_wallets |
||||
|
||||
@pyqtProperty(QEWalletListModel) |
||||
def availableWallets(self): |
||||
available = [] |
||||
availableListModel = QEWalletListModel(self) |
||||
wallet_folder = os.path.dirname(self.daemon.config.get_wallet_path()) |
||||
with os.scandir(wallet_folder) as it: |
||||
for i in it: |
||||
if i.is_file(): |
||||
available.append(i.path) |
||||
for path in sorted(available): |
||||
wallet = self.daemon.get_wallet(path) |
||||
if wallet != None: |
||||
availableListModel.add_wallet(wallet_path = wallet.storage.path, wallet = wallet) |
||||
else: |
||||
availableListModel.add_wallet(wallet_path = path) |
||||
return availableListModel |
||||
Loading…
Reference in new issue