Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qquicklabsplatformfiledialog.cpp
Go to the documentation of this file.
1// Copyright (C) 2017 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
5
6#include <QtCore/qlist.h>
7
9
10using namespace Qt::StringLiterals;
11
16
77
92
94{
95 if (mode == m_fileMode)
96 return;
97
98 switch (mode) {
99 case OpenFile:
102 break;
103 case OpenFiles:
106 break;
107 case SaveFile:
110 break;
111 default:
112 break;
113 }
114
115 m_fileMode = mode;
117}
118
133{
134 return addDefaultSuffix(m_files.value(0));
135}
136
138{
139 setFiles(QList<QUrl>() << file);
140}
141
156{
157 return addDefaultSuffixes(m_files);
158}
159
161{
162 if (m_files == files)
163 return;
164
165 bool firstChanged = m_files.value(0) != files.value(0);
166 m_files = files;
167 if (firstChanged)
170}
171
187
189{
190 setCurrentFiles(QList<QUrl>() << file);
191}
192
205{
206 if (QPlatformFileDialogHelper *fileDialog = qobject_cast<QPlatformFileDialogHelper *>(handle()))
207 return fileDialog->selectedFiles();
208 return m_options->initiallySelectedFiles();
209}
210
212{
213 if (QPlatformFileDialogHelper *fileDialog = qobject_cast<QPlatformFileDialogHelper *>(handle())) {
214 for (const QUrl &file : files)
215 fileDialog->selectFile(file);
216 }
218}
219
229{
230 if (QPlatformFileDialogHelper *fileDialog = qobject_cast<QPlatformFileDialogHelper *>(handle()))
231 return fileDialog->directory();
232 return m_options->initialDirectory();
233}
234
236{
237 if (QPlatformFileDialogHelper *fileDialog = qobject_cast<QPlatformFileDialogHelper *>(handle()))
238 fileDialog->setDirectory(folder);
239 m_options->setInitialDirectory(folder);
240}
241
259QFileDialogOptions::FileDialogOptions QQuickLabsPlatformFileDialog::options() const
260{
261 return m_options->options();
262}
263
264void QQuickLabsPlatformFileDialog::setOptions(QFileDialogOptions::FileDialogOptions options)
265{
266 if (options == m_options->options())
267 return;
268
269 m_options->setOptions(options);
271}
272
277
300{
301 return m_options->nameFilters();
302}
303
305{
306 if (filters == m_options->nameFilters())
307 return;
308
309 m_options->setNameFilters(filters);
310 if (m_selectedNameFilter) {
311 int index = m_selectedNameFilter->index();
312 if (index < 0 || index >= filters.size())
313 index = 0;
314 m_selectedNameFilter->update(filters.value(index));
315 }
317}
318
323
368{
369 if (!m_selectedNameFilter) {
371 m_selectedNameFilter = new QQuickLabsPlatformFileNameFilter(that);
372 m_selectedNameFilter->setOptions(m_options);
373 }
374 return m_selectedNameFilter;
375}
376
387{
388 return m_options->defaultSuffix();
389}
390
392{
393 if (suffix == m_options->defaultSuffix())
394 return;
395
396 m_options->setDefaultSuffix(suffix);
398}
399
404
422
431
436
453
462
467
473
475{
476 if (QPlatformFileDialogHelper *fileDialog = qobject_cast<QPlatformFileDialogHelper *>(dialog)) {
477 // TODO: emit currentFileChanged only when the first entry in currentFiles changes
481 fileDialog->setOptions(m_options);
482 }
483}
484
486{
487 m_options->setWindowTitle(title());
488 if (QPlatformFileDialogHelper *fileDialog = qobject_cast<QPlatformFileDialogHelper *>(dialog)) {
489 fileDialog->setOptions(m_options); // setOptions only assigns a member and isn't virtual
490 if (m_firstShow && m_options->initialDirectory().isValid())
491 fileDialog->setDirectory(m_options->initialDirectory());
492 if (m_selectedNameFilter) {
493 const int index = m_selectedNameFilter->index();
494 const QString filter = m_options->nameFilters().value(index);
496 fileDialog->selectNameFilter(filter);
498 }
499 }
500 if (m_firstShow)
501 m_firstShow = false;
502}
503
505{
506 if (QPlatformFileDialogHelper *fileDialog = qobject_cast<QPlatformFileDialogHelper *>(dialog)) {
507 if (m_selectedNameFilter)
509 }
510}
511
513{
514 if (QPlatformFileDialogHelper *fileDialog = qobject_cast<QPlatformFileDialogHelper *>(handle()))
515 setFiles(fileDialog->selectedFiles());
517}
518
519QUrl QQuickLabsPlatformFileDialog::addDefaultSuffix(const QUrl &file) const
520{
521 QUrl url = file;
522 const QString path = url.path();
523 const QString suffix = m_options->defaultSuffix();
524 // Urls with "content" scheme do not require suffixes. Such schemes are
525 // used on Android.
526 const bool isContentScheme = url.scheme() == u"content"_s;
527 if (!isContentScheme && !suffix.isEmpty() && !path.endsWith(QLatin1Char('/'))
528 && path.lastIndexOf(QLatin1Char('.')) == -1) {
529 url.setPath(path + QLatin1Char('.') + suffix);
530 }
531 return url;
532}
533
534QList<QUrl> QQuickLabsPlatformFileDialog::addDefaultSuffixes(const QList<QUrl> &files) const
535{
536 QList<QUrl> urls;
537 urls.reserve(files.size());
538 for (const QUrl &file : files)
539 urls += addDefaultSuffix(file);
540 return urls;
541}
542
547
549{
550 return m_index;
551}
552
554{
555 if (m_index == index)
556 return;
557
558 m_index = index;
560}
561
563{
564 return m_name;
565}
566
568{
569 return m_extensions;
570}
571
572QSharedPointer<QFileDialogOptions> QQuickLabsPlatformFileNameFilter::options() const
573{
574 return m_options;
575}
576
577void QQuickLabsPlatformFileNameFilter::setOptions(const QSharedPointer<QFileDialogOptions> &options)
578{
579 m_options = options;
580}
581
583{
584 return filter.left(filter.indexOf(QLatin1Char('(')) - 1);
585}
586
588{
589 return filter.mid(filter.indexOf(QLatin1Char('.')) + 1).toString();
590}
591
593{
594 QStringList extensions;
595 const int from = filter.indexOf(QLatin1Char('('));
596 const int to = filter.lastIndexOf(QLatin1Char(')')) - 1;
597 if (from >= 0 && from < to) {
598 const QStringView ref = filter.mid(from + 1, to - from);
599 const QList<QStringView> exts = ref.split(QLatin1Char(' '), Qt::SkipEmptyParts);
600 for (const QStringView &ref : exts)
601 extensions += extractExtension(ref);
602 }
603
604 return extensions;
605}
606
608{
609 const QStringList filters = nameFilters();
610
611 const int oldIndex = m_index;
612 const QString oldName = m_name;
613 const QStringList oldExtensions = m_extensions;
614
615 m_index = filters.indexOf(filter);
616 m_name = extractName(filter);
617 m_extensions = extractExtensions(filter);
618
619 if (oldIndex != m_index)
620 emit indexChanged(m_index);
621 if (oldName != m_name)
622 emit nameChanged(m_name);
623 if (oldExtensions != m_extensions)
624 emit extensionsChanged(m_extensions);
625}
626
627QStringList QQuickLabsPlatformFileNameFilter::nameFilters() const
628{
629 return m_options ? m_options->nameFilters() : QStringList();
630}
631
632QString QQuickLabsPlatformFileNameFilter::nameFilter(int index) const
633{
634 return m_options ? m_options->nameFilters().value(index) : QString();
635}
636
638
639#include "moc_qquicklabsplatformfiledialog_p.cpp"
QList< QUrl > initiallySelectedFiles() const
void setWindowTitle(const QString &)
QString labelText(DialogLabel label) const
void setNameFilters(const QStringList &filters)
void setOptions(FileDialogOptions options)
void setInitiallySelectedNameFilter(const QString &)
QStringList nameFilters() const
FileDialogOptions options() const
void setLabelText(DialogLabel label, const QString &text)
void setFileMode(FileMode mode)
void setAcceptMode(AcceptMode mode)
void setInitialDirectory(const QUrl &)
bool testOption(FileDialogOption option) const
void setDefaultSuffix(const QString &suffix)
void setInitiallySelectedFiles(const QList< QUrl > &)
qsizetype size() const noexcept
Definition qlist.h:397
T value(qsizetype i) const
Definition qlist.h:664
\inmodule QtCore
Definition qobject.h:103
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
Definition qobject.cpp:2960
The QPlatformDialogHelper class allows for platform-specific customization of dialogs.
The QPlatformFileDialogHelper class allows for platform-specific customization of file dialogs.
void currentChanged(const QUrl &path)
void directoryEntered(const QUrl &directory)
void filterSelected(const QString &filter)
The QPlatformTheme class allows customizing the UI based on themes.
QPlatformDialogHelper * handle() const
virtual void accept()
\qmlmethod void Qt.labs.platform::Dialog::accept()
void setFiles(const QList< QUrl > &files)
void setOptions(QFileDialogOptions::FileDialogOptions options)
QFileDialogOptions::FileDialogOptions options
void onShow(QPlatformDialogHelper *dialog) override
void setDefaultSuffix(const QString &suffix)
void setNameFilters(const QStringList &filters)
void accept() override
\qmlmethod void Qt.labs.platform::Dialog::accept()
QQuickLabsPlatformFileNameFilter * selectedNameFilter
QQuickLabsPlatformFileDialog(QObject *parent=nullptr)
A native file dialog.
void onCreate(QPlatformDialogHelper *dialog) override
void onHide(QPlatformDialogHelper *dialog) override
void setCurrentFiles(const QList< QUrl > &files)
void extensionsChanged(const QStringList &extensions)
void setOptions(const QSharedPointer< QFileDialogOptions > &options)
void nameChanged(const QString &name)
QSharedPointer< QFileDialogOptions > options() const
QQuickLabsPlatformFileNameFilter(QObject *parent=nullptr)
\inmodule QtCore
\inmodule QtCore
Definition qstringview.h:78
constexpr QStringView mid(qsizetype pos, qsizetype n=-1) const noexcept
Returns the substring of length length starting at position start in this object.
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
bool isEmpty() const noexcept
Returns true if the string has no characters; otherwise returns false.
Definition qstring.h:192
\inmodule QtCore
Definition qurl.h:94
bool isValid() const
Returns true if the URL is non-empty and valid; otherwise returns false.
Definition qurl.cpp:1882
QString scheme() const
Returns the scheme of the URL.
Definition qurl.cpp:1991
void setPath(const QString &path, ParsingMode mode=DecodedMode)
Sets the path of the URL to path.
Definition qurl.cpp:2414
QString path(ComponentFormattingOptions options=FullyDecoded) const
Returns the path of the URL.
Definition qurl.cpp:2468
Combined button and popup list for selecting options.
@ SkipEmptyParts
Definition qnamespace.h:128
QStringList m_selectedNameFilter
SharedPointerFileDialogOptions m_options
QList< QString > QStringList
Constructs a string list that contains the given string, str.
GLenum mode
GLuint index
[2]
GLuint GLsizei const GLchar * label
[43]
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
GLint ref
GLsizei const GLchar *const * path
static QString extractName(const QString &filter)
static QString extractExtension(QStringView filter)
static QStringList extractExtensions(QStringView filter)
#define emit
QFile file
[0]
QUrl url("example.com")
[constructor-url-reference]
QObject::connect nullptr
myObject disconnect()
[26]
QFileDialog dialog(this)
[1]
QStringList files
[8]
const QStringList filters({"Image files (*.png *.xpm *.jpg)", "Text files (*.txt)", "Any files (*)" })
[6]
view create()
\inmodule QtCore \reentrant
Definition qchar.h:18