2024-01-16 10:18:49 +00:00
|
|
|
import QtQuick 2.15
|
|
|
|
import QtQuick.Controls 2.15
|
|
|
|
import QtQuick.Layouts 1.15
|
|
|
|
|
|
|
|
import StatusQ 0.1
|
|
|
|
|
|
|
|
Item {
|
|
|
|
id: root
|
|
|
|
|
|
|
|
ListModel {
|
|
|
|
id: simpleSourceModel
|
|
|
|
|
|
|
|
ListElement {
|
|
|
|
name: "entry 1"
|
|
|
|
}
|
|
|
|
ListElement {
|
|
|
|
name: "entry 2"
|
|
|
|
}
|
|
|
|
ListElement {
|
|
|
|
name: "entry 3"
|
|
|
|
}
|
|
|
|
ListElement {
|
|
|
|
name: "entry 4"
|
|
|
|
}
|
|
|
|
ListElement {
|
|
|
|
name: "entry 5"
|
|
|
|
}
|
|
|
|
ListElement {
|
|
|
|
name: "entry 6"
|
|
|
|
}
|
|
|
|
ListElement {
|
|
|
|
name: "entry 7"
|
|
|
|
}
|
|
|
|
ListElement {
|
|
|
|
name: "entry 8"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
MovableModel {
|
|
|
|
id: movableModel
|
|
|
|
|
|
|
|
sourceModel: simpleSourceModel
|
|
|
|
}
|
|
|
|
|
|
|
|
RowLayout {
|
|
|
|
anchors.fill: parent
|
|
|
|
anchors.margins: 10
|
|
|
|
|
|
|
|
spacing: 50
|
|
|
|
|
|
|
|
ColumnLayout {
|
|
|
|
Layout.preferredWidth: parent.width / 2
|
|
|
|
Layout.fillHeight: true
|
|
|
|
|
|
|
|
Label {
|
|
|
|
text: "SOURCE MODEL"
|
|
|
|
|
|
|
|
font.bold: true
|
|
|
|
font.pixelSize: 17
|
|
|
|
}
|
|
|
|
|
|
|
|
ListView {
|
|
|
|
id: sourceListView
|
|
|
|
|
|
|
|
spacing: 5
|
|
|
|
|
|
|
|
Layout.fillWidth: true
|
|
|
|
Layout.fillHeight: true
|
|
|
|
|
|
|
|
model: simpleSourceModel
|
|
|
|
|
|
|
|
ScrollBar.vertical: ScrollBar {}
|
|
|
|
|
|
|
|
delegate: RowLayout {
|
|
|
|
width: ListView.view.width
|
|
|
|
|
|
|
|
Label {
|
|
|
|
Layout.fillWidth: true
|
|
|
|
|
|
|
|
font.bold: true
|
|
|
|
text: model.name
|
|
|
|
}
|
|
|
|
|
|
|
|
Button {
|
|
|
|
text: "delete"
|
|
|
|
|
|
|
|
onClicked: simpleSourceModel.remove(model.index)
|
|
|
|
}
|
|
|
|
|
|
|
|
Button {
|
|
|
|
text: "alter"
|
|
|
|
|
|
|
|
onClicked: simpleSourceModel.setProperty(
|
|
|
|
index, "name", simpleSourceModel.get(index).name + "_")
|
|
|
|
}
|
|
|
|
|
|
|
|
Button {
|
|
|
|
text: "⬆️"
|
|
|
|
|
|
|
|
onClicked: {
|
|
|
|
if (index !== 0)
|
|
|
|
simpleSourceModel.move(index, index - 1, 1)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Button {
|
|
|
|
text: "⬇️"
|
|
|
|
|
|
|
|
onClicked: {
|
|
|
|
if (index !== simpleSourceModel.count - 1)
|
|
|
|
simpleSourceModel.move(index, index + 1, 1)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
ColumnLayout {
|
|
|
|
Layout.preferredWidth: parent.width / 2
|
|
|
|
Layout.fillHeight: true
|
|
|
|
|
|
|
|
Label {
|
2024-02-16 10:30:54 +00:00
|
|
|
text: "MOVABLE MODEL (press to drag&drop)"
|
2024-01-16 10:18:49 +00:00
|
|
|
|
|
|
|
font.bold: true
|
|
|
|
font.pixelSize: 17
|
|
|
|
}
|
|
|
|
|
|
|
|
ListView {
|
|
|
|
id: transformedListView
|
|
|
|
|
|
|
|
Layout.fillWidth: true
|
|
|
|
Layout.fillHeight: true
|
|
|
|
|
|
|
|
spacing: 5
|
|
|
|
|
|
|
|
model: movableModel
|
|
|
|
|
|
|
|
ScrollBar.vertical: ScrollBar {}
|
|
|
|
|
|
|
|
delegate: MouseArea {
|
|
|
|
id: dragArea
|
|
|
|
|
|
|
|
property bool held: false
|
|
|
|
readonly property int idx: model.index
|
|
|
|
|
|
|
|
anchors {
|
|
|
|
left: parent ? parent.left : undefined
|
|
|
|
right: parent ? parent.right : undefined
|
|
|
|
}
|
|
|
|
height: content.implicitHeight
|
|
|
|
|
|
|
|
drag.target: held ? content : undefined
|
|
|
|
drag.axis: Drag.YAxis
|
|
|
|
|
|
|
|
onPressAndHold: held = true
|
|
|
|
onReleased: held = false
|
|
|
|
|
|
|
|
|
|
|
|
RowLayout {
|
|
|
|
id: content
|
|
|
|
|
|
|
|
anchors {
|
|
|
|
horizontalCenter: parent.horizontalCenter
|
|
|
|
verticalCenter: parent.verticalCenter
|
|
|
|
}
|
|
|
|
|
|
|
|
width: dragArea.width
|
|
|
|
|
|
|
|
Drag.active: dragArea.held
|
|
|
|
Drag.source: dragArea
|
|
|
|
Drag.hotSpot.x: width / 2
|
|
|
|
Drag.hotSpot.y: height / 2
|
|
|
|
|
|
|
|
states: State {
|
|
|
|
when: dragArea.held
|
|
|
|
|
|
|
|
ParentChange { target: content; parent: root }
|
|
|
|
AnchorChanges {
|
|
|
|
target: content
|
|
|
|
anchors {
|
|
|
|
horizontalCenter: undefined
|
|
|
|
verticalCenter: undefined
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Label {
|
|
|
|
Layout.fillWidth: true
|
|
|
|
|
|
|
|
font.bold: true
|
|
|
|
text: model.name
|
|
|
|
}
|
|
|
|
|
|
|
|
Button {
|
|
|
|
text: "⬆️"
|
|
|
|
enabled: index > 0
|
|
|
|
|
|
|
|
onClicked: movableModel.move(index, index - 1)
|
|
|
|
}
|
|
|
|
Button {
|
|
|
|
text: "⬇️"
|
|
|
|
enabled: index < transformedListView.count - 1
|
|
|
|
|
|
|
|
onClicked: movableModel.move(index, index + 1)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
DropArea {
|
|
|
|
anchors { fill: parent; margins: 10 }
|
|
|
|
|
|
|
|
onEntered: {
|
|
|
|
const from = drag.source.idx
|
|
|
|
const to = dragArea.idx
|
|
|
|
|
|
|
|
if (from === to)
|
|
|
|
return
|
|
|
|
|
|
|
|
movableModel.move(from, to)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
RowLayout {
|
|
|
|
anchors.bottom: parent.bottom
|
|
|
|
anchors.margins: 10
|
|
|
|
|
|
|
|
Button {
|
|
|
|
text: "append to source model"
|
|
|
|
|
|
|
|
onClicked: simpleSourceModel.append({ name: "X" })
|
|
|
|
}
|
|
|
|
|
|
|
|
Button {
|
2024-02-16 10:30:54 +00:00
|
|
|
text: "desynchronize"
|
2024-01-16 10:18:49 +00:00
|
|
|
|
|
|
|
onClicked: {
|
2024-02-16 10:30:54 +00:00
|
|
|
movableModel.desyncOrder()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Button {
|
|
|
|
text: "synchronize"
|
|
|
|
|
|
|
|
onClicked: {
|
|
|
|
movableModel.syncOrder()
|
2024-01-16 10:18:49 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Label {
|
2024-02-16 10:30:54 +00:00
|
|
|
text: "Synchronized: " + movableModel.synced
|
2024-01-16 10:18:49 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// category: Models
|