Skip to content

Commit 2e44584

Browse files
committed
Fix drag-and-drop bug in QuickSettingsPage.qml
Prevent list order reset when dropping a toggle below the last valid position in the sliding row. - Updated isValidDropPosition to explicitly handle boundary cases, preventing drops into the options section. - Modified MouseArea's onPositionChanged and onReleased to adjust dropIndex to the last valid toggle position. - Removed restoreOriginalOrder from abortDrag to avoid unintended list resets. - Ensured stable drag behavior at the end of the sliding row.
1 parent e504d61 commit 2e44584

File tree

1 file changed

+29
-16
lines changed

1 file changed

+29
-16
lines changed

src/qml/QuickSettingsPage.qml

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,7 @@ Item {
312312
}
313313

314314
function isValidDropPosition(dropIndex) {
315-
// Prevent dropping on labels, config, cycler, and display items
315+
// Prevent dropping on labels, config, cycler, or display items
316316
var item = slotModel.get(dropIndex);
317317
if (item.type !== "toggle") {
318318
return false;
@@ -321,6 +321,11 @@ Item {
321321
var sliderLabelIndex = findSliderLabelIndex();
322322
var optionsIndex = findOptionsLabelIndex();
323323

324+
// Prevent dropping in invalid sections
325+
if (dropIndex === 0 || dropIndex === sliderLabelIndex || dropIndex >= optionsIndex) {
326+
return false;
327+
}
328+
324329
// Prevent dropping below unavailable toggles
325330
var toggleSection = dropIndex < sliderLabelIndex ? "fixed" : "slider";
326331
var sectionStart = toggleSection === "fixed" ? 1 : sliderLabelIndex + 1;
@@ -338,7 +343,7 @@ Item {
338343
}
339344
}
340345

341-
// If there's an unavailable toggle in this section and we're trying to drop below it
346+
// Allow dropping at or before the last available toggle
342347
if (firstUnavailableIndex !== -1 && dropIndex >= firstUnavailableIndex) {
343348
return false;
344349
}
@@ -426,12 +431,12 @@ Item {
426431

427432
function abortDrag() {
428433
if (draggedItemIndex !== -1) {
429-
restoreOriginalOrder();
434+
draggedItemIndex = -1;
435+
targetIndex = -1;
436+
dragProxy.visible = false;
437+
autoScrollTimer.scrollSpeed = 0;
438+
slotList.forceLayout();
430439
}
431-
draggedItemIndex = -1;
432-
targetIndex = -1;
433-
dragProxy.visible = false;
434-
autoScrollTimer.scrollSpeed = 0;
435440
}
436441

437442
ListView {
@@ -794,11 +799,13 @@ Item {
794799
var optionsIndex = findOptionsLabelIndex();
795800
var sliderLabelIndex = findSliderLabelIndex();
796801

797-
// Handle drop position calculation
798-
if (dropIndex !== draggedItemIndex &&
799-
dropIndex !== sliderLabelIndex &&
800-
dropIndex < optionsIndex) {
802+
// Adjust dropIndex for the last position in the sliding row
803+
if (dropIndex > sliderLabelIndex && dropIndex >= optionsIndex - 1) {
804+
// If dropping below the last toggle, set dropIndex to the last valid toggle position
805+
dropIndex = optionsIndex - 1;
806+
}
801807

808+
if (dropIndex !== draggedItemIndex && isValidDropPosition(dropIndex)) {
802809
var targetY = itemUnder.y + itemUnder.height / 2;
803810
if (dropY < targetY && dropIndex > 0) {
804811
var prevItem = slotModel.get(dropIndex - 1);
@@ -809,7 +816,6 @@ Item {
809816
}
810817
}
811818

812-
// Check if valid before setting targetIndex
813819
if (isValidDropPosition(dropIndex) && dropIndex !== targetIndex) {
814820
targetIndex = dropIndex;
815821
moveItems();
@@ -836,15 +842,22 @@ Item {
836842
var optionsIndex = findOptionsLabelIndex();
837843
var sliderLabelIndex = findSliderLabelIndex();
838844

839-
if (dropIndex !== draggedItemIndex &&
840-
dropIndex < optionsIndex &&
841-
dropIndex !== sliderLabelIndex &&
842-
isValidDropPosition(dropIndex)) {
845+
// Adjust dropIndex for the last position in the sliding row
846+
if (dropIndex > sliderLabelIndex && dropIndex >= optionsIndex - 1) {
847+
dropIndex = optionsIndex - 1;
848+
}
843849

850+
if (dropIndex !== draggedItemIndex && isValidDropPosition(dropIndex)) {
844851
targetIndex = dropIndex;
845852
moveItems();
853+
} else {
854+
abortDrag();
846855
}
856+
} else {
857+
abortDrag();
847858
}
859+
} else {
860+
abortDrag();
848861
}
849862

850863
dragProxy.visible = false;

0 commit comments

Comments
 (0)