/**************************************************************************** ** ** Copyright (C) 2015 The Qt Company Ltd. ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtGui module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL21$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see http://www.qt.io/terms-conditions. For further ** information use the contact form at http://www.qt.io/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 or version 3 as published by the Free ** Software Foundation and appearing in the file LICENSE.LGPLv21 and ** LICENSE.LGPLv3 included in the packaging of this file. Please review the ** following information to ensure the GNU Lesser General Public License ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** As a special exception, The Qt Company gives you certain additional ** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qplatformdialoghelper.h" #include #include #include #include #include #include #include QT_BEGIN_NAMESPACE /*! \class QPlatformDialogHelper \since 5.0 \internal \ingroup qpa \brief The QPlatformDialogHelper class allows for platform-specific customization of dialogs. */ static const int buttonRoleLayouts[2][5][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 }, // MacModelessLayout { QPlatformDialogHelper::ResetRole, QPlatformDialogHelper::ApplyRole, QPlatformDialogHelper::ActionRole, QPlatformDialogHelper::Stretch, QPlatformDialogHelper::HelpRole, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL, 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 }, // MacModelessLayout { QPlatformDialogHelper::ActionRole, QPlatformDialogHelper::ApplyRole, QPlatformDialogHelper::ResetRole, QPlatformDialogHelper::Stretch, QPlatformDialogHelper::HelpRole, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL } } }; QPlatformDialogHelper::QPlatformDialogHelper() { } 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 QSharedData { public: QFontDialogOptionsPrivate() : options(0) {} QFontDialogOptions::FontDialogOptions options; QString windowTitle; }; QFontDialogOptions::QFontDialogOptions() : d(new QFontDialogOptionsPrivate) { } QFontDialogOptions::QFontDialogOptions(const QFontDialogOptions &rhs) : d(rhs.d) { } QFontDialogOptions &QFontDialogOptions::operator=(const QFontDialogOptions &rhs) { if (this != &rhs) d = rhs.d; return *this; } QFontDialogOptions::~QFontDialogOptions() { } 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 &QPlatformFontDialogHelper::options() const { return m_options; } void QPlatformFontDialogHelper::setOptions(const QSharedPointer &options) { m_options = options; } // Color dialog class QColorDialogStaticData { public: enum { CustomColorCount = 16, StandardColorCount = 6 * 8 }; QColorDialogStaticData(); inline void readSettings(); inline void writeSettings() const; 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); readSettings(); } void QColorDialogStaticData::readSettings() { #ifndef QT_NO_SETTINGS const QSettings settings(QSettings::UserScope, QStringLiteral("QtProject")); for (int i = 0; i < int(CustomColorCount); ++i) { const QVariant v = settings.value(QStringLiteral("Qt/customColors/") + QString::number(i)); if (v.isValid()) customRgb[i] = v.toUInt(); } #endif } void QColorDialogStaticData::writeSettings() const { #ifndef QT_NO_SETTINGS if (!customSet) { QSettings settings(QSettings::UserScope, QStringLiteral("QtProject")); for (int i = 0; i < int(CustomColorCount); ++i) settings.setValue(QStringLiteral("Qt/customColors/") + QString::number(i), customRgb[i]); } #endif } Q_GLOBAL_STATIC(QColorDialogStaticData, qColorDialogStaticData) class QColorDialogOptionsPrivate : public QSharedData { public: QColorDialogOptionsPrivate() : options(0) {} // Write out settings around destruction of dialogs ~QColorDialogOptionsPrivate() { qColorDialogStaticData()->writeSettings(); } QColorDialogOptions::ColorDialogOptions options; QString windowTitle; }; QColorDialogOptions::QColorDialogOptions() : d(new QColorDialogOptionsPrivate) { } QColorDialogOptions::QColorDialogOptions(const QColorDialogOptions &rhs) : d(rhs.d) { } QColorDialogOptions &QColorDialogOptions::operator=(const QColorDialogOptions &rhs) { if (this != &rhs) d = rhs.d; return *this; } QColorDialogOptions::~QColorDialogOptions() { } 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 &QPlatformColorDialogHelper::options() const { return m_options; } void QPlatformColorDialogHelper::setOptions(const QSharedPointer &options) { m_options = options; } // File dialog class QFileDialogOptionsPrivate : public QSharedData { public: QFileDialogOptionsPrivate() : options(0), viewMode(QFileDialogOptions::Detail), fileMode(QFileDialogOptions::AnyFile), acceptMode(QFileDialogOptions::AcceptOpen), filters(QDir::AllEntries | QDir::NoDotAndDotDot | QDir::AllDirs) {} QFileDialogOptions::FileDialogOptions options; QString windowTitle; QFileDialogOptions::ViewMode viewMode; QFileDialogOptions::FileMode fileMode; QFileDialogOptions::AcceptMode acceptMode; QString labels[QFileDialogOptions::DialogLabelCount]; QDir::Filters filters; QList sidebarUrls; QStringList nameFilters; QStringList mimeTypeFilters; QString defaultSuffix; QStringList history; QUrl initialDirectory; QString initiallySelectedNameFilter; QList initiallySelectedFiles; }; QFileDialogOptions::QFileDialogOptions() : d(new QFileDialogOptionsPrivate) { } QFileDialogOptions::QFileDialogOptions(const QFileDialogOptions &rhs) : d(rhs.d) { } QFileDialogOptions &QFileDialogOptions::operator=(const QFileDialogOptions &rhs) { if (this != &rhs) d = rhs.d; return *this; } QFileDialogOptions::~QFileDialogOptions() { } 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 &urls) { d->sidebarUrls = urls; } QList QFileDialogOptions::sidebarUrls() const { return d->sidebarUrls; } void QFileDialogOptions::setNameFilters(const QStringList &filters) { d->nameFilters = filters; } QStringList QFileDialogOptions::nameFilters() const { return d->nameFilters; } 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(QLatin1Char('.'))) 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 (label >= 0 && label < DialogLabelCount) d->labels[label] = text; } QString QFileDialogOptions::labelText(QFileDialogOptions::DialogLabel label) const { return (label >= 0 && label < DialogLabelCount) ? d->labels[label] : QString(); } bool QFileDialogOptions::isLabelExplicitlySet(DialogLabel label) { return label >= 0 && label < DialogLabelCount && !d->labels[label].isEmpty(); } QUrl QFileDialogOptions::initialDirectory() const { return d->initialDirectory; } void QFileDialogOptions::setInitialDirectory(const QUrl &directory) { d->initialDirectory = directory; } QString QFileDialogOptions::initiallySelectedNameFilter() const { return d->initiallySelectedNameFilter; } void QFileDialogOptions::setInitiallySelectedNameFilter(const QString &filter) { d->initiallySelectedNameFilter = filter; } QList QFileDialogOptions::initiallySelectedFiles() const { return d->initiallySelectedFiles; } void QFileDialogOptions::setInitiallySelectedFiles(const QList &files) { d->initiallySelectedFiles = files; } 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 &QPlatformFileDialogHelper::options() const { return m_options; } void QPlatformFileDialogHelper::setOptions(const QSharedPointer &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) { QRegExp regexp(QString::fromLatin1(filterRegExp)); QString f = filter; int i = regexp.indexIn(f); if (i >= 0) f = regexp.cap(2); return f.split(QLatin1Char(' '), QString::SkipEmptyParts); } // Message dialog class QMessageDialogOptionsPrivate : public QSharedData { public: QMessageDialogOptionsPrivate() : icon(QMessageDialogOptions::NoIcon), buttons(QPlatformDialogHelper::Ok) {} QString windowTitle; QMessageDialogOptions::Icon icon; QString text; QString informativeText; QString detailedText; QPlatformDialogHelper::StandardButtons buttons; }; QMessageDialogOptions::QMessageDialogOptions() : d(new QMessageDialogOptionsPrivate) { } QMessageDialogOptions::QMessageDialogOptions(const QMessageDialogOptions &rhs) : d(rhs.d) { } QMessageDialogOptions &QMessageDialogOptions::operator=(const QMessageDialogOptions &rhs) { if (this != &rhs) d = rhs.d; return *this; } QMessageDialogOptions::~QMessageDialogOptions() { } QString QMessageDialogOptions::windowTitle() const { return d->windowTitle; } void QMessageDialogOptions::setWindowTitle(const QString &title) { d->windowTitle = title; } QMessageDialogOptions::Icon QMessageDialogOptions::icon() const { return d->icon; } void QMessageDialogOptions::setIcon(Icon icon) { d->icon = icon; } 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; } 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_OSX) policy = MacLayout; #elif defined (Q_OS_LINUX) || defined (Q_OS_UNIX) policy = KdeLayout; #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 &QPlatformMessageDialogHelper::options() const { return m_options; } void QPlatformMessageDialogHelper::setOptions(const QSharedPointer &options) { m_options = options; } QT_END_NAMESPACE