7#include <QtCore/qeventloop.h>
8#include <QtCore/qfileinfo.h>
9#include <qohosjsenv_p.h>
10#include <QtGui/qguiapplication.h>
11#include <QtGui/qwindow.h>
13#include <qohoswindowmanager.h>
22 using FileMode = QFileDialogOptions::FileMode;
25 switch (options.fileMode()) {
26 case FileMode::Directory:
27 case FileMode::DirectoryOnly:
29 case FileMode::ExistingFile:
30 case FileMode::ExistingFiles:
31 return DocumentSelectMode
::FILE;
32 case FileMode::AnyFile:
33 return DocumentSelectMode
::MIXED;
35 return DocumentSelectMode
::MIXED;
41 return options.fileMode() == QFileDialogOptions::FileMode::ExistingFile
42 ? QOhosWindowManager::ResultMultiplicity::SINGLE
43 : QOhosWindowManager::ResultMultiplicity::MULTIPLE;
48 auto *platformWindow = QOhosPlatformWindow::fromQWindowOrNull(qWindow);
49 auto windowId = platformWindow !=
nullptr
50 ? platformWindow->internalWindowId()
51 : QtOhos::InternalWindowId::invalidWindowId();
53 if (!windowId.isValid())
54 qOhosReportFatalErrorAndAbort(
"%s: Failed to retrieve window id", Q_FUNC_INFO);
61 auto *focusedWindow = QGuiApplication::focusWindow();
62 return focusedWindow !=
nullptr
63 ? getQWindowInternalWindowIdOrFail(focusedWindow)
64 : QtOhos::InternalWindowId::invalidWindowId();
83 bool show(Qt::WindowFlags windowFlags, Qt::WindowModality windowModality, QWindow *parent)
override;
86 void setDialogResult(
bool accepted, QStringList files,
QOhosOptional<
int> optSelectedFilterIndex);
87 static QStringList convertQtNameFiltersToOhosStandard(
const QStringList &);
89 QEventLoop m_eventLoop;
93 QUrl m_selectFileName;
94 QString m_selectedNameFilter;
96 QList<QUrl> m_selectedFiles;
107 auto _dbg = make_QCScopedDebug(
"QOhosPlatformFileDialogHelperImpl::defaultNameFilterDisables");
113 auto _dbg = make_QCScopedDebug(
"QOhosPlatformFileDialogHelperImpl::setDirectory");
114 m_directory = directory;
119 auto _dbg = make_QCScopedDebug(
"QOhosPlatformFileDialogHelperImpl::directory");
125 auto _dbg = make_QCScopedDebug(
"QOhosPlatformFileDialogHelperImpl::selectFile");
126 m_selectFileName = filename;
131 auto _dbg = make_QCScopedDebug(
"QOhosPlatformFileDialogHelperImpl::setFilter");
136 m_selectedNameFilter = filter;
137 auto _dbg = make_QCScopedDebug(
"QOhosPlatformFileDialogHelperImpl::selectNameFilter");
142 auto _dbg = make_QCScopedDebug(
"QOhosPlatformFileDialogHelperImpl::selectedNameFilter");
143 return m_selectedNameFilter;
148 auto _dbg = make_QCScopedDebug(
"QOhosPlatformFileDialogHelperImpl::selectedFiles");
149 return m_selectedFiles;
159 auto _dbg = make_QCScopedDebug(
"QOhosPlatformFileDialogHelperImpl::hide()");
163 bool accepted, QStringList files,
QOhosOptional<
int> optSelectedFilterIndex)
165 auto _dbg = make_QCScopedDebug(
"QOhosPlatformFileDialogHelperImpl::dialogResult()");
168 m_selectedFiles.clear();
170 if (optSelectedFilterIndex.hasValue()) {
171 auto nameFilters = options()->nameFilters();
172 auto selectedFilterIndex = optSelectedFilterIndex.value();
173 if (selectedFilterIndex >= 0 && selectedFilterIndex < nameFilters.count())
174 selectNameFilter(nameFilters.at(selectedFilterIndex));
176 std::copy(files.constBegin(), files.constEnd(),
std::back_inserter(m_selectedFiles));
186 auto _dbg = make_QCScopedDebug(
"QOhosPlatformFileDialogHelperImpl::exec()");
189 show(Qt::Dialog, Qt::ApplicationModal, 0);
198 const auto qtAnyFilesFilter = QString::fromUtf8(
"*");
199 const auto ohosAnyFilesFilter = QString::fromUtf8(
".*");
200 QStringList ohosNameFilters;
201 for (
const auto &qtFilter : qtNameFilters) {
202 QStringList qtCleanFilters = QPlatformFileDialogHelper::cleanFilterList(qtFilter);
203 QStringList ohosExtensionList;
204 for (
auto &qtCleanFilter : qtCleanFilters) {
205 QString extensionOnly = qtCleanFilter.replace(QLatin1String(
"*."), QLatin1String(
"."));
206 ohosExtensionList.append(extensionOnly);
208 QString ohosExtensionsSeparatedByComma = ohosExtensionList.join(QString::fromUtf8(
","));
209 if (ohosExtensionsSeparatedByComma == qtAnyFilesFilter)
210 ohosExtensionsSeparatedByComma = ohosAnyFilesFilter;
211 auto ohosNameFilter = qtFilter + QLatin1String(
"|") + ohosExtensionsSeparatedByComma;
212 ohosNameFilters.append(ohosNameFilter);
214 return ohosNameFilters;
218 Qt::WindowFlags windowFlags, Qt::WindowModality windowModality, QWindow *parent)
220 Q_UNUSED(windowFlags)
221 Q_UNUSED(windowModality)
223 const auto contextWinId = parent !=
nullptr
224 ? getQWindowInternalWindowIdOrFail(parent)
225 : tryGetFocusedWindowInternalWindowId();
228 QSharedPointer<QFileDialogOptions> opt = options();
229 auto ohosNameFilters = convertQtNameFiltersToOhosStandard(opt->nameFilters());
230 if (opt->acceptMode() == QFileDialogOptions::AcceptOpen)
234 !m_selectFileName.isEmpty()
235 ? m_selectFileName.toLocalFile()
236 : !m_directory.isEmpty()
237 ? m_directory.toLocalFile()
239 mapQFileDialogOptionsToOhosDocumentSelectMode(*opt),
240 mapQFileDialogOptionsToOhosResultMultiplicity(*opt),
242 auto filesPaths = optOpenResult.hasValue()
243 ? optOpenResult.value().selectedUrls
245 setDialogResult(!filesPaths.isEmpty(), filesPaths, {});
250 !m_selectFileName.isEmpty()
251 ? QStringList(QFileInfo(m_selectFileName.toLocalFile()).fileName())
253 !m_directory.isEmpty()
254 ? m_directory.toLocalFile()
255 : !m_selectFileName.isEmpty()
256 ? QFileInfo(m_selectFileName.toLocalFile()).absoluteDir().path()
260 auto filesPaths = optSaveResult.hasValue()
261 ? optSaveResult.value().savedUrls
263 auto optSelectedFilterIndex = optSaveResult.transform(
264 [](
const auto &saveResult) {
265 return saveResult.selectedFileSuffixChoiceIndex;
267 setDialogResult(!filesPaths.isEmpty(), filesPaths, optSelectedFilterIndex);
std::enable_if_t< qohosplugincore_h_detail::isQOhosOptional< QOhosInvokeResult< Func, T > >, QOhosInvokeResult< Func, T > > andThen(Func &&func) const
void showFileDialogOpen(QtOhos::InternalWindowId contextWinId, QStringList filters, QString defaultPath, DocumentSelectMode documentSelectMode, ResultMultiplicity resultMultiplicity, QOhosConsumer< QOhosOptional< OpenResult > > resultCallback)
void showFileDialogSave(QtOhos::InternalWindowId contextWinId, QStringList newFileNames, QString defaultFilePath, QStringList fileSuffixChoices, QOhosConsumer< QOhosOptional< SaveResult > > resultCallback)
Combined button and popup list for selecting options.
QOhosWindowManager::ResultMultiplicity mapQFileDialogOptionsToOhosResultMultiplicity(const QFileDialogOptions &options)
QtOhos::InternalWindowId tryGetFocusedWindowInternalWindowId()
QOhosWindowManager::DocumentSelectMode mapQFileDialogOptionsToOhosDocumentSelectMode(const QFileDialogOptions &options)
QtOhos::InternalWindowId getQWindowInternalWindowIdOrFail(QWindow *qWindow)