Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qquicktransformgroup.cpp
Go to the documentation of this file.
1// Copyright (C) 2025 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
5#include <QtQuick/private/qquickitem_p.h>
6
8
9/*!
10 \qmltype TransformGroup
11 \inqmlmodule QtQuick.VectorImage.Helpers
12 \brief Provides specialization for sequences of transforms.
13
14 This type allows specific specializations for sequences of transform operations required
15 for VectorImage.
16*/
17
18namespace {
19
21{
22public:
23 DummyQuickItem(QQuickTransformGroup *group) : m_group(group) {}
24
25 virtual void itemChange(ItemChange ic, const ItemChangeData &) override
26 {
27 if (ic == ItemTransformHasChanged)
28 m_group->triggerUpdate();
29 }
30
31private:
32 QQuickTransformGroup *m_group = nullptr;
33};
34
35}
36
37QQuickTransformGroup::QQuickTransformGroup(QObject *parent)
38 : QQuickTransform(parent)
39{
40 m_dummyItem = new DummyQuickItem(this);
41}
42
43QQuickTransformGroup::~QQuickTransformGroup()
44{
45 delete m_dummyItem;
46}
47
48void QQuickTransformGroup::activateOverride(QQuickTransform *xform)
49{
50 m_transformFlags[xform] |= Override;
51 update();
52}
53
54void QQuickTransformGroup::triggerUpdate()
55{
56 update();
57}
58
59void QQuickTransformGroup::deactivateOverride(QQuickTransform *xform)
60{
61 m_transformFlags[xform] &= ~Override;
62 update();
63}
64
65void QQuickTransformGroup::deactivate(QQuickTransform *xform)
66{
67 m_transformFlags[xform] |= Disabled;
68 update();
69}
70
71void QQuickTransformGroup::applyTo(QMatrix4x4 *matrix) const
72{
73 QVarLengthArray<QQuickTransform *, 8> activeTransforms;
74 for (QQuickTransform *xform : m_transforms) {
75 int flags = m_transformFlags.value(xform);
76 if (!(flags & Disabled)) {
77 activeTransforms.append(xform);
78 if (flags & Override)
79 break;
80 }
81 }
82
83 // Apply in reverse order
84 for (auto it = activeTransforms.crbegin(); it != activeTransforms.crend(); ++it)
85 (*it)->applyTo(matrix);
86}
87
88QQmlListProperty<QQuickTransform> QQuickTransformGroup::transformSequence()
89{
90 return QQmlListProperty<QQuickTransform>(this,
91 nullptr,
92 transformSequence_append,
93 transformSequence_count,
94 transformSequence_at,
95 transformSequence_clear);
96}
97
98void QQuickTransformGroup::transformSequence_append(QQmlListProperty<QQuickTransform> *prop,
99 QQuickTransform *transform)
100{
101 if (!transform)
102 return;
103
104 QQuickTransformGroup *that = static_cast<QQuickTransformGroup *>(prop->object);
105 that->m_transforms.append(transform);
106 that->update();
107
108 transform->appendToItem(that->m_dummyItem);
109}
110
111QQuickTransform *QQuickTransformGroup::transformSequence_at(QQmlListProperty<QQuickTransform> *prop,
112 qsizetype idx)
113{
114 QQuickTransformGroup *that = static_cast<QQuickTransformGroup *>(prop->object);
115 if (idx < 0 || idx >= that->m_transforms.size())
116 return nullptr;
117 else
118 return that->m_transforms.at(idx);
119}
120
121void QQuickTransformGroup::transformSequence_clear(QQmlListProperty<QQuickTransform> *prop)
122{
123 QQuickTransformGroup *that = static_cast<QQuickTransformGroup *>(prop->object);
124 that->m_transforms.clear();
125 that->update();
126}
127
128qsizetype QQuickTransformGroup::transformSequence_count(QQmlListProperty<QQuickTransform> *prop)
129{
130 QQuickTransformGroup *that = static_cast<QQuickTransformGroup *>(prop->object);
131 return that->m_transforms.size();
132}
133
134QT_END_NAMESPACE
DummyQuickItem(QQuickTransformGroup *group)
virtual void itemChange(ItemChange ic, const ItemChangeData &) override
Called when change occurs for this item.