1
0

qml: add initial generic listmodel filter QEFilterProxyModel

This commit is contained in:
Sander van Grieken
2023-01-19 13:40:03 +01:00
parent 264cb7846f
commit 26f7238eb5
4 changed files with 44 additions and 5 deletions

View File

@@ -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'
}

View File

@@ -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)

View File

@@ -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

View File

@@ -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