6#include <QtCore/qeventloop.h>
7#include <QtCore/qfileinfo.h>
8#include <qohosjsenv_p.h>
9#include <QtGui/qguiapplication.h>
10#include <QtGui/qwindow.h>
12#include <qohoswindowmanager.h>
21 using FileMode = QFileDialogOptions::FileMode;
24 switch (options.fileMode()) {
25 case FileMode::Directory:
26 case FileMode::DirectoryOnly:
28 case FileMode::ExistingFile:
29 case FileMode::ExistingFiles:
30 return DocumentSelectMode
::FILE;
31 case FileMode::AnyFile:
32 return DocumentSelectMode
::MIXED;
34 return DocumentSelectMode
::MIXED;
40 return options.fileMode() == QFileDialogOptions::FileMode::ExistingFile
41 ? QOhosWindowManager::ResultMultiplicity::SINGLE
42 : QOhosWindowManager::ResultMultiplicity::MULTIPLE;
61 bool show(Qt::WindowFlags windowFlags, Qt::WindowModality windowModality, QWindow *parent)
override;
64 void setDialogResult(
bool accepted, QStringList files, QOhosOptional<
int> optSelectedFilterIndex);
65 static QStringList convertQtNameFiltersToOhosStandard(
const QStringList &);
67 QEventLoop m_eventLoop;
71 QUrl m_selectFileName;
72 QString m_selectedNameFilter;
74 QList<QUrl> m_selectedFiles;
85 auto _dbg = make_QCScopedDebug(
"QOhosPlatformFileDialogHelperImpl::defaultNameFilterDisables");
91 auto _dbg = make_QCScopedDebug(
"QOhosPlatformFileDialogHelperImpl::setDirectory");
92 m_directory = directory;
97 auto _dbg = make_QCScopedDebug(
"QOhosPlatformFileDialogHelperImpl::directory");
103 auto _dbg = make_QCScopedDebug(
"QOhosPlatformFileDialogHelperImpl::selectFile");
104 m_selectFileName = filename;
109 auto _dbg = make_QCScopedDebug(
"QOhosPlatformFileDialogHelperImpl::setFilter");
114 m_selectedNameFilter = filter;
115 auto _dbg = make_QCScopedDebug(
"QOhosPlatformFileDialogHelperImpl::selectNameFilter");
120 auto _dbg = make_QCScopedDebug(
"QOhosPlatformFileDialogHelperImpl::selectedNameFilter");
121 return m_selectedNameFilter;
126 auto _dbg = make_QCScopedDebug(
"QOhosPlatformFileDialogHelperImpl::selectedFiles");
127 return m_selectedFiles;
137 auto _dbg = make_QCScopedDebug(
"QOhosPlatformFileDialogHelperImpl::hide()");
141 bool accepted, QStringList files, QOhosOptional<
int> optSelectedFilterIndex)
143 auto _dbg = make_QCScopedDebug(
"QOhosPlatformFileDialogHelperImpl::dialogResult()");
146 m_selectedFiles.clear();
148 if (optSelectedFilterIndex.has_value()) {
149 auto nameFilters = options()->nameFilters();
150 auto selectedFilterIndex = optSelectedFilterIndex.value();
151 if (selectedFilterIndex >= 0 && selectedFilterIndex < nameFilters.count())
152 selectNameFilter(nameFilters.at(selectedFilterIndex));
154 std::copy(files.constBegin(), files.constEnd(),
std::back_inserter(m_selectedFiles));
164 auto _dbg = make_QCScopedDebug(
"QOhosPlatformFileDialogHelperImpl::exec()");
167 show(Qt::Dialog, Qt::ApplicationModal, 0);
176 const auto qtAnyFilesFilter = QString::fromUtf8(
"*");
177 const auto ohosAnyFilesFilter = QString::fromUtf8(
".*");
178 QStringList ohosNameFilters;
179 for (
const auto &qtFilter : qtNameFilters) {
180 QStringList qtCleanFilters = QPlatformFileDialogHelper::cleanFilterList(qtFilter);
181 QStringList ohosExtensionList;
182 for (
auto &qtCleanFilter : qtCleanFilters) {
183 QString extensionOnly = qtCleanFilter.replace(QLatin1String(
"*."), QLatin1String(
"."));
184 ohosExtensionList.append(extensionOnly);
186 QString ohosExtensionsSeparatedByComma = ohosExtensionList.join(QString::fromUtf8(
","));
187 if (ohosExtensionsSeparatedByComma == qtAnyFilesFilter)
188 ohosExtensionsSeparatedByComma = ohosAnyFilesFilter;
189 auto ohosNameFilter = qtFilter + QLatin1String(
"|") + ohosExtensionsSeparatedByComma;
190 ohosNameFilters.append(ohosNameFilter);
192 return ohosNameFilters;
196 Qt::WindowFlags windowFlags, Qt::WindowModality windowModality, QWindow *parent)
198 Q_UNUSED(windowFlags)
199 Q_UNUSED(windowModality)
201 auto contextWindowRef = QtOhos::QObjectThreadSafeRef(
202 parent !=
nullptr ? parent : QGuiApplication::focusWindow());
205 QSharedPointer<QFileDialogOptions> opt = options();
206 auto ohosNameFilters = convertQtNameFiltersToOhosStandard(opt->nameFilters());
207 if (opt->acceptMode() == QFileDialogOptions::AcceptOpen)
211 !m_selectFileName.isEmpty()
212 ? m_selectFileName.toLocalFile()
213 : !m_directory.isEmpty()
214 ? m_directory.toLocalFile()
216 mapQFileDialogOptionsToOhosDocumentSelectMode(*opt),
217 mapQFileDialogOptionsToOhosResultMultiplicity(*opt),
218 [
this](QOhosOptional<QOhosWindowManager::OpenResult> optOpenResult) {
219 auto filesPaths = optOpenResult.has_value()
220 ? optOpenResult.value().selectedUrls
222 setDialogResult(!filesPaths.isEmpty(), filesPaths, {});
227 !m_selectFileName.isEmpty()
228 ? QStringList(QFileInfo(m_selectFileName.toLocalFile()).fileName())
230 !m_directory.isEmpty()
231 ? m_directory.toLocalFile()
232 : !m_selectFileName.isEmpty()
233 ? QFileInfo(m_selectFileName.toLocalFile()).absoluteDir().path()
236 [
this](QOhosOptional<QOhosWindowManager::SaveResult> optSaveResult) {
237 auto filesPaths = optSaveResult.has_value()
238 ? optSaveResult.value().savedUrls
240 auto optSelectedFilterIndex = qTransform(
242 [](
const auto &saveResult) {
243 return saveResult.selectedFileSuffixChoiceIndex;
245 setDialogResult(!filesPaths.isEmpty(), filesPaths, optSelectedFilterIndex);
void showFileDialogSave(QtOhos::QObjectThreadSafeRef contextWindowRef, QStringList newFileNames, QString defaultFilePath, QStringList fileSuffixChoices, QOhosConsumer< QOhosOptional< SaveResult > > resultCallback)
void showFileDialogOpen(QtOhos::QObjectThreadSafeRef contextWindowRef, QStringList filters, QString defaultPath, DocumentSelectMode documentSelectMode, ResultMultiplicity resultMultiplicity, QOhosConsumer< QOhosOptional< OpenResult > > resultCallback)
QtOhos::enums::ohos::file::picker::DocumentSelectMode DocumentSelectMode
Combined button and popup list for selecting options.
QOhosWindowManager::ResultMultiplicity mapQFileDialogOptionsToOhosResultMultiplicity(const QFileDialogOptions &options)
QOhosWindowManager::DocumentSelectMode mapQFileDialogOptionsToOhosDocumentSelectMode(const QFileDialogOptions &options)