FOSSredder 0.5.0
Loading...
Searching...
No Matches
FileDialogs.cpp
Go to the documentation of this file.
1
5
7
8#include <QDir>
9#include <QFileDialog>
10#include <QFileInfo>
11#include <QStandardPaths>
12
13#include "ui/i18n/Text.h"
14
15namespace ui::dialogs {
16
17namespace {
18
19QString writableDocumentsDirectory() {
20 const QString documents =
21 QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation);
22 return documents.isEmpty() ? QDir::homePath() : documents;
23}
24
25QString ensureDirectory(const QString& path) {
26 if (!path.isEmpty()) {
27 QDir().mkpath(path);
28 }
29 return path;
30}
31
32QString workspaceDirectory() {
33 return ensureDirectory(QDir(writableDocumentsDirectory())
34 .filePath(QStringLiteral("FOSSredder")));
35}
36
37QString exportDirectory() {
38 return ensureDirectory(
39 QDir(workspaceDirectory()).filePath(QStringLiteral("Exports")));
40}
41
42QString workspaceFilePath() {
43 return QDir(workspaceDirectory())
44 .filePath(QStringLiteral("workspace.fossredder"));
45}
46
47QString cleanForCompare(const QString& path) {
48 return QDir::cleanPath(QFileInfo(path).absoluteFilePath()).toCaseFolded();
49}
50
51bool isInsideDirectory(const QString& path, const QString& directory) {
52 if (path.isEmpty() || directory.isEmpty()) {
53 return false;
54 }
55
56 const QString normalizedPath = cleanForCompare(path);
57 const QString normalizedDirectory = cleanForCompare(directory);
58 return normalizedPath == normalizedDirectory ||
59 normalizedPath.startsWith(normalizedDirectory + QLatin1Char('/'));
60}
61
62bool isInsideAppData(const QString& path) {
63 return isInsideDirectory(path, QStandardPaths::writableLocation(
64 QStandardPaths::AppDataLocation)) ||
65 isInsideDirectory(path, QStandardPaths::writableLocation(
66 QStandardPaths::AppLocalDataLocation));
67}
68
69QString existingDirectoryFromPath(const QString& path) {
70 const QString trimmed = path.trimmed();
71 if (trimmed.isEmpty()) {
72 return {};
73 }
74
75 const QFileInfo info(trimmed);
76 if (info.isDir() && info.exists()) {
77 return info.absoluteFilePath();
78 }
79
80 const QString parent = info.absoluteDir().absolutePath();
81 return QDir(parent).exists() ? parent : QString();
82}
83
84QString startDirectory(const QString& initialPath,
85 const QString& fallbackDirectory) {
86 const QString preferred = isInsideAppData(initialPath)
87 ? QString()
88 : existingDirectoryFromPath(initialPath);
89 return QDir::toNativeSeparators(preferred.isEmpty() ? fallbackDirectory
90 : preferred);
91}
92
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);
98 }
99 return QDir::toNativeSeparators(fallbackFile);
100}
101
102} // namespace
103
104QStringList pickImportFiles(QWidget* parent, const QString& filter,
105 const QString& initialPath) {
106 return QFileDialog::getOpenFileNames(
108 startDirectory(initialPath, writableDocumentsDirectory()), filter);
109}
110
111QString pickExportFile(QWidget* parent, const QString& filter,
112 const QString& initialPath) {
113 return QFileDialog::getSaveFileName(
115 startDirectory(initialPath, exportDirectory()), filter);
116}
117
118QString pickExportDirectory(QWidget* parent, const QString& title,
119 const QString& initialPath) {
120 return QFileDialog::getExistingDirectory(
121 parent, title, startDirectory(initialPath, exportDirectory()),
122 QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
123}
124
125QString pickNewStorageFile(QWidget* parent, const QString& initialPath) {
126 return QFileDialog::getSaveFileName(
128 startFilePath(initialPath, workspaceFilePath()),
130}
131
132QString pickOpenStorageFile(QWidget* parent, const QString& initialPath) {
133 return QFileDialog::getOpenFileName(
135 startDirectory(initialPath, workspaceDirectory()),
137}
138
139QString pickSaveStorageFileAs(QWidget* parent, const QString& initialPath) {
140 return QFileDialog::getSaveFileName(
142 startFilePath(initialPath, workspaceFilePath()),
144}
145
146} // namespace ui::dialogs
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.
Definition Text.h:139
QString newFileTitle()
Title for creating a workspace database file.
Definition Text.h:127
QString exportFileTitle()
Title for selecting an export target file.
Definition Text.h:119
QString saveFileAsTitle()
Title for saving a workspace database file under another path.
Definition Text.h:135
QString openFileTitle()
Title for opening a workspace database file.
Definition Text.h:131
QString selectPdfTitle()
Title for PDF import file selection.
Definition Text.h:115