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