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"

Reply via email to