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);
70 m_options->setSupportedSchemes({u"file"_s});
74
75
76
77
78
79
80
81
82
83QQuickFileDialog::FileMode QQuickFileDialog::fileMode()
const
88void QQuickFileDialog::setFileMode(FileMode mode)
90 qCDebug(lcFileDialog) <<
"setFileMode called with" << mode;
91 if (mode == m_fileMode)
96 m_options->setFileMode(QFileDialogOptions::ExistingFile);
97 m_options->setAcceptMode(QFileDialogOptions::AcceptOpen);
100 m_options->setFileMode(QFileDialogOptions::ExistingFiles);
101 m_options->setAcceptMode(QFileDialogOptions::AcceptOpen);
104 m_options->setFileMode(QFileDialogOptions::AnyFile);
105 m_options->setAcceptMode(QFileDialogOptions::AcceptSave);
112 emit fileModeChanged();
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132QUrl QQuickFileDialog::selectedFile()
const
134 return addDefaultSuffix(m_selectedFiles.value(0));
137void QQuickFileDialog::setSelectedFile(
const QUrl &selectedFile)
139 setSelectedFiles({ selectedFile });
143
144
145
146
147
148
149
150
151
152
153QList<QUrl> QQuickFileDialog::selectedFiles()
const
155 return addDefaultSuffixes(m_selectedFiles);
158void QQuickFileDialog::setSelectedFiles(
const QList<QUrl> &selectedFiles)
160 qCDebug(lcFileDialog) <<
"setSelectedFiles called with" << selectedFiles;
161 if (m_selectedFiles == selectedFiles)
164 if (m_fileMode == SaveFile && selectedFiles.size() > 1) {
165 qmlWarning(
this) <<
"Cannot set more than one selected file when fileMode is SaveFile";
169 if (m_fileMode != SaveFile) {
170 for (
const auto &selectedFile : selectedFiles) {
171 const QString selectedFilePath = QQmlFile::urlToLocalFileOrQrc(selectedFile);
172 if (!QFileInfo::exists(selectedFilePath)) {
173 qmlWarning(
this) <<
"Cannot set " << selectedFilePath
174 <<
" as a selected file because it doesn't exist";
180 const auto newFirstSelectedFile = selectedFiles.value(0);
181 const bool firstChanged = m_selectedFiles.value(0) != newFirstSelectedFile;
182 m_selectedFiles = selectedFiles;
183 m_options->setInitiallySelectedFiles(m_selectedFiles);
185 emit selectedFileChanged();
186 emit currentFileChanged();
188 emit selectedFilesChanged();
189 emit currentFilesChanged();
193
194
195
196
197
198
199
200QUrl QQuickFileDialog::currentFile()
const
202 return selectedFile();
205void QQuickFileDialog::setCurrentFile(
const QUrl &file)
207 setSelectedFiles(QList<QUrl>() << file);
211
212
213
214
215
216
217
218QList<QUrl> QQuickFileDialog::currentFiles()
const
220 return selectedFiles();
223void QQuickFileDialog::setCurrentFiles(
const QList<QUrl> ¤tFiles)
225 setSelectedFiles(currentFiles);
229
230
231
232
233
234
235
236QUrl QQuickFileDialog::currentFolder()
const
238 if (QPlatformFileDialogHelper *fileDialog = qobject_cast<QPlatformFileDialogHelper *>(handle()))
239 return fileDialog->directory();
243 if (!m_options->initialDirectory().isValid())
244 return QUrl::fromLocalFile(QDir::currentPath());
246 return m_options->initialDirectory();
249void QQuickFileDialog::setCurrentFolder(
const QUrl ¤tFolder)
251 qCDebug(lcFileDialog) <<
"setCurrentFolder called with" << currentFolder;
252 if (QPlatformFileDialogHelper *fileDialog = qobject_cast<QPlatformFileDialogHelper *>(handle()))
253 fileDialog->setDirectory(currentFolder);
254 m_options->setInitialDirectory(currentFolder);
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275QFileDialogOptions::FileDialogOptions QQuickFileDialog::options()
const
277 return m_options->options();
280void QQuickFileDialog::setOptions(QFileDialogOptions::FileDialogOptions options)
282 if (options == m_options->options())
285 m_options->setOptions(options);
286 emit optionsChanged();
289void QQuickFileDialog::resetOptions()
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319QStringList QQuickFileDialog::nameFilters()
const
321 return m_options->nameFilters();
324void QQuickFileDialog::setNameFilters(
const QStringList &filters)
326 qCDebug(lcFileDialog).nospace() <<
"setNameFilters called with " << filters
327 <<
" (old filters were: " << m_options->nameFilters() <<
")";
328 if (filters == m_options->nameFilters())
331 m_options->setNameFilters(filters);
332 if (m_selectedNameFilter) {
333 int index = m_selectedNameFilter->index();
334 if (index < 0 || index >= filters.size())
336 m_selectedNameFilter->update(filters.value(index));
338 emit nameFiltersChanged();
341void QQuickFileDialog::resetNameFilters()
343 setNameFilters(QStringList());
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
397
398QQuickFileNameFilter *QQuickFileDialog::selectedNameFilter()
const
400 if (!m_selectedNameFilter) {
401 QQuickFileDialog *that =
const_cast<QQuickFileDialog *>(
this);
402 m_selectedNameFilter =
new QQuickFileNameFilter(that);
403 m_selectedNameFilter->setOptions(m_options);
405 return m_selectedNameFilter;
409
410
411
412
413
414
415
416
417QString QQuickFileDialog::defaultSuffix()
const
419 return m_options->defaultSuffix();
422void QQuickFileDialog::setDefaultSuffix(
const QString &suffix)
424 if (suffix == m_options->defaultSuffix())
427 m_options->setDefaultSuffix(suffix);
428 emit defaultSuffixChanged();
431void QQuickFileDialog::resetDefaultSuffix()
433 setDefaultSuffix(QString());
437
438
439
440
441
442
443
444
445
446
447
448
449QString QQuickFileDialog::acceptLabel()
const
451 return m_options->labelText(QFileDialogOptions::Accept);
454void QQuickFileDialog::setAcceptLabel(
const QString &label)
456 if (label == m_options->labelText(QFileDialogOptions::Accept))
459 m_options->setLabelText(QFileDialogOptions::Accept, label);
460 emit acceptLabelChanged();
463void QQuickFileDialog::resetAcceptLabel()
465 setAcceptLabel(QString());
469
470
471
472
473
474
475
476
477
478
479
480QString QQuickFileDialog::rejectLabel()
const
482 return m_options->labelText(QFileDialogOptions::Reject);
485void QQuickFileDialog::setRejectLabel(
const QString &label)
487 if (label == m_options->labelText(QFileDialogOptions::Reject))
490 m_options->setLabelText(QFileDialogOptions::Reject, label);
491 emit rejectLabelChanged();
494void QQuickFileDialog::resetRejectLabel()
496 setRejectLabel(QString());
499bool QQuickFileDialog::useNativeDialog()
const
501 if (!QQuickAbstractDialog::useNativeDialog())
504 if (m_options->testOption(QFileDialogOptions::DontUseNativeDialog)) {
505 qCDebug(lcDialogs) <<
" - the FileDialog was told not to use a native dialog; not using native dialog";
512void QQuickFileDialog::onCreate(QPlatformDialogHelper *dialog)
514 if (QPlatformFileDialogHelper *fileDialog = qobject_cast<QPlatformFileDialogHelper *>(dialog)) {
515 connect(fileDialog, &QPlatformFileDialogHelper::currentChanged,
516 this, [
this, fileDialog](){ setSelectedFiles(fileDialog->selectedFiles()); });
517 connect(fileDialog, &QPlatformFileDialogHelper::directoryEntered,
this, &QQuickFileDialog::currentFolderChanged);
518 fileDialog->setOptions(m_options);
523 if (m_options->initiallySelectedFiles().isEmpty()) {
524 const auto selectedFiles = fileDialog->selectedFiles();
525 if (!selectedFiles.isEmpty())
526 setSelectedFiles(selectedFiles);
531void QQuickFileDialog::onShow(QPlatformDialogHelper *dialog)
533 m_options->setWindowTitle(title());
534 if (QPlatformFileDialogHelper *fileDialog = qobject_cast<QPlatformFileDialogHelper *>(dialog)) {
536 int index = selectedNameFilter()->index();
539 const QString filter = m_options->nameFilters().value(index);
540 m_options->setInitiallySelectedNameFilter(filter);
542 fileDialog->setOptions(m_options);
544 connect(fileDialog, &QPlatformFileDialogHelper::filterSelected, m_selectedNameFilter, &QQuickFileNameFilter::update);
545 fileDialog->selectNameFilter(filter);
548 if (!m_options->initiallySelectedFiles().isEmpty()) {
550 const QUrl selectedFile = m_options->initiallySelectedFiles().first();
551 fileDialog->selectFile(selectedFile);
554 const QUrl initialDir = m_options->initialDirectory();
556 if (m_firstShow && initialDir.isValid() && QDir(QQmlFile::urlToLocalFileOrQrc(initialDir)).exists())
557 fileDialog->setDirectory(m_options->initialDirectory());
560#if QT_CONFIG(quick_listview) && QT_CONFIG(quick_draganddrop)
561 if (QQuickPlatformFileDialog *fileDialog = qobject_cast<QQuickPlatformFileDialog *>(dialog); fileDialog && fileDialog->dialog())
562 fileDialog->dialog()->setPopupType(m_popupType);
565 QQuickAbstractDialog::onShow(dialog);
568void QQuickFileDialog::onHide(QPlatformDialogHelper *dialog)
570 if (QPlatformFileDialogHelper *fileDialog = qobject_cast<QPlatformFileDialogHelper *>(dialog)) {
571 if (m_selectedNameFilter)
572 disconnect(fileDialog, &QPlatformFileDialogHelper::filterSelected, m_selectedNameFilter, &QQuickFileNameFilter::update);
576QUrl QQuickFileDialog::addDefaultSuffix(
const QUrl &file)
const
579 const QString path = url.path();
580 const QString suffix = m_options->defaultSuffix();
583 const bool isContentScheme = url.scheme() == u"content"_s;
584 if (!isContentScheme && !suffix.isEmpty() && !path.endsWith(QLatin1Char(
'/'))
585 && path.lastIndexOf(QLatin1Char(
'.')) == -1) {
586 url.setPath(path + QLatin1Char(
'.') + suffix);
591void QQuickFileDialog::accept()
593 if (QPlatformFileDialogHelper *fileDialog = qobject_cast<QPlatformFileDialogHelper *>(handle())) {
595 setSelectedFiles(fileDialog->selectedFiles());
597 QQuickAbstractDialog::accept();
600QList<QUrl> QQuickFileDialog::addDefaultSuffixes(
const QList<QUrl> &files)
const
603 urls.reserve(files.size());
604 for (
const QUrl &file : files)
605 urls += addDefaultSuffix(file);
611#include "moc_qquickfiledialog_p.cpp"
Combined button and popup list for selecting options.
QT_BEGIN_NAMESPACE Q_STATIC_LOGGING_CATEGORY(lcSynthesizedIterableAccess, "qt.iterable.synthesized", QtWarningMsg)