9import org.kde.kirigami as Kirigami
84 property Item listItem
89 property ListView listView
94 property bool incrementalMoves: true
99 readonly property alias dragActive: mouseArea.drag.active
113 signal moveRequested(int oldIndex, int newIndex)
121 signal dropped(int oldIndex, int newIndex)
123 implicitWidth: Kirigami.Units.iconSizes.smallMedium
124 implicitHeight: Kirigami.Units.iconSizes.smallMedium
137 cursorShape: pressed ? Qt.ClosedHandCursor : Qt.OpenHandCursor
138 preventStealing: true
143 property int oldIndex: -1
144 property int newIndex: -1
147 _previousMove.oldIndex = -1;
148 _previousMove.newIndex = -1;
157 source:
"handle-sort"
158 opacity: mouseArea.pressed || (!Kirigami.Settings.tabletMode && listItem.hovered) ? 1 : 0.6
161 property int mouseDownY
162 property Item originalParent
163 property int listItemLastY
164 property bool draggingUp
166 function arrangeItem() {
167 const newIndex = listView.indexAt(1, listView.contentItem.mapFromItem(listItem, 0, listItem.height / 2).y);
169 if (newIndex > -1 && ((incrementalMoves && internal.draggingUp && newIndex < index) ||
170 (incrementalMoves && !internal.draggingUp && newIndex > index) ||
171 (!incrementalMoves && newIndex < listView.count))) {
172 if (_previousMove.oldIndex === index && _previousMove.newIndex === newIndex) {
176 _previousMove.oldIndex = index;
177 _previousMove.newIndex = newIndex;
179 root.moveRequested(index, newIndex);
184 onPressed: mouse => {
185 internal.originalParent = listItem.parent;
186 listItem.parent = listView;
187 listItem.y = internal.originalParent.mapToItem(listItem.parent, listItem.x, listItem.y).y;
188 internal.originalParent.z = 99;
189 internal.startY = listItem.y;
190 internal.listItemLastY = listItem.y;
191 internal.mouseDownY = mouse.y;
194 mouseArea.drag.maximumY = listView.height - listItem.height;
197 onPositionChanged: mouse => {
198 if (!pressed || listItem.y === internal.listItemLastY) {
202 internal.draggingUp = listItem.y < internal.listItemLastY
203 internal.listItemLastY = listItem.y;
205 internal.arrangeItem();
208 scrollTimer.running = (listView.contentHeight > listView.height)
209 && ((listItem.y === 0 && !listView.atYBeginning)
210 || (listItem.y === mouseArea.drag.maximumY && !listView.atYEnd));
213 onReleased: mouse => dropped()
214 onCanceled: dropped()
217 listItem.y = internal.originalParent.mapFromItem(listItem, 0, 0).y;
218 listItem.parent = internal.originalParent;
219 dropAnimation.running =
true;
220 scrollTimer.running =
false;
221 root.dropped(_previousMove.oldIndex, _previousMove.newIndex);
222 _previousMove.reset();
225 SequentialAnimation {
231 duration: Kirigami.Units.longDuration
232 easing.type: Easing.InOutQuad
235 target: listItem.parent
248 if (internal.draggingUp) {
249 listView.contentY -= Kirigami.Units.gridUnit;
250 if (listView.atYBeginning) {
251 listView.positionViewAtBeginning();
255 listView.contentY += Kirigami.Units.gridUnit;
256 if (listView.atYEnd) {
257 listView.positionViewAtEnd();
261 internal.arrangeItem();
void stop(Ekos::AlignState mode)
QAction * repeat(const QObject *recvr, const char *slot, QObject *parent)