11#include <QStandardPaths>
19QString writableDocumentsDirectory() {
20 const QString documents =
21 QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation);
22 return documents.isEmpty() ? QDir::homePath() : documents;
25QString ensureDirectory(
const QString& path) {
26 if (!path.isEmpty()) {
32QString workspaceDirectory() {
33 return ensureDirectory(QDir(writableDocumentsDirectory())
34 .filePath(QStringLiteral(
"FOSSredder")));
37QString exportDirectory() {
38 return ensureDirectory(
39 QDir(workspaceDirectory()).filePath(QStringLiteral(
"Exports")));
42QString workspaceFilePath() {
43 return QDir(workspaceDirectory())
44 .filePath(QStringLiteral(
"workspace.fossredder"));
47QString cleanForCompare(
const QString& path) {
48 return QDir::cleanPath(QFileInfo(path).absoluteFilePath()).toCaseFolded();
51bool isInsideDirectory(
const QString& path,
const QString& directory) {
52 if (path.isEmpty() || directory.isEmpty()) {
56 const QString normalizedPath = cleanForCompare(path);
57 const QString normalizedDirectory = cleanForCompare(directory);
58 return normalizedPath == normalizedDirectory ||
59 normalizedPath.startsWith(normalizedDirectory + QLatin1Char(
'/'));
62bool isInsideAppData(
const QString& path) {
63 return isInsideDirectory(path, QStandardPaths::writableLocation(
64 QStandardPaths::AppDataLocation)) ||
65 isInsideDirectory(path, QStandardPaths::writableLocation(
66 QStandardPaths::AppLocalDataLocation));
69QString existingDirectoryFromPath(
const QString& path) {
70 const QString trimmed = path.trimmed();
71 if (trimmed.isEmpty()) {
75 const QFileInfo info(trimmed);
76 if (info.isDir() && info.exists()) {
77 return info.absoluteFilePath();
80 const QString parent = info.absoluteDir().absolutePath();
81 return QDir(parent).exists() ? parent : QString();
84QString startDirectory(
const QString& initialPath,
85 const QString& fallbackDirectory) {
86 const QString preferred = isInsideAppData(initialPath)
88 : existingDirectoryFromPath(initialPath);
89 return QDir::toNativeSeparators(preferred.isEmpty() ? fallbackDirectory
93QString startFilePath(
const QString& initialPath,
const QString& fallbackFile) {
94 const QString trimmed = initialPath.trimmed();
95 if (!trimmed.isEmpty() && !isInsideAppData(trimmed) &&
96 !existingDirectoryFromPath(trimmed).isEmpty()) {
97 return QDir::toNativeSeparators(trimmed);
99 return QDir::toNativeSeparators(fallbackFile);
105 const QString& initialPath) {
106 return QFileDialog::getOpenFileNames(
108 startDirectory(initialPath, writableDocumentsDirectory()), filter);
112 const QString& initialPath) {
113 return QFileDialog::getSaveFileName(
115 startDirectory(initialPath, exportDirectory()), filter);
119 const QString& initialPath) {
120 return QFileDialog::getExistingDirectory(
121 parent, title, startDirectory(initialPath, exportDirectory()),
122 QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
126 return QFileDialog::getSaveFileName(
128 startFilePath(initialPath, workspaceFilePath()),
133 return QFileDialog::getOpenFileName(
135 startDirectory(initialPath, workspaceDirectory()),
140 return QFileDialog::getSaveFileName(
142 startFilePath(initialPath, workspaceFilePath()),
Declares shared native file dialog helpers used by the desktop UI.
Provides translated C++ UI strings for shell, workflow, adapter and view model code.
QStringList pickImportFiles(QWidget *parent, const QString &filter, const QString &initialPath={})
Opens a multi-select file dialog for statement import files.
QString pickNewStorageFile(QWidget *parent, const QString &initialPath={})
Opens a save dialog for creating a new storage database.
QString pickExportDirectory(QWidget *parent, const QString &title, const QString &initialPath={})
Opens a directory picker for export targets.
QString pickSaveStorageFileAs(QWidget *parent, const QString &initialPath={})
Opens a save dialog for choosing a database target path.
QString pickExportFile(QWidget *parent, const QString &filter, const QString &initialPath={})
Opens a save dialog for export targets.
QString pickOpenStorageFile(QWidget *parent, const QString &initialPath={})
Opens a file dialog for selecting an existing storage database.
QString databaseFilter()
File filter for workspace database files.
QString newFileTitle()
Title for creating a workspace database file.
QString exportFileTitle()
Title for selecting an export target file.
QString saveFileAsTitle()
Title for saving a workspace database file under another path.
QString openFileTitle()
Title for opening a workspace database file.
QString selectPdfTitle()
Title for PDF import file selection.