7#include <QtCore/qlist.h>
8#include <QtCore/qloggingcategory.h>
9#include <QtQml/qqmlfile.h>
10#include <QtQml/qqmlinfo.h>
11#if QT_CONFIG(quick_listview) && QT_CONFIG(quick_draganddrop)
12#include <QtQuickDialogs2QuickImpl/private/qquickplatformfiledialog_p.h>
13#include <QtQuickDialogs2QuickImpl/private/qquickfiledialogimpl_p.h>
16#include <QtQuickDialogs2Utils/private/qquickfilenamefilter_p.h>
20using namespace Qt::StringLiterals;
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
62QQuickFileDialog::QQuickFileDialog(QObject *parent)
63 : QQuickAbstractDialog(QQuickDialogType::FileDialog, parent),
65 m_options(QFileDialogOptions::create()),
66 m_selectedNameFilter(
nullptr)
68 m_options->setFileMode(QFileDialogOptions::ExistingFile);
69 m_options->setAcceptMode(QFileDialogOptions::AcceptOpen);
73
74
75
76
77
78
79
80
81
82QQuickFileDialog::FileMode QQuickFileDialog::fileMode()
const
87void QQuickFileDialog::setFileMode(FileMode mode)
89 qCDebug(lcFileDialog) <<
"setFileMode called with" << mode;
90 if (mode == m_fileMode)
95 m_options->setFileMode(QFileDialogOptions::ExistingFile);
96 m_options->setAcceptMode(QFileDialogOptions::AcceptOpen);
99 m_options->setFileMode(QFileDialogOptions::ExistingFiles);
100 m_options->setAcceptMode(QFileDialogOptions::AcceptOpen);
103 m_options->setFileMode(QFileDialogOptions::AnyFile);
104 m_options->setAcceptMode(QFileDialogOptions::AcceptSave);
111 emit fileModeChanged();
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131QUrl QQuickFileDialog::selectedFile()
const
133 return addDefaultSuffix(m_selectedFiles.value(0));
136void QQuickFileDialog::setSelectedFile(
const QUrl &selectedFile)
138 setSelectedFiles({ selectedFile });
142
143
144
145
146
147
148
149
150
151
152QList<QUrl> QQuickFileDialog::selectedFiles()
const
154 return addDefaultSuffixes(m_selectedFiles);
157void QQuickFileDialog::setSelectedFiles(
const QList<QUrl> &selectedFiles)
159 qCDebug(lcFileDialog) <<
"setSelectedFiles called with" << selectedFiles;
160 if (m_selectedFiles == selectedFiles)
163 if (m_fileMode == SaveFile && selectedFiles.size() > 1) {
164 qmlWarning(
this) <<
"Cannot set more than one selected file when fileMode is SaveFile";
168 if (m_fileMode != SaveFile) {
169 for (
const auto &selectedFile : selectedFiles) {
170 const QString selectedFilePath = QQmlFile::urlToLocalFileOrQrc(selectedFile);
171 if (!QFileInfo::exists(selectedFilePath)) {
172 qmlWarning(
this) <<
"Cannot set " << selectedFilePath
173 <<
" as a selected file because it doesn't exist";
179 const auto newFirstSelectedFile = selectedFiles.value(0);
180 const bool firstChanged = m_selectedFiles.value(0) != newFirstSelectedFile;
181 m_selectedFiles = selectedFiles;
182 m_options->setInitiallySelectedFiles(m_selectedFiles);
184 emit selectedFileChanged();
185 emit currentFileChanged();
187 emit selectedFilesChanged();
188 emit currentFilesChanged();
192
193
194
195
196
197
198
199QUrl QQuickFileDialog::currentFile()
const
201 return selectedFile();
204void QQuickFileDialog::setCurrentFile(
const QUrl &file)
206 setSelectedFiles(QList<QUrl>() << file);
210
211
212
213
214
215
216
217QList<QUrl> QQuickFileDialog::currentFiles()
const
219 return selectedFiles();
222void QQuickFileDialog::setCurrentFiles(
const QList<QUrl> ¤tFiles)
224 setSelectedFiles(currentFiles);
228
229
230
231
232
233
234
235QUrl QQuickFileDialog::currentFolder()
const
237 if (QPlatformFileDialogHelper *fileDialog = qobject_cast<QPlatformFileDialogHelper *>(handle()))
238 return fileDialog->directory();
242 if (!m_options->initialDirectory().isValid())
243 return QUrl::fromLocalFile(QDir::currentPath());
245 return m_options->initialDirectory();
248void QQuickFileDialog::setCurrentFolder(
const QUrl ¤tFolder)
250 qCDebug(lcFileDialog) <<
"setCurrentFolder called with" << currentFolder;
251 if (QPlatformFileDialogHelper *fileDialog = qobject_cast<QPlatformFileDialogHelper *>(handle()))
252 fileDialog->setDirectory(currentFolder);
253 m_options->setInitialDirectory(currentFolder);
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274QFileDialogOptions::FileDialogOptions QQuickFileDialog::options()
const
276 return m_options->options();
279void QQuickFileDialog::setOptions(QFileDialogOptions::FileDialogOptions options)
281 if (options == m_options->options())
284 m_options->setOptions(options);
285 emit optionsChanged();
288void QQuickFileDialog::resetOptions()
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318QStringList QQuickFileDialog::nameFilters()
const
320 return m_options->nameFilters();
323void QQuickFileDialog::setNameFilters(
const QStringList &filters)
325 qCDebug(lcFileDialog).nospace() <<
"setNameFilters called with " << filters
326 <<
" (old filters were: " << m_options->nameFilters() <<
")";
327 if (filters == m_options->nameFilters())
330 m_options->setNameFilters(filters);
331 if (m_selectedNameFilter) {
332 int index = m_selectedNameFilter->index();
333 if (index < 0 || index >= filters.size())
335 m_selectedNameFilter->update(filters.value(index));
337 emit nameFiltersChanged();
340void QQuickFileDialog::resetNameFilters()
342 setNameFilters(QStringList());
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397QQuickFileNameFilter *QQuickFileDialog::selectedNameFilter()
const
399 if (!m_selectedNameFilter) {
400 QQuickFileDialog *that =
const_cast<QQuickFileDialog *>(
this);
401 m_selectedNameFilter =
new QQuickFileNameFilter(that);
402 m_selectedNameFilter->setOptions(m_options);
404 return m_selectedNameFilter;
408
409
410
411
412
413
414
415
416QString QQuickFileDialog::defaultSuffix()
const
418 return m_options->defaultSuffix();
421void QQuickFileDialog::setDefaultSuffix(
const QString &suffix)
423 if (suffix == m_options->defaultSuffix())
426 m_options->setDefaultSuffix(suffix);
427 emit defaultSuffixChanged();
430void QQuickFileDialog::resetDefaultSuffix()
432 setDefaultSuffix(QString());
436
437
438
439
440
441
442
443
444
445
446
447
448QString QQuickFileDialog::acceptLabel()
const
450 return m_options->labelText(QFileDialogOptions::Accept);
453void QQuickFileDialog::setAcceptLabel(
const QString &label)
455 if (label == m_options->labelText(QFileDialogOptions::Accept))
458 m_options->setLabelText(QFileDialogOptions::Accept, label);
459 emit acceptLabelChanged();
462void QQuickFileDialog::resetAcceptLabel()
464 setAcceptLabel(QString());
468
469
470
471
472
473
474
475
476
477
478
479QString QQuickFileDialog::rejectLabel()
const
481 return m_options->labelText(QFileDialogOptions::Reject);
484void QQuickFileDialog::setRejectLabel(
const QString &label)
486 if (label == m_options->labelText(QFileDialogOptions::Reject))
489 m_options->setLabelText(QFileDialogOptions::Reject, label);
490 emit rejectLabelChanged();
493void QQuickFileDialog::resetRejectLabel()
495 setRejectLabel(QString());
498bool QQuickFileDialog::useNativeDialog()
const
500 if (!QQuickAbstractDialog::useNativeDialog())
503 if (m_options->testOption(QFileDialogOptions::DontUseNativeDialog)) {
504 qCDebug(lcDialogs) <<
" - the FileDialog was told not to use a native dialog; not using native dialog";
511void QQuickFileDialog::onCreate(QPlatformDialogHelper *dialog)
513 if (QPlatformFileDialogHelper *fileDialog = qobject_cast<QPlatformFileDialogHelper *>(dialog)) {
514 connect(fileDialog, &QPlatformFileDialogHelper::currentChanged,
515 this, [
this, fileDialog](){ setSelectedFiles(fileDialog->selectedFiles()); });
516 connect(fileDialog, &QPlatformFileDialogHelper::directoryEntered,
this, &QQuickFileDialog::currentFolderChanged);
517 fileDialog->setOptions(m_options);
522 if (m_options->initiallySelectedFiles().isEmpty()) {
523 const auto selectedFiles = fileDialog->selectedFiles();
524 if (!selectedFiles.isEmpty())
525 setSelectedFiles(selectedFiles);
530void QQuickFileDialog::onShow(QPlatformDialogHelper *dialog)
532 m_options->setWindowTitle(title());
533 if (QPlatformFileDialogHelper *fileDialog = qobject_cast<QPlatformFileDialogHelper *>(dialog)) {
535 int index = selectedNameFilter()->index();
538 const QString filter = m_options->nameFilters().value(index);
539 m_options->setInitiallySelectedNameFilter(filter);
541 fileDialog->setOptions(m_options);
543 connect(fileDialog, &QPlatformFileDialogHelper::filterSelected, m_selectedNameFilter, &QQuickFileNameFilter::update);
544 fileDialog->selectNameFilter(filter);
547 if (!m_options->initiallySelectedFiles().isEmpty()) {
549 const QUrl selectedFile = m_options->initiallySelectedFiles().first();
550 fileDialog->selectFile(selectedFile);
553 const QUrl initialDir = m_options->initialDirectory();
555 if (m_firstShow && initialDir.isValid() && QDir(QQmlFile::urlToLocalFileOrQrc(initialDir)).exists())
556 fileDialog->setDirectory(m_options->initialDirectory());
559#if QT_CONFIG(quick_listview) && QT_CONFIG(quick_draganddrop)
560 if (QQuickPlatformFileDialog *fileDialog = qobject_cast<QQuickPlatformFileDialog *>(dialog); fileDialog && fileDialog->dialog())
561 fileDialog->dialog()->setPopupType(m_popupType);
564 QQuickAbstractDialog::onShow(dialog);
567void QQuickFileDialog::onHide(QPlatformDialogHelper *dialog)
569 if (QPlatformFileDialogHelper *fileDialog = qobject_cast<QPlatformFileDialogHelper *>(dialog)) {
570 if (m_selectedNameFilter)
571 disconnect(fileDialog, &QPlatformFileDialogHelper::filterSelected, m_selectedNameFilter, &QQuickFileNameFilter::update);
575QUrl QQuickFileDialog::addDefaultSuffix(
const QUrl &file)
const
578 const QString path = url.path();
579 const QString suffix = m_options->defaultSuffix();
582 const bool isContentScheme = url.scheme() == u"content"_s;
583 if (!isContentScheme && !suffix.isEmpty() && !path.endsWith(QLatin1Char(
'/'))
584 && path.lastIndexOf(QLatin1Char(
'.')) == -1) {
585 url.setPath(path + QLatin1Char(
'.') + suffix);
590void QQuickFileDialog::accept()
592 if (QPlatformFileDialogHelper *fileDialog = qobject_cast<QPlatformFileDialogHelper *>(handle())) {
594 setSelectedFiles(fileDialog->selectedFiles());
596 QQuickAbstractDialog::accept();
599QList<QUrl> QQuickFileDialog::addDefaultSuffixes(
const QList<QUrl> &files)
const
602 urls.reserve(files.size());
603 for (
const QUrl &file : files)
604 urls += addDefaultSuffix(file);
610#include "moc_qquickfiledialog_p.cpp"
Q_STATIC_LOGGING_CATEGORY(lcAccessibilityCore, "qt.accessibility.core")