Revision control

++ // Copyright (C) 2018 The Qt Company Ltd.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
++ // Qt-Security score:significant reason:default
++
++ #include "qplatformdialoghelper.h"
++
++ #include <QtCore/QCoreApplication>
++ #include <QtCore/QList>
++ #if QT_CONFIG(regularexpression)
++ #include <QtCore/QRegularExpression>
++ #endif
++ #include <QtCore/QUrl>
++ #include <QtCore/QVariant>
++ #include <QtGui/QColor>
++ #include <QtGui/QPixmap>
++
++ #include <algorithm>
++
++ QT_BEGIN_NAMESPACE
++
++ using namespace Qt::StringLiterals;
++
++ QT_IMPL_METATYPE_EXTERN_TAGGED(QPlatformDialogHelper::StandardButton,
++ QPlatformDialogHelper__StandardButton)
++ QT_IMPL_METATYPE_EXTERN_TAGGED(QPlatformDialogHelper::ButtonRole,
++ QPlatformDialogHelper__ButtonRole)
++
++ /*!
++ \class QPlatformDialogHelper
++ \since 5.0
++ \internal
++ \ingroup qpa
++
++ \brief The QPlatformDialogHelper class allows for platform-specific customization of dialogs.
++
++ */
++
++ /*!
++ \enum QPlatformDialogHelper::StyleHint
++
++ This enum type specifies platform-specific style hints.
++
++ \value DialogIsQtWindow Indicates that a platform-specific dialog is implemented
++ as in-process Qt window. It allows to prevent blocking the
++ dialog by an invisible proxy Qt dialog.
++
++ \sa styleHint()
++ */
++
++ static const int buttonRoleLayouts[2][6][14] =
++ {
++ // Qt::Horizontal
++ {
++ // WinLayout
++ { QPlatformDialogHelper::ResetRole, QPlatformDialogHelper::Stretch, QPlatformDialogHelper::YesRole, QPlatformDialogHelper::AcceptRole,
++ QPlatformDialogHelper::AlternateRole, QPlatformDialogHelper::DestructiveRole, QPlatformDialogHelper::NoRole,
++ QPlatformDialogHelper::ActionRole, QPlatformDialogHelper::RejectRole, QPlatformDialogHelper::ApplyRole,
++ QPlatformDialogHelper::HelpRole, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL },
++
++ // MacLayout
++ { QPlatformDialogHelper::HelpRole, QPlatformDialogHelper::ResetRole, QPlatformDialogHelper::ApplyRole, QPlatformDialogHelper::ActionRole,
++ QPlatformDialogHelper::Stretch, QPlatformDialogHelper::DestructiveRole | QPlatformDialogHelper::Reverse,
++ QPlatformDialogHelper::AlternateRole | QPlatformDialogHelper::Reverse, QPlatformDialogHelper::RejectRole | QPlatformDialogHelper::Reverse,
++ QPlatformDialogHelper::AcceptRole | QPlatformDialogHelper::Reverse, QPlatformDialogHelper::NoRole | QPlatformDialogHelper::Reverse,
++ QPlatformDialogHelper::YesRole | QPlatformDialogHelper::Reverse, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL },
++
++ // KdeLayout
++ { QPlatformDialogHelper::HelpRole, QPlatformDialogHelper::ResetRole, QPlatformDialogHelper::Stretch, QPlatformDialogHelper::YesRole,
++ QPlatformDialogHelper::NoRole, QPlatformDialogHelper::ActionRole, QPlatformDialogHelper::AcceptRole, QPlatformDialogHelper::AlternateRole,
++ QPlatformDialogHelper::ApplyRole, QPlatformDialogHelper::DestructiveRole, QPlatformDialogHelper::RejectRole, QPlatformDialogHelper::EOL },
++
++ // GnomeLayout
++ { QPlatformDialogHelper::HelpRole, QPlatformDialogHelper::ResetRole, QPlatformDialogHelper::Stretch, QPlatformDialogHelper::ActionRole,
++ QPlatformDialogHelper::ApplyRole | QPlatformDialogHelper::Reverse, QPlatformDialogHelper::DestructiveRole | QPlatformDialogHelper::Reverse,
++ QPlatformDialogHelper::AlternateRole | QPlatformDialogHelper::Reverse, QPlatformDialogHelper::RejectRole | QPlatformDialogHelper::Reverse,
++ QPlatformDialogHelper::AcceptRole | QPlatformDialogHelper::Reverse, QPlatformDialogHelper::NoRole | QPlatformDialogHelper::Reverse,
++ QPlatformDialogHelper::YesRole | QPlatformDialogHelper::Reverse, QPlatformDialogHelper::EOL },
++
++ // AndroidLayout (neutral, stretch, dismissive, affirmative)
++ { QPlatformDialogHelper::HelpRole, QPlatformDialogHelper::ResetRole, QPlatformDialogHelper::ApplyRole, QPlatformDialogHelper::ActionRole,
++ QPlatformDialogHelper::Stretch, QPlatformDialogHelper::RejectRole | QPlatformDialogHelper::Reverse,
++ QPlatformDialogHelper::NoRole | QPlatformDialogHelper::Reverse, QPlatformDialogHelper::DestructiveRole | QPlatformDialogHelper::Reverse,
++ QPlatformDialogHelper::AlternateRole | QPlatformDialogHelper::Reverse, QPlatformDialogHelper::AcceptRole | QPlatformDialogHelper::Reverse,
++ QPlatformDialogHelper::YesRole | QPlatformDialogHelper::Reverse, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL }
++ },
++
++ // Qt::Vertical
++ {
++ // WinLayout
++ { QPlatformDialogHelper::ActionRole, QPlatformDialogHelper::YesRole, QPlatformDialogHelper::AcceptRole, QPlatformDialogHelper::AlternateRole,
++ QPlatformDialogHelper::DestructiveRole, QPlatformDialogHelper::NoRole, QPlatformDialogHelper::RejectRole, QPlatformDialogHelper::ApplyRole, QPlatformDialogHelper::ResetRole,
++ QPlatformDialogHelper::HelpRole, QPlatformDialogHelper::Stretch, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL },
++
++ // MacLayout
++ { QPlatformDialogHelper::YesRole, QPlatformDialogHelper::NoRole, QPlatformDialogHelper::AcceptRole, QPlatformDialogHelper::RejectRole,
++ QPlatformDialogHelper::AlternateRole, QPlatformDialogHelper::DestructiveRole, QPlatformDialogHelper::Stretch, QPlatformDialogHelper::ActionRole, QPlatformDialogHelper::ApplyRole,
++ QPlatformDialogHelper::ResetRole, QPlatformDialogHelper::HelpRole, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL },
++
++ // KdeLayout
++ { QPlatformDialogHelper::AcceptRole, QPlatformDialogHelper::AlternateRole, QPlatformDialogHelper::ApplyRole, QPlatformDialogHelper::ActionRole,
++ QPlatformDialogHelper::YesRole, QPlatformDialogHelper::NoRole, QPlatformDialogHelper::Stretch, QPlatformDialogHelper::ResetRole,
++ QPlatformDialogHelper::DestructiveRole, QPlatformDialogHelper::RejectRole, QPlatformDialogHelper::HelpRole, QPlatformDialogHelper::EOL },
++
++ // GnomeLayout
++ { QPlatformDialogHelper::YesRole, QPlatformDialogHelper::NoRole, QPlatformDialogHelper::AcceptRole, QPlatformDialogHelper::RejectRole,
++ QPlatformDialogHelper::AlternateRole, QPlatformDialogHelper::DestructiveRole, QPlatformDialogHelper::ApplyRole, QPlatformDialogHelper::ActionRole, QPlatformDialogHelper::Stretch,
++ QPlatformDialogHelper::ResetRole, QPlatformDialogHelper::HelpRole, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL },
++
++ // AndroidLayout
++ // (affirmative
++ // dismissive
++ // neutral)
++ { QPlatformDialogHelper::YesRole, QPlatformDialogHelper::AcceptRole, QPlatformDialogHelper::AlternateRole, QPlatformDialogHelper::DestructiveRole,
++ QPlatformDialogHelper::NoRole, QPlatformDialogHelper::RejectRole, QPlatformDialogHelper::Stretch, QPlatformDialogHelper::ActionRole, QPlatformDialogHelper::ApplyRole,
++ QPlatformDialogHelper::ResetRole, QPlatformDialogHelper::HelpRole, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL }
++ }
++ };
++
++
++ QPlatformDialogHelper::QPlatformDialogHelper()
++ {
++ qRegisterMetaType<StandardButton>();
++ qRegisterMetaType<ButtonRole>();
++ }
++
++ QPlatformDialogHelper::~QPlatformDialogHelper()
++ {
++ }
++
++ QVariant QPlatformDialogHelper::styleHint(StyleHint hint) const
++ {
++ return QPlatformDialogHelper::defaultStyleHint(hint);
++ }
++
++ QVariant QPlatformDialogHelper::defaultStyleHint(QPlatformDialogHelper::StyleHint hint)
++ {
++ Q_UNUSED(hint);
++ return QVariant();
++ }
++
++ // Font dialog
++
++ class QFontDialogOptionsPrivate
++ {
++ public:
++ QFontDialogOptionsPrivate() = default;
++
++ QFontDialogOptions::FontDialogOptions options;
++ QString windowTitle;
++ };
++
++ QFontDialogOptions::QFontDialogOptions(QFontDialogOptionsPrivate *dd)
++ : d(dd)
++ {
++ }
++
++ QFontDialogOptions::~QFontDialogOptions()
++ {
++ }
++
++ namespace {
++ struct FontDialogCombined : QFontDialogOptionsPrivate, QFontDialogOptions
++ {
++ FontDialogCombined() : QFontDialogOptionsPrivate(), QFontDialogOptions(this) {}
++ FontDialogCombined(const FontDialogCombined &other)
++ : QFontDialogOptionsPrivate(other), QFontDialogOptions(this) {}
++ };
++ }
++
++ // static
++ QSharedPointer<QFontDialogOptions> QFontDialogOptions::create()
++ {
++ return QSharedPointer<FontDialogCombined>::create();
++ }
++
++ QSharedPointer<QFontDialogOptions> QFontDialogOptions::clone() const
++ {
++ return QSharedPointer<FontDialogCombined>::create(*static_cast<const FontDialogCombined*>(this));
++ }
++
++ QString QFontDialogOptions::windowTitle() const
++ {
++ return d->windowTitle;
++ }
++
++ void QFontDialogOptions::setWindowTitle(const QString &title)
++ {
++ d->windowTitle = title;
++ }
++
++ void QFontDialogOptions::setOption(QFontDialogOptions::FontDialogOption option, bool on)
++ {
++ if (!(d->options & option) != !on)
++ setOptions(d->options ^ option);
++ }
++
++ bool QFontDialogOptions::testOption(QFontDialogOptions::FontDialogOption option) const
++ {
++ return d->options & option;
++ }
++
++ void QFontDialogOptions::setOptions(FontDialogOptions options)
++ {
++ if (options != d->options)
++ d->options = options;
++ }
++
++ QFontDialogOptions::FontDialogOptions QFontDialogOptions::options() const
++ {
++ return d->options;
++ }
++
++ /*!
++ \class QPlatformFontDialogHelper
++ \since 5.0
++ \internal
++ \ingroup qpa
++
++ \brief The QPlatformFontDialogHelper class allows for platform-specific customization of font dialogs.
++
++ */
++ const QSharedPointer<QFontDialogOptions> &QPlatformFontDialogHelper::options() const
++ {
++ return m_options;
++ }
++
++ void QPlatformFontDialogHelper::setOptions(const QSharedPointer<QFontDialogOptions> &options)
++ {
++ m_options = options;
++ }
++
++ // Color dialog
++
++ class QColorDialogStaticData
++ {
++ public:
++ enum { CustomColorCount = 16, StandardColorCount = 6 * 8 };
++
++ QColorDialogStaticData();
++
++ QRgb customRgb[CustomColorCount];
++ QRgb standardRgb[StandardColorCount];
++ bool customSet;
++ };
++
++ QColorDialogStaticData::QColorDialogStaticData() : customSet(false)
++ {
++ int i = 0;
++ for (int g = 0; g < 4; ++g)
++ for (int r = 0; r < 4; ++r)
++ for (int b = 0; b < 3; ++b)
++ standardRgb[i++] = qRgb(r * 255 / 3, g * 255 / 3, b * 255 / 2);
++ std::fill(customRgb, customRgb + CustomColorCount, 0xffffffff);
++ }
++
++ Q_GLOBAL_STATIC(QColorDialogStaticData, qColorDialogStaticData)
++
++ class QColorDialogOptionsPrivate
++ {
++ public:
++ QColorDialogOptionsPrivate() = default;
++ QColorDialogOptionsPrivate(const QColorDialogOptionsPrivate &) = default;
++ QColorDialogOptionsPrivate(QColorDialogOptionsPrivate &&) = default;
++ QColorDialogOptionsPrivate &operator=(const QColorDialogOptionsPrivate &) = delete;
++ QColorDialogOptionsPrivate &operator=(QColorDialogOptionsPrivate &&) = delete;
++
++ QColorDialogOptions::ColorDialogOptions options;
++ QString windowTitle;
++ };
++
++ QColorDialogOptions::QColorDialogOptions(QColorDialogOptionsPrivate *dd)
++ : d(dd)
++ {
++ }
++
++ QColorDialogOptions::~QColorDialogOptions()
++ {
++ }
++
++ namespace {
++ struct ColorDialogCombined : QColorDialogOptionsPrivate, QColorDialogOptions
++ {
++ ColorDialogCombined() : QColorDialogOptionsPrivate(), QColorDialogOptions(this) {}
++ ColorDialogCombined(const ColorDialogCombined &other)
++ : QColorDialogOptionsPrivate(other), QColorDialogOptions(this) {}
++ };
++ }
++
++ // static
++ QSharedPointer<QColorDialogOptions> QColorDialogOptions::create()
++ {
++ return QSharedPointer<ColorDialogCombined>::create();
++ }
++
++ QSharedPointer<QColorDialogOptions> QColorDialogOptions::clone() const
++ {
++ return QSharedPointer<ColorDialogCombined>::create(*static_cast<const ColorDialogCombined*>(this));
++ }
++
++ QString QColorDialogOptions::windowTitle() const
++ {
++ return d->windowTitle;
++ }
++
++ void QColorDialogOptions::setWindowTitle(const QString &title)
++ {
++ d->windowTitle = title;
++ }
++
++ void QColorDialogOptions::setOption(QColorDialogOptions::ColorDialogOption option, bool on)
++ {
++ if (!(d->options & option) != !on)
++ setOptions(d->options ^ option);
++ }
++
++ bool QColorDialogOptions::testOption(QColorDialogOptions::ColorDialogOption option) const
++ {
++ return d->options & option;
++ }
++
++ void QColorDialogOptions::setOptions(ColorDialogOptions options)
++ {
++ if (options != d->options)
++ d->options = options;
++ }
++
++ QColorDialogOptions::ColorDialogOptions QColorDialogOptions::options() const
++ {
++ return d->options;
++ }
++
++ int QColorDialogOptions::customColorCount()
++ {
++ return QColorDialogStaticData::CustomColorCount;
++ }
++
++ QRgb QColorDialogOptions::customColor(int index)
++ {
++ if (uint(index) >= uint(QColorDialogStaticData::CustomColorCount))
++ return qRgb(255, 255, 255);
++ return qColorDialogStaticData()->customRgb[index];
++ }
++
++ QRgb *QColorDialogOptions::customColors()
++ {
++ return qColorDialogStaticData()->customRgb;
++ }
++
++ void QColorDialogOptions::setCustomColor(int index, QRgb color)
++ {
++ if (uint(index) >= uint(QColorDialogStaticData::CustomColorCount))
++ return;
++ qColorDialogStaticData()->customSet = true;
++ qColorDialogStaticData()->customRgb[index] = color;
++ }
++
++ QRgb *QColorDialogOptions::standardColors()
++ {
++ return qColorDialogStaticData()->standardRgb;
++ }
++
++ QRgb QColorDialogOptions::standardColor(int index)
++ {
++ if (uint(index) >= uint(QColorDialogStaticData::StandardColorCount))
++ return qRgb(255, 255, 255);
++ return qColorDialogStaticData()->standardRgb[index];
++ }
++
++ void QColorDialogOptions::setStandardColor(int index, QRgb color)
++ {
++ if (uint(index) >= uint(QColorDialogStaticData::StandardColorCount))
++ return;
++ qColorDialogStaticData()->standardRgb[index] = color;
++ }
++
++ /*!
++ \class QPlatformColorDialogHelper
++ \since 5.0
++ \internal
++ \ingroup qpa
++
++ \brief The QPlatformColorDialogHelper class allows for platform-specific customization of color dialogs.
++
++ */
++ const QSharedPointer<QColorDialogOptions> &QPlatformColorDialogHelper::options() const
++ {
++ return m_options;
++ }
++
++ void QPlatformColorDialogHelper::setOptions(const QSharedPointer<QColorDialogOptions> &options)
++ {
++ m_options = options;
++ }
++
++ // File dialog
++
++ class QFileDialogOptionsPrivate
++ {
++ public:
++ QFileDialogOptions::FileDialogOptions options;
++ QString windowTitle;
++
++ QFileDialogOptions::ViewMode viewMode = QFileDialogOptions::Detail;
++ QFileDialogOptions::FileMode fileMode = QFileDialogOptions::AnyFile;
++ QFileDialogOptions::AcceptMode acceptMode = QFileDialogOptions::AcceptOpen;
++ QString labels[QFileDialogOptions::DialogLabelCount];
++ QDir::Filters filters = QDir::AllEntries | QDir::NoDotAndDotDot | QDir::AllDirs;
++ QList<QUrl> sidebarUrls;
++ bool useDefaultNameFilters = true;
++ QStringList nameFilters;
++ QStringList mimeTypeFilters;
++ QString defaultSuffix;
++ QStringList history;
++ QUrl initialDirectory;
++ QString initiallySelectedMimeTypeFilter;
++ QString initiallySelectedNameFilter;
++ QList<QUrl> initiallySelectedFiles;
++ QStringList supportedSchemes;
++ };
++
++ QFileDialogOptions::QFileDialogOptions(QFileDialogOptionsPrivate *dd)
++ : d(dd)
++ {
++ }
++
++ QFileDialogOptions::~QFileDialogOptions()
++ {
++ }
++
++ namespace {
++ struct FileDialogCombined : QFileDialogOptionsPrivate, QFileDialogOptions
++ {
++ FileDialogCombined() : QFileDialogOptionsPrivate(), QFileDialogOptions(this) {}
++ FileDialogCombined(const FileDialogCombined &other) : QFileDialogOptionsPrivate(other), QFileDialogOptions(this) {}
++ };
++ }
++
++ // static
++ QSharedPointer<QFileDialogOptions> QFileDialogOptions::create()
++ {
++ return QSharedPointer<FileDialogCombined>::create();
++ }
++
++ QSharedPointer<QFileDialogOptions> QFileDialogOptions::clone() const
++ {
++ return QSharedPointer<FileDialogCombined>::create(*static_cast<const FileDialogCombined*>(this));
++ }
++
++ QString QFileDialogOptions::windowTitle() const
++ {
++ return d->windowTitle;
++ }
++
++ void QFileDialogOptions::setWindowTitle(const QString &title)
++ {
++ d->windowTitle = title;
++ }
++
++ void QFileDialogOptions::setOption(QFileDialogOptions::FileDialogOption option, bool on)
++ {
++ if (!(d->options & option) != !on)
++ setOptions(d->options ^ option);
++ }
++
++ bool QFileDialogOptions::testOption(QFileDialogOptions::FileDialogOption option) const
++ {
++ return d->options & option;
++ }
++
++ void QFileDialogOptions::setOptions(FileDialogOptions options)
++ {
++ if (options != d->options)
++ d->options = options;
++ }
++
++ QFileDialogOptions::FileDialogOptions QFileDialogOptions::options() const
++ {
++ return d->options;
++ }
++
++ QDir::Filters QFileDialogOptions::filter() const
++ {
++ return d->filters;
++ }
++
++ void QFileDialogOptions::setFilter(QDir::Filters filters)
++ {
++ d->filters = filters;
++ }
++
++ void QFileDialogOptions::setViewMode(QFileDialogOptions::ViewMode mode)
++ {
++ d->viewMode = mode;
++ }
++
++ QFileDialogOptions::ViewMode QFileDialogOptions::viewMode() const
++ {
++ return d->viewMode;
++ }
++
++ void QFileDialogOptions::setFileMode(QFileDialogOptions::FileMode mode)
++ {
++ d->fileMode = mode;
++ }
++
++ QFileDialogOptions::FileMode QFileDialogOptions::fileMode() const
++ {
++ return d->fileMode;
++ }
++
++ void QFileDialogOptions::setAcceptMode(QFileDialogOptions::AcceptMode mode)
++ {
++ d->acceptMode = mode;
++ }
++
++ QFileDialogOptions::AcceptMode QFileDialogOptions::acceptMode() const
++ {
++ return d->acceptMode;
++ }
++
++ void QFileDialogOptions::setSidebarUrls(const QList<QUrl> &urls)
++ {
++ d->sidebarUrls = urls;
++ }
++
++ QList<QUrl> QFileDialogOptions::sidebarUrls() const
++ {
++ return d->sidebarUrls;
++ }
++
++ /*!
++ \since 5.7
++ \internal
++ The bool property useDefaultNameFilters indicates that no name filters have been
++ set or that they are equivalent to \gui{All Files (*)}. If it is true, the
++ platform can choose to hide the filter combo box.
++
++ \sa defaultNameFilterString().
++ */
++ bool QFileDialogOptions::useDefaultNameFilters() const
++ {
++ return d->useDefaultNameFilters;
++ }
++
++ void QFileDialogOptions::setUseDefaultNameFilters(bool dnf)
++ {
++ d->useDefaultNameFilters = dnf;
++ }
++
++ void QFileDialogOptions::setNameFilters(const QStringList &filters)
++ {
++ d->useDefaultNameFilters = filters.size() == 1
++ && filters.first() == QFileDialogOptions::defaultNameFilterString();
++ d->nameFilters = filters;
++ }
++
++ QStringList QFileDialogOptions::nameFilters() const
++ {
++ return d->useDefaultNameFilters ?
++ QStringList(QFileDialogOptions::defaultNameFilterString()) : d->nameFilters;
++ }
++
++ /*!
++ \since 5.6
++ \internal
++ \return The translated default name filter string (\gui{All Files (*)}).
++ \sa defaultNameFilters(), nameFilters()
++ */
++
++ QString QFileDialogOptions::defaultNameFilterString()
++ {
++ return QCoreApplication::translate("QFileDialog", "All Files (*)");
++ }
++
++ void QFileDialogOptions::setMimeTypeFilters(const QStringList &filters)
++ {
++ d->mimeTypeFilters = filters;
++ }
++
++ QStringList QFileDialogOptions::mimeTypeFilters() const
++ {
++ return d->mimeTypeFilters;
++ }
++
++ void QFileDialogOptions::setDefaultSuffix(const QString &suffix)
++ {
++ d->defaultSuffix = suffix;
++ if (d->defaultSuffix.size() > 1 && d->defaultSuffix.startsWith(u'.'))
++ d->defaultSuffix.remove(0, 1); // Silently change ".txt" -> "txt".
++ }
++
++ QString QFileDialogOptions::defaultSuffix() const
++ {
++ return d->defaultSuffix;
++ }
++
++ void QFileDialogOptions::setHistory(const QStringList &paths)
++ {
++ d->history = paths;
++ }
++
++ QStringList QFileDialogOptions::history() const
++ {
++ return d->history;
++ }
++
++ void QFileDialogOptions::setLabelText(QFileDialogOptions::DialogLabel label, const QString &text)
++ {
++ if (unsigned(label) < unsigned(DialogLabelCount))
++ d->labels[label] = text;
++ }
++
++ QString QFileDialogOptions::labelText(QFileDialogOptions::DialogLabel label) const
++ {
++ return (unsigned(label) < unsigned(DialogLabelCount)) ? d->labels[label] : QString();
++ }
++
++ bool QFileDialogOptions::isLabelExplicitlySet(DialogLabel label)
++ {
++ return unsigned(label) < unsigned(DialogLabelCount) && !d->labels[label].isEmpty();
++ }
++
++ QUrl QFileDialogOptions::initialDirectory() const
++ {
++ return d->initialDirectory;
++ }
++
++ void QFileDialogOptions::setInitialDirectory(const QUrl &directory)
++ {
++ d->initialDirectory = directory;
++ }
++
++ QString QFileDialogOptions::initiallySelectedMimeTypeFilter() const
++ {
++ return d->initiallySelectedMimeTypeFilter;
++ }
++
++ void QFileDialogOptions::setInitiallySelectedMimeTypeFilter(const QString &filter)
++ {
++ d->initiallySelectedMimeTypeFilter = filter;
++ }
++
++ QString QFileDialogOptions::initiallySelectedNameFilter() const
++ {
++ return d->initiallySelectedNameFilter;
++ }
++
++ void QFileDialogOptions::setInitiallySelectedNameFilter(const QString &filter)
++ {
++ d->initiallySelectedNameFilter = filter;
++ }
++
++ QList<QUrl> QFileDialogOptions::initiallySelectedFiles() const
++ {
++ return d->initiallySelectedFiles;
++ }
++
++ void QFileDialogOptions::setInitiallySelectedFiles(const QList<QUrl> &files)
++ {
++ d->initiallySelectedFiles = files;
++ }
++
++ // Schemes supported by the application
++ void QFileDialogOptions::setSupportedSchemes(const QStringList &schemes)
++ {
++ d->supportedSchemes = schemes;
++ }
++
++ QStringList QFileDialogOptions::supportedSchemes() const
++ {
++ return d->supportedSchemes;
++ }
++
++ void QPlatformFileDialogHelper::selectMimeTypeFilter(const QString &filter)
++ {
++ Q_UNUSED(filter);
++ }
++
++ QString QPlatformFileDialogHelper::selectedMimeTypeFilter() const
++ {
++ return QString();
++ }
++
++ // Return true if the URL is supported by the filedialog implementation *and* by the application.
++ bool QPlatformFileDialogHelper::isSupportedUrl(const QUrl &url) const
++ {
++ return url.isLocalFile();
++ }
++
++ /*!
++ \class QPlatformFileDialogHelper
++ \since 5.0
++ \internal
++ \ingroup qpa
++
++ \brief The QPlatformFileDialogHelper class allows for platform-specific customization of file dialogs.
++
++ */
++ const QSharedPointer<QFileDialogOptions> &QPlatformFileDialogHelper::options() const
++ {
++ return m_options;
++ }
++
++ void QPlatformFileDialogHelper::setOptions(const QSharedPointer<QFileDialogOptions> &options)
++ {
++ m_options = options;
++ }
++
++ const char QPlatformFileDialogHelper::filterRegExp[] =
++ "^(.*)\\(([a-zA-Z0-9_.,*? +;#\\-\\[\\]@\\{\\}/!<>\\$%&=^~:\\|]*)\\)$";
++
++ // Makes a list of filters from a normal filter string "Image Files (*.png *.jpg)"
++ QStringList QPlatformFileDialogHelper::cleanFilterList(const QString &filter)
++ {
++ #if QT_CONFIG(regularexpression)
++ static const QRegularExpression regexp(QString::fromLatin1(filterRegExp));
++ Q_ASSERT(regexp.isValid());
++ QString f = filter;
++ QRegularExpressionMatch match = regexp.match(filter);
++ if (match.hasMatch())
++ f = match.captured(2);
++ return f.split(u' ', Qt::SkipEmptyParts);
++ #else
++ Q_UNUSED(filter);
++ return QStringList();
++ #endif
++ }
++
++ // Message dialog
++
++ class QMessageDialogOptionsPrivate
++ {
++ public:
++ QMessageDialogOptionsPrivate() :
++ icon(QMessageDialogOptions::NoIcon),
++ buttons(QPlatformDialogHelper::Ok),
++ nextCustomButtonId(QPlatformDialogHelper::LastButton + 1)
++ {}
++
++ QString windowTitle;
++ QMessageDialogOptions::StandardIcon icon;
++ QString text;
++ QString informativeText;
++ QString detailedText;
++ QPlatformDialogHelper::StandardButtons buttons;
++ QList<QMessageDialogOptions::CustomButton> customButtons;
++ int nextCustomButtonId;
++ QPixmap iconPixmap;
++ QString checkBoxLabel;
++ Qt::CheckState checkBoxState = Qt::Unchecked;
++ int defaultButtonId = 0;
++ int escapeButtonId = 0;
++ QMessageDialogOptions::Options options;
++ };
++
++ QMessageDialogOptions::QMessageDialogOptions(QMessageDialogOptionsPrivate *dd)
++ : d(dd)
++ {
++ }
++
++ QMessageDialogOptions::~QMessageDialogOptions()
++ {
++ }
++
++ namespace {
++ struct MessageDialogCombined : QMessageDialogOptionsPrivate, QMessageDialogOptions
++ {
++ MessageDialogCombined() : QMessageDialogOptionsPrivate(), QMessageDialogOptions(this) {}
++ MessageDialogCombined(const MessageDialogCombined &other)
++ : QMessageDialogOptionsPrivate(other), QMessageDialogOptions(this) {}
++ };
++ }
++
++ // static
++ QSharedPointer<QMessageDialogOptions> QMessageDialogOptions::create()
++ {
++ return QSharedPointer<MessageDialogCombined>::create();
++ }
++
++ QSharedPointer<QMessageDialogOptions> QMessageDialogOptions::clone() const
++ {
++ return QSharedPointer<MessageDialogCombined>::create(*static_cast<const MessageDialogCombined*>(this));
++ }
++
++ QString QMessageDialogOptions::windowTitle() const
++ {
++ return d->windowTitle;
++ }
++
++ void QMessageDialogOptions::setWindowTitle(const QString &title)
++ {
++ d->windowTitle = title;
++ }
++
++ QMessageDialogOptions::StandardIcon QMessageDialogOptions::standardIcon() const
++ {
++ return d->icon;
++ }
++
++ void QMessageDialogOptions::setStandardIcon(StandardIcon icon)
++ {
++ d->icon = icon;
++ }
++
++ void QMessageDialogOptions::setIconPixmap(const QPixmap &pixmap)
++ {
++ d->iconPixmap = pixmap;
++ }
++
++ QPixmap QMessageDialogOptions::iconPixmap() const
++ {
++ return d->iconPixmap;
++ }
++
++ QString QMessageDialogOptions::text() const
++ {
++ return d->text;
++ }
++
++ void QMessageDialogOptions::setText(const QString &text)
++ {
++ d->text = text;
++ }
++
++ QString QMessageDialogOptions::informativeText() const
++ {
++ return d->informativeText;
++ }
++
++ void QMessageDialogOptions::setInformativeText(const QString &informativeText)
++ {
++ d->informativeText = informativeText;
++ }
++
++ QString QMessageDialogOptions::detailedText() const
++ {
++ return d->detailedText;
++ }
++
++ void QMessageDialogOptions::setDetailedText(const QString &detailedText)
++ {
++ d->detailedText = detailedText;
++ }
++
++ void QMessageDialogOptions::setStandardButtons(QPlatformDialogHelper::StandardButtons buttons)
++ {
++ d->buttons = buttons;
++ }
++
++ QPlatformDialogHelper::StandardButtons QMessageDialogOptions::standardButtons() const
++ {
++ return d->buttons;
++ }
++
++ int QMessageDialogOptions::addButton(const QString &label, QPlatformDialogHelper::ButtonRole role,
++ void *buttonImpl, int buttonId)
++ {
++ const CustomButton b(buttonId ? buttonId : d->nextCustomButtonId++, label, role, buttonImpl);
++ d->customButtons.append(b);
++ return b.id;
++ }
++
++ static inline bool operator==(const QMessageDialogOptions::CustomButton &a,
++ const QMessageDialogOptions::CustomButton &b) {
++ return a.id == b.id;
++ }
++
++ void QMessageDialogOptions::removeButton(int id)
++ {
++ d->customButtons.removeOne(CustomButton(id));
++ }
++
++ const QList<QMessageDialogOptions::CustomButton> &QMessageDialogOptions::customButtons()
++ {
++ return d->customButtons;
++ }
++
++ void QMessageDialogOptions::clearCustomButtons()
++ {
++ d->customButtons.clear();
++ }
++
++ const QMessageDialogOptions::CustomButton *QMessageDialogOptions::customButton(int id)
++ {
++ const int i = int(d->customButtons.indexOf(CustomButton(id)));
++ return (i < 0 ? nullptr : &d->customButtons.at(i));
++ }
++
++ void QMessageDialogOptions::setCheckBox(const QString &label, Qt::CheckState state)
++ {
++ d->checkBoxLabel = label;
++ d->checkBoxState = state;
++ }
++
++ QString QMessageDialogOptions::checkBoxLabel() const
++ {
++ return d->checkBoxLabel;
++ }
++
++ Qt::CheckState QMessageDialogOptions::checkBoxState() const
++ {
++ return d->checkBoxState;
++ }
++
++ void QMessageDialogOptions::setDefaultButton(int id)
++ {
++ d->defaultButtonId = id;
++ }
++
++ int QMessageDialogOptions::defaultButton() const
++ {
++ return d->defaultButtonId;
++ }
++
++ void QMessageDialogOptions::setEscapeButton(int id)
++ {
++ d->escapeButtonId = id;
++ }
++
++ int QMessageDialogOptions::escapeButton() const
++ {
++ return d->escapeButtonId;
++ }
++
++ void QMessageDialogOptions::setOption(QMessageDialogOptions::Option option, bool on)
++ {
++ if (!(d->options & option) != !on)
++ setOptions(d->options ^ option);
++ }
++
++ bool QMessageDialogOptions::testOption(QMessageDialogOptions::Option option) const
++ {
++ return d->options & option;
++ }
++
++ void QMessageDialogOptions::setOptions(QMessageDialogOptions::Options options)
++ {
++ if (options != d->options)
++ d->options = options;
++ }
++
++ QMessageDialogOptions::Options QMessageDialogOptions::options() const
++ {
++ return d->options;
++ }
++
++
++ QPlatformDialogHelper::ButtonRole QPlatformDialogHelper::buttonRole(QPlatformDialogHelper::StandardButton button)
++ {
++ switch (button) {
++ case Ok:
++ case Save:
++ case Open:
++ case SaveAll:
++ case Retry:
++ case Ignore:
++ return AcceptRole;
++
++ case Cancel:
++ case Close:
++ case Abort:
++ return RejectRole;
++
++ case Discard:
++ return DestructiveRole;
++
++ case Help:
++ return HelpRole;
++
++ case Apply:
++ return ApplyRole;
++
++ case Yes:
++ case YesToAll:
++ return YesRole;
++
++ case No:
++ case NoToAll:
++ return NoRole;
++
++ case RestoreDefaults:
++ case Reset:
++ return ResetRole;
++
++ default:
++ break;
++ }
++ return InvalidRole;
++ }
++
++ const int *QPlatformDialogHelper::buttonLayout(Qt::Orientation orientation, ButtonLayout policy)
++ {
++ if (policy == UnknownLayout) {
++ #if defined (Q_OS_MACOS)
++ policy = MacLayout;
++ #elif defined (Q_OS_LINUX) || defined (Q_OS_UNIX)
++ policy = KdeLayout;
++ #elif defined (Q_OS_ANDROID)
++ policy = AndroidLayout;
++ #else
++ policy = WinLayout;
++ #endif
++ }
++ return buttonRoleLayouts[orientation == Qt::Vertical][policy];
++ }
++
++ /*!
++ \class QPlatformMessageDialogHelper
++ \since 5.0
++ \internal
++ \ingroup qpa
++
++ \brief The QPlatformMessageDialogHelper class allows for platform-specific customization of Message dialogs.
++
++ */
++ const QSharedPointer<QMessageDialogOptions> &QPlatformMessageDialogHelper::options() const
++ {
++ return m_options;
++ }
++
++ void QPlatformMessageDialogHelper::setOptions(const QSharedPointer<QMessageDialogOptions> &options)
++ {
++ m_options = options;
++ }
++
++ QT_END_NAMESPACE
++
++ #include "moc_qplatformdialoghelper.cpp"