diff options
author | Maximilian Goldstein <[email protected]> | 2020-04-08 14:35:21 +0200 |
---|---|---|
committer | Maximilian Goldstein <[email protected]> | 2020-04-14 14:46:19 +0200 |
commit | 53aa259d57e92f48585f95b47a25ee6e16fc2aaa (patch) | |
tree | b3e27b6ee5ca5b8fdfb4d1e084e50ebd151fc0bc | |
parent | 27748dec471a9c9825f5a35d1936bb5d00400b5b (diff) |
Implement Qt.alpha()
Introduces an easy way to get a version of a color with transparency
(e.g. Qt.alpha("red", 0.5)).
[ChangeLog][QML][General] Added Qt.alpha for easily modifying a color's alpha value
Task-number: QTBUG-77635
Change-Id: Ic724e5fa503ca2ae5157a99eed1b5c913a39239f
Reviewed-by: Fabian Kosmale <[email protected]>
Reviewed-by: Shawn Rutledge <[email protected]>
-rw-r--r-- | src/qml/qml/qqmlglobal.cpp | 4 | ||||
-rw-r--r-- | src/qml/qml/qqmlglobal_p.h | 1 | ||||
-rw-r--r-- | src/qml/qml/v8/qqmlbuiltinfunctions.cpp | 31 | ||||
-rw-r--r-- | src/qml/qml/v8/qqmlbuiltinfunctions_p.h | 2 | ||||
-rw-r--r-- | src/quick/util/qquickglobal.cpp | 7 | ||||
-rw-r--r-- | src/quick/util/qquickvaluetypes.cpp | 5 | ||||
-rw-r--r-- | src/quick/util/qquickvaluetypes_p.h | 1 | ||||
-rw-r--r-- | tests/auto/qml/qqmlqt/data/alpha.qml | 16 | ||||
-rw-r--r-- | tests/auto/qml/qqmlqt/tst_qqmlqt.cpp | 32 |
9 files changed, 98 insertions, 1 deletions
diff --git a/src/qml/qml/qqmlglobal.cpp b/src/qml/qml/qqmlglobal.cpp index acebb6bac3..b6a1075c67 100644 --- a/src/qml/qml/qqmlglobal.cpp +++ b/src/qml/qml/qqmlglobal.cpp @@ -283,6 +283,10 @@ QVariant QQmlColorProvider::fromHslF(double, double, double, double) { return QV QVariant QQmlColorProvider::fromHsvF(double, double, double, double) { return QVariant(); } QVariant QQmlColorProvider::lighter(const QVariant &, qreal) { return QVariant(); } QVariant QQmlColorProvider::darker(const QVariant &, qreal) { return QVariant(); } +QVariant QQmlColorProvider::alpha(const QVariant &, qreal) +{ + return QVariant(); +} QVariant QQmlColorProvider::tint(const QVariant &, const QVariant &) { return QVariant(); } static QQmlColorProvider *colorProvider = nullptr; diff --git a/src/qml/qml/qqmlglobal_p.h b/src/qml/qml/qqmlglobal_p.h index 3c540a6124..b0f239e398 100644 --- a/src/qml/qml/qqmlglobal_p.h +++ b/src/qml/qml/qqmlglobal_p.h @@ -278,6 +278,7 @@ public: virtual QVariant fromHsvF(double, double, double, double); virtual QVariant lighter(const QVariant &, qreal); virtual QVariant darker(const QVariant &, qreal); + virtual QVariant alpha(const QVariant &, qreal); virtual QVariant tint(const QVariant &, const QVariant &); }; diff --git a/src/qml/qml/v8/qqmlbuiltinfunctions.cpp b/src/qml/qml/v8/qqmlbuiltinfunctions.cpp index 158f05c743..1123949cfa 100644 --- a/src/qml/qml/v8/qqmlbuiltinfunctions.cpp +++ b/src/qml/qml/v8/qqmlbuiltinfunctions.cpp @@ -142,6 +142,7 @@ void Heap::QtObject::init(QQmlEngine *qmlEngine) o->defineDefaultProperty(QStringLiteral("binding"), QV4::QtObject::method_binding); if (qmlEngine) { + o->defineDefaultProperty(QStringLiteral("alpha"), QV4::QtObject::method_alpha); o->defineDefaultProperty(QStringLiteral("lighter"), QV4::QtObject::method_lighter); o->defineDefaultProperty(QStringLiteral("darker"), QV4::QtObject::method_darker); o->defineDefaultProperty(QStringLiteral("tint"), QV4::QtObject::method_tint); @@ -692,6 +693,35 @@ ReturnedValue QtObject::method_darker(const FunctionObject *b, const Value *, co } /*! + \qmlmethod color Qt::alpha(color baseColor, real value) + + Returns \a baseColor with an alpha value of \a value. + + \a value is a real ranging from 0 (completely transparent) to 1 (completely opaque). +*/ +ReturnedValue QtObject::method_alpha(const FunctionObject *b, const Value *, const Value *argv, + int argc) +{ + QV4::Scope scope(b); + if (argc != 2) + THROW_GENERIC_ERROR("Qt.alpha(): Wrong number of arguments provided"); + + QVariant v = scope.engine->toVariant(argv[0], -1); + if (v.userType() == QMetaType::QString) { + bool ok = false; + v = QQmlStringConverters::colorFromString(v.toString(), &ok); + if (!ok) + return QV4::Encode::null(); + } else if (v.userType() != QMetaType::QColor) { + return QV4::Encode::null(); + } + + qreal value = argv[1].toNumber(); + + return scope.engine->fromVariant(QQml_colorProvider()->alpha(v, value)); +} + +/*! \qmlmethod color Qt::tint(color baseColor, color tintColor) This function allows tinting one color (\a baseColor) with another (\a tintColor). @@ -2258,4 +2288,3 @@ ReturnedValue QtObject::method_callLater(const FunctionObject *b, const Value *t } QT_END_NAMESPACE - diff --git a/src/qml/qml/v8/qqmlbuiltinfunctions_p.h b/src/qml/qml/v8/qqmlbuiltinfunctions_p.h index 0e6d815457..8c64e5b1d8 100644 --- a/src/qml/qml/v8/qqmlbuiltinfunctions_p.h +++ b/src/qml/qml/v8/qqmlbuiltinfunctions_p.h @@ -114,6 +114,8 @@ struct QtObject : Object static ReturnedValue method_matrix4x4(const FunctionObject *b, const Value *thisObject, const Value *argv, int argc); static ReturnedValue method_lighter(const FunctionObject *b, const Value *thisObject, const Value *argv, int argc); static ReturnedValue method_darker(const FunctionObject *b, const Value *thisObject, const Value *argv, int argc); + static ReturnedValue method_alpha(const FunctionObject *b, const Value *thisObject, + const Value *argv, int argc); static ReturnedValue method_tint(const FunctionObject *b, const Value *thisObject, const Value *argv, int argc); static ReturnedValue method_formatDate(const FunctionObject *b, const Value *thisObject, const Value *argv, int argc); static ReturnedValue method_formatTime(const FunctionObject *b, const Value *thisObject, const Value *argv, int argc); diff --git a/src/quick/util/qquickglobal.cpp b/src/quick/util/qquickglobal.cpp index 3ea2f88712..e8439121ca 100644 --- a/src/quick/util/qquickglobal.cpp +++ b/src/quick/util/qquickglobal.cpp @@ -123,6 +123,13 @@ public: return QVariant::fromValue(color); } + QVariant alpha(const QVariant &var, qreal value) override + { + QColor color = var.value<QColor>(); + color.setAlphaF(value); + return QVariant::fromValue(color); + } + QVariant tint(const QVariant &baseVar, const QVariant &tintVar) override { QColor tintColor = tintVar.value<QColor>(); diff --git a/src/quick/util/qquickvaluetypes.cpp b/src/quick/util/qquickvaluetypes.cpp index 2b86fe5ceb..d836946214 100644 --- a/src/quick/util/qquickvaluetypes.cpp +++ b/src/quick/util/qquickvaluetypes.cpp @@ -68,6 +68,11 @@ QVariant QQuickColorValueType::darker(qreal factor) const return QQml_colorProvider()->darker(this->v, factor); } +QVariant QQuickColorValueType::alpha(qreal value) const +{ + return QQml_colorProvider()->alpha(this->v, value); +} + QVariant QQuickColorValueType::tint(QVariant tintColor) const { return QQml_colorProvider()->tint(this->v, tintColor); diff --git a/src/quick/util/qquickvaluetypes_p.h b/src/quick/util/qquickvaluetypes_p.h index b20fc6c0e3..6ddb51b5de 100644 --- a/src/quick/util/qquickvaluetypes_p.h +++ b/src/quick/util/qquickvaluetypes_p.h @@ -90,6 +90,7 @@ class QQuickColorValueType public: Q_INVOKABLE QString toString() const; + Q_INVOKABLE QVariant alpha(qreal value) const; Q_INVOKABLE QVariant lighter(qreal factor = 1.5) const; Q_INVOKABLE QVariant darker(qreal factor = 2.0) const; Q_INVOKABLE QVariant tint(QVariant factor) const; diff --git a/tests/auto/qml/qqmlqt/data/alpha.qml b/tests/auto/qml/qqmlqt/data/alpha.qml new file mode 100644 index 0000000000..0587f60bc6 --- /dev/null +++ b/tests/auto/qml/qqmlqt/data/alpha.qml @@ -0,0 +1,16 @@ +import QtQuick 2.0 + +QtObject { + property variant test1: Qt.alpha(Qt.rgba(1, 0.8, 0.3), 0.5) + property variant test2: Qt.alpha() + property variant test3: Qt.alpha(Qt.rgba(1, 0.8, 0.3), 0.7) + property variant test4: Qt.alpha("red", 0.5); + property variant test5: Qt.alpha("perfectred", 0.5); // Non-existent color + property variant test6: Qt.alpha(1, 0.5); + property variant test7: Qt.alpha(Qt.rgba(1, 0.8, 0.3), 2.8, 10) + + property variant testColor1: Qt.rgba(1, 0.8, 0.3).alpha(0.5) + property variant testColor3: Qt.rgba(1, 0.8, 0.3).alpha(0.7) + property variant testColor4: Qt.color("red").alpha(0.5); + property variant testColor7: Qt.rgba(1, 0.8, 0.3).alpha(2.8, 10); +} diff --git a/tests/auto/qml/qqmlqt/tst_qqmlqt.cpp b/tests/auto/qml/qqmlqt/tst_qqmlqt.cpp index 6c93b46167..da33a46c68 100644 --- a/tests/auto/qml/qqmlqt/tst_qqmlqt.cpp +++ b/tests/auto/qml/qqmlqt/tst_qqmlqt.cpp @@ -79,6 +79,7 @@ private slots: void font(); void lighter(); void darker(); + void alpha(); void tint(); void color(); void openUrlExternally(); @@ -543,6 +544,37 @@ void tst_qqmlqt::darker() QCOMPARE(qvariant_cast<QColor>(object->property("test6")), QColor()); } +void tst_qqmlqt::alpha() +{ + QQmlComponent component(&engine, testFileUrl("alpha.qml")); + + QString warning1 = component.url().toString() + ":5: Error: Qt.alpha(): Wrong number of arguments provided"; + QString warning2 = component.url().toString() + ":10: Error: Qt.alpha(): Wrong number of arguments provided"; + QTest::ignoreMessage(QtWarningMsg, qPrintable(warning1)); + QTest::ignoreMessage(QtWarningMsg, qPrintable(warning2)); + + QScopedPointer<QObject> object(component.create()); + QVERIFY(object != nullptr); + + QCOMPARE(qvariant_cast<QColor>(object->property("test1")), + QColor::fromRgbF(1.0, 0.8, 0.3, 0.5)); + QCOMPARE(qvariant_cast<QColor>(object->property("testColor1")), + QColor::fromRgbF(1, 0.8, 0.3, 0.5)); + QCOMPARE(qvariant_cast<QColor>(object->property("test2")), QColor()); + QCOMPARE(qvariant_cast<QColor>(object->property("test3")), + QColor::fromRgbF(1.0, 0.8, 0.3, 0.7)); + QCOMPARE(qvariant_cast<QColor>(object->property("testColor3")), + QColor::fromRgbF(1, 0.8, 0.3, 0.7)); + + QColor alphaRed = QColor("red"); + alphaRed.setAlphaF(0.5); + + QCOMPARE(qvariant_cast<QColor>(object->property("test4")), alphaRed); + QCOMPARE(qvariant_cast<QColor>(object->property("testColor4")), alphaRed); + QCOMPARE(qvariant_cast<QColor>(object->property("test5")), QColor()); + QCOMPARE(qvariant_cast<QColor>(object->property("test6")), QColor()); +} + void tst_qqmlqt::tint() { QQmlComponent component(&engine, testFileUrl("tint.qml")); |