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*/
224
225QPlatformFontDialogHelper::QPlatformFontDialogHelper()
226 = default;
227
228QPlatformFontDialogHelper::~QPlatformFontDialogHelper()
229 = default;
230
231const QSharedPointer<QFontDialogOptions> &QPlatformFontDialogHelper::options() const
232{
233 return m_options;
234}
235
236void QPlatformFontDialogHelper::setOptions(const QSharedPointer<QFontDialogOptions> &options)
237{
238 m_options = options;
239}
240
241// Color dialog
242
254
256{
257 int i = 0;
258 for (int g = 0; g < 4; ++g)
259 for (int r = 0; r < 4; ++r)
260 for (int b = 0; b < 3; ++b)
261 standardRgb[i++] = qRgb(r * 255 / 3, g * 255 / 3, b * 255 / 2);
262 std::fill(customRgb, customRgb + CustomColorCount, 0xffffffff);
263}
264
265Q_GLOBAL_STATIC(QColorDialogStaticData, qColorDialogStaticData)
266
279
280QColorDialogOptions::QColorDialogOptions(QColorDialogOptionsPrivate *dd)
281 : d(dd)
282{
283}
284
285QColorDialogOptions::~QColorDialogOptions()
286{
287}
288
289namespace {
290 struct ColorDialogCombined : QColorDialogOptionsPrivate, QColorDialogOptions
291 {
292 ColorDialogCombined() : QColorDialogOptionsPrivate(), QColorDialogOptions(this) {}
293 ColorDialogCombined(const ColorDialogCombined &other)
294 : QColorDialogOptionsPrivate(other), QColorDialogOptions(this) {}
295 };
296}
297
298// static
299QSharedPointer<QColorDialogOptions> QColorDialogOptions::create()
300{
301 return QSharedPointer<ColorDialogCombined>::create();
302}
303
304QSharedPointer<QColorDialogOptions> QColorDialogOptions::clone() const
305{
306 return QSharedPointer<ColorDialogCombined>::create(*static_cast<const ColorDialogCombined*>(this));
307}
308
309QString QColorDialogOptions::windowTitle() const
310{
311 return d->windowTitle;
312}
313
314void QColorDialogOptions::setWindowTitle(const QString &title)
315{
316 d->windowTitle = title;
317}
318
319void QColorDialogOptions::setOption(QColorDialogOptions::ColorDialogOption option, bool on)
320{
321 if (!(d->options & option) != !on)
322 setOptions(d->options ^ option);
323}
324
325bool QColorDialogOptions::testOption(QColorDialogOptions::ColorDialogOption option) const
326{
327 return d->options & option;
328}
329
330void QColorDialogOptions::setOptions(ColorDialogOptions options)
331{
332 if (options != d->options)
333 d->options = options;
334}
335
336QColorDialogOptions::ColorDialogOptions QColorDialogOptions::options() const
337{
338 return d->options;
339}
340
341int QColorDialogOptions::customColorCount()
342{
343 return QColorDialogStaticData::CustomColorCount;
344}
345
346QRgb QColorDialogOptions::customColor(int index)
347{
348 if (uint(index) >= uint(QColorDialogStaticData::CustomColorCount))
349 return qRgb(255, 255, 255);
350 return qColorDialogStaticData()->customRgb[index];
351}
352
353QRgb *QColorDialogOptions::customColors()
354{
355 return qColorDialogStaticData()->customRgb;
356}
357
358void QColorDialogOptions::setCustomColor(int index, QRgb color)
359{
360 if (uint(index) >= uint(QColorDialogStaticData::CustomColorCount))
361 return;
362 qColorDialogStaticData()->customSet = true;
363 qColorDialogStaticData()->customRgb[index] = color;
364}
365
366QRgb *QColorDialogOptions::standardColors()
367{
368 return qColorDialogStaticData()->standardRgb;
369}
370
371QRgb QColorDialogOptions::standardColor(int index)
372{
373 if (uint(index) >= uint(QColorDialogStaticData::StandardColorCount))
374 return qRgb(255, 255, 255);
375 return qColorDialogStaticData()->standardRgb[index];
376}
377
378void QColorDialogOptions::setStandardColor(int index, QRgb color)
379{
380 if (uint(index) >= uint(QColorDialogStaticData::StandardColorCount))
381 return;
382 qColorDialogStaticData()->standardRgb[index] = color;
383}
384
385/*!
386 \class QPlatformColorDialogHelper
387 \since 5.0
388 \internal
389 \ingroup qpa
390
391 \brief The QPlatformColorDialogHelper class allows for platform-specific customization of color dialogs.
392
393*/
394QPlatformColorDialogHelper::QPlatformColorDialogHelper()
395 = default;
396
397QPlatformColorDialogHelper::~QPlatformColorDialogHelper()
398 = default;
399
400const QSharedPointer<QColorDialogOptions> &QPlatformColorDialogHelper::options() const
401{
402 return m_options;
403}
404
405void QPlatformColorDialogHelper::setOptions(const QSharedPointer<QColorDialogOptions> &options)
406{
407 m_options = options;
408}
409
410// File dialog
411
435
436QFileDialogOptions::QFileDialogOptions(QFileDialogOptionsPrivate *dd)
437 : d(dd)
438{
439}
440
441QFileDialogOptions::~QFileDialogOptions()
442{
443}
444
445namespace {
446 struct FileDialogCombined : QFileDialogOptionsPrivate, QFileDialogOptions
447 {
448 FileDialogCombined() : QFileDialogOptionsPrivate(), QFileDialogOptions(this) {}
449 FileDialogCombined(const FileDialogCombined &other) : QFileDialogOptionsPrivate(other), QFileDialogOptions(this) {}
450 };
451}
452
453// static
454QSharedPointer<QFileDialogOptions> QFileDialogOptions::create()
455{
456 return QSharedPointer<FileDialogCombined>::create();
457}
458
459QSharedPointer<QFileDialogOptions> QFileDialogOptions::clone() const
460{
461 return QSharedPointer<FileDialogCombined>::create(*static_cast<const FileDialogCombined*>(this));
462}
463
464QString QFileDialogOptions::windowTitle() const
465{
466 return d->windowTitle;
467}
468
469void QFileDialogOptions::setWindowTitle(const QString &title)
470{
471 d->windowTitle = title;
472}
473
474void QFileDialogOptions::setOption(QFileDialogOptions::FileDialogOption option, bool on)
475{
476 if (!(d->options & option) != !on)
477 setOptions(d->options ^ option);
478}
479
480bool QFileDialogOptions::testOption(QFileDialogOptions::FileDialogOption option) const
481{
482 return d->options & option;
483}
484
485void QFileDialogOptions::setOptions(FileDialogOptions options)
486{
487 if (options != d->options)
488 d->options = options;
489}
490
491QFileDialogOptions::FileDialogOptions QFileDialogOptions::options() const
492{
493 return d->options;
494}
495
496QDir::Filters QFileDialogOptions::filter() const
497{
498 return d->filters;
499}
500
501void QFileDialogOptions::setFilter(QDir::Filters filters)
502{
503 d->filters = filters;
504}
505
506void QFileDialogOptions::setViewMode(QFileDialogOptions::ViewMode mode)
507{
508 d->viewMode = mode;
509}
510
511QFileDialogOptions::ViewMode QFileDialogOptions::viewMode() const
512{
513 return d->viewMode;
514}
515
516void QFileDialogOptions::setFileMode(QFileDialogOptions::FileMode mode)
517{
518 d->fileMode = mode;
519}
520
521QFileDialogOptions::FileMode QFileDialogOptions::fileMode() const
522{
523 return d->fileMode;
524}
525
526void QFileDialogOptions::setAcceptMode(QFileDialogOptions::AcceptMode mode)
527{
528 d->acceptMode = mode;
529}
530
531QFileDialogOptions::AcceptMode QFileDialogOptions::acceptMode() const
532{
533 return d->acceptMode;
534}
535
536void QFileDialogOptions::setSidebarUrls(const QList<QUrl> &urls)
537{
538 d->sidebarUrls = urls;
539}
540
541QList<QUrl> QFileDialogOptions::sidebarUrls() const
542{
543 return d->sidebarUrls;
544}
545
546/*!
547 \since 5.7
548 \internal
549 The bool property useDefaultNameFilters indicates that no name filters have been
550 set or that they are equivalent to \gui{All Files (*)}. If it is true, the
551 platform can choose to hide the filter combo box.
552
553 \sa defaultNameFilterString().
554*/
555bool QFileDialogOptions::useDefaultNameFilters() const
556{
557 return d->useDefaultNameFilters;
558}
559
560void QFileDialogOptions::setUseDefaultNameFilters(bool dnf)
561{
562 d->useDefaultNameFilters = dnf;
563}
564
565void QFileDialogOptions::setNameFilters(const QStringList &filters)
566{
567 d->useDefaultNameFilters = filters.size() == 1
568 && filters.first() == QFileDialogOptions::defaultNameFilterString();
569 d->nameFilters = filters;
570}
571
572QStringList QFileDialogOptions::nameFilters() const
573{
574 return d->useDefaultNameFilters ?
575 QStringList(QFileDialogOptions::defaultNameFilterString()) : d->nameFilters;
576}
577
578/*!
579 \since 5.6
580 \internal
581 \return The translated default name filter string (\gui{All Files (*)}).
582 \sa defaultNameFilters(), nameFilters()
583*/
584
585QString QFileDialogOptions::defaultNameFilterString()
586{
587 return QCoreApplication::translate("QFileDialog", "All Files (*)");
588}
589
590void QFileDialogOptions::setMimeTypeFilters(const QStringList &filters)
591{
592 d->mimeTypeFilters = filters;
593}
594
595QStringList QFileDialogOptions::mimeTypeFilters() const
596{
597 return d->mimeTypeFilters;
598}
599
600void QFileDialogOptions::setDefaultSuffix(const QString &suffix)
601{
602 d->defaultSuffix = suffix;
603 if (d->defaultSuffix.size() > 1 && d->defaultSuffix.startsWith(u'.'))
604 d->defaultSuffix.remove(0, 1); // Silently change ".txt" -> "txt".
605}
606
607QString QFileDialogOptions::defaultSuffix() const
608{
609 return d->defaultSuffix;
610}
611
612void QFileDialogOptions::setHistory(const QStringList &paths)
613{
614 d->history = paths;
615}
616
617QStringList QFileDialogOptions::history() const
618{
619 return d->history;
620}
621
622void QFileDialogOptions::setLabelText(QFileDialogOptions::DialogLabel label, const QString &text)
623{
624 if (unsigned(label) < unsigned(DialogLabelCount))
625 d->labels[label] = text;
626}
627
628QString QFileDialogOptions::labelText(QFileDialogOptions::DialogLabel label) const
629{
630 return (unsigned(label) < unsigned(DialogLabelCount)) ? d->labels[label] : QString();
631}
632
633bool QFileDialogOptions::isLabelExplicitlySet(DialogLabel label)
634{
635 return unsigned(label) < unsigned(DialogLabelCount) && !d->labels[label].isEmpty();
636}
637
638QUrl QFileDialogOptions::initialDirectory() const
639{
640 return d->initialDirectory;
641}
642
643void QFileDialogOptions::setInitialDirectory(const QUrl &directory)
644{
645 d->initialDirectory = directory;
646}
647
648QString QFileDialogOptions::initiallySelectedMimeTypeFilter() const
649{
650 return d->initiallySelectedMimeTypeFilter;
651}
652
653void QFileDialogOptions::setInitiallySelectedMimeTypeFilter(const QString &filter)
654{
655 d->initiallySelectedMimeTypeFilter = filter;
656}
657
658QString QFileDialogOptions::initiallySelectedNameFilter() const
659{
660 return d->initiallySelectedNameFilter;
661}
662
663void QFileDialogOptions::setInitiallySelectedNameFilter(const QString &filter)
664{
665 d->initiallySelectedNameFilter = filter;
666}
667
668QList<QUrl> QFileDialogOptions::initiallySelectedFiles() const
669{
670 return d->initiallySelectedFiles;
671}
672
673void QFileDialogOptions::setInitiallySelectedFiles(const QList<QUrl> &files)
674{
675 d->initiallySelectedFiles = files;
676}
677
678// Schemes supported by the application
679void QFileDialogOptions::setSupportedSchemes(const QStringList &schemes)
680{
681 d->supportedSchemes = schemes;
682}
683
684QStringList QFileDialogOptions::supportedSchemes() const
685{
686 return d->supportedSchemes;
687}
688
689QPlatformFileDialogHelper::QPlatformFileDialogHelper()
690 = default;
691
692QPlatformFileDialogHelper::~QPlatformFileDialogHelper()
693 = default;
694
695void QPlatformFileDialogHelper::selectMimeTypeFilter(const QString &filter)
696{
697 Q_UNUSED(filter);
698}
699
700QString QPlatformFileDialogHelper::selectedMimeTypeFilter() const
701{
702 return QString();
703}
704
705// Return true if the URL is supported by the filedialog implementation *and* by the application.
706bool QPlatformFileDialogHelper::isSupportedUrl(const QUrl &url) const
707{
708 return url.isLocalFile();
709}
710
711/*!
712 \class QPlatformFileDialogHelper
713 \since 5.0
714 \internal
715 \ingroup qpa
716
717 \brief The QPlatformFileDialogHelper class allows for platform-specific customization of file dialogs.
718
719*/
720const QSharedPointer<QFileDialogOptions> &QPlatformFileDialogHelper::options() const
721{
722 return m_options;
723}
724
725void QPlatformFileDialogHelper::setOptions(const QSharedPointer<QFileDialogOptions> &options)
726{
727 m_options = options;
728}
729
730const char QPlatformFileDialogHelper::filterRegExp[] =
731"^(.*)\\‍(([a-zA-Z0-9_.,*? +;#\\-\\‍[\\‍]@\\{\\}/!<>\\$%&=^~:\\|]*)\\‍)$";
732
733// Makes a list of filters from a normal filter string "Image Files (*.png *.jpg)"
734QStringList QPlatformFileDialogHelper::cleanFilterList(const QString &filter)
735{
736#if QT_CONFIG(regularexpression)
737 static const QRegularExpression regexp(QString::fromLatin1(filterRegExp));
738 Q_ASSERT(regexp.isValid());
739 QString f = filter;
740 QRegularExpressionMatch match = regexp.match(filter);
741 if (match.hasMatch())
742 f = match.captured(2);
743 return f.split(u' ', Qt::SkipEmptyParts);
744#else
745 Q_UNUSED(filter);
746 return QStringList();
747#endif
748}
749
750// Message dialog
751
776
777QMessageDialogOptions::QMessageDialogOptions(QMessageDialogOptionsPrivate *dd)
778 : d(dd)
779{
780}
781
782QMessageDialogOptions::~QMessageDialogOptions()
783{
784}
785
786namespace {
787 struct MessageDialogCombined : QMessageDialogOptionsPrivate, QMessageDialogOptions
788 {
789 MessageDialogCombined() : QMessageDialogOptionsPrivate(), QMessageDialogOptions(this) {}
790 MessageDialogCombined(const MessageDialogCombined &other)
791 : QMessageDialogOptionsPrivate(other), QMessageDialogOptions(this) {}
792 };
793}
794
795// static
796QSharedPointer<QMessageDialogOptions> QMessageDialogOptions::create()
797{
798 return QSharedPointer<MessageDialogCombined>::create();
799}
800
801QSharedPointer<QMessageDialogOptions> QMessageDialogOptions::clone() const
802{
803 return QSharedPointer<MessageDialogCombined>::create(*static_cast<const MessageDialogCombined*>(this));
804}
805
806QString QMessageDialogOptions::windowTitle() const
807{
808 return d->windowTitle;
809}
810
811void QMessageDialogOptions::setWindowTitle(const QString &title)
812{
813 d->windowTitle = title;
814}
815
816QMessageDialogOptions::StandardIcon QMessageDialogOptions::standardIcon() const
817{
818 return d->icon;
819}
820
821void QMessageDialogOptions::setStandardIcon(StandardIcon icon)
822{
823 d->icon = icon;
824}
825
826void QMessageDialogOptions::setIconPixmap(const QPixmap &pixmap)
827{
828 d->iconPixmap = pixmap;
829}
830
831QPixmap QMessageDialogOptions::iconPixmap() const
832{
833 return d->iconPixmap;
834}
835
836QString QMessageDialogOptions::text() const
837{
838 return d->text;
839}
840
841void QMessageDialogOptions::setText(const QString &text)
842{
843 d->text = text;
844}
845
846QString QMessageDialogOptions::informativeText() const
847{
848 return d->informativeText;
849}
850
851void QMessageDialogOptions::setInformativeText(const QString &informativeText)
852{
853 d->informativeText = informativeText;
854}
855
856QString QMessageDialogOptions::detailedText() const
857{
858 return d->detailedText;
859}
860
861void QMessageDialogOptions::setDetailedText(const QString &detailedText)
862{
863 d->detailedText = detailedText;
864}
865
866void QMessageDialogOptions::setStandardButtons(QPlatformDialogHelper::StandardButtons buttons)
867{
868 d->buttons = buttons;
869}
870
871QPlatformDialogHelper::StandardButtons QMessageDialogOptions::standardButtons() const
872{
873 return d->buttons;
874}
875
876int QMessageDialogOptions::addButton(const QString &label, QPlatformDialogHelper::ButtonRole role,
877 void *buttonImpl, int buttonId)
878{
879 const CustomButton b(buttonId ? buttonId : d->nextCustomButtonId++, label, role, buttonImpl);
880 d->customButtons.append(b);
881 return b.id;
882}
883
884static inline bool operator==(const QMessageDialogOptions::CustomButton &a,
885 const QMessageDialogOptions::CustomButton &b) {
886 return a.id == b.id;
887}
888
889void QMessageDialogOptions::removeButton(int id)
890{
891 d->customButtons.removeOne(CustomButton(id));
892}
893
894const QList<QMessageDialogOptions::CustomButton> &QMessageDialogOptions::customButtons()
895{
896 return d->customButtons;
897}
898
899void QMessageDialogOptions::clearCustomButtons()
900{
901 d->customButtons.clear();
902}
903
904const QMessageDialogOptions::CustomButton *QMessageDialogOptions::customButton(int id)
905{
906 const int i = int(d->customButtons.indexOf(CustomButton(id)));
907 return (i < 0 ? nullptr : &d->customButtons.at(i));
908}
909
910void QMessageDialogOptions::setCheckBox(const QString &label, Qt::CheckState state)
911{
912 d->checkBoxLabel = label;
913 d->checkBoxState = state;
914}
915
916QString QMessageDialogOptions::checkBoxLabel() const
917{
918 return d->checkBoxLabel;
919}
920
921Qt::CheckState QMessageDialogOptions::checkBoxState() const
922{
923 return d->checkBoxState;
924}
925
926void QMessageDialogOptions::setDefaultButton(int id)
927{
928 d->defaultButtonId = id;
929}
930
931int QMessageDialogOptions::defaultButton() const
932{
933 return d->defaultButtonId;
934}
935
936void QMessageDialogOptions::setEscapeButton(int id)
937{
938 d->escapeButtonId = id;
939}
940
941int QMessageDialogOptions::escapeButton() const
942{
943 return d->escapeButtonId;
944}
945
946void QMessageDialogOptions::setOption(QMessageDialogOptions::Option option, bool on)
947{
948 if (!(d->options & option) != !on)
949 setOptions(d->options ^ option);
950}
951
952bool QMessageDialogOptions::testOption(QMessageDialogOptions::Option option) const
953{
954 return d->options & option;
955}
956
957void QMessageDialogOptions::setOptions(QMessageDialogOptions::Options options)
958{
959 if (options != d->options)
960 d->options = options;
961}
962
963QMessageDialogOptions::Options QMessageDialogOptions::options() const
964{
965 return d->options;
966}
967
968
969QPlatformDialogHelper::ButtonRole QPlatformDialogHelper::buttonRole(QPlatformDialogHelper::StandardButton button)
970{
971 switch (button) {
972 case Ok:
973 case Save:
974 case Open:
975 case SaveAll:
976 case Retry:
977 case Ignore:
978 return AcceptRole;
979
980 case Cancel:
981 case Close:
982 case Abort:
983 return RejectRole;
984
985 case Discard:
986 return DestructiveRole;
987
988 case Help:
989 return HelpRole;
990
991 case Apply:
992 return ApplyRole;
993
994 case Yes:
995 case YesToAll:
996 return YesRole;
997
998 case No:
999 case NoToAll:
1000 return NoRole;
1001
1002 case RestoreDefaults:
1003 case Reset:
1004 return ResetRole;
1005
1006 default:
1007 break;
1008 }
1009 return InvalidRole;
1010}
1011
1012const int *QPlatformDialogHelper::buttonLayout(Qt::Orientation orientation, ButtonLayout policy)
1013{
1014 if (policy == UnknownLayout) {
1015#if defined (Q_OS_MACOS)
1016 policy = MacLayout;
1017#elif defined (Q_OS_LINUX) || defined (Q_OS_UNIX)
1018 policy = KdeLayout;
1019#elif defined (Q_OS_ANDROID)
1020 policy = AndroidLayout;
1021#else
1022 policy = WinLayout;
1023#endif
1024 }
1025 return buttonRoleLayouts[orientation == Qt::Vertical][policy];
1026}
1027
1028/*!
1029 \class QPlatformMessageDialogHelper
1030 \since 5.0
1031 \internal
1032 \ingroup qpa
1033
1034 \brief The QPlatformMessageDialogHelper class allows for platform-specific customization of Message dialogs.
1035
1036*/
1037
1038QPlatformMessageDialogHelper::QPlatformMessageDialogHelper()
1039 = default;
1040
1041QPlatformMessageDialogHelper::~QPlatformMessageDialogHelper()
1042 = default;
1043
1044const QSharedPointer<QMessageDialogOptions> &QPlatformMessageDialogHelper::options() const
1045{
1046 return m_options;
1047}
1048
1049void QPlatformMessageDialogHelper::setOptions(const QSharedPointer<QMessageDialogOptions> &options)
1050{
1051 m_options = options;
1052}
1053
1054QT_END_NAMESPACE
1055
1056#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)