summaryrefslogtreecommitdiffstats
path: root/src/api/studio3d/q3dsdatainput.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/api/studio3d/q3dsdatainput.cpp')
-rw-r--r--src/api/studio3d/q3dsdatainput.cpp451
1 files changed, 451 insertions, 0 deletions
diff --git a/src/api/studio3d/q3dsdatainput.cpp b/src/api/studio3d/q3dsdatainput.cpp
new file mode 100644
index 0000000..a15f9fb
--- /dev/null
+++ b/src/api/studio3d/q3dsdatainput.cpp
@@ -0,0 +1,451 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "q3dsdatainput_p.h"
+#include "q3dspresentation_p.h"
+#include "q3dscommandqueue_p.h"
+
+#include <QtCore/qdebug.h>
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \qmltype DataInput
+ \instantiates Q3DSDataInput
+ \inqmlmodule Qt3DStudio
+ \ingroup OpenGLRuntime
+ \brief Controls a data input entry in a Qt 3D Studio presentation.
+ This class is a convenience class for controlling a data input in a presentation.
+ DataInput provides a clean contract between the presentation design and the code.
+ It hides the presentation details from the code while providing a contractual access
+ point to code for controlling aspects of the presentation (e.g. timeline of a
+ subpresentation). It also allows the design to use a single DataInput to drive
+ multiple aspects of the design (e.g. DataInput for speed can change the color of
+ the speedometer, angle of the needle).
+
+ \note There is a performance cost for each registered DataInput, so try to avoid
+ creating unnecessary DataInputs.
+
+ \sa Presentation, DataOutput, Presentation::slideExited, Presentation::slideEntered
+ \sa Presentation::customSignalEmitted
+*/
+
+/*!
+ \class Q3DSDataInput
+ \inmodule OpenGLRuntime
+ \since Qt 3D Studio 2.0
+ \brief Controls a data input entry in a Qt 3D Studio presentation.
+ This class is a convenience class for controlling a data input in a presentation.
+ DataInput provides a clean contract between the presentation design and the code.
+ It hides the presentation details from the code while providing a contractual access
+ point to code for controlling aspects of the presentation (e.g. timeline of a
+ subpresentation). It also allows the design to use a single DataInput to drive
+ multiple aspects of the design (e.g. DataInput for speed can change the color of
+ the speedometer, angle of the needle).
+
+ \note There is a performance cost for each registered DataInput, so try to avoid
+ creating unnecessary DataInputs.
+
+ For other integration points between code and presentation see:
+ \sa Q3DSPresentation::customSignalEmitted
+ \sa Q3DSPresentation::slideEntered
+ \sa Q3DSPresentation::slideExited
+ \sa Q3DSDataOutput
+
+ \sa Q3DSPresentation
+*/
+
+/*!
+ \internal
+ */
+Q3DSDataInput::Q3DSDataInput(QObject *parent)
+ : QObject(parent)
+ , d_ptr(new Q3DSDataInputPrivate(this))
+{
+}
+
+/*!
+ \internal
+ */
+Q3DSDataInput::Q3DSDataInput(const QString &name, QObject *parent)
+ : QObject(parent)
+ , d_ptr(new Q3DSDataInputPrivate(this))
+{
+ d_ptr->m_name = name;
+}
+
+/*!
+ Constructs a Q3DSDataInput instance and initializes the \a name. The
+ constructed instance is automatically associated with the specified \a
+ presentation. An optional \a parent object can be specified.
+ */
+Q3DSDataInput::Q3DSDataInput(Q3DSPresentation *presentation, const QString &name, QObject *parent)
+ : QObject(parent)
+ , d_ptr(new Q3DSDataInputPrivate(this))
+{
+ d_ptr->m_name = name;
+ d_ptr->m_presentation = presentation;
+ if (presentation)
+ presentation->registerDataInput(this);
+}
+
+/*!
+ \internal
+ */
+Q3DSDataInput::Q3DSDataInput(Q3DSDataInputPrivate *d, Q3DSPresentation *presentation,
+ const QString &name, QObject *parent)
+ : QObject(parent)
+ , d_ptr(d)
+{
+ d_ptr->m_name = name;
+ d_ptr->m_presentation = presentation;
+ if (presentation)
+ presentation->registerDataInput(this);
+}
+
+/*!
+ Destructor.
+ */
+Q3DSDataInput::~Q3DSDataInput()
+{
+ delete d_ptr;
+}
+
+/*!
+ \qmlproperty string DataInput::name
+
+ Specifies the name of the controlled data input element in the
+ presentation. The name must match a name of a data input defined
+ in the presentation. This property must be set before setting the
+ value property.
+ */
+
+/*!
+ \property Q3DSDataInput::name
+
+ Specifies the name of the controlled data input element in the
+ presentation. The name must match a name of a data input defined
+ in the presentation.
+
+ This property must be set before setting the value property.
+ The initial value is provided via the constructor, but the name
+ can also be changed later on.
+ */
+QString Q3DSDataInput::name() const
+{
+ return d_ptr->m_name;
+}
+
+void Q3DSDataInput::setName(const QString &name)
+{
+ if (d_ptr->m_name != name) {
+ d_ptr->m_name = name;
+ if (d_ptr->m_presentation)
+ d_ptr->m_presentation->registerDataInput(this);
+ Q_EMIT nameChanged();
+ }
+}
+
+/*!
+ \qmlproperty variant DataInput::value
+
+ Specifies the value of the controlled data input element in the
+ presentation.
+
+ The value of this property only accounts for changes done via the same
+ Q3DSDataInput instance. If the value of the same data input in the
+ presentation is changed elsewhere, for example via animations or
+ Q3DSPresentation::setAttribute(), those changes are not reflected in the
+ value of this property. Due to this uncertainty, this property treats all
+ value sets as changes even if the newly set value is the same value as the
+ previous value.
+
+ To get actual values from the presentation, use DataOutput.
+ \sa DataOutput
+*/
+/*!
+ \property Q3DSDataInput::value
+
+ Specifies the value of the controlled data input element in the
+ presentation.
+
+ The value of this property only accounts for changes done via the same
+ Q3DSDataInput instance. If the value of the same data input in the
+ presentation is changed elsewhere, for example via animations or
+ Q3DSPresentation::setAttribute(), those changes are not reflected in the
+ value of this property. Due to this uncertainty, this property treats all
+ value sets as changes even if the newly set value is the same value as the
+ previous value.
+
+ To get actual values from the presentation, use DataOutput.
+ \sa DataOutput
+*/
+QVariant Q3DSDataInput::value() const
+{
+ return d_ptr->m_value;
+}
+
+/*!
+ \property Q3DSDataInput::min
+
+ Contains the minimum range value for datainput. Returned value is zero
+ for datainput types other than \e {Ranged Number}.
+
+ \note This value is read-only.
+ */
+float Q3DSDataInput::min() const
+{
+ if (!d_ptr->m_presentation)
+ return 0.0f;
+
+ return d_ptr->m_presentation->d_ptr->dataInputMin(d_ptr->m_name);
+}
+
+/*!
+ \property Q3DSDataInput::max
+
+ Contains the maximum range value for datainput. Returned value is zero
+ for datainput types other than \e {Ranged Number}.
+
+ \note This value is read-only.
+ */
+float Q3DSDataInput::max() const
+{
+ if (!d_ptr->m_presentation)
+ return 0.0f;
+
+ return d_ptr->m_presentation->d_ptr->dataInputMax(d_ptr->m_name);
+}
+
+/*!
+ Returns true if presentation (or its subpresentation) associated with
+ this datainput has a datainput definition with a matching name. Returns
+ false if the datainput has no associated presentation, or if a match is not found.
+ */
+bool Q3DSDataInput::isValid() const
+{
+ if (d_ptr->m_presentation)
+ return d_ptr->m_presentation->d_ptr->isValidDataInput(this);
+ else
+ return false;
+}
+
+/*!
+ Returns the metadata defined for this datainput with metadata \a key.
+
+ Metadata is user-defined key-value table that can be used, for example, to better describe the
+ usage of, or to indicate the external data source that should be bound to this datainput.
+ Metadata has no impact on presentation rendering.
+
+ \note Datainput metadata is read-only.
+ */
+/*!
+ \qmlmethod string DataInput::metadata
+ Returns the metadata defined for this datainput with metadata \a key.
+
+ Metadata is user-defined key-value table that can be used, for example, to better describe the
+ usage of, or to indicate the external data source that should be bound to this datainput.
+ Metadata has no impact on presentation rendering.
+
+ \note Datainput metadata is read-only.
+ */
+QString Q3DSDataInput::metadata(const QString &key) const
+{
+ if (!d_ptr->m_presentation)
+ return {};
+
+ auto metadata = d_ptr->m_presentation->d_ptr->dataInputMetadata(name());
+
+ return metadata[key];
+}
+
+/*!
+ Returns the metadata keys defined for this datainput.
+
+ \sa metadata
+ */
+/*!
+ \qmlmethod var DataInput::metadataKeys
+ Returns the metadata keys defined for this datainput.
+
+ \note Datainput metadata is read-only.
+ \sa metadata
+ */
+QStringList Q3DSDataInput::metadataKeys() const
+{
+ if (!d_ptr->m_presentation)
+ return {};
+
+ return d_ptr->m_presentation->d_ptr->dataInputMetadata(name()).keys();
+}
+
+/*!
+ \brief Q3DSDataInput::setValue Set a new \a value for this data input.
+ \note For performance reasons do not call setValue unnecessarily.
+ */
+void Q3DSDataInput::setValue(const QVariant &value)
+{
+ // Since properties controlled by data inputs can change without the current value being
+ // reflected on the value of the DataInput element, we allow setting the value to the
+ // same one it was previously and still consider it a change.
+ // For example, when controlling timeline, the value set to DataInput will only be
+ // the current value for one frame if presentation has a running animation.
+ // In order to track an element property, see DataOutput API.
+ d_ptr->setValue(value, ValueRole::Value);
+ Q_EMIT valueChanged();
+}
+
+void Q3DSDataInputPrivate::setPresentation(Q3DSPresentation *presentation)
+{
+ m_presentation = presentation;
+}
+
+Q3DSDataInputPrivate::Q3DSDataInputPrivate(Q3DSDataInput *parent)
+ : q_ptr(parent)
+{
+}
+
+Q3DSDataInputPrivate::~Q3DSDataInputPrivate()
+{
+ if (m_presentation)
+ m_presentation->unregisterDataInput(q_ptr);
+}
+
+void Q3DSDataInputPrivate::setValue(const QVariant &value, Q3DSDataInput::ValueRole valueRole)
+{
+ m_value = value;
+ if (m_presentation)
+ m_presentation->setDataInputValue(m_name, m_value, valueRole);
+}
+
+void Q3DSDataInputPrivate::setViewerApp(Q3DSViewer::Q3DSViewerApp *app)
+{
+ m_viewerApp = app;
+
+ if (m_viewerApp && m_value.isValid())
+ setValue(m_value);
+}
+
+void Q3DSDataInputPrivate::setCommandQueue(CommandQueue *queue)
+{
+ m_commandQueue = queue;
+
+ if (m_commandQueue && m_value.isValid())
+ setValue(m_value);
+}
+
+
+/*!
+ \qmltype DataInput
+ \instantiates Q3DSDataInput
+ \inqmlmodule QtStudio3D
+ \ingroup OpenGLRuntime
+
+ \brief Controls a data input entry in a Qt 3D Studio presentation.
+
+ This type is a convenience for controlling a data in a presentation. Its functionality is
+ equivalent to \c{Presentation::setDataInputValue()}, however it has a big advantage
+ of being able to use QML property bindings, thus avoiding the need to having to resort
+ to a JavaScript function call for every value change.
+
+ As an example:
+
+ \qml
+ Studio3D {
+ ...
+ Presentation {
+ id: presentation
+ ...
+ property string text: ""
+ DataInput {
+ name: "inputForSomeTextNode"
+ value: presentation.text
+ }
+ }
+ }
+
+ Button {
+ onClicked: presentation.text = "Hello World"
+ }
+ \endqml
+
+ The example assumes that a data input connection was made in Qt 3D Studio
+ presentation using Qt 3D Studio editor between the \c textstring property of
+ target property and a data input name \c inputForSomeTextNode. As the value
+ is now set via a property, the full set of QML property bindings techniques
+ are available.
+
+ \sa Studio3D, Presentation
+*/
+
+/*!
+ \qmlproperty string DataInput::name
+
+ Specifies the name of the controlled data input element in the
+ presentation. This property must be set as part of DataInput declaration,
+ although it is changeable afterwards, if desired.
+*/
+
+/*!
+ \qmlproperty variant DataInput::value
+
+ Specifies the value of the controlled data input element in the presentation.
+
+ The value of this property only accounts for changes done via the same
+ DataInput instance. If the value of the underlying attribute in the
+ presentation is changed elsewhere, for example via animations or
+ Presentation::setAttribute(), those changes are not reflected in the value
+ of this property. Due to this uncertainty, this property treats all value
+ sets as changes even if the newly set value is the same value as the
+ previous value.
+*/
+
+/*!
+ \qmlproperty real DataInput::min
+
+ Contains the minimum value of the controlled data input element range.
+
+ This property is applicable only to data input type \e {Ranged Number}. For other
+ types, value returned is zero.
+
+ \note This value is read-only.
+*/
+
+/*!
+ \qmlproperty real DataInput::max
+
+ Contains the maximum value of the controlled data input element range.
+
+ This property is applicable only to data input type \e {Ranged Number}. For other
+ types, value returned is zero.
+
+ \note This value is read-only.
+*/
+
+QT_END_NAMESPACE