8 import org.kde.kirigami 2.4 as Kirigami
38 property Item listItem
43 property ListView listView
55 signal moveRequested(
int oldIndex,
int newIndex)
63 implicitWidth: Kirigami.
Units.iconSizes.smallMedium
64 implicitHeight: implicitWidth
74 cursorShape: pressed ?
Qt.ClosedHandCursor :
Qt.OpenHandCursor
80 property int mouseDownY
81 property Item originalParent
82 opacity: mouseArea.pressed || (!Kirigami.Settings.tabletMode && listItem.hovered) ? 1 : 0.6
83 property
int listItemLastY
84 property
bool draggingUp
86 function arrangeItem() {
87 const newIndex = listView.indexAt(1, listView.contentItem.mapFromItem(mouseArea, 0,
internal.mouseDownY).y);
89 if (newIndex > -1 && ((
internal.draggingUp && newIndex < index) || (!
internal.draggingUp && newIndex > index))) {
90 root.moveRequested(index, newIndex);
100 internal.originalParent = listItem.parent;
101 listItem.parent = listView;
102 listItem.y =
internal.originalParent.mapToItem(listItem.parent, listItem.x, listItem.y).y;
103 internal.originalParent.z = 99;
104 internal.startY = listItem.y;
105 internal.listItemLastY = listItem.y;
106 internal.mouseDownY = mouse.y;
109 mouseArea.drag.maximumY = listView.height - listItem.height;
112 onPositionChanged: mouse => {
113 if (!pressed || listItem.y ===
internal.listItemLastY) {
117 internal.draggingUp = listItem.y <
internal.listItemLastY
118 internal.listItemLastY = listItem.y;
120 internal.arrangeItem();
123 scrollTimer.running = (listView.contentHeight > listView.height)
124 && ( (listItem.y === 0 && !listView.atYBeginning) ||
125 (listItem.y === mouseArea.drag.maximumY && !listView.atYEnd) );
127 onReleased: mouse => {
128 listItem.y =
internal.originalParent.mapFromItem(listItem, 0, 0).y;
129 listItem.parent =
internal.originalParent;
130 dropAnimation.running =
true;
131 scrollTimer.running =
false;
134 onCanceled: released()
135 SequentialAnimation {
141 duration: Kirigami.Units.longDuration
142 easing.type: Easing.InOutQuad
145 target: listItem.parent
155 if (
internal.draggingUp) {
156 listView.contentY -= Kirigami.Units.gridUnit;
157 if (listView.atYBeginning) {
158 listView.positionViewAtBeginning();
162 listView.contentY += Kirigami.Units.gridUnit;
163 if (listView.atYEnd) {
164 listView.positionViewAtEnd();
168 internal.arrangeItem();