1/****************************************************************************
2**
3** Copyright (C) 2017 Klaralvdalens Datakonsult AB (KDAB).
4** Contact: http://www.qt-project.org/legal
5**
6** This file is part of the Qt3D module of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:LGPL3$
9** Commercial License Usage
10** Licensees holding valid commercial Qt licenses may use this file in
11** accordance with the commercial license agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and The Qt Company. For licensing terms
14** and conditions see http://www.qt.io/terms-conditions. For further
15** information use the contact form at http://www.qt.io/contact-us.
16**
17** GNU Lesser General Public License Usage
18** Alternatively, this file may be used under the terms of the GNU Lesser
19** General Public License version 3 as published by the Free Software
20** Foundation and appearing in the file LICENSE.LGPLv3 included in the
21** packaging of this file. Please review the following information to
22** ensure the GNU Lesser General Public License version 3 requirements
23** will be met: https://www.gnu.org/licenses/lgpl.html.
24**
25** GNU General Public License Usage
26** Alternatively, this file may be used under the terms of the GNU
27** General Public License version 2.0 or later as published by the Free
28** Software Foundation and appearing in the file LICENSE.GPL included in
29** the packaging of this file. Please review the following information to
30** ensure the GNU General Public License version 2.0 requirements will be
31** met: http://www.gnu.org/licenses/gpl-2.0.html.
32**
33** $QT_END_LICENSE$
34**
35****************************************************************************/
36
37#include "qchannelmapper.h"
38#include "qchannelmapper_p.h"
39#include <Qt3DAnimation/qchannelmapping.h>
40#include <Qt3DCore/qpropertynodeaddedchange.h>
41#include <Qt3DCore/qpropertynoderemovedchange.h>
42
43QT_BEGIN_NAMESPACE
44
45namespace Qt3DAnimation {
46
47QChannelMapperPrivate::QChannelMapperPrivate()
48 : Qt3DCore::QNodePrivate()
49{
50}
51
52/*!
53 \class QChannelMapper
54 \inmodule Qt3DAnimation
55 \brief Allows to map the channels within the clip onto properties of
56 objects in the application.
57
58*/
59QChannelMapper::QChannelMapper(Qt3DCore::QNode *parent)
60 : Qt3DCore::QNode(*new QChannelMapperPrivate, parent)
61{
62}
63
64QChannelMapper::QChannelMapper(QChannelMapperPrivate &dd, Qt3DCore::QNode *parent)
65 : Qt3DCore::QNode(dd, parent)
66{
67}
68
69QChannelMapper::~QChannelMapper()
70{
71}
72
73void QChannelMapper::addMapping(QAbstractChannelMapping *mapping)
74{
75 Q_ASSERT(mapping);
76 Q_D(QChannelMapper);
77 if (!d->m_mappings.contains(mapping)) {
78 d->m_mappings.append(mapping);
79
80 // Ensures proper bookkeeping
81 d->registerDestructionHelper(mapping, &QChannelMapper::removeMapping, d->m_mappings);
82
83 // We need to add it as a child of the current node if it has been declared inline
84 // Or not previously added as a child of the current node so that
85 // 1) The backend gets notified about it's creation
86 // 2) When the current node is destroyed, it gets destroyed as well
87 if (!mapping->parent())
88 mapping->setParent(this);
89
90 if (d->m_changeArbiter != nullptr) {
91 const auto change = Qt3DCore::QPropertyNodeAddedChangePtr::create(id(), mapping);
92 change->setPropertyName("mappings");
93 d->notifyObservers(change);
94 }
95 }
96}
97
98void QChannelMapper::removeMapping(QAbstractChannelMapping *mapping)
99{
100 Q_ASSERT(mapping);
101 Q_D(QChannelMapper);
102 if (d->m_changeArbiter != nullptr) {
103 const auto change = Qt3DCore::QPropertyNodeRemovedChangePtr::create(id(), mapping);
104 change->setPropertyName("mappings");
105 d->notifyObservers(change);
106 }
107 d->m_mappings.removeOne(mapping);
108 // Remove bookkeeping connection
109 d->unregisterDestructionHelper(mapping);
110}
111
112QVector<QAbstractChannelMapping *> QChannelMapper::mappings() const
113{
114 Q_D(const QChannelMapper);
115 return d->m_mappings;
116}
117
118Qt3DCore::QNodeCreatedChangeBasePtr QChannelMapper::createNodeCreationChange() const
119{
120 auto creationChange = Qt3DCore::QNodeCreatedChangePtr<QChannelMapperData>::create(this);
121 auto &data = creationChange->data;
122 Q_D(const QChannelMapper);
123 data.mappingIds = Qt3DCore::qIdsForNodes(d->m_mappings);
124 return creationChange;
125}
126
127} // namespace Qt3DAnimation
128
129QT_END_NAMESPACE
130