Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions meshroom/ui/components/filepath.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,13 @@ def removeExtension(self, path):
""" Returns the pathname without its extension (.ext)"""
return os.path.splitext(self.asStr(path))[0]

@Slot(str, result=bool)
@Slot(QUrl, result=bool)
def accessible(self, path):
""" Returns whether a path is accessible for the user """
path = self.asStr(path)
return os.path.isdir(self.asStr(path)) and os.access(path, os.R_OK) and os.access(path, os.W_OK)

@Slot(str, result=bool)
@Slot(QUrl, result=bool)
def isFile(self, path):
Expand Down
52 changes: 43 additions & 9 deletions meshroom/ui/qml/Application.qml
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,24 @@ Page {
}
}

Component {
id: permissionsDialog

MessageDialog {
title: "Permission Denied"

required property string filepath

preset: "Warning"
text: "The location does not exist or you do not have necessary permissions to save to the provided filepath."
detailedText: "Filepath: " + filepath
helperText: "Please check the location or permissions and try again or choose a different location."

standardButtons: Dialog.Ok
onClosed: destroy()
}
}

function validateFilepathForSave(filepath: string, sourceSaveDialog: Dialog): bool {
/**
* Return true if `filepath` is valid for saving a file to disk.
Expand All @@ -70,19 +88,35 @@ Page {
*/
const emptyFilename = Filepath.basename(filepath).trim() === ".mg";

// Provided filename is valid
if (!emptyFilename) {
return true
// Provided filename is not valid
if (emptyFilename) {
// Instantiate the Warning Dialog with the provided filepath
const warningDialog = invalidFilepathDialog.createObject(root, {"filepath": Filepath.urlToString(filepath)});

// And open the dialog
warningDialog.closed.connect(sourceSaveDialog.open);
warningDialog.open();

return false;
}

// Instantiate the Warning Dialog with the provided filepath
const warningDialog = invalidFilepathDialog.createObject(root, {"filepath": Filepath.urlToString(filepath)});
// Check if the user has access to the directory where the file is to be saved
const hasPermission = Filepath.accessible(Filepath.dirname(filepath));

// Either the directory does not exist or is inaccessible for the user
if (!hasPermission) {
// Intantiate the permissions dialog with the provided filepath
const warningDialog = permissionsDialog.createObject(root, {"filepath": Filepath.urlToString(filepath)});

// And open the dialog
warningDialog.closed.connect(sourceSaveDialog.open);
warningDialog.open();
// Connect and show the dialog
warningDialog.closed.connect(sourceSaveDialog.open);
warningDialog.open();

return false;
}

return false
// Everything is valid
return true;
}

// File dialogs
Expand Down
Loading