Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qplatformdialoghelper.cpp
Go to the documentation of this file.
1// Copyright (C) 2018 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// Qt-Security score:significant reason:default
4
6
7#include <QtCore/QCoreApplication>
8#include <QtCore/QList>
9#if QT_CONFIG(regularexpression)
10#include <QtCore/QRegularExpression>
11#endif
12#include <QtCore/QUrl>
13#include <QtCore/QVariant>
14#include <QtGui/QColor>
15#include <QtGui/QPixmap>
16
17#include <algorithm>
18
19QT_BEGIN_NAMESPACE
20
21using namespace Qt::StringLiterals;
22
23QT_IMPL_METATYPE_EXTERN_TAGGED(QPlatformDialogHelper::StandardButton,
24 QPlatformDialogHelper__StandardButton)
25QT_IMPL_METATYPE_EXTERN_TAGGED(QPlatformDialogHelper::ButtonRole,
26 QPlatformDialogHelper__ButtonRole)
27
28/*!
29 \class QPlatformDialogHelper
30 \since 5.0
31 \internal
32 \ingroup qpa
33
34 \brief The QPlatformDialogHelper class allows for platform-specific customization of dialogs.
35
36*/
37
38/*!
39 \enum QPlatformDialogHelper::StyleHint
40
41 This enum type specifies platform-specific style hints.
42
43 \value DialogIsQtWindow Indicates that a platform-specific dialog is implemented
44 as in-process Qt window. It allows to prevent blocking the
45 dialog by an invisible proxy Qt dialog.
46
47 \sa styleHint()
48*/
49
50static const int buttonRoleLayouts[2][6][14] =
51{
52 // Qt::Horizontal
53 {
54 // WinLayout
55 { QPlatformDialogHelper::ResetRole, QPlatformDialogHelper::Stretch, QPlatformDialogHelper::YesRole, QPlatformDialogHelper::AcceptRole,
56 QPlatformDialogHelper::AlternateRole, QPlatformDialogHelper::DestructiveRole, QPlatformDialogHelper::NoRole,
57 QPlatformDialogHelper::ActionRole, QPlatformDialogHelper::RejectRole, QPlatformDialogHelper::ApplyRole,
58 QPlatformDialogHelper::HelpRole, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL },
59
60 // MacLayout
61 { QPlatformDialogHelper::HelpRole, QPlatformDialogHelper::ResetRole, QPlatformDialogHelper::ApplyRole, QPlatformDialogHelper::ActionRole,
62 QPlatformDialogHelper::Stretch, QPlatformDialogHelper::DestructiveRole | QPlatformDialogHelper::Reverse,
63 QPlatformDialogHelper::AlternateRole | QPlatformDialogHelper::Reverse, QPlatformDialogHelper::RejectRole | QPlatformDialogHelper::Reverse,
64 QPlatformDialogHelper::AcceptRole | QPlatformDialogHelper::Reverse, QPlatformDialogHelper::NoRole | QPlatformDialogHelper::Reverse,
65 QPlatformDialogHelper::YesRole | QPlatformDialogHelper::Reverse, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL },
66
67 // KdeLayout
68 { QPlatformDialogHelper::HelpRole, QPlatformDialogHelper::ResetRole, QPlatformDialogHelper::Stretch, QPlatformDialogHelper::YesRole,
69 QPlatformDialogHelper::NoRole, QPlatformDialogHelper::ActionRole, QPlatformDialogHelper::AcceptRole, QPlatformDialogHelper::AlternateRole,
70 QPlatformDialogHelper::ApplyRole, QPlatformDialogHelper::DestructiveRole, QPlatformDialogHelper::RejectRole, QPlatformDialogHelper::EOL },
71
72 // GnomeLayout
73 { QPlatformDialogHelper::HelpRole, QPlatformDialogHelper::ResetRole, QPlatformDialogHelper::Stretch, QPlatformDialogHelper::ActionRole,
74 QPlatformDialogHelper::ApplyRole | QPlatformDialogHelper::Reverse, QPlatformDialogHelper::DestructiveRole | QPlatformDialogHelper::Reverse,
75 QPlatformDialogHelper::AlternateRole | QPlatformDialogHelper::Reverse, QPlatformDialogHelper::RejectRole | QPlatformDialogHelper::Reverse,
76 QPlatformDialogHelper::AcceptRole | QPlatformDialogHelper::Reverse, QPlatformDialogHelper::NoRole | QPlatformDialogHelper::Reverse,
77 QPlatformDialogHelper::YesRole | QPlatformDialogHelper::Reverse, QPlatformDialogHelper::EOL },
78
79 // AndroidLayout (neutral, stretch, dismissive, affirmative)
80 // https://material.io/guidelines/components/dialogs.html#dialogs-specs
81 { QPlatformDialogHelper::HelpRole, QPlatformDialogHelper::ResetRole, QPlatformDialogHelper::ApplyRole, QPlatformDialogHelper::ActionRole,
82 QPlatformDialogHelper::Stretch, QPlatformDialogHelper::RejectRole | QPlatformDialogHelper::Reverse,
83 QPlatformDialogHelper::NoRole | QPlatformDialogHelper::Reverse, QPlatformDialogHelper::DestructiveRole | QPlatformDialogHelper::Reverse,
84 QPlatformDialogHelper::AlternateRole | QPlatformDialogHelper::Reverse, QPlatformDialogHelper::AcceptRole | QPlatformDialogHelper::Reverse,
85 QPlatformDialogHelper::YesRole | QPlatformDialogHelper::Reverse, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL }
86 },
87
88 // Qt::Vertical
89 {
90 // WinLayout
91 { QPlatformDialogHelper::ActionRole, QPlatformDialogHelper::YesRole, QPlatformDialogHelper::AcceptRole, QPlatformDialogHelper::AlternateRole,
92 QPlatformDialogHelper::DestructiveRole, QPlatformDialogHelper::NoRole, QPlatformDialogHelper::RejectRole, QPlatformDialogHelper::ApplyRole, QPlatformDialogHelper::ResetRole,
93 QPlatformDialogHelper::HelpRole, QPlatformDialogHelper::Stretch, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL },
94
95 // MacLayout
96 { QPlatformDialogHelper::YesRole, QPlatformDialogHelper::NoRole, QPlatformDialogHelper::AcceptRole, QPlatformDialogHelper::RejectRole,
97 QPlatformDialogHelper::AlternateRole, QPlatformDialogHelper::DestructiveRole, QPlatformDialogHelper::Stretch, QPlatformDialogHelper::ActionRole, QPlatformDialogHelper::ApplyRole,
98 QPlatformDialogHelper::ResetRole, QPlatformDialogHelper::HelpRole, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL },
99
100 // KdeLayout
101 { QPlatformDialogHelper::AcceptRole, QPlatformDialogHelper::AlternateRole, QPlatformDialogHelper::ApplyRole, QPlatformDialogHelper::ActionRole,
102 QPlatformDialogHelper::YesRole, QPlatformDialogHelper::NoRole, QPlatformDialogHelper::Stretch, QPlatformDialogHelper::ResetRole,
103 QPlatformDialogHelper::DestructiveRole, QPlatformDialogHelper::RejectRole, QPlatformDialogHelper::HelpRole, QPlatformDialogHelper::EOL },
104
105 // GnomeLayout
106 { QPlatformDialogHelper::YesRole, QPlatformDialogHelper::NoRole, QPlatformDialogHelper::AcceptRole, QPlatformDialogHelper::RejectRole,
107 QPlatformDialogHelper::AlternateRole, QPlatformDialogHelper::DestructiveRole, QPlatformDialogHelper::ApplyRole, QPlatformDialogHelper::ActionRole, QPlatformDialogHelper::Stretch,
108 QPlatformDialogHelper::ResetRole, QPlatformDialogHelper::HelpRole, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL },
109
110 // AndroidLayout
111 // (affirmative
112 // dismissive
113 // neutral)
114 // https://material.io/guidelines/components/dialogs.html#dialogs-specs
115 { QPlatformDialogHelper::YesRole, QPlatformDialogHelper::AcceptRole, QPlatformDialogHelper::AlternateRole, QPlatformDialogHelper::DestructiveRole,
116 QPlatformDialogHelper::NoRole, QPlatformDialogHelper::RejectRole, QPlatformDialogHelper::Stretch, QPlatformDialogHelper::ActionRole, QPlatformDialogHelper::ApplyRole,
117 QPlatformDialogHelper::ResetRole, QPlatformDialogHelper::HelpRole, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL }
118 }
119};
120
121
122QPlatformDialogHelper::QPlatformDialogHelper()
123{
124 qRegisterMetaType<StandardButton>();
125 qRegisterMetaType<ButtonRole>();
126}
127
128QPlatformDialogHelper::~QPlatformDialogHelper()
129{
130}
131
132QVariant QPlatformDialogHelper::styleHint(StyleHint hint) const
133{
134 return QPlatformDialogHelper::defaultStyleHint(hint);
135}
136
137QVariant QPlatformDialogHelper::defaultStyleHint(QPlatformDialogHelper::StyleHint hint)
138{
139 Q_UNUSED(hint);
140 return QVariant();
141}
142
143// Font dialog
144
153
154QFontDialogOptions::QFontDialogOptions(QFontDialogOptionsPrivate *dd)
155 : d(dd)
156{
157}
158
159QFontDialogOptions::~QFontDialogOptions()
160{
161}
162
163namespace {
164 struct FontDialogCombined : QFontDialogOptionsPrivate, QFontDialogOptions
165 {
166 FontDialogCombined() : QFontDialogOptionsPrivate(), QFontDialogOptions(this) {}
167 FontDialogCombined(const FontDialogCombined &other)
168 : QFontDialogOptionsPrivate(other), QFontDialogOptions(this) {}
169 };
170}
171
172// static
173QSharedPointer<QFontDialogOptions> QFontDialogOptions::create()
174{
175 return QSharedPointer<FontDialogCombined>::create();
176}
177
178QSharedPointer<QFontDialogOptions> QFontDialogOptions::clone() const
179{
180 return QSharedPointer<FontDialogCombined>::create(*static_cast<const FontDialogCombined*>(this));
181}
182
183QString QFontDialogOptions::windowTitle() const
184{
185 return d->windowTitle;
186}
187
188void QFontDialogOptions::setWindowTitle(const QString &title)
189{
190 d->windowTitle = title;
191}
192
193void QFontDialogOptions::setOption(QFontDialogOptions::FontDialogOption option, bool on)
194{
195 if (!(d->options & option) != !on)
196 setOptions(d->options ^ option);
197}
198
199bool QFontDialogOptions::testOption(QFontDialogOptions::FontDialogOption option) const
200{
201 return d->options & option;
202}
203
204void QFontDialogOptions::setOptions(FontDialogOptions options)
205{
206 if (options != d->options)
207 d->options = options;
208}
209
210QFontDialogOptions::FontDialogOptions QFontDialogOptions::options() const
211{
212 return d->options;
213}
214
215/*!
216 \class QPlatformFontDialogHelper
217 \since 5.0
218 \internal
219 \ingroup qpa
220
221 \brief The QPlatformFontDialogHelper class allows for platform-specific customization of font dialogs.
222
223*/
224const QSharedPointer<QFontDialogOptions> &QPlatformFontDialogHelper::options() const
225{
226 return m_options;
227}
228
229void QPlatformFontDialogHelper::setOptions(const QSharedPointer<QFontDialogOptions> &options)
230{
231 m_options = options;
232}
233
234// Color dialog
235
247
249{
250 int i = 0;
251 for (int g = 0; g < 4; ++g)
252 for (int r = 0; r < 4; ++r)
253 for (int b = 0; b < 3; ++b)
254 standardRgb[i++] = qRgb(r * 255 / 3, g * 255 / 3, b * 255 / 2);
255 std::fill(customRgb, customRgb + CustomColorCount, 0xffffffff);
256}
257
258Q_GLOBAL_STATIC(QColorDialogStaticData, qColorDialogStaticData)
259
272
273QColorDialogOptions::QColorDialogOptions(QColorDialogOptionsPrivate *dd)
274 : d(dd)
275{
276}
277
278QColorDialogOptions::~QColorDialogOptions()
279{
280}
281
282namespace {
283 struct ColorDialogCombined : QColorDialogOptionsPrivate, QColorDialogOptions
284 {
285 ColorDialogCombined() : QColorDialogOptionsPrivate(), QColorDialogOptions(this) {}
286 ColorDialogCombined(const ColorDialogCombined &other)
287 : QColorDialogOptionsPrivate(other), QColorDialogOptions(this) {}
288 };
289}
290
291// static
292QSharedPointer<QColorDialogOptions> QColorDialogOptions::create()
293{
294 return QSharedPointer<ColorDialogCombined>::create();
295}
296
297QSharedPointer<QColorDialogOptions> QColorDialogOptions::clone() const
298{
299 return QSharedPointer<ColorDialogCombined>::create(*static_cast<const ColorDialogCombined*>(this));
300}
301
302QString QColorDialogOptions::windowTitle() const
303{
304 return d->windowTitle;
305}
306
307void QColorDialogOptions::setWindowTitle(const QString &title)
308{
309 d->windowTitle = title;
310}
311
312void QColorDialogOptions::setOption(QColorDialogOptions::ColorDialogOption option, bool on)
313{
314 if (!(d->options & option) != !on)
315 setOptions(d->options ^ option);
316}
317
318bool QColorDialogOptions::testOption(QColorDialogOptions::ColorDialogOption option) const
319{
320 return d->options & option;
321}
322
323void QColorDialogOptions::setOptions(ColorDialogOptions options)
324{
325 if (options != d->options)
326 d->options = options;
327}
328
329QColorDialogOptions::ColorDialogOptions QColorDialogOptions::options() const
330{
331 return d->options;
332}
333
334int QColorDialogOptions::customColorCount()
335{
336 return QColorDialogStaticData::CustomColorCount;
337}
338
339QRgb QColorDialogOptions::customColor(int index)
340{
341 if (uint(index) >= uint(QColorDialogStaticData::CustomColorCount))
342 return qRgb(255, 255, 255);
343 return qColorDialogStaticData()->customRgb[index];
344}
345
346QRgb *QColorDialogOptions::customColors()
347{
348 return qColorDialogStaticData()->customRgb;
349}
350
351void QColorDialogOptions::setCustomColor(int index, QRgb color)
352{
353 if (uint(index) >= uint(QColorDialogStaticData::CustomColorCount))
354 return;
355 qColorDialogStaticData()->customSet = true;
356 qColorDialogStaticData()->customRgb[index] = color;
357}
358
359QRgb *QColorDialogOptions::standardColors()
360{
361 return qColorDialogStaticData()->standardRgb;
362}
363
364QRgb QColorDialogOptions::standardColor(int index)
365{
366 if (uint(index) >= uint(QColorDialogStaticData::StandardColorCount))
367 return qRgb(255, 255, 255);
368 return qColorDialogStaticData()->standardRgb[index];
369}
370
371void QColorDialogOptions::setStandardColor(int index, QRgb color)
372{
373 if (uint(index) >= uint(QColorDialogStaticData::StandardColorCount))
374 return;
375 qColorDialogStaticData()->standardRgb[index] = color;
376}
377
378/*!
379 \class QPlatformColorDialogHelper
380 \since 5.0
381 \internal
382 \ingroup qpa
383
384 \brief The QPlatformColorDialogHelper class allows for platform-specific customization of color dialogs.
385
386*/
387const QSharedPointer<QColorDialogOptions> &QPlatformColorDialogHelper::options() const
388{
389 return m_options;
390}
391
392void QPlatformColorDialogHelper::setOptions(const QSharedPointer<QColorDialogOptions> &options)
393{
394 m_options = options;
395}
396
397// File dialog
398
422
423QFileDialogOptions::QFileDialogOptions(QFileDialogOptionsPrivate *dd)
424 : d(dd)
425{
426}
427
428QFileDialogOptions::~QFileDialogOptions()
429{
430}
431
432namespace {
433 struct FileDialogCombined : QFileDialogOptionsPrivate, QFileDialogOptions
434 {
435 FileDialogCombined() : QFileDialogOptionsPrivate(), QFileDialogOptions(this) {}
436 FileDialogCombined(const FileDialogCombined &other) : QFileDialogOptionsPrivate(other), QFileDialogOptions(this) {}
437 };
438}
439
440// static
441QSharedPointer<QFileDialogOptions> QFileDialogOptions::create()
442{
443 return QSharedPointer<FileDialogCombined>::create();
444}
445
446QSharedPointer<QFileDialogOptions> QFileDialogOptions::clone() const
447{
448 return QSharedPointer<FileDialogCombined>::create(*static_cast<const FileDialogCombined*>(this));
449}
450
451QString QFileDialogOptions::windowTitle() const
452{
453 return d->windowTitle;
454}
455
456void QFileDialogOptions::setWindowTitle(const QString &title)
457{
458 d->windowTitle = title;
459}
460
461void QFileDialogOptions::setOption(QFileDialogOptions::FileDialogOption option, bool on)
462{
463 if (!(d->options & option) != !on)
464 setOptions(d->options ^ option);
465}
466
467bool QFileDialogOptions::testOption(QFileDialogOptions::FileDialogOption option) const
468{
469 return d->options & option;
470}
471
472void QFileDialogOptions::setOptions(FileDialogOptions options)
473{
474 if (options != d->options)
475 d->options = options;
476}
477
478QFileDialogOptions::FileDialogOptions QFileDialogOptions::options() const
479{
480 return d->options;
481}
482
483QDir::Filters QFileDialogOptions::filter() const
484{
485 return d->filters;
486}
487
488void QFileDialogOptions::setFilter(QDir::Filters filters)
489{
490 d->filters = filters;
491}
492
493void QFileDialogOptions::setViewMode(QFileDialogOptions::ViewMode mode)
494{
495 d->viewMode = mode;
496}
497
498QFileDialogOptions::ViewMode QFileDialogOptions::viewMode() const
499{
500 return d->viewMode;
501}
502
503void QFileDialogOptions::setFileMode(QFileDialogOptions::FileMode mode)
504{
505 d->fileMode = mode;
506}
507
508QFileDialogOptions::FileMode QFileDialogOptions::fileMode() const
509{
510 return d->fileMode;
511}
512
513void QFileDialogOptions::setAcceptMode(QFileDialogOptions::AcceptMode mode)
514{
515 d->acceptMode = mode;
516}
517
518QFileDialogOptions::AcceptMode QFileDialogOptions::acceptMode() const
519{
520 return d->acceptMode;
521}
522
523void QFileDialogOptions::setSidebarUrls(const QList<QUrl> &urls)
524{
525 d->sidebarUrls = urls;
526}
527
528QList<QUrl> QFileDialogOptions::sidebarUrls() const
529{
530 return d->sidebarUrls;
531}
532
533/*!
534 \since 5.7
535 \internal
536 The bool property useDefaultNameFilters indicates that no name filters have been
537 set or that they are equivalent to \gui{All Files (*)}. If it is true, the
538 platform can choose to hide the filter combo box.
539
540 \sa defaultNameFilterString().
541*/
542bool QFileDialogOptions::useDefaultNameFilters() const
543{
544 return d->useDefaultNameFilters;
545}
546
547void QFileDialogOptions::setUseDefaultNameFilters(bool dnf)
548{
549 d->useDefaultNameFilters = dnf;
550}
551
552void QFileDialogOptions::setNameFilters(const QStringList &filters)
553{
554 d->useDefaultNameFilters = filters.size() == 1
555 && filters.first() == QFileDialogOptions::defaultNameFilterString();
556 d->nameFilters = filters;
557}
558
559QStringList QFileDialogOptions::nameFilters() const
560{
561 return d->useDefaultNameFilters ?
562 QStringList(QFileDialogOptions::defaultNameFilterString()) : d->nameFilters;
563}
564
565/*!
566 \since 5.6
567 \internal
568 \return The translated default name filter string (\gui{All Files (*)}).
569 \sa defaultNameFilters(), nameFilters()
570*/
571
572QString QFileDialogOptions::defaultNameFilterString()
573{
574 return QCoreApplication::translate("QFileDialog", "All Files (*)");
575}
576
577void QFileDialogOptions::setMimeTypeFilters(const QStringList &filters)
578{
579 d->mimeTypeFilters = filters;
580}
581
582QStringList QFileDialogOptions::mimeTypeFilters() const
583{
584 return d->mimeTypeFilters;
585}
586
587void QFileDialogOptions::setDefaultSuffix(const QString &suffix)
588{
589 d->defaultSuffix = suffix;
590 if (d->defaultSuffix.size() > 1 && d->defaultSuffix.startsWith(u'.'))
591 d->defaultSuffix.remove(0, 1); // Silently change ".txt" -> "txt".
592}
593
594QString QFileDialogOptions::defaultSuffix() const
595{
596 return d->defaultSuffix;
597}
598
599void QFileDialogOptions::setHistory(const QStringList &paths)
600{
601 d->history = paths;
602}
603
604QStringList QFileDialogOptions::history() const
605{
606 return d->history;
607}
608
609void QFileDialogOptions::setLabelText(QFileDialogOptions::DialogLabel label, const QString &text)
610{
611 if (unsigned(label) < unsigned(DialogLabelCount))
612 d->labels[label] = text;
613}
614
615QString QFileDialogOptions::labelText(QFileDialogOptions::DialogLabel label) const
616{
617 return (unsigned(label) < unsigned(DialogLabelCount)) ? d->labels[label] : QString();
618}
619
620bool QFileDialogOptions::isLabelExplicitlySet(DialogLabel label)
621{
622 return unsigned(label) < unsigned(DialogLabelCount) && !d->labels[label].isEmpty();
623}
624
625QUrl QFileDialogOptions::initialDirectory() const
626{
627 return d->initialDirectory;
628}
629
630void QFileDialogOptions::setInitialDirectory(const QUrl &directory)
631{
632 d->initialDirectory = directory;
633}
634
635QString QFileDialogOptions::initiallySelectedMimeTypeFilter() const
636{
637 return d->initiallySelectedMimeTypeFilter;
638}
639
640void QFileDialogOptions::setInitiallySelectedMimeTypeFilter(const QString &filter)
641{
642 d->initiallySelectedMimeTypeFilter = filter;
643}
644
645QString QFileDialogOptions::initiallySelectedNameFilter() const
646{
647 return d->initiallySelectedNameFilter;
648}
649
650void QFileDialogOptions::setInitiallySelectedNameFilter(const QString &filter)
651{
652 d->initiallySelectedNameFilter = filter;
653}
654
655QList<QUrl> QFileDialogOptions::initiallySelectedFiles() const
656{
657 return d->initiallySelectedFiles;
658}
659
660void QFileDialogOptions::setInitiallySelectedFiles(const QList<QUrl> &files)
661{
662 d->initiallySelectedFiles = files;
663}
664
665// Schemes supported by the application
666void QFileDialogOptions::setSupportedSchemes(const QStringList &schemes)
667{
668 d->supportedSchemes = schemes;
669}
670
671QStringList QFileDialogOptions::supportedSchemes() const
672{
673 return d->supportedSchemes;
674}
675
676void QPlatformFileDialogHelper::selectMimeTypeFilter(const QString &filter)
677{
678 Q_UNUSED(filter);
679}
680
681QString QPlatformFileDialogHelper::selectedMimeTypeFilter() const
682{
683 return QString();
684}
685
686// Return true if the URL is supported by the filedialog implementation *and* by the application.
687bool QPlatformFileDialogHelper::isSupportedUrl(const QUrl &url) const
688{
689 return url.isLocalFile();
690}
691
692/*!
693 \class QPlatformFileDialogHelper
694 \since 5.0
695 \internal
696 \ingroup qpa
697
698 \brief The QPlatformFileDialogHelper class allows for platform-specific customization of file dialogs.
699
700*/
701const QSharedPointer<QFileDialogOptions> &QPlatformFileDialogHelper::options() const
702{
703 return m_options;
704}
705
706void QPlatformFileDialogHelper::setOptions(const QSharedPointer<QFileDialogOptions> &options)
707{
708 m_options = options;
709}
710
711const char QPlatformFileDialogHelper::filterRegExp[] =
712"^(.*)\\‍(([a-zA-Z0-9_.,*? +;#\\-\\‍[\\‍]@\\{\\}/!<>\\$%&=^~:\\|]*)\\‍)$";
713
714// Makes a list of filters from a normal filter string "Image Files (*.png *.jpg)"
715QStringList QPlatformFileDialogHelper::cleanFilterList(const QString &filter)
716{
717#if QT_CONFIG(regularexpression)
718 static const QRegularExpression regexp(QString::fromLatin1(filterRegExp));
719 Q_ASSERT(regexp.isValid());
720 QString f = filter;
721 QRegularExpressionMatch match = regexp.match(filter);
722 if (match.hasMatch())
723 f = match.captured(2);
724 return f.split(u' ', Qt::SkipEmptyParts);
725#else
726 Q_UNUSED(filter);
727 return QStringList();
728#endif
729}
730
731// Message dialog
732
757
758QMessageDialogOptions::QMessageDialogOptions(QMessageDialogOptionsPrivate *dd)
759 : d(dd)
760{
761}
762
763QMessageDialogOptions::~QMessageDialogOptions()
764{
765}
766
767namespace {
768 struct MessageDialogCombined : QMessageDialogOptionsPrivate, QMessageDialogOptions
769 {
770 MessageDialogCombined() : QMessageDialogOptionsPrivate(), QMessageDialogOptions(this) {}
771 MessageDialogCombined(const MessageDialogCombined &other)
772 : QMessageDialogOptionsPrivate(other), QMessageDialogOptions(this) {}
773 };
774}
775
776// static
777QSharedPointer<QMessageDialogOptions> QMessageDialogOptions::create()
778{
779 return QSharedPointer<MessageDialogCombined>::create();
780}
781
782QSharedPointer<QMessageDialogOptions> QMessageDialogOptions::clone() const
783{
784 return QSharedPointer<MessageDialogCombined>::create(*static_cast<const MessageDialogCombined*>(this));
785}
786
787QString QMessageDialogOptions::windowTitle() const
788{
789 return d->windowTitle;
790}
791
792void QMessageDialogOptions::setWindowTitle(const QString &title)
793{
794 d->windowTitle = title;
795}
796
797QMessageDialogOptions::StandardIcon QMessageDialogOptions::standardIcon() const
798{
799 return d->icon;
800}
801
802void QMessageDialogOptions::setStandardIcon(StandardIcon icon)
803{
804 d->icon = icon;
805}
806
807void QMessageDialogOptions::setIconPixmap(const QPixmap &pixmap)
808{
809 d->iconPixmap = pixmap;
810}
811
812QPixmap QMessageDialogOptions::iconPixmap() const
813{
814 return d->iconPixmap;
815}
816
817QString QMessageDialogOptions::text() const
818{
819 return d->text;
820}
821
822void QMessageDialogOptions::setText(const QString &text)
823{
824 d->text = text;
825}
826
827QString QMessageDialogOptions::informativeText() const
828{
829 return d->informativeText;
830}
831
832void QMessageDialogOptions::setInformativeText(const QString &informativeText)
833{
834 d->informativeText = informativeText;
835}
836
837QString QMessageDialogOptions::detailedText() const
838{
839 return d->detailedText;
840}
841
842void QMessageDialogOptions::setDetailedText(const QString &detailedText)
843{
844 d->detailedText = detailedText;
845}
846
847void QMessageDialogOptions::setStandardButtons(QPlatformDialogHelper::StandardButtons buttons)
848{
849 d->buttons = buttons;
850}
851
852QPlatformDialogHelper::StandardButtons QMessageDialogOptions::standardButtons() const
853{
854 return d->buttons;
855}
856
857int QMessageDialogOptions::addButton(const QString &label, QPlatformDialogHelper::ButtonRole role,
858 void *buttonImpl, int buttonId)
859{
860 const CustomButton b(buttonId ? buttonId : d->nextCustomButtonId++, label, role, buttonImpl);
861 d->customButtons.append(b);
862 return b.id;
863}
864
865static inline bool operator==(const QMessageDialogOptions::CustomButton &a,
866 const QMessageDialogOptions::CustomButton &b) {
867 return a.id == b.id;
868}
869
870void QMessageDialogOptions::removeButton(int id)
871{
872 d->customButtons.removeOne(CustomButton(id));
873}
874
875const QList<QMessageDialogOptions::CustomButton> &QMessageDialogOptions::customButtons()
876{
877 return d->customButtons;
878}
879
880void QMessageDialogOptions::clearCustomButtons()
881{
882 d->customButtons.clear();
883}
884
885const QMessageDialogOptions::CustomButton *QMessageDialogOptions::customButton(int id)
886{
887 const int i = int(d->customButtons.indexOf(CustomButton(id)));
888 return (i < 0 ? nullptr : &d->customButtons.at(i));
889}
890
891void QMessageDialogOptions::setCheckBox(const QString &label, Qt::CheckState state)
892{
893 d->checkBoxLabel = label;
894 d->checkBoxState = state;
895}
896
897QString QMessageDialogOptions::checkBoxLabel() const
898{
899 return d->checkBoxLabel;
900}
901
902Qt::CheckState QMessageDialogOptions::checkBoxState() const
903{
904 return d->checkBoxState;
905}
906
907void QMessageDialogOptions::setDefaultButton(int id)
908{
909 d->defaultButtonId = id;
910}
911
912int QMessageDialogOptions::defaultButton() const
913{
914 return d->defaultButtonId;
915}
916
917void QMessageDialogOptions::setEscapeButton(int id)
918{
919 d->escapeButtonId = id;
920}
921
922int QMessageDialogOptions::escapeButton() const
923{
924 return d->escapeButtonId;
925}
926
927void QMessageDialogOptions::setOption(QMessageDialogOptions::Option option, bool on)
928{
929 if (!(d->options & option) != !on)
930 setOptions(d->options ^ option);
931}
932
933bool QMessageDialogOptions::testOption(QMessageDialogOptions::Option option) const
934{
935 return d->options & option;
936}
937
938void QMessageDialogOptions::setOptions(QMessageDialogOptions::Options options)
939{
940 if (options != d->options)
941 d->options = options;
942}
943
944QMessageDialogOptions::Options QMessageDialogOptions::options() const
945{
946 return d->options;
947}
948
949
950QPlatformDialogHelper::ButtonRole QPlatformDialogHelper::buttonRole(QPlatformDialogHelper::StandardButton button)
951{
952 switch (button) {
953 case Ok:
954 case Save:
955 case Open:
956 case SaveAll:
957 case Retry:
958 case Ignore:
959 return AcceptRole;
960
961 case Cancel:
962 case Close:
963 case Abort:
964 return RejectRole;
965
966 case Discard:
967 return DestructiveRole;
968
969 case Help:
970 return HelpRole;
971
972 case Apply:
973 return ApplyRole;
974
975 case Yes:
976 case YesToAll:
977 return YesRole;
978
979 case No:
980 case NoToAll:
981 return NoRole;
982
983 case RestoreDefaults:
984 case Reset:
985 return ResetRole;
986
987 default:
988 break;
989 }
990 return InvalidRole;
991}
992
993const int *QPlatformDialogHelper::buttonLayout(Qt::Orientation orientation, ButtonLayout policy)
994{
995 if (policy == UnknownLayout) {
996#if defined (Q_OS_MACOS)
997 policy = MacLayout;
998#elif defined (Q_OS_LINUX) || defined (Q_OS_UNIX)
999 policy = KdeLayout;
1000#elif defined (Q_OS_ANDROID)
1001 policy = AndroidLayout;
1002#else
1003 policy = WinLayout;
1004#endif
1005 }
1006 return buttonRoleLayouts[orientation == Qt::Vertical][policy];
1007}
1008
1009/*!
1010 \class QPlatformMessageDialogHelper
1011 \since 5.0
1012 \internal
1013 \ingroup qpa
1014
1015 \brief The QPlatformMessageDialogHelper class allows for platform-specific customization of Message dialogs.
1016
1017*/
1018const QSharedPointer<QMessageDialogOptions> &QPlatformMessageDialogHelper::options() const
1019{
1020 return m_options;
1021}
1022
1023void QPlatformMessageDialogHelper::setOptions(const QSharedPointer<QMessageDialogOptions> &options)
1024{
1025 m_options = options;
1026}
1027
1028QT_END_NAMESPACE
1029
1030#include "moc_qplatformdialoghelper.cpp"
QColorDialogOptionsPrivate()=default
QColorDialogOptionsPrivate(const QColorDialogOptionsPrivate &)=default
QColorDialogOptionsPrivate(QColorDialogOptionsPrivate &&)=default
QColorDialogOptionsPrivate & operator=(QColorDialogOptionsPrivate &&)=delete
QColorDialogOptions::ColorDialogOptions options
QColorDialogOptionsPrivate & operator=(const QColorDialogOptionsPrivate &)=delete
QRgb customRgb[CustomColorCount]
QRgb standardRgb[StandardColorCount]
QString labels[QFileDialogOptions::DialogLabelCount]
QFontDialogOptionsPrivate()=default
QList< QMessageDialogOptions::CustomButton > customButtons
static bool operator==(const QMessageDialogOptions::CustomButton &a, const QMessageDialogOptions::CustomButton &b)