aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/qml/qml/qqmlglobal.cpp4
-rw-r--r--src/qml/qml/qqmlglobal_p.h1
-rw-r--r--src/qml/qml/v8/qqmlbuiltinfunctions.cpp31
-rw-r--r--src/qml/qml/v8/qqmlbuiltinfunctions_p.h2
-rw-r--r--src/quick/util/qquickglobal.cpp7
-rw-r--r--src/quick/util/qquickvaluetypes.cpp5
-rw-r--r--src/quick/util/qquickvaluetypes_p.h1
-rw-r--r--tests/auto/qml/qqmlqt/data/alpha.qml16
-rw-r--r--tests/auto/qml/qqmlqt/tst_qqmlqt.cpp32
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"));