51 lines
1.3 KiB
QML
51 lines
1.3 KiB
QML
import QtQuick 2.13
|
|
import QtQml.Models 2.3
|
|
import "../imports"
|
|
|
|
DelegateModel {
|
|
id: delegateModel
|
|
property var lessThan
|
|
|
|
property int sortOrder: 0
|
|
onSortOrderChanged: items.setGroups(0, items.count, "unsorted")
|
|
|
|
function insertPosition(lessThan, item) {
|
|
var lower = 0
|
|
var upper = items.count
|
|
while (lower < upper) {
|
|
var middle = Math.floor(lower + (upper - lower) / 2)
|
|
var result = lessThan(item.model, items.get(middle).model);
|
|
if (result) {
|
|
upper = middle
|
|
} else {
|
|
lower = middle + 1
|
|
}
|
|
}
|
|
return lower
|
|
}
|
|
|
|
function sort(lessThan) {
|
|
while (unsortedItems.count > 0) {
|
|
var item = unsortedItems.get(0)
|
|
var index = insertPosition(lessThan, item)
|
|
|
|
item.groups = "items"
|
|
items.move(item.itemsIndex, index)
|
|
}
|
|
}
|
|
|
|
items.includeByDefault: false
|
|
groups: DelegateModelGroup {
|
|
id: unsortedItems
|
|
name: "unsorted"
|
|
|
|
includeByDefault: true
|
|
onChanged: {
|
|
if (delegateModel.sortOrder === delegateModel.lessThan.length)
|
|
setGroups(0, count, "items")
|
|
else
|
|
delegateModel.sort(delegateModel.lessThan[delegateModel.sortOrder])
|
|
}
|
|
}
|
|
}
|