qtbase/src/widgets/kernel/qplatformdialoghelper_qpa.cpp

557 lines
13 KiB
C++
Raw Normal View History

/****************************************************************************
**
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/
**
** This file is part of the QtGui module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** GNU Lesser General Public License Usage
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this
** file. Please review the following information to ensure the GNU Lesser
** General Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU General
** Public License version 3.0 as published by the Free Software Foundation
** and appearing in the file LICENSE.GPL included in the packaging of this
** file. Please review the following information to ensure the GNU General
** Public License version 3.0 requirements will be met:
** http://www.gnu.org/copyleft/gpl.html.
**
** Other Usage
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**
**
**
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include "qplatformdialoghelper_qpa.h"
#include <QtCore/QVariant>
#include <QtCore/QSharedData>
#include <QtCore/QSettings>
#include <QtCore/QHash>
#include <QtCore/QUrl>
#include <QtGui/QColor>
QT_BEGIN_NAMESPACE
/*!
\class QPlatformDialogHelper
\since 5.0
\internal
\brief The QPlatformDialogHelper class allows for platform-specific customization of dialogs.
*/
/*!
\enum QPlatformDialogHelper::StyleHint
This enum type specifies platform-specific style hints.
\value SnapToDefaultButton Snap the mouse to the center of the default
button. There is corresponding system
setting on Windows.
\sa styleHint()
*/
QPlatformDialogHelper::QPlatformDialogHelper()
{
}
QPlatformDialogHelper::~QPlatformDialogHelper()
{
}
QVariant QPlatformDialogHelper::styleHint(StyleHint hint) const
{
return QPlatformDialogHelper::defaultStyleHint(hint);
}
QVariant QPlatformDialogHelper::defaultStyleHint(QPlatformDialogHelper::StyleHint hint)
{
switch (hint) {
case QPlatformDialogHelper::SnapToDefaultButton:
return QVariant(false);
}
return QVariant();
}
void QPlatformDialogHelper::emitLaunchNativeAppModalPanel()
{
emit launchNativeAppModalPanel();
}
// 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;
}
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();
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);
qFill(customRgb, customRgb + CustomColorCount, 0xffffffff);
readSettings();
}
void QColorDialogStaticData::readSettings()
{
#ifndef QT_NO_SETTINGS
const QSettings settings(QSettings::UserScope, QStringLiteral("Trolltech"));
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("Trolltech"));
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;
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;
}
const QSharedPointer<QColorDialogOptions> &QPlatformColorDialogHelper::options() const
{
return m_options;
}
void QPlatformColorDialogHelper::setOptions(const QSharedPointer<QColorDialogOptions> &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<QUrl> sidebarUrls;
QStringList nameFilters;
QString defaultSuffix;
QStringList history;
QString initialDirectory;
QString initiallySelectedNameFilter;
QStringList 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<QUrl> &urls)
{
d->sidebarUrls = urls;
}
QList<QUrl> QFileDialogOptions::sidebarUrls() const
{
return d->sidebarUrls;
}
void QFileDialogOptions::setNameFilters(const QStringList &filters)
{
d->nameFilters = filters;
}
QStringList QFileDialogOptions::nameFilters() const
{
return d->nameFilters;
}
void QFileDialogOptions::setDefaultSuffix(const QString &suffix)
{
d->defaultSuffix = suffix;
}
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();
}
QString QFileDialogOptions::initialDirectory() const
{
return d->initialDirectory;
}
void QFileDialogOptions::setInitialDirectory(const QString &directory)
{
d->initialDirectory = directory;
}
QString QFileDialogOptions::initiallySelectedNameFilter() const
{
return d->initiallySelectedNameFilter;
}
void QFileDialogOptions::setInitiallySelectedNameFilter(const QString &filter)
{
d->initiallySelectedNameFilter = filter;
}
QStringList QFileDialogOptions::initiallySelectedFiles() const
{
return d->initiallySelectedFiles;
}
void QFileDialogOptions::setInitiallySelectedFiles(const QStringList &files)
{
d->initiallySelectedFiles = files;
}
const QSharedPointer<QFileDialogOptions> &QPlatformFileDialogHelper::options() const
{
return m_options;
}
void QPlatformFileDialogHelper::setOptions(const QSharedPointer<QFileDialogOptions> &options)
{
m_options = options;
}
QT_END_NAMESPACE