diff --git a/meshroom/ui/qml/GraphEditor/AttributeEditor.qml b/meshroom/ui/qml/GraphEditor/AttributeEditor.qml index 113e564c..2484d773 100644 --- a/meshroom/ui/qml/GraphEditor/AttributeEditor.qml +++ b/meshroom/ui/qml/GraphEditor/AttributeEditor.qml @@ -2,6 +2,7 @@ import QtQuick 2.9 import QtQuick.Layouts 1.3 import QtQuick.Controls 2.2 import MaterialIcons 2.2 +import Utils 1.0 /** A component to display and edit a Node's attributes. @@ -43,7 +44,7 @@ ColumnLayout { id: settingsMenu MenuItem { text: "Open Cache Folder" - onClicked: Qt.openUrlExternally("file://" + node.internalFolder) + onClicked: Qt.openUrlExternally(Filepath.stringToFile(node.internalFolder)) ToolTip.text: node.internalFolder ToolTip.visible: hovered ToolTip.delay: 500 diff --git a/meshroom/ui/qml/GraphEditor/AttributeItemDelegate.qml b/meshroom/ui/qml/GraphEditor/AttributeItemDelegate.qml index ae3b7d46..3fc240fc 100644 --- a/meshroom/ui/qml/GraphEditor/AttributeItemDelegate.qml +++ b/meshroom/ui/qml/GraphEditor/AttributeItemDelegate.qml @@ -108,7 +108,7 @@ RowLayout { _reconstruction.setAttribute(root.attribute, Number(value)) break; case "File": - _reconstruction.setAttribute(root.attribute, value.replace("file://", "").trim()) + _reconstruction.setAttribute(root.attribute, Filepath.fileToString(value.trim())) break; default: _reconstruction.setAttribute(root.attribute, value.trim()) diff --git a/meshroom/ui/qml/GraphEditor/NodeLog.qml b/meshroom/ui/qml/GraphEditor/NodeLog.qml index 608b9a6e..28ba52f7 100644 --- a/meshroom/ui/qml/GraphEditor/NodeLog.qml +++ b/meshroom/ui/qml/GraphEditor/NodeLog.qml @@ -3,6 +3,8 @@ import QtQuick.Controls 2.3 import QtQuick.Controls 1.4 as Controls1 // SplitView import QtQuick.Layouts 1.3 import MaterialIcons 2.2 +import Utils 1.0 + import "common.js" as Common /** @@ -195,7 +197,7 @@ FocusScope { function loadCurrentFile(keepCursorPosition) { var xhr = new XMLHttpRequest; - xhr.open("GET", fileSelector.currentFile); + xhr.open("GET", Filepath.stringToFile(fileSelector.currentFile)); xhr.onreadystatechange = function() { if(xhr.readyState == XMLHttpRequest.HEADERS_RECEIVED) { diff --git a/meshroom/ui/qml/ImageDelegate.qml b/meshroom/ui/qml/ImageDelegate.qml index 2b278d9e..c2bf304b 100644 --- a/meshroom/ui/qml/ImageDelegate.qml +++ b/meshroom/ui/qml/ImageDelegate.qml @@ -68,7 +68,7 @@ Item { Image { anchors.fill: parent anchors.margins: 4 - source: imageDelegate.source + source: Filepath.stringToFile(imageDelegate.source) sourceSize: Qt.size(100, 100) asynchronous: true autoTransform: true diff --git a/meshroom/ui/qml/Utils/filepath.js b/meshroom/ui/qml/Utils/filepath.js index b52b62ab..810a9ef8 100644 --- a/meshroom/ui/qml/Utils/filepath.js +++ b/meshroom/ui/qml/Utils/filepath.js @@ -22,3 +22,29 @@ function extension(path) { function isFile(path) { return extension(path) !== "" } + +/// Conform 'path' to the Qt file representation relying on "file:" protocol prefix +function stringToFile(path) { + // already containing the file protocol + if(path.startsWith("file:")) + return path + // network path + if(path.startsWith("//")) + return "file:" + path + // assumed local path + if(path.trim() == "") + return "" + return "file:/" + path +} + +/// Remove any "file:" protocol prefix from 'path' +function fileToString(path) +{ + // local path + if(path.startsWith("file:///")) + return path.replace("file:///", "") + // network path + else if(path.startsWith("file://")) + return path.replace("file://", "") + return path +} diff --git a/meshroom/ui/qml/Viewer/Viewer2D.qml b/meshroom/ui/qml/Viewer/Viewer2D.qml index d77cf764..4d88ba29 100644 --- a/meshroom/ui/qml/Viewer/Viewer2D.qml +++ b/meshroom/ui/qml/Viewer/Viewer2D.qml @@ -2,12 +2,13 @@ import QtQuick 2.7 import QtQuick.Controls 2.0 import QtQuick.Layouts 1.3 import MaterialIcons 2.2 +import Utils 1.0 FocusScope { id: root clip: true - property alias source: image.source + property string source property var metadata // slots @@ -48,6 +49,7 @@ FocusScope { fillMode: Image.PreserveAspectFit autoTransform: true onWidthChanged: if(status==Image.Ready) fit() + source: Filepath.stringToFile(root.source) onStatusChanged: { // update cache source when image is loaded if(status === Image.Ready) diff --git a/meshroom/ui/qml/WorkspaceView.qml b/meshroom/ui/qml/WorkspaceView.qml index 16da32ad..2f441e41 100644 --- a/meshroom/ui/qml/WorkspaceView.qml +++ b/meshroom/ui/qml/WorkspaceView.qml @@ -31,6 +31,7 @@ Item { // Load a 3D media file in the 3D viewer function load3DMedia(filepath) { + filepath = Filepath.stringToFile(filepath) if(Filepath.extension(filepath) === ".abc") { viewer3D.abcSource = filepath @@ -154,7 +155,7 @@ Item { anchors.bottomMargin: 10 anchors.horizontalCenter: parent.horizontalCenter visible: meshFile != '' && (viewer3D.source != meshFile) - onClicked: viewer3D.source = meshFile + onClicked: load3DMedia(meshFile) } } }