284 lines
7.5 KiB
QML
284 lines
7.5 KiB
QML
|
import QtQuick 2.15
|
||
|
import QtQuick.Controls 2.15
|
||
|
import QtQuick.Layouts 1.15
|
||
|
|
||
|
import StatusQ 0.1
|
||
|
|
||
|
Item {
|
||
|
id: root
|
||
|
|
||
|
readonly property var colors: [
|
||
|
"red", "green", "purple", "orange","gray", "ping", "brown", "blue"
|
||
|
]
|
||
|
|
||
|
ListModel {
|
||
|
id: leftModel
|
||
|
|
||
|
ListElement {
|
||
|
title: "Token 1"
|
||
|
communityId: "1"
|
||
|
}
|
||
|
ListElement {
|
||
|
title: "Token 2"
|
||
|
communityId: "1"
|
||
|
}
|
||
|
ListElement {
|
||
|
title: "Token 3"
|
||
|
communityId: "2"
|
||
|
}
|
||
|
ListElement {
|
||
|
title: "Token 4"
|
||
|
communityId: "3"
|
||
|
}
|
||
|
ListElement {
|
||
|
title: "Token 5"
|
||
|
communityId: ""
|
||
|
}
|
||
|
ListElement {
|
||
|
title: "Token 6"
|
||
|
communityId: "1"
|
||
|
}
|
||
|
}
|
||
|
|
||
|
ListModel {
|
||
|
id: rightModel
|
||
|
|
||
|
ListElement {
|
||
|
communityId: "1"
|
||
|
name: "Community 1"
|
||
|
color: "red"
|
||
|
|
||
|
}
|
||
|
ListElement {
|
||
|
communityId: "2"
|
||
|
name: "Community 2"
|
||
|
color: "green"
|
||
|
}
|
||
|
ListElement {
|
||
|
communityId: "3"
|
||
|
name: "Community 3"
|
||
|
color: "blue"
|
||
|
}
|
||
|
}
|
||
|
|
||
|
LeftJoinModel {
|
||
|
id: leftJoinModel
|
||
|
|
||
|
leftModel: leftModel
|
||
|
rightModel: rightModel
|
||
|
|
||
|
joinRole: "communityId"
|
||
|
}
|
||
|
|
||
|
ColumnLayout {
|
||
|
anchors.fill: parent
|
||
|
anchors.margins: 40
|
||
|
|
||
|
RowLayout {
|
||
|
Layout.fillWidth: true
|
||
|
Layout.fillHeight: true
|
||
|
|
||
|
clip: true
|
||
|
|
||
|
Rectangle {
|
||
|
Layout.fillWidth: true
|
||
|
Layout.fillHeight: true
|
||
|
|
||
|
border.color: "gray"
|
||
|
|
||
|
ListView {
|
||
|
anchors.fill: parent
|
||
|
|
||
|
model: leftModel
|
||
|
|
||
|
header: Label {
|
||
|
height: implicitHeight * 2
|
||
|
text: `Left model (${leftModel.count})`
|
||
|
|
||
|
font.bold: true
|
||
|
|
||
|
verticalAlignment: Text.AlignVCenter
|
||
|
}
|
||
|
|
||
|
ScrollBar.vertical: ScrollBar {}
|
||
|
|
||
|
delegate: Label {
|
||
|
width: ListView.view.width
|
||
|
|
||
|
text: `${model.title}, community id: ${model.communityId || "-"}`
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Rectangle {
|
||
|
Layout.fillWidth: true
|
||
|
Layout.fillHeight: true
|
||
|
|
||
|
border.color: "gray"
|
||
|
|
||
|
ListView {
|
||
|
anchors.fill: parent
|
||
|
|
||
|
model: rightModel
|
||
|
|
||
|
header: Label {
|
||
|
height: implicitHeight * 2
|
||
|
text: `Right model (${rightModel.count})`
|
||
|
|
||
|
font.bold: true
|
||
|
|
||
|
verticalAlignment: Text.AlignVCenter
|
||
|
}
|
||
|
|
||
|
ScrollBar.vertical: ScrollBar {}
|
||
|
|
||
|
delegate: RowLayout {
|
||
|
width: ListView.view.width - 10
|
||
|
|
||
|
Label {
|
||
|
Layout.fillWidth: true
|
||
|
|
||
|
text: `${model.name}, community id: ${model.communityId}`
|
||
|
}
|
||
|
|
||
|
Rectangle {
|
||
|
Layout.preferredWidth: parent.height
|
||
|
Layout.preferredHeight: parent.height
|
||
|
|
||
|
color: model.color
|
||
|
|
||
|
MouseArea {
|
||
|
anchors.fill: parent
|
||
|
|
||
|
onClicked: {
|
||
|
const colorIndex = root.colors.indexOf(
|
||
|
model.color)
|
||
|
const nextIndex = (colorIndex + 1)
|
||
|
% root.colors.length
|
||
|
|
||
|
rightModel.setProperty(index, "color",
|
||
|
root.colors[nextIndex])
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Rectangle {
|
||
|
Layout.fillWidth: true
|
||
|
Layout.fillHeight: true
|
||
|
|
||
|
border.color: "gray"
|
||
|
|
||
|
ListView {
|
||
|
id: leftJoinListView
|
||
|
|
||
|
anchors.fill: parent
|
||
|
|
||
|
model: leftJoinModel
|
||
|
|
||
|
header: Label {
|
||
|
height: implicitHeight * 2
|
||
|
text: `Left Join model (${leftJoinListView.count})`
|
||
|
|
||
|
font.bold: true
|
||
|
|
||
|
verticalAlignment: Text.AlignVCenter
|
||
|
}
|
||
|
|
||
|
ScrollBar.vertical: ScrollBar {}
|
||
|
|
||
|
delegate: RowLayout {
|
||
|
id: row
|
||
|
|
||
|
width: ListView.view.width - 10
|
||
|
|
||
|
readonly property bool hasCommunity: model.communityId.length
|
||
|
|
||
|
Label {
|
||
|
Layout.fillWidth: true
|
||
|
|
||
|
text: model.title + (row.hasCommunity
|
||
|
? `, community id: ${model.communityId}, name: ${model.name}`
|
||
|
: "")
|
||
|
}
|
||
|
|
||
|
Rectangle {
|
||
|
Layout.preferredWidth: parent.height
|
||
|
Layout.preferredHeight: parent.height
|
||
|
|
||
|
color: model.color || "transparent"
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
RowLayout {
|
||
|
Layout.fillWidth: true
|
||
|
|
||
|
Label {
|
||
|
text: "Left model count: " + leftModel.count
|
||
|
}
|
||
|
|
||
|
Label {
|
||
|
text: "Right model count: " + rightModel.count
|
||
|
}
|
||
|
|
||
|
Button {
|
||
|
text: "add 100 left model items"
|
||
|
|
||
|
onClicked: {
|
||
|
for (let i = 0; i < 100; i++) {
|
||
|
|
||
|
const count = leftModel.count
|
||
|
|
||
|
const entry = {
|
||
|
title: "Token " + (count + 1),
|
||
|
communityId: (Math.floor(Math.random() * rightModel.count) + 1).toString()
|
||
|
}
|
||
|
|
||
|
leftModel.append(entry)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Button {
|
||
|
text: "add 10 right model items"
|
||
|
|
||
|
onClicked: {
|
||
|
for (let i = 0; i < 10; i++) {
|
||
|
const count = rightModel.count
|
||
|
|
||
|
const entry = {
|
||
|
communityId: count.toString(),
|
||
|
name: "Community " + count,
|
||
|
color: root.colors[Math.floor(Math.random() * colors.length)]
|
||
|
}
|
||
|
|
||
|
rightModel.append(entry)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Button {
|
||
|
text: "shuffle"
|
||
|
|
||
|
onClicked: {
|
||
|
const count = leftModel.count
|
||
|
const iterations = count / 2
|
||
|
|
||
|
for (let i = 0; i < iterations; i++) {
|
||
|
leftModel.move(Math.floor(Math.random() * (count - 1)),
|
||
|
Math.floor(Math.random() * (count - 1)),
|
||
|
Math.floor(Math.random() * 2) + 1)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// category: Models
|