144 lines
3.2 KiB
QML
144 lines
3.2 KiB
QML
|
import QtQuick 2.15
|
||
|
import QtQuick.Controls 2.15
|
||
|
import QtQuick.Layouts 1.15
|
||
|
|
||
|
import StatusQ 0.1
|
||
|
|
||
|
import SortFilterProxyModel 0.2
|
||
|
|
||
|
Pane {
|
||
|
id: root
|
||
|
|
||
|
ListModel {
|
||
|
id: collectiblesModel
|
||
|
|
||
|
Component.onCompleted: {
|
||
|
const randomInt = max => Math.floor(Math.random() * max)
|
||
|
const data = []
|
||
|
|
||
|
for (let i = 0; i < 1000; i++) {
|
||
|
const collectionName = "collection_" + i
|
||
|
const tokensCount = randomInt(10) + 1
|
||
|
|
||
|
for (let j = 0; j < tokensCount; j++) {
|
||
|
data.push({
|
||
|
collectionName,
|
||
|
tokenName: "token_" + j,
|
||
|
tokenValue: randomInt(200)
|
||
|
})
|
||
|
}
|
||
|
}
|
||
|
|
||
|
append(data)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
SortFilterProxyModel {
|
||
|
id: sfpm
|
||
|
|
||
|
sourceModel: collectiblesModel
|
||
|
|
||
|
filters: RangeFilter {
|
||
|
roleName: "tokenValue"
|
||
|
minimumValue: slider.value
|
||
|
}
|
||
|
}
|
||
|
|
||
|
GroupingModel {
|
||
|
id: groupingModel
|
||
|
|
||
|
sourceModel: sfpm
|
||
|
groupingRoleName: "collectionName"
|
||
|
submodelRoleName: "collectibles"
|
||
|
}
|
||
|
|
||
|
ColumnLayout {
|
||
|
anchors.fill: parent
|
||
|
|
||
|
Label {
|
||
|
Layout.fillWidth: true
|
||
|
Layout.bottomMargin: 10
|
||
|
|
||
|
wrapMode: Text.Wrap
|
||
|
text: "<b>Description</b>: flat model with roles 'collectionName',"
|
||
|
+ " 'tokenName' and 'tokenValue' is filtered by token value"
|
||
|
+ " and grouped by collection name"
|
||
|
}
|
||
|
|
||
|
Label {
|
||
|
text: "source model count: " + collectiblesModel.count
|
||
|
}
|
||
|
|
||
|
Label {
|
||
|
text: "filtered model count: " + sfpm.count
|
||
|
}
|
||
|
|
||
|
Label {
|
||
|
text: "grouped model count: " + listView.count
|
||
|
}
|
||
|
|
||
|
RowLayout {
|
||
|
Layout.fillHeight: false
|
||
|
|
||
|
Label {
|
||
|
text: "Token value threshold"
|
||
|
}
|
||
|
|
||
|
Slider {
|
||
|
id: slider
|
||
|
|
||
|
stepSize: 1
|
||
|
value: 100
|
||
|
from: 0
|
||
|
to: 200
|
||
|
}
|
||
|
|
||
|
Label {
|
||
|
text: slider.value
|
||
|
}
|
||
|
}
|
||
|
|
||
|
ListView {
|
||
|
id: listView
|
||
|
|
||
|
Layout.fillWidth: true
|
||
|
Layout.fillHeight: true
|
||
|
|
||
|
model: groupingModel
|
||
|
spacing: 5
|
||
|
clip: true
|
||
|
|
||
|
ScrollBar.vertical: ScrollBar {}
|
||
|
|
||
|
delegate: RowLayout {
|
||
|
id: delegateRoot
|
||
|
|
||
|
width: ListView.view.width
|
||
|
|
||
|
readonly property var collectibles: model.collectibles
|
||
|
|
||
|
Label {
|
||
|
text: model.collectionName
|
||
|
}
|
||
|
|
||
|
ListView {
|
||
|
clip: true
|
||
|
orientation: ListView.Horizontal
|
||
|
|
||
|
Layout.fillWidth: true
|
||
|
Layout.fillHeight: true
|
||
|
|
||
|
model: delegateRoot.collectibles
|
||
|
|
||
|
delegate: Label {
|
||
|
text: `${model.tokenName} (val: ${model.tokenValue})`
|
||
|
color: "darkred"
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// category: Models
|