Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package qt6-quicktimeline for
openSUSE:Factory checked in at 2024-04-08 17:37:54
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/qt6-quicktimeline (Old)
and /work/SRC/openSUSE:Factory/.qt6-quicktimeline.new.1905 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "qt6-quicktimeline"
Mon Apr 8 17:37:54 2024 rev:28 rq:1165798 version:6.7.0
Changes:
--------
--- /work/SRC/openSUSE:Factory/qt6-quicktimeline/qt6-quicktimeline.changes
2024-03-28 14:08:24.728470875 +0100
+++
/work/SRC/openSUSE:Factory/.qt6-quicktimeline.new.1905/qt6-quicktimeline.changes
2024-04-08 17:43:25.726093796 +0200
@@ -1,0 +2,6 @@
+Tue Apr 2 13:39:53 UTC 2024 - Christophe Marin <[email protected]>
+
+- Update to 6.7.0:
+ * https://www.qt.io/blog/qt-6.7-released
+
+-------------------------------------------------------------------
Old:
----
qtquicktimeline-everywhere-src-6.6.3.tar.xz
New:
----
qtquicktimeline-everywhere-src-6.7.0.tar.xz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ qt6-quicktimeline.spec ++++++
--- /var/tmp/diff_new_pack.hAU1t1/_old 2024-04-08 17:43:26.414119210 +0200
+++ /var/tmp/diff_new_pack.hAU1t1/_new 2024-04-08 17:43:26.414119210 +0200
@@ -16,8 +16,8 @@
#
-%define real_version 6.6.3
-%define short_version 6.6
+%define real_version 6.7.0
+%define short_version 6.7
%define tar_name qtquicktimeline-everywhere-src
%define tar_suffix %{nil}
#
@@ -27,7 +27,7 @@
%endif
#
Name: qt6-quicktimeline%{?pkg_suffix}
-Version: 6.6.3
+Version: 6.7.0
Release: 0
Summary: Qt 6 module for creating keyframe-based animations
License: GPL-3.0-or-later
@@ -110,22 +110,34 @@
%files -n libQt6QuickTimeline6
%{_qt6_libdir}/libQt6QuickTimeline.so.*
+%{_qt6_libdir}/libQt6QuickTimelineBlendTrees.so.*
%files devel
%{_qt6_cmakedir}/Qt6BuildInternals/StandaloneTests/QtQuickTimelineTestsConfig.cmake
%{_qt6_cmakedir}/Qt6QuickTimeline/
+%{_qt6_cmakedir}/Qt6QuickTimelineBlendTrees/
%{_qt6_descriptionsdir}/QuickTimeline.json
+%{_qt6_descriptionsdir}/QuickTimelineBlendTrees.json
%{_qt6_includedir}/QtQuickTimeline/
+%{_qt6_includedir}/QtQuickTimelineBlendTrees/
%{_qt6_libdir}/libQt6QuickTimeline.prl
+%{_qt6_libdir}/libQt6QuickTimelineBlendTrees.prl
%{_qt6_libdir}/libQt6QuickTimeline.so
+%{_qt6_libdir}/libQt6QuickTimelineBlendTrees.so
%{_qt6_metatypesdir}/qt6quicktimeline_*_metatypes.json
+%{_qt6_metatypesdir}/qt6quicktimelineblendtrees_*_metatypes.json
%{_qt6_mkspecsdir}/modules/qt_lib_quicktimeline.pri
+%{_qt6_mkspecsdir}/modules/qt_lib_quicktimelineblendtrees.pri
%{_qt6_pkgconfigdir}/Qt6QuickTimeline.pc
+%{_qt6_pkgconfigdir}/Qt6QuickTimelineBlendTrees.pc
%exclude %{_qt6_includedir}/QtQuickTimeline/%{real_version}
+%exclude %{_qt6_includedir}/QtQuickTimelineBlendTrees/%{real_version}
%files private-devel
%{_qt6_includedir}/QtQuickTimeline/%{real_version}
+%{_qt6_includedir}/QtQuickTimelineBlendTrees/%{real_version}
%{_qt6_mkspecsdir}/modules/qt_lib_quicktimeline_private.pri
+%{_qt6_mkspecsdir}/modules/qt_lib_quicktimelineblendtrees_private.pri
%endif
++++++ qtquicktimeline-everywhere-src-6.6.3.tar.xz ->
qtquicktimeline-everywhere-src-6.7.0.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/qtquicktimeline-everywhere-src-6.6.3/.cmake.conf
new/qtquicktimeline-everywhere-src-6.7.0/.cmake.conf
--- old/qtquicktimeline-everywhere-src-6.6.3/.cmake.conf 2024-03-19
00:52:58.000000000 +0100
+++ new/qtquicktimeline-everywhere-src-6.7.0/.cmake.conf 2024-03-22
19:51:21.000000000 +0100
@@ -1,3 +1,5 @@
-set(QT_REPO_MODULE_VERSION "6.6.3")
+set(QT_REPO_MODULE_VERSION "6.7.0")
set(QT_REPO_MODULE_PRERELEASE_VERSION_SEGMENT "alpha1")
set(QT_EXTRA_INTERNAL_TARGET_DEFINES "QT_NO_AS_CONST=1")
+list(APPEND QT_EXTRA_INTERNAL_TARGET_DEFINES "QT_NO_FOREACH=1")
+list(APPEND QT_EXTRA_INTERNAL_TARGET_DEFINES "QT_NO_CONTEXTLESS_CONNECT=1")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/qtquicktimeline-everywhere-src-6.6.3/.tag
new/qtquicktimeline-everywhere-src-6.7.0/.tag
--- old/qtquicktimeline-everywhere-src-6.6.3/.tag 2024-03-19
00:52:58.000000000 +0100
+++ new/qtquicktimeline-everywhere-src-6.7.0/.tag 2024-03-22
19:51:21.000000000 +0100
@@ -1 +1 @@
-e155cafc4e19fd4999779b14e906ac6403491159
+fd74687a02ea08ed102b952a645594596a4f53ce
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtquicktimeline-everywhere-src-6.6.3/coin/axivion/ci_config_linux.json
new/qtquicktimeline-everywhere-src-6.7.0/coin/axivion/ci_config_linux.json
--- old/qtquicktimeline-everywhere-src-6.6.3/coin/axivion/ci_config_linux.json
2024-03-19 00:52:58.000000000 +0100
+++ new/qtquicktimeline-everywhere-src-6.7.0/coin/axivion/ci_config_linux.json
2024-03-22 19:51:21.000000000 +0100
@@ -1,9 +1,5 @@
{
"Project": {
- "Git": {
- "_active": true,
- "sourceserver_gitdir":
"/data/axivion/databases/$(env:TESTED_MODULE_COIN).git"
- },
"BuildSystemIntegration": {
"child_order": [
"GCCSetup",
@@ -32,29 +28,14 @@
"build/qml/*/*/lib*.so*.ir"
],
"ir": "build/$(env:TESTED_MODULE_COIN).ir"
- },
- "Project-GlobalOptions": {
- "directory": "../work/qt/$(env:TESTED_MODULE_COIN)",
- "ir": "build/$(env:TESTED_MODULE_COIN).ir",
- "name": "qt_$(env:TESTED_MODULE_COIN)_dev_$(env:TARGET_OS_COIN)"
- }
- },
- "Results": {
- "Dashboard": {
- "dashboard_url": "https://axivion-srv.ci.qt.io/axivion/"
- },
- "Database": {
- "ci_mode": {
- "directory": "/data/axivion/databases"
- }
}
},
"_Format": "1.0",
- "_Version": "trunk-9e0ef9c5818",
+ "_Version": "7.6.2",
"_VersionNum": [
7,
6,
- 9999,
- 11489
+ 2,
+ 12725
]
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtquicktimeline-everywhere-src-6.6.3/dependencies.yaml
new/qtquicktimeline-everywhere-src-6.7.0/dependencies.yaml
--- old/qtquicktimeline-everywhere-src-6.6.3/dependencies.yaml 2024-03-19
00:52:58.000000000 +0100
+++ new/qtquicktimeline-everywhere-src-6.7.0/dependencies.yaml 2024-03-22
19:51:21.000000000 +0100
@@ -1,7 +1,7 @@
dependencies:
../qtbase:
- ref: afdec885058c92e24604f398a926297222da06f3
+ ref: 98602c26fc97eb41e3dd7548194ca637420a31b9
required: true
../qtdeclarative:
- ref: ab5521fd1a637739c7e91def84caa84426055aff
+ ref: e6d14fcdc95713f65367499629f93fb1f1e35ec9
required: true
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtquicktimeline-everywhere-src-6.6.3/src/timeline/CMakeLists.txt
new/qtquicktimeline-everywhere-src-6.7.0/src/timeline/CMakeLists.txt
--- old/qtquicktimeline-everywhere-src-6.6.3/src/timeline/CMakeLists.txt
2024-03-19 00:52:58.000000000 +0100
+++ new/qtquicktimeline-everywhere-src-6.7.0/src/timeline/CMakeLists.txt
2024-03-22 19:51:21.000000000 +0100
@@ -30,3 +30,6 @@
qt_internal_add_docs(QuickTimeline
doc/qtquicktimeline.qdocconf
)
+
+add_subdirectory(blendtrees)
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtquicktimeline-everywhere-src-6.6.3/src/timeline/blendtrees/CMakeLists.txt
new/qtquicktimeline-everywhere-src-6.7.0/src/timeline/blendtrees/CMakeLists.txt
---
old/qtquicktimeline-everywhere-src-6.6.3/src/timeline/blendtrees/CMakeLists.txt
1970-01-01 01:00:00.000000000 +0100
+++
new/qtquicktimeline-everywhere-src-6.7.0/src/timeline/blendtrees/CMakeLists.txt
2024-03-22 19:51:21.000000000 +0100
@@ -0,0 +1,29 @@
+# Copyright (C) 2023 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+qt_internal_add_qml_module(QuickTimelineBlendTrees
+ URI "QtQuick.Timeline.BlendTrees"
+ VERSION "${PROJECT_VERSION}"
+ DESIGNER_SUPPORTED
+ CLASS_NAME QtQuickTimelineBlendTreesPlugin
+ PLUGIN_TARGET qtquicktimelineblendtreesplugin
+ DEPENDENCIES
+ QtQuickTimeline
+ SOURCES
+ qblendtreenode.cpp qblendtreenode_p.h
+ qtimelineanimationnode.cpp qtimelineanimationnode_p.h
+ qblendanimationnode.cpp qblendanimationnode_p.h
+ qtquicktimelineblendtreesglobal.h qtquicktimelineblendtreesglobal_p.h
+ DEFINES
+ QT_BUILD_QUICKTIMELINEBLENDTREES_LIB
+ PUBLIC_LIBRARIES
+ Qt::Core
+ Qt::Qml
+ Qt::Quick
+ Qt::QuickTimeline
+ LIBRARIES
+ Qt::QuickPrivate
+ Qt::QuickTimelinePrivate
+ GENERATE_CPP_EXPORTS
+ GENERATE_PRIVATE_CPP_EXPORTS
+)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtquicktimeline-everywhere-src-6.6.3/src/timeline/blendtrees/doc/src/qtquicktimelineblendtrees-module-qml.qdoc
new/qtquicktimeline-everywhere-src-6.7.0/src/timeline/blendtrees/doc/src/qtquicktimelineblendtrees-module-qml.qdoc
---
old/qtquicktimeline-everywhere-src-6.6.3/src/timeline/blendtrees/doc/src/qtquicktimelineblendtrees-module-qml.qdoc
1970-01-01 01:00:00.000000000 +0100
+++
new/qtquicktimeline-everywhere-src-6.7.0/src/timeline/blendtrees/doc/src/qtquicktimelineblendtrees-module-qml.qdoc
2024-03-22 19:51:21.000000000 +0100
@@ -0,0 +1,20 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR
GFDL-1.3-no-invariants-only
+
+/*!
+ \qmlmodule QtQuick.Timeline.BlendTrees
+ \title Qt Quick Timeline Blend Trees QML Types
+ \since 6.7
+
+ \brief Provides QML types for blending multiple \l {TimelineAnimation}s
+ together, creating new dynamic animations.
+
+//! [usage]
+ To import the QML types into your application, use the following import
+ statement in your .qml file:
+
+ \qml
+ import QtQuick.Timeline.BlendTrees
+ \endqml
+//! [usage]
+*/
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtquicktimeline-everywhere-src-6.6.3/src/timeline/blendtrees/qblendanimationnode.cpp
new/qtquicktimeline-everywhere-src-6.7.0/src/timeline/blendtrees/qblendanimationnode.cpp
---
old/qtquicktimeline-everywhere-src-6.6.3/src/timeline/blendtrees/qblendanimationnode.cpp
1970-01-01 01:00:00.000000000 +0100
+++
new/qtquicktimeline-everywhere-src-6.7.0/src/timeline/blendtrees/qblendanimationnode.cpp
2024-03-22 19:51:21.000000000 +0100
@@ -0,0 +1,251 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#include "qblendanimationnode_p.h"
+
+#include <QVariant>
+#include <QVector2D>
+#include <QVector3D>
+#include <QVector4D>
+#include <QQuaternion>
+#include <QColor>
+#include <QRect>
+#include <QRectF>
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \qmltype BlendAnimationNode
+ \inherits QBlendTreeNode
+ \instantiates QBlendAnimationNode
+ \inqmlmodule QtQuick.Timeline.BlendTrees
+ \ingroup qtqmltypes
+
+ \brief A blend tree node that blends between two animation sources.
+
+ BlendAnimationNode is a blend tree node that blends between two animation
+ sources based on a weight value. The weight value can be animated to
+ dynamically blend between the two animation sources.
+*/
+
+/*!
+ \qmlproperty BlendTreeNode BlendAnimationNode::source1
+
+ This property holds the first animation source.
+*/
+
+/*!
+ \qmlproperty BlendTreeNode BlendAnimationNode::source2
+
+ This property holds the second animation source.
+*/
+
+/*!
+ \qmlproperty real BlendAnimationNode::weight
+
+ This property holds the weight value used to blend between the two
animation
+ sources.
+ The weight value determines how much of the first animation source is
blended
+ with the second animation source. A weight value of \c 0.0 means the first
+ animation source is used exclusively, a weight value of \c 1.0 means the
+ second animation source is used exclusively, and a weight value of \c 0.5
means
+ both animation sources are blended equally. The default value is \c 0.5.
+*/
+
+QBlendAnimationNode::QBlendAnimationNode(QObject *parent)
+ : QBlendTreeNode(parent)
+{
+ connect(this,
+ &QBlendAnimationNode::weightChanged,
+ this,
+ &QBlendAnimationNode::handleInputFrameDataChanged);
+}
+
+QBlendTreeNode *QBlendAnimationNode::source1() const
+{
+ return m_source1;
+}
+
+void QBlendAnimationNode::setSource1(QBlendTreeNode *newSource1)
+{
+ if (m_source1 == newSource1)
+ return;
+
+ if (m_source1) {
+ disconnect(m_source1OutputConnection);
+ disconnect(m_source1DestroyedConnection);
+ }
+
+ m_source1 = newSource1;
+
+ if (m_source1) {
+ m_source1OutputConnection = connect(m_source1,
+ &QBlendTreeNode::frameDataChanged,
+ this,
+
&QBlendAnimationNode::handleInputFrameDataChanged);
+ m_source1DestroyedConnection = connect(m_source1,
+ &QObject::destroyed,
+ this,
+ [this] { setSource1(nullptr);});
+ }
+ Q_EMIT source1Changed();
+}
+
+QBlendTreeNode *QBlendAnimationNode::source2() const
+{
+ return m_source2;
+}
+
+void QBlendAnimationNode::setSource2(QBlendTreeNode *newSource2)
+{
+ if (m_source2 == newSource2)
+ return;
+
+ if (m_source2) {
+ disconnect(m_source2OutputConnection);
+ disconnect(m_source2DestroyedConnection);
+ }
+
+ m_source2 = newSource2;
+
+ if (m_source2) {
+ m_source2OutputConnection = connect(m_source2,
+ &QBlendTreeNode::frameDataChanged,
+ this,
+
&QBlendAnimationNode::handleInputFrameDataChanged);
+ m_source2DestroyedConnection = connect(m_source2,
+ &QObject::destroyed,
+ this,
+ [this] { setSource2(nullptr);});
+ }
+
+ Q_EMIT source2Changed();
+}
+
+qreal QBlendAnimationNode::weight() const
+{
+ return m_weight;
+}
+
+void QBlendAnimationNode::setWeight(qreal newWeight)
+{
+ if (qFuzzyCompare(m_weight, newWeight))
+ return;
+ m_weight = newWeight;
+ Q_EMIT weightChanged();
+}
+
+static QVariant lerp(const QVariant &first, const QVariant &second, float
weight)
+{
+ // Don't bother with weights if there is no data (for now)
+ if (first.isNull())
+ return second;
+ else if (second.isNull())
+ return first;
+
+ const QMetaType type = first.metaType();
+ switch (type.id()) {
+ case QMetaType::Bool:
+ return QVariant((1.0f - weight) * first.toBool() + weight *
second.toBool() >= 0.5f);
+ case QMetaType::Int:
+ return QVariant((1.0f - weight) * first.toInt() + weight *
second.toInt());
+ case QMetaType::Float:
+ return QVariant((1.0f - weight) * first.toFloat() + weight *
second.toFloat());
+ case QMetaType::Double:
+ return QVariant((1.0 - weight) * first.toDouble() + weight *
second.toDouble());
+ case QMetaType::QVector2D: {
+ QVector2D firstVec = first.value<QVector2D>();
+ QVector2D secondVec = second.value<QVector2D>();
+ return QVariant::fromValue<QVector2D>(firstVec * (1.0f - weight) +
secondVec * weight);
+ }
+ case QMetaType::QVector3D: {
+ QVector3D firstVec = first.value<QVector3D>();
+ QVector3D secondVec = second.value<QVector3D>();
+ return QVariant::fromValue<QVector3D>(firstVec * (1.0f - weight) +
secondVec * weight);
+ }
+ case QMetaType::QVector4D: {
+ QVector4D firstVec = first.value<QVector4D>();
+ QVector4D secondVec = second.value<QVector4D>();
+ return QVariant::fromValue<QVector4D>(firstVec * (1.0f - weight) +
secondVec * weight);
+ }
+ case QMetaType::QQuaternion: {
+ QQuaternion firstQuat = first.value<QQuaternion>();
+ QQuaternion secondQuat = second.value<QQuaternion>();
+ return QVariant::fromValue<QQuaternion>(QQuaternion::nlerp(firstQuat,
secondQuat, weight));
+ }
+ case QMetaType::QColor: {
+ QColor firstColor = first.value<QColor>();
+ QColor secondColor = second.value<QColor>();
+ int r = (1.0f - weight) * firstColor.red() + weight *
secondColor.red();
+ int g = (1.0f - weight) * firstColor.green() + weight *
secondColor.green();
+ int b = (1.0f - weight) * firstColor.blue() + weight *
secondColor.blue();
+ int a = (1.0f - weight) * firstColor.alpha() + weight *
secondColor.alpha();
+ return QVariant::fromValue<QColor>(QColor(r, g, b, a));
+ }
+ case QMetaType::QRect: {
+ QRect firstRect = first.value<QRect>();
+ QRect secondRect = second.value<QRect>();
+ int x = (1.0f - weight) * firstRect.x() + weight * secondRect.x();
+ int y = (1.0f - weight) * firstRect.y() + weight * secondRect.y();
+ int width = (1.0f - weight) * firstRect.width() + weight *
secondRect.width();
+ int height = (1.0f - weight) * firstRect.height() + weight *
secondRect.height();
+ return QVariant::fromValue<QRect>(QRect(x, y, width, height));
+ }
+ case QMetaType::QRectF: {
+ QRectF firstRectF = first.value<QRectF>();
+ QRectF secondRectF = second.value<QRectF>();
+ qreal x = (1.0 - weight) * firstRectF.x() + weight * secondRectF.x();
+ qreal y = (1.0 - weight) * firstRectF.y() + weight * secondRectF.y();
+ qreal width = (1.0 - weight) * firstRectF.width() + weight *
secondRectF.width();
+ qreal height = (1.0 - weight) * firstRectF.height() + weight *
secondRectF.height();
+ return QVariant::fromValue<QRectF>(QRectF(x, y, width, height));
+ }
+ default:
+ // Unsupported type, return an invalid QVariant
+ return QVariant();
+ }
+
+}
+
+void QBlendAnimationNode::handleInputFrameDataChanged()
+{
+ const QHash<QQmlProperty, QVariant> &frameData1 = m_source1 ?
m_source1->frameData() : QHash<QQmlProperty, QVariant>();
+ const QHash<QQmlProperty, QVariant> &frameData2 = m_source2 ?
m_source2->frameData() : QHash<QQmlProperty, QVariant>();
+
+ // Do the LERP blending here
+ if (m_weight <= 0.0) {
+ // all source1
+ m_frameData = frameData1;
+ } else if (m_weight >= 1.0) {
+ // all source2
+ m_frameData = frameData2;
+ } else {
+ // is a mix
+ QHash<QQmlProperty, QPair<QVariant, QVariant>> allData;
+ const auto &keys1 = frameData1.keys();
+ for (const auto &property : keys1)
+ allData.insert(property, QPair<QVariant,
QVariant>(frameData1[property], QVariant()));
+ const auto &keys2 = frameData2.keys();
+ for (const auto &property : keys2) {
+ // first check if property is already in all data, and if so
modify the pair to include this value
+ if (allData.contains(property)) {
+ allData[property].second = frameData2[property];
+ } else {
+ allData.insert(property, QPair<QVariant, QVariant>(QVariant(),
frameData2[property]));
+ }
+ }
+
+ QHash<QQmlProperty, QVariant> newFrameData;
+
+ const auto &keys = allData.keys();
+ for (const auto &property : keys) {
+ const auto &dataPair = allData[property];
+ newFrameData.insert(property, lerp(dataPair.first,
dataPair.second, m_weight));
+ }
+ m_frameData = newFrameData;
+ }
+
+ Q_EMIT frameDataChanged();
+}
+
+QT_END_NAMESPACE
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtquicktimeline-everywhere-src-6.6.3/src/timeline/blendtrees/qblendanimationnode_p.h
new/qtquicktimeline-everywhere-src-6.7.0/src/timeline/blendtrees/qblendanimationnode_p.h
---
old/qtquicktimeline-everywhere-src-6.6.3/src/timeline/blendtrees/qblendanimationnode_p.h
1970-01-01 01:00:00.000000000 +0100
+++
new/qtquicktimeline-everywhere-src-6.7.0/src/timeline/blendtrees/qblendanimationnode_p.h
2024-03-22 19:51:21.000000000 +0100
@@ -0,0 +1,65 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#ifndef QBLENDANIMATIONNODE_P_H
+#define QBLENDANIMATIONNODE_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QObject>
+#include <QtQml>
+#include <QtQuick/private/qquickanimation_p.h>
+#include <QtQuickTimelineBlendTrees/private/qblendtreenode_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class Q_QUICKTIMELINEBLENDTREES_EXPORT QBlendAnimationNode : public
QBlendTreeNode
+{
+ Q_OBJECT
+ Q_PROPERTY(QBlendTreeNode *source1 READ source1 WRITE setSource1 NOTIFY
source1Changed FINAL)
+ Q_PROPERTY(QBlendTreeNode *source2 READ source2 WRITE setSource2 NOTIFY
source2Changed FINAL)
+ Q_PROPERTY(qreal weight READ weight WRITE setWeight NOTIFY weightChanged
FINAL)
+ QML_NAMED_ELEMENT(BlendAnimationNode)
+public:
+ explicit QBlendAnimationNode(QObject *parent = nullptr);
+
+ QBlendTreeNode *source1() const;
+ void setSource1(QBlendTreeNode *newSource1);
+
+ QBlendTreeNode *source2() const;
+ void setSource2(QBlendTreeNode *newSource2);
+
+ qreal weight() const;
+ void setWeight(qreal newWeight);
+
+private Q_SLOTS:
+ void handleInputFrameDataChanged();
+
+Q_SIGNALS:
+ void source1Changed();
+ void source2Changed();
+ void weightChanged();
+
+private:
+ QBlendTreeNode *m_source1 = nullptr;
+ QBlendTreeNode *m_source2 = nullptr;
+ qreal m_weight = 0.5;
+
+ QMetaObject::Connection m_source1OutputConnection;
+ QMetaObject::Connection m_source2OutputConnection;
+ QMetaObject::Connection m_source1DestroyedConnection;
+ QMetaObject::Connection m_source2DestroyedConnection;
+};
+
+QT_END_NAMESPACE
+
+#endif // QBLENDANIMATIONNODE_P_H
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtquicktimeline-everywhere-src-6.6.3/src/timeline/blendtrees/qblendtreenode.cpp
new/qtquicktimeline-everywhere-src-6.7.0/src/timeline/blendtrees/qblendtreenode.cpp
---
old/qtquicktimeline-everywhere-src-6.6.3/src/timeline/blendtrees/qblendtreenode.cpp
1970-01-01 01:00:00.000000000 +0100
+++
new/qtquicktimeline-everywhere-src-6.7.0/src/timeline/blendtrees/qblendtreenode.cpp
2024-03-22 19:51:21.000000000 +0100
@@ -0,0 +1,73 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#include "qblendtreenode_p.h"
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \qmltype BlendTreeNode
+ \inherits QObject
+ \instantiates QBlendTreeNode
+ \inqmlmodule QtQuick.Timeline.BlendTrees
+ \ingroup qtqmltypes
+
+ \brief Base class for all blend tree nodes.
+
+ BlendTreeNode is the base class for all blend tree nodes. It is not
+ intended to be used directly, but rather to be subclassed to create
+ custom blend tree nodes.
+*/
+
+/*!
+ \qmlproperty bool BlendTreeNode::outputEnabled
+
+ This property determines whether the blend tree node should commit
+ the property changes. The default value is /c false.
+
+ Any node can be an output node which commits the property changes,
+ but it should usually be the last node in the blend tree. If multiple
+ nodes are outputting data and there is a conflict, then the last
+ property change will be used. So ideally if there are multiple output
+ nodes in a tree, the targets and properties effected should be disjoint.
+*/
+
+QBlendTreeNode::QBlendTreeNode(QObject *parent)
+ : QObject{parent}
+{
+ connect(this, &QBlendTreeNode::frameDataChanged, this,
&QBlendTreeNode::handleFrameDataChanged);
+ connect(this, &QBlendTreeNode::outputEnabledChanged, this,
&QBlendTreeNode::handleFrameDataChanged);
+}
+
+const QHash<QQmlProperty, QVariant> &QBlendTreeNode::frameData()
+{
+ return m_frameData;
+}
+
+bool QBlendTreeNode::outputEnabled() const
+{
+ return m_outputEnabled;
+}
+
+void QBlendTreeNode::setOutputEnabled(bool isOutputEnabled)
+{
+ if (m_outputEnabled == isOutputEnabled)
+ return;
+ m_outputEnabled = isOutputEnabled;
+ Q_EMIT outputEnabledChanged();
+}
+
+void QBlendTreeNode::handleFrameDataChanged()
+{
+ // If we are not outputting data, then there is nothing to do
+ if (!m_outputEnabled)
+ return;
+
+ // Commit the property
+ for (auto it = m_frameData.cbegin(), end = m_frameData.cend(); it != end;
++it) {
+ const auto &property = it.key();
+ property.write(it.value());
+ }
+}
+
+QT_END_NAMESPACE
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtquicktimeline-everywhere-src-6.6.3/src/timeline/blendtrees/qblendtreenode_p.h
new/qtquicktimeline-everywhere-src-6.7.0/src/timeline/blendtrees/qblendtreenode_p.h
---
old/qtquicktimeline-everywhere-src-6.6.3/src/timeline/blendtrees/qblendtreenode_p.h
1970-01-01 01:00:00.000000000 +0100
+++
new/qtquicktimeline-everywhere-src-6.7.0/src/timeline/blendtrees/qblendtreenode_p.h
2024-03-22 19:51:21.000000000 +0100
@@ -0,0 +1,55 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#ifndef QBLENDTREENODE_P_H
+#define QBLENDTREENODE_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "qtquicktimelineblendtreesglobal.h"
+
+#include <QObject>
+#include <QtQml>
+
+QT_BEGIN_NAMESPACE
+
+class Q_QUICKTIMELINEBLENDTREES_EXPORT QBlendTreeNode : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(bool outputEnabled READ outputEnabled WRITE setOutputEnabled
NOTIFY outputEnabledChanged FINAL)
+ QML_NAMED_ELEMENT(BlendTreeNode)
+ QML_UNCREATABLE("Interface Class")
+public:
+ explicit QBlendTreeNode(QObject *parent = nullptr);
+
+ const QHash<QQmlProperty, QVariant> &frameData();
+
+ bool outputEnabled() const;
+ void setOutputEnabled(bool isOutputEnabled);
+
+Q_SIGNALS:
+ void frameDataChanged();
+ void outputEnabledChanged();
+
+protected:
+ QHash<QQmlProperty, QVariant> m_frameData;
+
+private Q_SLOTS:
+ void handleFrameDataChanged();
+
+private:
+ bool m_outputEnabled = false;
+};
+
+QT_END_NAMESPACE
+
+#endif // QBLENDTREENODE_P_H
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtquicktimeline-everywhere-src-6.6.3/src/timeline/blendtrees/qtimelineanimationnode.cpp
new/qtquicktimeline-everywhere-src-6.7.0/src/timeline/blendtrees/qtimelineanimationnode.cpp
---
old/qtquicktimeline-everywhere-src-6.6.3/src/timeline/blendtrees/qtimelineanimationnode.cpp
1970-01-01 01:00:00.000000000 +0100
+++
new/qtquicktimeline-everywhere-src-6.7.0/src/timeline/blendtrees/qtimelineanimationnode.cpp
2024-03-22 19:51:21.000000000 +0100
@@ -0,0 +1,149 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#include "qtimelineanimationnode_p.h"
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \qmltype TimelineAnimationNode
+ \inherits QBlendTreeNode
+ \instantiates QTimelineAnimationNode
+ \inqmlmodule QtQuick.Timeline.BlendTrees
+ \ingroup qtqmltypes
+
+ \brief A blend tree source node that plays a timeline animation.
+
+ TimelineAnimationNode is a blend tree source node that plays a timeline
+ animation and outputs the animation's frame data. This node wraps a
+ TimelineAnimation and its associated Timeline and provides a way to
+ intercept the animation's frame data and output it to the blend tree.
+*/
+
+/*!
+ \qmlproperty TimelineAnimation TimelineAnimationNode::animation
+
+ This property holds the timeline animation to play.
+*/
+
+/*!
+ \qmlproperty Timeline TimelineAnimationNode::timeline
+
+ This property holds the timeline that the animation is played on.
+*/
+
+/*!
+ \qmlproperty real TimelineAnimationNode::currentFrame
+
+ This property holds the current frame of the animation.
+*/
+
+QTimelineAnimationNode::QTimelineAnimationNode(QObject *parent)
+ : QBlendTreeNode(parent)
+{
+
+}
+
+QQuickTimelineAnimation *QTimelineAnimationNode::animation() const
+{
+ return m_animation;
+}
+
+void QTimelineAnimationNode::setAnimation(QQuickTimelineAnimation
*newAnimation)
+{
+ if (m_animation == newAnimation)
+ return;
+
+ if (m_animation)
+ disconnect(m_animationDestroyedConnection);
+
+ m_animation = newAnimation;
+
+ if (m_animation)
+ m_animationDestroyedConnection = connect(m_animation,
+ &QObject::destroyed,
+ this,
+ [this]
{setAnimation(nullptr);});
+
+ updateAnimationTarget();
+ updateFrameData();
+ Q_EMIT animationChanged();
+}
+
+QQuickTimeline *QTimelineAnimationNode::timeline() const
+{
+ return m_timeline;
+}
+
+void QTimelineAnimationNode::setTimeline(QQuickTimeline *newTimeline)
+{
+ if (m_timeline == newTimeline)
+ return;
+
+ if (m_timeline)
+ disconnect(m_timelineDestroyedConnection);
+
+ m_timeline = newTimeline;
+
+ if (m_timeline)
+ m_timelineDestroyedConnection = connect(m_timeline,
+ &QObject::destroyed,
+ this,
+ [this]
{setTimeline(nullptr);});
+
+ updateFrameData();
+ Q_EMIT timelineChanged();
+}
+
+qreal QTimelineAnimationNode::currentFrame() const
+{
+ return m_currentFrame;
+}
+
+void QTimelineAnimationNode::setCurrentFrame(qreal newCurrentFrame)
+{
+ if (qFuzzyCompare(m_currentFrame, newCurrentFrame))
+ return;
+ m_currentFrame = newCurrentFrame;
+ updateFrameData();
+ Q_EMIT currentFrameChanged();
+}
+
+static QHash<QQmlProperty, QVariant> getFrameData(QQuickTimeline *timeline,
qreal frame)
+{
+ QHash<QQmlProperty, QVariant> frameData;
+ if (timeline) {
+ QQmlListReference keyframeGroups(timeline, "keyframeGroups");
+ if (keyframeGroups.isValid() && keyframeGroups.isReadable()) {
+ for (int i = 0; i < keyframeGroups.count(); ++i) {
+ QQuickKeyframeGroup *keyframeGroup =
qobject_cast<QQuickKeyframeGroup *>(keyframeGroups.at(i));
+ if (keyframeGroup && keyframeGroup->target()) {
+ QQmlProperty qmlProperty(keyframeGroup->target(),
keyframeGroup->property());
+ QVariant value = keyframeGroup->evaluate(frame);
+ frameData.insert(qmlProperty, value);
+ }
+ }
+ }
+ }
+
+ return frameData;
+}
+
+void QTimelineAnimationNode::updateFrameData()
+{
+ if (!m_animation || !m_timeline)
+ return;
+
+ m_frameData = getFrameData(m_timeline, m_currentFrame);
+ Q_EMIT frameDataChanged();
+}
+
+void QTimelineAnimationNode::updateAnimationTarget()
+{
+ if (!m_animation)
+ return;
+ // Property should already be set to "currentFrame"
+ m_animation->setTargetObject(this);
+}
+
+QT_END_NAMESPACE
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtquicktimeline-everywhere-src-6.6.3/src/timeline/blendtrees/qtimelineanimationnode_p.h
new/qtquicktimeline-everywhere-src-6.7.0/src/timeline/blendtrees/qtimelineanimationnode_p.h
---
old/qtquicktimeline-everywhere-src-6.6.3/src/timeline/blendtrees/qtimelineanimationnode_p.h
1970-01-01 01:00:00.000000000 +0100
+++
new/qtquicktimeline-everywhere-src-6.7.0/src/timeline/blendtrees/qtimelineanimationnode_p.h
2024-03-22 19:51:21.000000000 +0100
@@ -0,0 +1,63 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#ifndef QTIMELINEANIMATIONNODE_P_H
+#define QTIMELINEANIMATIONNODE_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QObject>
+#include <QtQml>
+#include <QtQuickTimeline/private/qquicktimeline_p.h>
+#include <QtQuickTimeline/private/qquicktimelineanimation_p.h>
+#include <QtQuickTimelineBlendTrees/private/qblendtreenode_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class Q_QUICKTIMELINEBLENDTREES_EXPORT QTimelineAnimationNode : public
QBlendTreeNode
+{
+ Q_OBJECT
+ Q_PROPERTY(QQuickTimelineAnimation *animation READ animation WRITE
setAnimation NOTIFY animationChanged FINAL)
+ Q_PROPERTY(QQuickTimeline *timeline READ timeline WRITE setTimeline NOTIFY
timelineChanged FINAL)
+ Q_PROPERTY(qreal currentFrame READ currentFrame WRITE setCurrentFrame
NOTIFY currentFrameChanged FINAL)
+ QML_NAMED_ELEMENT(TimelineAnimationNode)
+public:
+ explicit QTimelineAnimationNode(QObject *parent = nullptr);
+
+ QQuickTimelineAnimation *animation() const;
+ void setAnimation(QQuickTimelineAnimation *newAnimation);
+
+ QQuickTimeline *timeline() const;
+ void setTimeline(QQuickTimeline *newTimeline);
+
+ qreal currentFrame() const;
+ void setCurrentFrame(qreal newCurrentFrame);
+
+Q_SIGNALS:
+ void animationChanged();
+ void timelineChanged();
+ void currentFrameChanged();
+
+private:
+ void updateFrameData();
+ void updateAnimationTarget();
+ QQuickTimelineAnimation *m_animation = nullptr;
+ QQuickTimeline *m_timeline = nullptr;
+ qreal m_currentFrame = -1.0;
+
+ QMetaObject::Connection m_animationDestroyedConnection;
+ QMetaObject::Connection m_timelineDestroyedConnection;
+};
+
+QT_END_NAMESPACE
+
+#endif // QTIMELINEANIMATIONNODE_P_H
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtquicktimeline-everywhere-src-6.6.3/src/timeline/blendtrees/qtquicktimelineblendtreesglobal.h
new/qtquicktimeline-everywhere-src-6.7.0/src/timeline/blendtrees/qtquicktimelineblendtreesglobal.h
---
old/qtquicktimeline-everywhere-src-6.6.3/src/timeline/blendtrees/qtquicktimelineblendtreesglobal.h
1970-01-01 01:00:00.000000000 +0100
+++
new/qtquicktimeline-everywhere-src-6.7.0/src/timeline/blendtrees/qtquicktimelineblendtreesglobal.h
2024-03-22 19:51:21.000000000 +0100
@@ -0,0 +1,10 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#ifndef QTQUICKTIMELINEBLENDTREESGLOBAL_H
+#define QTQUICKTIMELINEBLENDTREESGLOBAL_H
+
+#include <QtCore/qglobal.h>
+#include <QtQuickTimelineBlendTrees/qtquicktimelineblendtreesexports.h>
+
+#endif // QTQUICKTIMELINEBLENDTREESGLOBAL_H
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtquicktimeline-everywhere-src-6.6.3/src/timeline/blendtrees/qtquicktimelineblendtreesglobal_p.h
new/qtquicktimeline-everywhere-src-6.7.0/src/timeline/blendtrees/qtquicktimelineblendtreesglobal_p.h
---
old/qtquicktimeline-everywhere-src-6.6.3/src/timeline/blendtrees/qtquicktimelineblendtreesglobal_p.h
1970-01-01 01:00:00.000000000 +0100
+++
new/qtquicktimeline-everywhere-src-6.7.0/src/timeline/blendtrees/qtquicktimelineblendtreesglobal_p.h
2024-03-22 19:51:21.000000000 +0100
@@ -0,0 +1,21 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#ifndef QTQUICKTIMELINEBLENDTREESGLOBAL_P_H
+#define QTQUICKTIMELINEBLENDTREESGLOBAL_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "qtquicktimelineblendtreesglobal.h"
+#include
<QtQuickTimelineBlendTrees/private/qtquicktimelineblendtreesexports_p.h>
+
+#endif // QTQUICKTIMELINEBLENDTREESGLOBAL_P_H
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtquicktimeline-everywhere-src-6.6.3/src/timeline/doc/src/qtquicktimeline-module-qml.qdoc
new/qtquicktimeline-everywhere-src-6.7.0/src/timeline/doc/src/qtquicktimeline-module-qml.qdoc
---
old/qtquicktimeline-everywhere-src-6.6.3/src/timeline/doc/src/qtquicktimeline-module-qml.qdoc
2024-03-19 00:52:58.000000000 +0100
+++
new/qtquicktimeline-everywhere-src-6.7.0/src/timeline/doc/src/qtquicktimeline-module-qml.qdoc
2024-03-22 19:51:21.000000000 +0100
@@ -8,10 +8,26 @@
\brief Provides QML types to use timelines and keyframes to animate Qt
Quick
user interfaces.
+ \section1 QtQuick.Timeline import
+
To import the QML types into your application, use the following import
statement in your .qml file:
\qml
import QtQuick.Timeline
\endqml
+
+ \generatelist qmltypesbymodule QtQuick.Timeline
+
+
+ \section1 QtQuick.Timeline.BlendTrees import
+
+ The \BlendTrees submodule provides QML types for blending multiple
+ \l {TimelineAnimation}s together, creating new dynamic animations.
+
+ \include qtquicktimelineblendtrees-module-qml.qdoc usage
+
+ \generatelist qmltypesbymodule QtQuick.Timeline.BlendTrees
+
+ \noautolist
*/
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtquicktimeline-everywhere-src-6.6.3/src/timeline/qquickkeyframe.cpp
new/qtquicktimeline-everywhere-src-6.7.0/src/timeline/qquickkeyframe.cpp
--- old/qtquicktimeline-everywhere-src-6.6.3/src/timeline/qquickkeyframe.cpp
2024-03-19 00:52:58.000000000 +0100
+++ new/qtquicktimeline-everywhere-src-6.7.0/src/timeline/qquickkeyframe.cpp
2024-03-22 19:51:21.000000000 +0100
@@ -10,7 +10,6 @@
#include <QtCore/QVariantAnimation>
#include <QtCore/qmath.h>
#include <QtGui/qpainter.h>
-#include <QtQuick/private/qquickitem_p.h>
#include <QtQml/QQmlProperty>
#include <QtQml/QQmlFile>
#include <QtQml/QQmlContext>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtquicktimeline-everywhere-src-6.6.3/src/timeline/qquicktimeline.cpp
new/qtquicktimeline-everywhere-src-6.7.0/src/timeline/qquicktimeline.cpp
--- old/qtquicktimeline-everywhere-src-6.6.3/src/timeline/qquicktimeline.cpp
2024-03-19 00:52:58.000000000 +0100
+++ new/qtquicktimeline-everywhere-src-6.7.0/src/timeline/qquicktimeline.cpp
2024-03-22 19:51:21.000000000 +0100
@@ -5,7 +5,6 @@
#include <QtCore/qmath.h>
#include <QtGui/qpainter.h>
-#include <QtQuick/private/qquickitem_p.h>
QT_BEGIN_NAMESPACE
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/qtquicktimeline-everywhere-src-6.6.3/sync.profile
new/qtquicktimeline-everywhere-src-6.7.0/sync.profile
--- old/qtquicktimeline-everywhere-src-6.6.3/sync.profile 2024-03-19
00:52:58.000000000 +0100
+++ new/qtquicktimeline-everywhere-src-6.7.0/sync.profile 1970-01-01
01:00:00.000000000 +0100
@@ -1,5 +0,0 @@
-%modules = ( # path to module name map
- "QtQuickTimeline" => "$basedir/src/timeline",
-);
-%moduleheaders = ( # restrict the module headers to those found in relative
path
-);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtquicktimeline-everywhere-src-6.6.3/tests/auto/CMakeLists.txt
new/qtquicktimeline-everywhere-src-6.7.0/tests/auto/CMakeLists.txt
--- old/qtquicktimeline-everywhere-src-6.6.3/tests/auto/CMakeLists.txt
2024-03-19 00:52:58.000000000 +0100
+++ new/qtquicktimeline-everywhere-src-6.7.0/tests/auto/CMakeLists.txt
2024-03-22 19:51:21.000000000 +0100
@@ -4,3 +4,4 @@
# Generated from auto.pro.
add_subdirectory(qtquicktimeline)
+add_subdirectory(qtquicktimeline_blendtrees)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtquicktimeline-everywhere-src-6.6.3/tests/auto/qtquicktimeline_blendtrees/CMakeLists.txt
new/qtquicktimeline-everywhere-src-6.7.0/tests/auto/qtquicktimeline_blendtrees/CMakeLists.txt
---
old/qtquicktimeline-everywhere-src-6.6.3/tests/auto/qtquicktimeline_blendtrees/CMakeLists.txt
1970-01-01 01:00:00.000000000 +0100
+++
new/qtquicktimeline-everywhere-src-6.7.0/tests/auto/qtquicktimeline_blendtrees/CMakeLists.txt
2024-03-22 19:51:21.000000000 +0100
@@ -0,0 +1,26 @@
+# Copyright (C) 2023 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+# Collect test data
+file(GLOB_RECURSE test_data
+ RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
+ data/*
+)
+
+qt_internal_add_test(tst_blendtrees
+ SOURCES
+ tst_blendtrees.cpp
+ DEFINES
+ SRCDIR="${CMAKE_CURRENT_SOURCE_DIR}/"
+ LIBRARIES
+ Qt::Gui
+ Qt::Qml
+ Qt::QmlPrivate
+ Qt::Quick
+ Qt::QuickPrivate
+ TESTDATA ${test_data}
+)
+
+if(QT_BUILD_STANDALONE_TESTS)
+ qt_import_qml_plugins(tst_blendtrees)
+endif()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtquicktimeline-everywhere-src-6.6.3/tests/auto/qtquicktimeline_blendtrees/data/BlendTreeTest.qml
new/qtquicktimeline-everywhere-src-6.7.0/tests/auto/qtquicktimeline_blendtrees/data/BlendTreeTest.qml
---
old/qtquicktimeline-everywhere-src-6.6.3/tests/auto/qtquicktimeline_blendtrees/data/BlendTreeTest.qml
1970-01-01 01:00:00.000000000 +0100
+++
new/qtquicktimeline-everywhere-src-6.7.0/tests/auto/qtquicktimeline_blendtrees/data/BlendTreeTest.qml
2024-03-22 19:51:21.000000000 +0100
@@ -0,0 +1,175 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import QtQuick
+import QtQuick.Timeline
+import QtQuick.Timeline.BlendTrees
+
+Item {
+ Item {
+ width: 480
+ height: 480
+
+ TimelineAnimation {
+ objectName: "animation1"
+ id: animation1
+ duration: 20000
+ loops: -1
+ from: 0
+ to: 100
+ }
+ TimelineAnimation {
+ objectName: "animation2"
+ id: animation2
+ duration: 20000
+ loops: -1
+ from: 100
+ to: 200
+ }
+
+ Timeline {
+ id: timeline
+ objectName: "timeline"
+
+ enabled: true
+
+ KeyframeGroup {
+ objectName: "group01"
+ target: rectangle
+ property: "x"
+
+ Keyframe {
+ frame: 0
+ value: 0
+ }
+
+ Keyframe {
+ objectName: "keyframe"
+ frame: 50
+ value: 100
+ }
+
+ Keyframe {
+ frame: 100
+ value: 200
+ }
+
+ Keyframe {
+ frame: 150
+ value: 100
+ }
+
+ Keyframe {
+ frame: 200
+ value: 0
+ }
+ }
+
+ KeyframeGroup {
+ target: rectangle
+ property: "y"
+
+ Keyframe {
+ frame: 0
+ value: 0
+ }
+
+ Keyframe {
+ frame: 50
+ value: 100
+ }
+
+ Keyframe {
+ objectName: "easingBounce"
+ frame: 100
+ value: 200
+ easing.type: Easing.InBounce
+ }
+
+ Keyframe {
+ frame: 150
+ value: 300
+ }
+
+ Keyframe {
+ frame: 200
+ value: 400
+ }
+ }
+
+ KeyframeGroup {
+ target: rectangle
+ property: "color"
+
+ Keyframe {
+ frame: 0
+ value: "red"
+ }
+
+ Keyframe {
+ frame: 50
+ value: "blue"
+ }
+
+ Keyframe {
+ frame: 100
+ value: "yellow"
+ }
+
+ Keyframe {
+ frame: 150
+ value: "cyan"
+ }
+
+ Keyframe {
+ frame: 200
+ value: "magenta"
+ }
+ }
+ }
+
+ TimelineAnimationNode {
+ id: animation1Node
+ objectName: "animation1Node"
+ timeline: timeline
+ animation: animation1
+ }
+
+ TimelineAnimationNode {
+ id: animation2Node
+ objectName: "animation2Node"
+ timeline: timeline
+ animation: animation2
+ }
+
+ BlendAnimationNode {
+ id: animationBlendNode
+ objectName: "blendAnimation"
+ source1: animation1Node
+ source2: animation2Node
+ weight: 0.5
+ outputEnabled: true
+ }
+
+ Rectangle {
+ id: rectangle
+
+ objectName: "rectangle"
+
+ width: 20
+ height: 20
+ color: "red"
+ }
+
+ AnimationController {
+ id: animation1Controller
+ objectName: "animation1Controller"
+ animation: animation1
+ }
+ AnimationController {
+ id: animation2Controller
+ objectName: "animation2Controller"
+ animation: animation2
+ }
+ }
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtquicktimeline-everywhere-src-6.6.3/tests/auto/qtquicktimeline_blendtrees/tst_blendtrees.cpp
new/qtquicktimeline-everywhere-src-6.7.0/tests/auto/qtquicktimeline_blendtrees/tst_blendtrees.cpp
---
old/qtquicktimeline-everywhere-src-6.6.3/tests/auto/qtquicktimeline_blendtrees/tst_blendtrees.cpp
1970-01-01 01:00:00.000000000 +0100
+++
new/qtquicktimeline-everywhere-src-6.7.0/tests/auto/qtquicktimeline_blendtrees/tst_blendtrees.cpp
2024-03-22 19:51:21.000000000 +0100
@@ -0,0 +1,284 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#include <QtTest/QtTest>
+#include <QtQml/qqmlengine.h>
+#include <QtQml/qqmlcomponent.h>
+
+#include <QEasingCurve>
+#include <QVector3D>
+
+inline QUrl testFileUrl(const QString &fileName)
+{
+ static const QString dir = QTest::qFindTestData("data");
+
+ QString result = dir;
+ result += QLatin1Char('/');
+ result += fileName;
+
+ return QUrl::fromLocalFile(result);
+}
+
+class Tst_BlendTrees : public QObject
+{
+ Q_OBJECT
+
+private Q_SLOTS:
+ void checkImport();
+ void testBlendAnimationNode();
+
+};
+
+
+
+void Tst_BlendTrees::checkImport()
+{
+ QQmlEngine engine;
+ QQmlComponent component(&engine);
+ component.setData("import QtQuick; import QtQuick.Timeline; import
QtQuick.Timeline.BlendTrees; Item { }", QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY2(!object.isNull(), qPrintable(component.errorString()));
+}
+
+void Tst_BlendTrees::testBlendAnimationNode()
+{
+ QQmlEngine engine;
+ QQmlComponent component(&engine);
+ component.loadUrl(testFileUrl("BlendTreeTest.qml"));
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY2(!object.isNull(), qPrintable(component.errorString()));
+
+ // Get all of the necessary objects
+ auto *timeline = object->findChild<QObject * >("timeline");
+ auto *timelineAnimation1 = object->findChild<QObject *>("animation1");
+ QVERIFY2(timelineAnimation1, "Could not find animation1");
+ auto *timelineAnimation2 = object->findChild<QObject *>("animation2");
+ QVERIFY2(timelineAnimation2, "Could not find animation2");
+ auto *animation1Node = object->findChild<QObject *>("animation1Node");
+ QVERIFY2(animation1Node, "Could not find animation1Node");
+ auto *animation2Node = object->findChild<QObject *>("animation2Node");
+ QVERIFY2(animation2Node, "Could not find animation2Node");
+ auto *blendAnimation = object->findChild<QObject *>("blendAnimation");
+ QVERIFY2(blendAnimation, "Could not find blendAnimation");
+ auto *rectangle = object->findChild<QObject *>("rectangle");
+ QVERIFY2(rectangle, "Could not find rectangle");
+ auto *animation1Controller = object->findChild<QObject
*>("animation1Controller");
+ QVERIFY2(animation1Controller, "Could not find animation1Controller");
+ auto *animation2Controller = object->findChild<QObject
*>("animation2Controller");
+ QVERIFY2(animation2Controller, "Could not find animation2Controller");
+
+
+ // At this point nothing should be happening because the animations have
controllers
+ // attached to this which forces them to always be paused. Starting
states is:
+ // animation1Node.currentFrame == 0
+ // animation2Node.currentFrame == 100
+ // rectangle.x = 100
+ // rectangle.y = 100
+ // rectangle.color = #ff7f00
+
+ QCOMPARE(animation1Node->property("currentFrame").toInt(), 0);
+ QCOMPARE(animation2Node->property("currentFrame").toInt(), 100);
+ QCOMPARE(rectangle->property("x").toInt(), 100);
+ QCOMPARE(rectangle->property("y").toInt(), 100);
+ QCOMPARE(rectangle->property("color").value<QColor>(), QColor("#ff7f00"));
+
+ // Push animation1 to end
+ // Should be a blend of 50% blend of animation1 and and 50% blend of
animation2
+ // animation 1 should be at frame 100 (100%)
+ // animation 2 should be at frame 100 (0%)
+ animation1Controller->setProperty("progress", 1.0f);
+ QCOMPARE(animation1Node->property("currentFrame").toInt(), 100);
+ QCOMPARE(animation2Node->property("currentFrame").toInt(), 100);
+ QCOMPARE(rectangle->property("x").toInt(), 200);
+ QCOMPARE(rectangle->property("y").toInt(), 200);
+ QCOMPARE(rectangle->property("color").value<QColor>(), QColor("#ffff00"));
+
+ // Push animation2 to end
+ // Should be a blend of 50% blend of animation1 and and 50% blend of
animation2
+ // animation 1 should be at frame 100 (100%)
+ // animation 2 should be at frame 200 (100%)
+ animation2Controller->setProperty("progress", 1.0f);
+ QCOMPARE(animation1Node->property("currentFrame").toInt(), 100);
+ QCOMPARE(animation2Node->property("currentFrame").toInt(), 200);
+ QCOMPARE(rectangle->property("x").toInt(), 100);
+ QCOMPARE(rectangle->property("y").toInt(), 300);
+ QCOMPARE(rectangle->property("color").value<QColor>(), QColor("#ff7f7f"));
+
+ // Change weight to 0.0
+ // Should be a blend of 100% blend of animation1 and and 0% blend of
animation2
+ // animation 1 should be at frame 100 (100%)
+ // animation 2 should be at frame 200 (100%)
+ blendAnimation->setProperty("weight", 0.0f);
+ QCOMPARE(animation1Node->property("currentFrame").toInt(), 100);
+ QCOMPARE(animation2Node->property("currentFrame").toInt(), 200);
+ QCOMPARE(rectangle->property("x").toInt(), 200);
+ QCOMPARE(rectangle->property("y").toInt(), 200);
+ QCOMPARE(rectangle->property("color").value<QColor>(), QColor("#ffff00"));
+
+ // Change weight to 1.0
+ // Should be a blend of 0% blend of animation1 and and 100% blend of
animation2
+ // animation 1 should be at frame 100 (100%)
+ // animation 2 should be at frame 200 (100%)
+ blendAnimation->setProperty("weight", 1.0f);
+ QCOMPARE(animation1Node->property("currentFrame").toInt(), 100);
+ QCOMPARE(animation2Node->property("currentFrame").toInt(), 200);
+ QCOMPARE(rectangle->property("x").toInt(), 0);
+ QCOMPARE(rectangle->property("y").toInt(), 400);
+ QCOMPARE(rectangle->property("color").value<QColor>(), QColor("#ff00ff"));
+
+ // Change animation1 to start (should be the same as previous)
+ // Should be a blend of 0% blend of animation1 and and 100% blend of
animation2
+ // animation 1 should be at frame 0 (0%)
+ // animation 2 should be at frame 200 (100%)
+ animation1Controller->setProperty("progress", 0.0f);
+ QCOMPARE(animation1Node->property("currentFrame").toInt(), 0);
+ QCOMPARE(animation2Node->property("currentFrame").toInt(), 200);
+ QCOMPARE(rectangle->property("x").toInt(), 0);
+ QCOMPARE(rectangle->property("y").toInt(), 400);
+ QCOMPARE(rectangle->property("color").value<QColor>(), QColor("#ff00ff"));
+
+ // Change weight to 0.0
+ // Should be a blend of 100% blend of animation1 and and 0% blend of
animation2
+ // animation 1 should be at frame 0 (0%)
+ // animation 2 should be at frame 200 (100%)
+ blendAnimation->setProperty("weight", 0.0f);
+ QCOMPARE(animation1Node->property("currentFrame").toInt(), 0);
+ QCOMPARE(animation2Node->property("currentFrame").toInt(), 200);
+ QCOMPARE(rectangle->property("x").toInt(), 0);
+ QCOMPARE(rectangle->property("y").toInt(), 0);
+ QCOMPARE(rectangle->property("color").value<QColor>(), QColor("#ff0000"));
+
+ // Change animation2 to start (should be the same as previous)
+ // Should be a blend of 100% blend of animation1 and and 0% blend of
animation2
+ // animation 1 should be at frame 0 (0%)
+ // animation 2 should be at frame 100 (0%)
+ animation2Controller->setProperty("progress", 0.0f);
+ QCOMPARE(animation1Node->property("currentFrame").toInt(), 0);
+ QCOMPARE(animation2Node->property("currentFrame").toInt(), 100);
+ QCOMPARE(rectangle->property("x").toInt(), 0);
+ QCOMPARE(rectangle->property("y").toInt(), 0);
+ QCOMPARE(rectangle->property("color").value<QColor>(), QColor("#ff0000"));
+
+ // Disable committing of changes by animationBlendNode
+ blendAnimation->setProperty("outputEnabled", false);
+ // Now changing either animation progress or weight should have no effect
on the scene
+ animation1Controller->setProperty("progress", 1.0f);
+ QCOMPARE(animation1Node->property("currentFrame").toInt(), 100);
+ QCOMPARE(animation2Node->property("currentFrame").toInt(), 100);
+ QCOMPARE(rectangle->property("x").toInt(), 0);
+ QCOMPARE(rectangle->property("y").toInt(), 0);
+ QCOMPARE(rectangle->property("color").value<QColor>(), QColor("#ff0000"));
+
+ animation2Controller->setProperty("progress", 1.0f);
+ QCOMPARE(animation1Node->property("currentFrame").toInt(), 100);
+ QCOMPARE(animation2Node->property("currentFrame").toInt(), 200);
+ QCOMPARE(rectangle->property("x").toInt(), 0);
+ QCOMPARE(rectangle->property("y").toInt(), 0);
+ QCOMPARE(rectangle->property("color").value<QColor>(), QColor("#ff0000"));
+
+ blendAnimation->setProperty("weight", 0.5f);
+ QCOMPARE(animation1Node->property("currentFrame").toInt(), 100);
+ QCOMPARE(animation2Node->property("currentFrame").toInt(), 200);
+ QCOMPARE(rectangle->property("x").toInt(), 0);
+ QCOMPARE(rectangle->property("y").toInt(), 0);
+ QCOMPARE(rectangle->property("color").value<QColor>(), QColor("#ff0000"));
+
+ // re-enable committing of changes by animationBlendNode
+ // This should cause the animation to blend to the new state
+ blendAnimation->setProperty("outputEnabled", true);
+ QCOMPARE(animation1Node->property("currentFrame").toInt(), 100);
+ QCOMPARE(animation2Node->property("currentFrame").toInt(), 200);
+ QCOMPARE(rectangle->property("x").toInt(), 100);
+ QCOMPARE(rectangle->property("y").toInt(), 300);
+ QCOMPARE(rectangle->property("color").value<QColor>(), QColor("#ff7f7f"));
+
+ // Test disconnecting animation1
+ blendAnimation->setProperty("source1", QVariant());
+
+ animation1Controller->setProperty("progress", 0.0f);
+ QCOMPARE(animation1Node->property("currentFrame").toInt(), 0);
+ QCOMPARE(animation2Node->property("currentFrame").toInt(), 200);
+ QCOMPARE(rectangle->property("x").toInt(), 100);
+ QCOMPARE(rectangle->property("y").toInt(), 300);
+ QCOMPARE(rectangle->property("color").value<QColor>(), QColor("#ff7f7f"));
+
+ // Test disconnecting animation2
+ blendAnimation->setProperty("source2", QVariant());
+ animation2Controller->setProperty("progress", 0.0f);
+ QCOMPARE(animation1Node->property("currentFrame").toInt(), 0);
+ QCOMPARE(animation2Node->property("currentFrame").toInt(), 100);
+ QCOMPARE(rectangle->property("x").toInt(), 100);
+ QCOMPARE(rectangle->property("y").toInt(), 300);
+ QCOMPARE(rectangle->property("color").value<QColor>(), QColor("#ff7f7f"));
+
+ // Disable committing of changes by animationBlendNode
+ blendAnimation->setProperty("outputEnabled", false);
+
+ // Try outputting dirrectly from animation1
+ animation1Node->setProperty("outputEnabled", true);
+ // Should have changed to be the value of animation1 at frame 0
+ QCOMPARE(rectangle->property("x").toInt(), 0);
+ QCOMPARE(rectangle->property("y").toInt(), 0);
+ QCOMPARE(rectangle->property("color").value<QColor>(), QColor("#ff0000"));
+
+ animation1Controller->setProperty("progress", 1.0f);
+ // Should have changed to be the value of animation1 at frame 100
+ QCOMPARE(rectangle->property("x").toInt(), 200);
+ QCOMPARE(rectangle->property("y").toInt(), 200);
+ QCOMPARE(rectangle->property("color").value<QColor>(), QColor("#ffff00"));
+
+ // Disable outputting dirrectly from animation1
+ animation1Node->setProperty("outputEnabled", false);
+ // Try outputting dirrectly from animation2
+ animation2Node->setProperty("outputEnabled", true);
+ // Nothing should have changed since both would be at frame 100 anyway
+ QCOMPARE(animation1Node->property("currentFrame").toInt(), 100);
+ QCOMPARE(animation2Node->property("currentFrame").toInt(), 100);
+ QCOMPARE(rectangle->property("x").toInt(), 200);
+ QCOMPARE(rectangle->property("y").toInt(), 200);
+ QCOMPARE(rectangle->property("color").value<QColor>(), QColor("#ffff00"));
+
+ animation2Controller->setProperty("progress", 1.0f);
+ QCOMPARE(animation1Node->property("currentFrame").toInt(), 100);
+ QCOMPARE(animation2Node->property("currentFrame").toInt(), 200);
+ QCOMPARE(rectangle->property("x").toInt(), 0);
+ QCOMPARE(rectangle->property("y").toInt(), 400);
+ QCOMPARE(rectangle->property("color").value<QColor>(), QColor("#ff00ff"));
+
+ // Try breaking animation2Node's connection to timeline (the source of
frame data)
+ // currentFrame should change but the output should not
+ animation2Node->setProperty("timeline", QVariant());
+ animation2Controller->setProperty("progress", 0.0f);
+ QCOMPARE(animation2Node->property("currentFrame").toInt(), 100);
+ QCOMPARE(rectangle->property("x").toInt(), 0);
+ QCOMPARE(rectangle->property("y").toInt(), 400);
+ QCOMPARE(rectangle->property("color").value<QColor>(), QColor("#ff00ff"));
+
+ // reattach the timeline
+ animation2Node->setProperty("timeline", QVariant::fromValue(timeline));
+ // Should update the output now that we can fetch frameData for frame 100
+ QCOMPARE(animation2Node->property("currentFrame").toInt(), 100);
+ QCOMPARE(rectangle->property("x").toInt(), 200);
+ QCOMPARE(rectangle->property("y").toInt(), 200);
+ QCOMPARE(rectangle->property("color").value<QColor>(), QColor("#ffff00"));
+
+ // Try breaking animation2Node's connection to animation
+ animation2Node->setProperty("animation", QVariant());
+ animation2Controller->setProperty("progress", 1.0f);
+ QCOMPARE(rectangle->property("x").toInt(), 200);
+ QCOMPARE(rectangle->property("y").toInt(), 200);
+ QCOMPARE(rectangle->property("color").value<QColor>(), QColor("#ffff00"));
+
+ // reattach the animation
+ animation2Node->setProperty("animation",
QVariant::fromValue(timelineAnimation2));
+ // Should update the output now that we can fetch frameData for frame 200
+ QCOMPARE(rectangle->property("x").toInt(), 0);
+ QCOMPARE(rectangle->property("y").toInt(), 400);
+ QCOMPARE(rectangle->property("color").value<QColor>(), QColor("#ff00ff"));
+}
+
+QTEST_MAIN(Tst_BlendTrees)
+
+#include "tst_blendtrees.moc"