diff --git a/electrum/gui/qml/components/Channels.qml b/electrum/gui/qml/components/Channels.qml index 4db86b07e..810a36142 100644 --- a/electrum/gui/qml/components/Channels.qml +++ b/electrum/gui/qml/components/Channels.qml @@ -78,7 +78,7 @@ Pane { Layout.preferredWidth: parent.width Layout.fillHeight: true clip: true - model: Daemon.currentWallet.channelModel + model: Daemon.currentWallet.channelModel.filterModel('is_backup', false) delegate: ChannelDelegate { onClicked: { @@ -126,10 +126,9 @@ Pane { FlatButton { Layout.fillWidth: true - text: qsTr('Import channel backup') + text: qsTr('Channel backups') onClicked: { - var dialog = importChannelBackupDialog.createObject(root) - dialog.open() + app.stack.push(Qt.resolvedUrl('ChannelBackups.qml')) } icon.source: '../../icons/file.png' } diff --git a/electrum/gui/qml/qeapp.py b/electrum/gui/qml/qeapp.py index 95e90207a..1cebd04d8 100644 --- a/electrum/gui/qml/qeapp.py +++ b/electrum/gui/qml/qeapp.py @@ -8,7 +8,8 @@ import threading import asyncio from typing import TYPE_CHECKING -from PyQt5.QtCore import pyqtSlot, pyqtSignal, pyqtProperty, QObject, QUrl, QLocale, qInstallMessageHandler, QTimer +from PyQt5.QtCore import (pyqtSlot, pyqtSignal, pyqtProperty, QObject, QUrl, QLocale, + qInstallMessageHandler, QTimer, QSortFilterProxyModel) from PyQt5.QtGui import QGuiApplication, QFontDatabase from PyQt5.QtQml import qmlRegisterType, qmlRegisterUncreatableType, QQmlApplicationEngine @@ -38,6 +39,7 @@ from .qelnpaymentdetails import QELnPaymentDetails from .qechanneldetails import QEChannelDetails from .qeswaphelper import QESwapHelper from .qewizard import QENewWalletWizard, QEServerConnectWizard +from .qemodelfilter import QEFilterProxyModel if TYPE_CHECKING: from electrum.simple_config import SimpleConfig @@ -297,6 +299,8 @@ class ElectrumQmlApplication(QGuiApplication): qmlRegisterUncreatableType(QEAmount, 'org.electrum', 1, 0, 'Amount', 'Amount can only be used as property') qmlRegisterUncreatableType(QENewWalletWizard, 'org.electrum', 1, 0, 'NewWalletWizard', 'NewWalletWizard can only be used as property') qmlRegisterUncreatableType(QEServerConnectWizard, 'org.electrum', 1, 0, 'ServerConnectWizard', 'ServerConnectWizard can only be used as property') + qmlRegisterUncreatableType(QEFilterProxyModel, 'org.electrum', 1, 0, 'FilterProxyModel', 'FilterProxyModel can only be used as property') + qmlRegisterUncreatableType(QSortFilterProxyModel, 'org.electrum', 1, 0, 'QSortFilterProxyModel', 'QSortFilterProxyModel can only be used as property') self.engine = QQmlApplicationEngine(parent=self) diff --git a/electrum/gui/qml/qechannellistmodel.py b/electrum/gui/qml/qechannellistmodel.py index 4d33eff7c..8c612d2f0 100644 --- a/electrum/gui/qml/qechannellistmodel.py +++ b/electrum/gui/qml/qechannellistmodel.py @@ -8,6 +8,7 @@ from electrum.util import Satoshis from .qetypes import QEAmount from .util import QtEventListener, qt_event_listener +from .qemodelfilter import QEFilterProxyModel class QEChannelListModel(QAbstractListModel, QtEventListener): _logger = get_logger(__name__) @@ -165,3 +166,11 @@ class QEChannelListModel(QAbstractListModel, QtEventListener): self.countChanged.emit() return i = i + 1 + + @pyqtSlot(str, 'QVariant', result=QEFilterProxyModel) + def filterModel(self, role, match): + self._filterModel = QEFilterProxyModel(self, self) + self._filterModel.setFilterRole(QEChannelListModel._ROLE_RMAP[role]) + self._filterModel.setFilterValue(match) + return self._filterModel + diff --git a/electrum/gui/qml/qemodelfilter.py b/electrum/gui/qml/qemodelfilter.py new file mode 100644 index 000000000..dc7a0a36b --- /dev/null +++ b/electrum/gui/qml/qemodelfilter.py @@ -0,0 +1,27 @@ +from PyQt5.QtCore import QSortFilterProxyModel + +from electrum.logging import get_logger + +class QEFilterProxyModel(QSortFilterProxyModel): + _logger = get_logger(__name__) + + _filter_value = None + + def __init__(self, parent_model, parent=None): + super().__init__(parent) + self.setSourceModel(parent_model) + + def isCustomFilter(self): + return self._filter_value is not None + + def setFilterValue(self, filter_value): + self._filter_value = filter_value + + def filterAcceptsRow(self, s_row, s_parent): + if not self.isCustomFilter: + return super().filterAcceptsRow(s_row, s_parent) + + parent_model = self.sourceModel() + d = parent_model.data(parent_model.index(s_row, 0, s_parent), self.filterRole()) + # self._logger.debug(f'DATA in FilterProxy is {repr(d)}') + return True if self._filter_value is None else d == self._filter_value