7#if QT_DEPRECATED_SINCE(6
, 9
)
9#include <QtCore/qlist.h>
13using namespace Qt::StringLiterals;
16
17
18
19
20
21
22
23
24
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
61
62
63
64
65
66
67
68
69
70
72QQuickLabsPlatformFileDialog::QQuickLabsPlatformFileDialog(QObject *parent)
73 : QQuickLabsPlatformDialog(QPlatformTheme::FileDialog, parent),
75 m_options(QFileDialogOptions::create()),
76 m_selectedNameFilter(
nullptr)
78 m_options->setFileMode(QFileDialogOptions::ExistingFile);
79 m_options->setAcceptMode(QFileDialogOptions::AcceptOpen);
83
84
85
86
87
88
89
90
91
92QQuickLabsPlatformFileDialog::FileMode QQuickLabsPlatformFileDialog::fileMode()
const
97void QQuickLabsPlatformFileDialog::setFileMode(FileMode mode)
99 if (mode == m_fileMode)
104 m_options->setFileMode(QFileDialogOptions::ExistingFile);
105 m_options->setAcceptMode(QFileDialogOptions::AcceptOpen);
108 m_options->setFileMode(QFileDialogOptions::ExistingFiles);
109 m_options->setAcceptMode(QFileDialogOptions::AcceptOpen);
112 m_options->setFileMode(QFileDialogOptions::AnyFile);
113 m_options->setAcceptMode(QFileDialogOptions::AcceptSave);
120 emit fileModeChanged();
124
125
126
127
128
129
130
131
132
133
134
135
136QUrl QQuickLabsPlatformFileDialog::file()
const
138 return addDefaultSuffix(m_files.value(0));
141void QQuickLabsPlatformFileDialog::setFile(
const QUrl &file)
143 setFiles(QList<QUrl>() << file);
147
148
149
150
151
152
153
154
155
156
157
158
159QList<QUrl> QQuickLabsPlatformFileDialog::files()
const
161 return addDefaultSuffixes(m_files);
164void QQuickLabsPlatformFileDialog::setFiles(
const QList<QUrl> &files)
166 if (m_files == files)
169 bool firstChanged = m_files.value(0) != files.value(0);
177
178
179
180
181
182
183
184
185
186
187QUrl QQuickLabsPlatformFileDialog::currentFile()
const
189 return currentFiles().value(0);
192void QQuickLabsPlatformFileDialog::setCurrentFile(
const QUrl &file)
194 setCurrentFiles(QList<QUrl>() << file);
198
199
200
201
202
203
204
205
206
207
208QList<QUrl> QQuickLabsPlatformFileDialog::currentFiles()
const
210 if (QPlatformFileDialogHelper *fileDialog = qobject_cast<QPlatformFileDialogHelper *>(handle()))
211 return fileDialog->selectedFiles();
212 return m_options->initiallySelectedFiles();
215void QQuickLabsPlatformFileDialog::setCurrentFiles(
const QList<QUrl> &files)
217 if (QPlatformFileDialogHelper *fileDialog = qobject_cast<QPlatformFileDialogHelper *>(handle())) {
218 for (
const QUrl &file : files)
219 fileDialog->selectFile(file);
221 m_options->setInitiallySelectedFiles(files);
225
226
227
228
229
230
231
232QUrl QQuickLabsPlatformFileDialog::folder()
const
234 if (QPlatformFileDialogHelper *fileDialog = qobject_cast<QPlatformFileDialogHelper *>(handle()))
235 return fileDialog->directory();
236 return m_options->initialDirectory();
239void QQuickLabsPlatformFileDialog::setFolder(
const QUrl &folder)
241 if (QPlatformFileDialogHelper *fileDialog = qobject_cast<QPlatformFileDialogHelper *>(handle()))
242 fileDialog->setDirectory(folder);
243 m_options->setInitialDirectory(folder);
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263QFileDialogOptions::FileDialogOptions QQuickLabsPlatformFileDialog::options()
const
265 return m_options->options();
268void QQuickLabsPlatformFileDialog::setOptions(QFileDialogOptions::FileDialogOptions options)
270 if (options == m_options->options())
273 m_options->setOptions(options);
274 emit optionsChanged();
277void QQuickLabsPlatformFileDialog::resetOptions()
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303QStringList QQuickLabsPlatformFileDialog::nameFilters()
const
305 return m_options->nameFilters();
308void QQuickLabsPlatformFileDialog::setNameFilters(
const QStringList &filters)
310 if (filters == m_options->nameFilters())
313 m_options->setNameFilters(filters);
314 if (m_selectedNameFilter) {
315 int index = m_selectedNameFilter->index();
316 if (index < 0 || index >= filters.size())
318 m_selectedNameFilter->update(filters.value(index));
320 emit nameFiltersChanged();
323void QQuickLabsPlatformFileDialog::resetNameFilters()
325 setNameFilters(QStringList());
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
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
371QQuickLabsPlatformFileNameFilter *QQuickLabsPlatformFileDialog::selectedNameFilter()
const
373 if (!m_selectedNameFilter) {
374 QQuickLabsPlatformFileDialog *that =
const_cast<QQuickLabsPlatformFileDialog *>(
this);
375 m_selectedNameFilter =
new QQuickLabsPlatformFileNameFilter(that);
376 m_selectedNameFilter->setOptions(m_options);
378 return m_selectedNameFilter;
382
383
384
385
386
387
388
389
390QString QQuickLabsPlatformFileDialog::defaultSuffix()
const
392 return m_options->defaultSuffix();
395void QQuickLabsPlatformFileDialog::setDefaultSuffix(
const QString &suffix)
397 if (suffix == m_options->defaultSuffix())
400 m_options->setDefaultSuffix(suffix);
401 emit defaultSuffixChanged();
404void QQuickLabsPlatformFileDialog::resetDefaultSuffix()
406 setDefaultSuffix(QString());
410
411
412
413
414
415
416
417
418
419
420
421
422QString QQuickLabsPlatformFileDialog::acceptLabel()
const
424 return m_options->labelText(QFileDialogOptions::Accept);
427void QQuickLabsPlatformFileDialog::setAcceptLabel(
const QString &label)
429 if (label == m_options->labelText(QFileDialogOptions::Accept))
432 m_options->setLabelText(QFileDialogOptions::Accept, label);
433 emit acceptLabelChanged();
436void QQuickLabsPlatformFileDialog::resetAcceptLabel()
438 setAcceptLabel(QString());
442
443
444
445
446
447
448
449
450
451
452
453QString QQuickLabsPlatformFileDialog::rejectLabel()
const
455 return m_options->labelText(QFileDialogOptions::Reject);
458void QQuickLabsPlatformFileDialog::setRejectLabel(
const QString &label)
460 if (label == m_options->labelText(QFileDialogOptions::Reject))
463 m_options->setLabelText(QFileDialogOptions::Reject, label);
464 emit rejectLabelChanged();
467void QQuickLabsPlatformFileDialog::resetRejectLabel()
469 setRejectLabel(QString());
472bool QQuickLabsPlatformFileDialog::useNativeDialog()
const
474 return QQuickLabsPlatformDialog::useNativeDialog()
475 && !m_options->testOption(QFileDialogOptions::DontUseNativeDialog);
478void QQuickLabsPlatformFileDialog::onCreate(QPlatformDialogHelper *dialog)
480 if (QPlatformFileDialogHelper *fileDialog = qobject_cast<QPlatformFileDialogHelper *>(dialog)) {
482 connect(fileDialog, &QPlatformFileDialogHelper::currentChanged,
this, &QQuickLabsPlatformFileDialog::currentFileChanged);
483 connect(fileDialog, &QPlatformFileDialogHelper::currentChanged,
this, &QQuickLabsPlatformFileDialog::currentFilesChanged);
484 connect(fileDialog, &QPlatformFileDialogHelper::directoryEntered,
this, &QQuickLabsPlatformFileDialog::folderChanged);
485 fileDialog->setOptions(m_options);
489void QQuickLabsPlatformFileDialog::onShow(QPlatformDialogHelper *dialog)
491 m_options->setWindowTitle(title());
492 if (QPlatformFileDialogHelper *fileDialog = qobject_cast<QPlatformFileDialogHelper *>(dialog)) {
493 fileDialog->setOptions(m_options);
494 if (m_firstShow && m_options->initialDirectory().isValid())
495 fileDialog->setDirectory(m_options->initialDirectory());
496 if (m_selectedNameFilter) {
497 const int index = m_selectedNameFilter->index();
498 const QString filter = m_options->nameFilters().value(index);
499 m_options->setInitiallySelectedNameFilter(filter);
500 fileDialog->selectNameFilter(filter);
501 connect(fileDialog, &QPlatformFileDialogHelper::filterSelected, m_selectedNameFilter, &QQuickLabsPlatformFileNameFilter::update);
508void QQuickLabsPlatformFileDialog::onHide(QPlatformDialogHelper *dialog)
510 if (QPlatformFileDialogHelper *fileDialog = qobject_cast<QPlatformFileDialogHelper *>(dialog)) {
511 if (m_selectedNameFilter)
512 disconnect(fileDialog, &QPlatformFileDialogHelper::filterSelected, m_selectedNameFilter, &QQuickLabsPlatformFileNameFilter::update);
516void QQuickLabsPlatformFileDialog::accept()
518 if (QPlatformFileDialogHelper *fileDialog = qobject_cast<QPlatformFileDialogHelper *>(handle()))
519 setFiles(fileDialog->selectedFiles());
520 QQuickLabsPlatformDialog::accept();
523QUrl QQuickLabsPlatformFileDialog::addDefaultSuffix(
const QUrl &file)
const
526 const QString path = url.path();
527 const QString suffix = m_options->defaultSuffix();
530 const bool isContentScheme = url.scheme() == u"content"_s;
531 if (!isContentScheme && !suffix.isEmpty() && !path.endsWith(QLatin1Char(
'/'))
532 && path.lastIndexOf(QLatin1Char(
'.')) == -1) {
533 url.setPath(path + QLatin1Char(
'.') + suffix);
538QList<QUrl> QQuickLabsPlatformFileDialog::addDefaultSuffixes(
const QList<QUrl> &files)
const
541 urls.reserve(files.size());
542 for (
const QUrl &file : files)
543 urls += addDefaultSuffix(file);
547QQuickLabsPlatformFileNameFilter::QQuickLabsPlatformFileNameFilter(QObject *parent)
548 : QObject(parent), m_index(-1)
552int QQuickLabsPlatformFileNameFilter::index()
const
557void QQuickLabsPlatformFileNameFilter::setIndex(
int index)
559 if (m_index == index)
563 emit indexChanged(index);
566QString QQuickLabsPlatformFileNameFilter::name()
const
571QStringList QQuickLabsPlatformFileNameFilter::extensions()
const
576QSharedPointer<QFileDialogOptions> QQuickLabsPlatformFileNameFilter::options()
const
581void QQuickLabsPlatformFileNameFilter::setOptions(
const QSharedPointer<QFileDialogOptions> &options)
586static QString extractName(
const QString &filter)
588 return filter.left(filter.indexOf(QLatin1Char(
'(')) - 1);
591static QString extractExtension(QStringView filter)
593 return filter.mid(filter.indexOf(QLatin1Char(
'.')) + 1).toString();
596static QStringList extractExtensions(QStringView filter)
598 QStringList extensions;
599 const int from = filter.indexOf(QLatin1Char(
'('));
600 const int to = filter.lastIndexOf(QLatin1Char(
')')) - 1;
601 if (from >= 0 && from < to) {
602 const QStringView ref = filter.mid(from + 1, to - from);
603 const QList<QStringView> exts = ref.split(QLatin1Char(
' '), Qt::SkipEmptyParts);
604 for (
const QStringView &ref : exts)
605 extensions += extractExtension(ref);
611void QQuickLabsPlatformFileNameFilter::update(
const QString &filter)
613 const QStringList filters = nameFilters();
615 const int oldIndex = m_index;
616 const QString oldName = m_name;
617 const QStringList oldExtensions = m_extensions;
619 m_index = filters.indexOf(filter);
620 m_name = extractName(filter);
621 m_extensions = extractExtensions(filter);
623 if (oldIndex != m_index)
624 emit indexChanged(m_index);
625 if (oldName != m_name)
626 emit nameChanged(m_name);
627 if (oldExtensions != m_extensions)
628 emit extensionsChanged(m_extensions);
631QStringList QQuickLabsPlatformFileNameFilter::nameFilters()
const
633 return m_options ? m_options->nameFilters() : QStringList();
636QString QQuickLabsPlatformFileNameFilter::nameFilter(
int index)
const
638 return m_options ? m_options->nameFilters().value(index) : QString();
643#include "moc_qquicklabsplatformfiledialog_p.cpp"