9#ifndef FILEOPENDIALOG_H
10#define FILEOPENDIALOG_H
12#include <QCryptographicHash>
16#include <QRegularExpression>
19#include <initializer_list>
35 static QString
startDirectory(
const QString &type,
const QString &fallback = {})
37 if (type == QStringLiteral(
"models")) {
38 const QString preferred =
40 .value(QStringLiteral(
"SWMMVis/Preferences/General/ProjectOpenDirectory"))
42 if (!preferred.isEmpty() && QFileInfo(preferred).isDir())
45 const QString saved = QSettings().value(settingKey(type)).toString();
46 if (!saved.isEmpty() && QFileInfo(saved).isDir())
48 if (!fallback.isEmpty()) {
49 const QFileInfo candidate(fallback);
50 if (candidate.isDir())
51 return candidate.absoluteFilePath();
52 if (QFileInfo(candidate.absolutePath()).isDir())
53 return candidate.absolutePath();
55 return QDir::homePath();
68 for (
auto it = paths.crbegin(); it != paths.crend(); ++it) {
71 const QFileInfo file(*it);
75 settings.setValue(settingKey(type), file.absolutePath());
94 const QString &caption = {},
const QString &directory = {},
95 const QString &filter = {}, QString *selectedFilter =
nullptr,
96 QFileDialog::Options
options = {})
98 const QString
path = QFileDialog::getOpenFileName(
117 const QString &caption = {},
const QString &directory = {},
118 const QString &filter = {},
119 QString *selectedFilter =
nullptr,
120 QFileDialog::Options
options = {})
122 const QStringList paths = QFileDialog::getOpenFileNames(
137 static const QRegularExpression pattern(QStringLiteral(R
"(\*\.([\w.\-?*]+))"));
139 auto matches = pattern.globalMatch(filter);
140 while (matches.hasNext())
141 extensions.append(matches.next().captured(1).toLower());
144 const auto hasAny = [&
extensions](std::initializer_list<const char *> types) {
145 for (
const char *type : types)
146 if (
extensions.contains(QString::fromLatin1(type)))
150 if (
extensions.contains(QStringLiteral(
"2dm")))
151 return QStringLiteral(
"mesh");
152 if (
extensions.contains(QStringLiteral(
"out")))
153 return QStringLiteral(
"results-1d");
154 if (hasAny({
"h5",
"hdf5"}))
155 return QStringLiteral(
"results-2d");
156 if (
extensions.contains(QStringLiteral(
"inp")) ||
158 return QStringLiteral(
"models");
159 if (
extensions.contains(QStringLiteral(
"qml")) ||
160 extensions.contains(QStringLiteral(
"swmm-style.json")))
161 return QStringLiteral(
"styles");
162 if (hasAny({
"tfw",
"pgw",
"jgw",
"bpw",
"wld"}))
163 return QStringLiteral(
"world-files");
164 if (hasAny({
"tif",
"tiff",
"asc",
"img",
"vrt",
"nc",
"png",
"jpg",
"jpeg",
"bmp"}))
165 return QStringLiteral(
"raster");
166 if (hasAny({
"shp",
"gpkg",
"geojson",
"gml",
"kml",
"fgb",
"dxf"}))
167 return QStringLiteral(
"vector");
168 if (hasAny({
"csv",
"tsv",
"txt",
"dat",
"tsf"}))
169 return QStringLiteral(
"timeseries");
171 return QStringLiteral(
"other-files");
172 return QStringLiteral(
"filter-") +
174 QCryptographicHash::hash(
extensions.join(QLatin1Char(
';')).toUtf8(),
175 QCryptographicHash::Sha256)
185 static QString settingKey(
const QString &type)
187 return QStringLiteral(
"SWMMVis/FileOpenDirectories/") +
188 (type.isEmpty() ? QStringLiteral(
"other-files") : type);
Definition fileopendialog.h:27
static QString getOpenFileName(const QString &type, QWidget *parent=nullptr, const QString &caption={}, const QString &directory={}, const QString &filter={}, QString *selectedFilter=nullptr, QFileDialog::Options options={})
Open the standard modal file picker with per-category folder memory.
Definition fileopendialog.h:93
static QStringList getOpenFileNames(const QString &type, QWidget *parent=nullptr, const QString &caption={}, const QString &directory={}, const QString &filter={}, QString *selectedFilter=nullptr, QFileDialog::Options options={})
Open the standard modal file picker with per-category folder memory.
Definition fileopendialog.h:116
static QString typeForFilter(const QString &filter)
Map a filename filter to a shared category or deterministic extension-set key.
Definition fileopendialog.h:135
static QString startDirectory(const QString &type, const QString &fallback={})
Choose the most applicable existing directory for an open/import category.
Definition fileopendialog.h:35
static void rememberSelection(const QString &type, const QStringList &paths)
Persist the parent of the last nonempty selected regular file.
Definition fileopendialog.h:64
QString path
Populated by the worker only after its own successful atomic creation.
Definition extensiontimeseriesaccess.cpp:32
const char * extensions
Space-separated, no dots: "tif tiff".
Definition gdaldrivers.cpp:29
Definition openswmmvislayer.h:46
const ConstraintAuditOptions & options
Definition constraintaudit.cpp:34
int parent
Definition planning.cpp:199