From dac043a52d5c7f47255373e10cad89446d3297be Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 20 May 2016 10:49:38 +1200 Subject: [PATCH] Provide navigation up to the PC level to display drives in table --- .../resources/qml/dialogs/FileDialog.qml | 87 ++++++++++++++++--- 1 file changed, 74 insertions(+), 13 deletions(-) diff --git a/interface/resources/qml/dialogs/FileDialog.qml b/interface/resources/qml/dialogs/FileDialog.qml index 5674123b4d..0e936ff0a3 100644 --- a/interface/resources/qml/dialogs/FileDialog.qml +++ b/interface/resources/qml/dialogs/FileDialog.qml @@ -194,10 +194,8 @@ ModalWindow { function navigateUp() { if (fileTableModel.parentFolder && fileTableModel.parentFolder !== "") { - fileTableModel.folder = fileTableModel.parentFolder + fileTableModel.folder = fileTableModel.parentFolder; return true; - } else if (true) { - } } @@ -222,6 +220,42 @@ ModalWindow { onFolderChanged: { fileTableModel.update(); // Update once the data from the folder change is available. } + + function getItem(index, field) { + return get(index, field); + } + } + + ListModel { + // Emulates FolderListModel but contains drive data. + id: driveListModel + + property int count: 1 + + Component.onCompleted: initialize(); + + function initialize() { + var drive, + i; + + count = drives.length; + + for (i = 0; i < count; i++) { + drive = drives[i].slice(0, -1); // Remove trailing "/". + append({ + fileName: drive, + fileModified: new Date(0), + fileSize: 0, + filePath: drive + "/", + fileIsDir: true, + fileNameSort: drive.toLowerCase() + }); + } + } + + function getItem(index, field) { + return get(index)[field]; + } } ListModel { @@ -237,10 +271,37 @@ ModalWindow { property var folder property int sortOrder: Qt.AscendingOrder property int sortColumn: 0 - property string parentFolder: folderListModel.parentFolder + property var model: folderListModel + property string parentFolder: calculateParentFolder(); + + readonly property string rootFolder: "file:///" + + function calculateParentFolder() { + if (model === folderListModel) { + if (folderListModel.parentFolder.toString() === "" && driveListModel.count > 1) { + return rootFolder; + } else { + return folderListModel.parentFolder; + } + } else { + return ""; + } + } onFolderChanged: { - folderListModel.folder = folder; + if (folder === rootFolder) { + model = driveListModel; + update(); + } else { + var needsUpdate = model === driveListModel && folder === folderListModel.folder; + + model = folderListModel; + folderListModel.folder = folder; + + if (needsUpdate) { + update(); + } + } currentDirectory.lastValidFolder = helper.urlToPath(folder); } @@ -265,18 +326,18 @@ ModalWindow { upper, rows = 0, i; + clear(); comparisonFunction = sortOrder === Qt.AscendingOrder ? function(a, b) { return a < b; } : function(a, b) { return a > b; } - for (i = 0; i < folderListModel.count; i++) { - fileName = folderListModel.get(i, "fileName"); - fileIsDir = folderListModel.get(i, "fileIsDir"); - - sortValue = folderListModel.get(i, dataField); + for (i = 0; i < model.count; i++) { + fileName = model.getItem(i, "fileName"); + fileIsDir = model.getItem(i, "fileIsDir"); + sortValue = model.getItem(i, dataField); if (dataField === "fileName") { // Directories first by prefixing a "*". // Case-insensitive. @@ -299,9 +360,9 @@ ModalWindow { insert(lower, { fileName: fileName, - fileModified: (fileIsDir ? new Date(0) : folderListModel.get(i, "fileModified")), - fileSize: folderListModel.get(i, "fileSize"), - filePath: folderListModel.get(i, "filePath"), + fileModified: (fileIsDir ? new Date(0) : model.getItem(i, "fileModified")), + fileSize: model.getItem(i, "fileSize"), + filePath: model.getItem(i, "filePath"), fileIsDir: fileIsDir, fileNameSort: (fileIsDir ? "*" : "") + fileName.toLowerCase() });