summaryrefslogtreecommitdiffstats
path: root/src/gui/kernel/qguivariant.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/kernel/qguivariant.cpp')
-rw-r--r--src/gui/kernel/qguivariant.cpp341
1 files changed, 64 insertions, 277 deletions
diff --git a/src/gui/kernel/qguivariant.cpp b/src/gui/kernel/qguivariant.cpp
index 565e91d662..fe72e7782f 100644
--- a/src/gui/kernel/qguivariant.cpp
+++ b/src/gui/kernel/qguivariant.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** 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 https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://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 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2020 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
// Gui types
#include "qbitmap.h"
@@ -86,272 +50,95 @@
#include <float.h>
-#include "private/qvariant_p.h"
#include <private/qmetatype_p.h>
QT_BEGIN_NAMESPACE
-Q_CORE_EXPORT const QVariant::Handler *qcoreVariantHandler();
-
namespace {
-struct GuiTypesFilter {
- template<typename T>
- struct Acceptor {
- static const bool IsAccepted = QModulesPrivate::QTypeModuleInfo<T>::IsGui && QtMetaTypePrivate::TypeDefinition<T>::IsAvailable;
- };
-};
-// This class is a hack that customizes access to QPolygon and QPolygonF
-template<class Filter>
-class QGuiVariantIsNull : public QVariantIsNull<Filter> {
- typedef QVariantIsNull<Filter> Base;
-public:
- QGuiVariantIsNull(const QVariant::Private *d)
- : QVariantIsNull<Filter>(d)
- {}
- template<typename T>
- bool delegate(const T *p) { return Base::delegate(p); }
- bool delegate(const QPolygon*) { return v_cast<QPolygon>(Base::m_d)->isEmpty(); }
- bool delegate(const QPolygonF*) { return v_cast<QPolygonF>(Base::m_d)->isEmpty(); }
- bool delegate(const void *p) { return Base::delegate(p); }
-};
-static bool isNull(const QVariant::Private *d)
+// NOLINTNEXTLINE(cppcoreguidelines-virtual-class-destructor): this is not a base class
+static constexpr struct : QMetaTypeModuleHelper
{
- QGuiVariantIsNull<GuiTypesFilter> isNull(d);
- return QMetaTypeSwitcher::switcher<bool>(isNull, d->type().id(), nullptr);
-}
+#define QT_IMPL_METATYPEINTERFACE_GUI_TYPES(MetaTypeName, MetaTypeId, RealName) \
+ QT_METATYPE_INTERFACE_INIT(RealName),
-// This class is a hack that customizes access to QPixmap, QBitmap, QCursor and QIcon
-template<class Filter>
-class QGuiVariantComparator : public QVariantComparator<Filter> {
- typedef QVariantComparator<Filter> Base;
-public:
- QGuiVariantComparator(const QVariant::Private *a, const QVariant::Private *b)
- : QVariantComparator<Filter>(a, b)
- {}
- template<typename T>
- bool delegate(const T *p)
- {
- return Base::delegate(p);
- }
- bool delegate(const QPixmap*)
- {
- return v_cast<QPixmap>(Base::m_a)->cacheKey() == v_cast<QPixmap>(Base::m_b)->cacheKey();
- }
- bool delegate(const QBitmap*)
- {
- return v_cast<QBitmap>(Base::m_a)->cacheKey() == v_cast<QBitmap>(Base::m_b)->cacheKey();
- }
-#ifndef QT_NO_CURSOR
- bool delegate(const QCursor*)
- {
- return v_cast<QCursor>(Base::m_a)->shape() == v_cast<QCursor>(Base::m_b)->shape();
- }
-#endif
-#ifndef QT_NO_ICON
- bool delegate(const QIcon *)
- {
- return v_cast<QIcon>(Base::m_a)->cacheKey() == v_cast<QIcon>(Base::m_b)->cacheKey();
+ const QtPrivate::QMetaTypeInterface *interfaceForType(int type) const override {
+ switch (type) {
+ QT_FOR_EACH_STATIC_GUI_CLASS(QT_METATYPE_CONVERT_ID_TO_TYPE)
+ default: return nullptr;
+ }
}
-#endif
- bool delegate(const void *p) { return Base::delegate(p); }
-};
-
-static bool compare(const QVariant::Private *a, const QVariant::Private *b)
-{
- QGuiVariantComparator<GuiTypesFilter> comparator(a, b);
- return QMetaTypeSwitcher::switcher<bool>(comparator, a->type().id(), nullptr);
-}
+#undef QT_IMPL_METATYPEINTERFACE_GUI_TYPES
-static bool convert(const QVariant::Private *d, int t,
- void *result, bool *ok)
-{
- switch (t) {
- case QMetaType::QByteArray:
- if (d->type().id() == QMetaType::QColor) {
- const QColor *c = v_cast<QColor>(d);
- *static_cast<QByteArray *>(result) = c->name(c->alpha() != 255 ? QColor::HexArgb : QColor::HexRgb).toLatin1();
- return true;
- }
- break;
- case QMetaType::QString: {
- QString *str = static_cast<QString *>(result);
- switch (d->type().id()) {
+ bool convert(const void *from, int fromTypeId, void *to, int toTypeId) const override
+ {
+ Q_ASSERT(fromTypeId != toTypeId);
+
+ bool onlyCheck = (from == nullptr && to == nullptr);
+ // either two nullptrs from canConvert, or two valid pointers
+ Q_ASSERT(onlyCheck || (bool(from) && bool(to)));
+
+ using Int = int;
+ switch (makePair(toTypeId, fromTypeId)) {
+ QMETATYPE_CONVERTER(QByteArray, QColor,
+ result = source.name(source.alpha() != 255 ?
+ QColor::HexArgb : QColor::HexRgb).toLatin1();
+ return true;
+ );
+ QMETATYPE_CONVERTER(QColor, QByteArray,
+ result = QColor::fromString(QLatin1StringView(source));
+ return result.isValid();
+ );
+ QMETATYPE_CONVERTER(QString, QColor,
+ result = source.name(source.alpha() != 255 ?
+ QColor::HexArgb : QColor::HexRgb);
+ return true;
+ );
+ QMETATYPE_CONVERTER(QColor, QString,
+ result = QColor::fromString(source);
+ return result.isValid();
+ );
#if QT_CONFIG(shortcut)
- case QMetaType::QKeySequence:
- *str = (*v_cast<QKeySequence>(d)).toString(QKeySequence::NativeText);
- return true;
-#endif
- case QMetaType::QFont:
- *str = v_cast<QFont>(d)->toString();
- return true;
- case QMetaType::QColor: {
- const QColor *c = v_cast<QColor>(d);
- *str = c->name(c->alpha() != 255 ? QColor::HexArgb : QColor::HexRgb);
- return true;
- }
- default:
- break;
- }
- break;
- }
- case QMetaType::QPixmap:
- if (d->type().id() == QMetaType::QImage) {
- *static_cast<QPixmap *>(result) = QPixmap::fromImage(*v_cast<QImage>(d));
- return true;
- } else if (d->type().id() == QMetaType::QBitmap) {
- *static_cast<QPixmap *>(result) = *v_cast<QBitmap>(d);
- return true;
- } else if (d->type().id() == QMetaType::QBrush) {
- if (v_cast<QBrush>(d)->style() == Qt::TexturePattern) {
- *static_cast<QPixmap *>(result) = v_cast<QBrush>(d)->texture();
- return true;
- }
- }
- break;
- case QMetaType::QImage:
- if (d->type().id() == QMetaType::QPixmap) {
- *static_cast<QImage *>(result) = v_cast<QPixmap>(d)->toImage();
- return true;
- } else if (d->type().id() == QMetaType::QBitmap) {
- *static_cast<QImage *>(result) = v_cast<QBitmap>(d)->toImage();
- return true;
- }
- break;
- case QMetaType::QBitmap:
- if (d->type().id() == QMetaType::QPixmap) {
- *static_cast<QBitmap *>(result) = *v_cast<QPixmap>(d);
- return true;
- } else if (d->type().id() == QMetaType::QImage) {
- *static_cast<QBitmap *>(result) = QBitmap::fromImage(*v_cast<QImage>(d));
+ QMETATYPE_CONVERTER(QString, QKeySequence,
+ result = source.toString(QKeySequence::NativeText);
return true;
- }
- break;
-#if QT_CONFIG(shortcut)
- case QMetaType::Int:
- if (d->type().id() == QMetaType::QKeySequence) {
- const QKeySequence &seq = *v_cast<QKeySequence>(d);
- *static_cast<int *>(result) = seq.isEmpty() ? 0 : seq[0];
+ );
+ QMETATYPE_CONVERTER(QKeySequence, QString, result = source; return true;);
+ QMETATYPE_CONVERTER(Int, QKeySequence,
+ result = source.isEmpty() ? 0 : source[0].toCombined();
return true;
- }
- break;
+ );
+ QMETATYPE_CONVERTER(QKeySequence, Int, result = source; return true;);
#endif
- case QMetaType::QFont:
- if (d->type().id() == QMetaType::QString) {
- QFont *f = static_cast<QFont *>(result);
- f->fromString(*v_cast<QString>(d));
- return true;
- }
- break;
- case QMetaType::QColor:
- if (d->type().id() == QMetaType::QString) {
- static_cast<QColor *>(result)->setNamedColor(*v_cast<QString>(d));
- return static_cast<QColor *>(result)->isValid();
- } else if (d->type().id() == QMetaType::QByteArray) {
- static_cast<QColor *>(result)->setNamedColor(QLatin1String(*v_cast<QByteArray>(d)));
- return true;
- } else if (d->type().id() == QMetaType::QBrush) {
- if (v_cast<QBrush>(d)->style() == Qt::SolidPattern) {
- *static_cast<QColor *>(result) = v_cast<QBrush>(d)->color();
+ QMETATYPE_CONVERTER(QString, QFont, result = source.toString(); return true;);
+ QMETATYPE_CONVERTER(QFont, QString, return result.fromString(source););
+ QMETATYPE_CONVERTER(QPixmap, QImage, result = QPixmap::fromImage(source); return true;);
+ QMETATYPE_CONVERTER(QImage, QPixmap, result = source.toImage(); return true;);
+ QMETATYPE_CONVERTER(QPixmap, QBitmap, result = source; return true;);
+ QMETATYPE_CONVERTER(QBitmap, QPixmap, result = QBitmap::fromPixmap(source); return true;);
+ QMETATYPE_CONVERTER(QImage, QBitmap, result = source.toImage(); return true;);
+ QMETATYPE_CONVERTER(QBitmap, QImage, result = QBitmap::fromImage(source); return true;);
+ QMETATYPE_CONVERTER(QPixmap, QBrush, result = source.texture(); return true;);
+ QMETATYPE_CONVERTER(QBrush, QPixmap, result = source; return true;);
+ QMETATYPE_CONVERTER(QColor, QBrush,
+ if (source.style() == Qt::SolidPattern) {
+ result = source.color();
return true;
}
- }
- break;
- case QMetaType::QBrush:
- if (d->type().id() == QMetaType::QColor) {
- *static_cast<QBrush *>(result) = QBrush(*v_cast<QColor>(d));
- return true;
- } else if (d->type().id() == QMetaType::QPixmap) {
- *static_cast<QBrush *>(result) = QBrush(*v_cast<QPixmap>(d));
- return true;
- }
- break;
-#if QT_CONFIG(shortcut)
- case QMetaType::QKeySequence: {
- QKeySequence *seq = static_cast<QKeySequence *>(result);
- switch (d->type().id()) {
- case QMetaType::QString:
- *seq = QKeySequence(*v_cast<QString>(d));
- return true;
- case QMetaType::Int:
- *seq = QKeySequence(d->data.i);
- return true;
+ return false;
+ );
+ QMETATYPE_CONVERTER(QBrush, QColor, result = source; return true;);
default:
break;
}
- break;
- }
-#endif
-#ifndef QT_NO_ICON
- case QMetaType::QIcon: {
- if (ok)
- *ok = false;
return false;
}
-#endif
- default:
- break;
- }
- return qcoreVariantHandler()->convert(d, t, result, ok);
-}
-
-#if !defined(QT_NO_DEBUG_STREAM)
-static void streamDebug(QDebug dbg, const QVariant &v)
-{
- QVariant::Private *d = const_cast<QVariant::Private *>(&v.data_ptr());
- QVariantDebugStream<GuiTypesFilter> stream(dbg, d);
- QMetaTypeSwitcher::switcher<void>(stream, d->type().id(), nullptr);
-}
-#endif
-
-const QVariant::Handler qt_gui_variant_handler = {
- isNull,
- compare,
- convert,
-#if !defined(QT_NO_DEBUG_STREAM)
- streamDebug
-#else
- nullptr
-#endif
-};
-
-#define QT_IMPL_METATYPEINTERFACE_GUI_TYPES(MetaTypeName, MetaTypeId, RealName) \
- QT_METATYPE_INTERFACE_INIT(RealName),
-
-static const struct : QMetaTypeModuleHelper
-{
- QtPrivate::QMetaTypeInterface *interfaceForType(int type) const override {
- switch (type) {
- QT_FOR_EACH_STATIC_GUI_CLASS(QT_METATYPE_CONVERT_ID_TO_TYPE)
- default: return nullptr;
- }
- }
-#ifndef QT_NO_DATASTREAM
- bool save(QDataStream &stream, int type, const void *data) const override {
- switch (type) {
- QT_FOR_EACH_STATIC_GUI_CLASS(QT_METATYPE_DATASTREAM_SAVE)
- default: return false;
- }
- }
- bool load(QDataStream &stream, int type, void *data) const override {
- switch (type) {
- QT_FOR_EACH_STATIC_GUI_CLASS(QT_METATYPE_DATASTREAM_LOAD)
- default: return false;
- }
- }
-#endif
-
} qVariantGuiHelper;
-
-#undef QT_IMPL_METATYPEINTERFACE_GUI_TYPES
} // namespace used to hide QVariant handler
-extern Q_CORE_EXPORT const QMetaTypeModuleHelper *qMetaTypeGuiHelper;
-
void qRegisterGuiVariant()
{
- QVariantPrivate::registerHandler(QModulesPrivate::Gui, &qt_gui_variant_handler);
qMetaTypeGuiHelper = &qVariantGuiHelper;
}
Q_CONSTRUCTOR_FUNCTION(qRegisterGuiVariant)