mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-06-06 04:41:06 +02:00
Sort files case-insensitively, directories first
This commit is contained in:
parent
862a88cf29
commit
585467094c
1 changed files with 55 additions and 9 deletions
|
@ -238,6 +238,8 @@ ModalWindow {
|
||||||
// drive information when viewing at the computer level.
|
// drive information when viewing at the computer level.
|
||||||
|
|
||||||
property var folder
|
property var folder
|
||||||
|
property int sortOrder: Qt.AscendingOrder
|
||||||
|
property int sortColumn: 0
|
||||||
|
|
||||||
onFolderChanged: folderListModel.folder = folder;
|
onFolderChanged: folderListModel.folder = folder;
|
||||||
|
|
||||||
|
@ -249,16 +251,61 @@ ModalWindow {
|
||||||
}
|
}
|
||||||
|
|
||||||
function update() {
|
function update() {
|
||||||
var i;
|
var dataFields = ["fileName", "fileModified", "fileSize"],
|
||||||
|
sortFields = ["fileNameSort", "fileModified", "fileSize"],
|
||||||
|
dataField = dataFields[sortColumn],
|
||||||
|
sortField = sortFields[sortColumn],
|
||||||
|
sortValue,
|
||||||
|
fileName,
|
||||||
|
fileIsDir,
|
||||||
|
comparisonFunction,
|
||||||
|
lower,
|
||||||
|
middle,
|
||||||
|
upper,
|
||||||
|
rows = 0,
|
||||||
|
i;
|
||||||
clear();
|
clear();
|
||||||
|
|
||||||
|
comparisonFunction = sortOrder === Qt.AscendingOrder
|
||||||
|
? function(a, b) { return a < b; }
|
||||||
|
: function(a, b) { return a > b; }
|
||||||
|
|
||||||
for (i = 0; i < folderListModel.count; i++) {
|
for (i = 0; i < folderListModel.count; i++) {
|
||||||
append({
|
fileName = folderListModel.get(i, "fileName");
|
||||||
fileName: folderListModel.get(i, "fileName"),
|
fileIsDir = folderListModel.get(i, "fileIsDir");
|
||||||
fileModified: folderListModel.get(i, "fileModified"),
|
|
||||||
|
sortValue = folderListModel.get(i, dataField);
|
||||||
|
|
||||||
|
if (dataField === "fileName") {
|
||||||
|
// Directories first by prefixing a "*".
|
||||||
|
// Case-insensitive.
|
||||||
|
sortValue = (fileIsDir ? "*" : "") + sortValue.toLowerCase();
|
||||||
|
}
|
||||||
|
|
||||||
|
lower = 0;
|
||||||
|
upper = rows;
|
||||||
|
while (lower < upper) {
|
||||||
|
middle = Math.floor((lower + upper) / 2);
|
||||||
|
var lessThan;
|
||||||
|
if (comparisonFunction(sortValue, get(middle)[sortField])) {
|
||||||
|
lessThan = true;
|
||||||
|
upper = middle;
|
||||||
|
} else {
|
||||||
|
lessThan = false;
|
||||||
|
lower = middle + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
insert(lower, {
|
||||||
|
fileName: fileName,
|
||||||
|
fileModified: (fileIsDir ? new Date(0) : folderListModel.get(i, "fileModified")),
|
||||||
fileSize: folderListModel.get(i, "fileSize"),
|
fileSize: folderListModel.get(i, "fileSize"),
|
||||||
filePath: folderListModel.get(i, "filePath"),
|
filePath: folderListModel.get(i, "filePath"),
|
||||||
fileIsDir: folderListModel.get(i, "fileIsDir")
|
fileIsDir: fileIsDir,
|
||||||
|
fileNameSort: (fileIsDir ? "*" : "") + fileName.toLowerCase()
|
||||||
});
|
});
|
||||||
|
|
||||||
|
rows++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -287,10 +334,9 @@ ModalWindow {
|
||||||
model: fileTableModel
|
model: fileTableModel
|
||||||
|
|
||||||
function updateSort() {
|
function updateSort() {
|
||||||
model.sortReversed = sortIndicatorColumn == 0
|
model.sortOrder = sortIndicatorOrder;
|
||||||
? (sortIndicatorOrder == Qt.DescendingOrder)
|
model.sortColumn = sortIndicatorColumn;
|
||||||
: (sortIndicatorOrder == Qt.AscendingOrder); // Date and size fields have opposite sense
|
model.update();
|
||||||
model.sortField = sortIndicatorColumn + 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
onSortIndicatorColumnChanged: { updateSort(); }
|
onSortIndicatorColumnChanged: { updateSort(); }
|
||||||
|
|
Loading…
Reference in a new issue