diff options
Diffstat (limited to 'tests/auto/qml/qqmllistmodelworkerscript/data/listmodel_async_sort/ListModelSort.mjs')
-rw-r--r-- | tests/auto/qml/qqmllistmodelworkerscript/data/listmodel_async_sort/ListModelSort.mjs | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/tests/auto/qml/qqmllistmodelworkerscript/data/listmodel_async_sort/ListModelSort.mjs b/tests/auto/qml/qqmllistmodelworkerscript/data/listmodel_async_sort/ListModelSort.mjs new file mode 100644 index 0000000000..cfc1e1146f --- /dev/null +++ b/tests/auto/qml/qqmllistmodelworkerscript/data/listmodel_async_sort/ListModelSort.mjs @@ -0,0 +1,117 @@ +/* Copyright 2020 Esri + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +//------------------------------------------------------------------------------ + +export const OrderAscending = 0 +export const OrderDescending = 1 + +//------------------------------------------------------------------------------ + +export function sort(model, sortKey, descending, useMove) { + + _sort(model, sortKey, descending, useMove); +} + +//------------------------------------------------------------------------------ + +function _sort(model, sortKey, descending, useMove) { + var lessThan = descending ? 1 : -1; + var greaterThan = -lessThan; + + var indices = [...new Array(model.count).keys()]; + + function getKeyValue(index) { + return model.get(index)[sortKey]; + } + + function compareKey(index1, index2) { + var value1 = getKeyValue(index1); + var value2 = getKeyValue(index2); + + return (value1 < value2) + ? lessThan + : (value1 > value2) + ? greaterThan + : 0; + } + + indices.sort(compareKey); + + + function compareFrom(i1, i2) { + return (i1.from < i2.from) + ? -1 + : (i1.from > i2.from) + ? 1 + : 0; + } + + var swapIndices = indices.map((e, i) => { return { from: e, to: i }}).sort(compareFrom).map(e => e.to); + + function clone(o) { + return JSON.parse(JSON.stringify(o)); + } + + function cloneSwap(a, b) { + var o = clone(model.get(a)); + model.set(a, model.get(b)); + model.set(b, o); + } + + function moveSwap(a, b) { + if (a < b) { + model.move(a, b, 1); + model.move(b - 1, a, 1); + } + else if (a > b) { + model.move(b, a, 1); + model.move(a - 1, b, 1); + } + } + + + var swap = useMove ? moveSwap : cloneSwap; + var swapCount = 0; + + + for (var iFrom = 0; iFrom < swapIndices.length; iFrom++) { + var iTo = swapIndices[iFrom]; + + if (iFrom === iTo) { + continue; + } + + do { + swap(iFrom, iTo); + + var t = swapIndices[iFrom]; + swapIndices[iFrom] = swapIndices[iTo] + swapIndices[iTo] = t; + + iTo = swapIndices[iFrom]; + + swapCount++; + } + while (iFrom !== iTo); + } + +} + +//------------------------------------------------------------------------------ + + + |