Browse Source

qml: add initial generic listmodel filter QEFilterProxyModel

Sander van Grieken 3 years ago
parent
commit
26f7238eb5
  1. 7
      electrum/gui/qml/components/Channels.qml
  2. 6
      electrum/gui/qml/qeapp.py
  3. 9
      electrum/gui/qml/qechannellistmodel.py
  4. 27
      electrum/gui/qml/qemodelfilter.py

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

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

9
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

27
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
Loading…
Cancel
Save