summaryrefslogtreecommitdiffstats
path: root/src/runtime/q3dsslideplayer_p.h
diff options
context:
space:
mode:
authorChristian Strømme <christian.stromme@qt.io>2018-01-10 17:28:04 +0100
committerLaszlo Agocs <laszlo.agocs@qt.io>2018-02-14 09:01:47 +0000
commit44455c051ba17b71d6d0699e3a1601e6c949b896 (patch)
tree4ca4ca114e4c83bc2e33f906c368403c9a233b18 /src/runtime/q3dsslideplayer_p.h
parente2b0f98b63ac0e2b89bce40d96940e91abcaf6d8 (diff)
Add slide player
This adds logic for handling slides and their animations. Change-Id: I368d16fd2164dca41931ee2b566b16d5098a99ad Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
Diffstat (limited to 'src/runtime/q3dsslideplayer_p.h')
-rw-r--r--src/runtime/q3dsslideplayer_p.h286
1 files changed, 286 insertions, 0 deletions
diff --git a/src/runtime/q3dsslideplayer_p.h b/src/runtime/q3dsslideplayer_p.h
new file mode 100644
index 0000000..3984d69
--- /dev/null
+++ b/src/runtime/q3dsslideplayer_p.h
@@ -0,0 +1,286 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: http://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$
+**
+****************************************************************************/
+
+#ifndef Q3DSSLIDEPLAYER_P_H
+#define Q3DSSLIDEPLAYER_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of a number of Qt sources files. This header file may change from
+// version to version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QObject>
+
+#include "q3dsuippresentation_p.h"
+#include "q3dsscenemanager_p.h"
+#include <QtCore/qvector.h>
+
+QT_BEGIN_NAMESPACE
+
+class Q3DSAnimationManager;
+class Q3DSSlideDeck;
+
+class Q3DSV_PRIVATE_EXPORT Q3DSSlidePlayer : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(Q3DSSlideDeck *slideDeck READ slideDeck WRITE setSlideDeck NOTIFY slideDeckChanged)
+ Q_PROPERTY(float duration READ duration NOTIFY durationChanged)
+ Q_PROPERTY(float position READ position NOTIFY positionChanged)
+
+public:
+ enum class PlayerState
+ {
+ Idle,
+ Ready,
+ Stopped,
+ Playing,
+ Paused
+ };
+ Q_ENUM(PlayerState)
+
+ enum class PlayerMode
+ {
+ Viewer,
+ Editor
+ };
+ Q_ENUM(PlayerMode)
+
+ enum class PlayerType
+ {
+ Slide,
+ ComponentSlide
+ };
+ Q_ENUM(PlayerType)
+
+ Q3DSSlidePlayer(Q3DSAnimationManager *animationManager,
+ Q3DSSceneManager *sceneManager,
+ QObject *parent = nullptr);
+ ~Q3DSSlidePlayer();
+
+ Q3DSSlideDeck *slideDeck() const;
+ float duration() const;
+ float position() const;
+ PlayerState state() const { return m_data.state; }
+
+ void setMode(PlayerMode mode);
+ PlayerMode mode() const { return m_mode; }
+
+public Q_SLOTS:
+ void play();
+ void stop();
+ void pause();
+ void seek(float);
+ void setSlideDeck(Q3DSSlideDeck *slideDeck);
+ void setPlaybackRate(float rate);
+ void nextSlide();
+ void previousSlide();
+ void reload();
+
+Q_SIGNALS:
+ void slideDeckChanged(Q3DSSlideDeck *slideDeck);
+ void durationChanged(float duration);
+ void positionChanged(float position);
+ void stateChanged(PlayerState state);
+ void slideChanged(Q3DSSlide *);
+
+private:
+ Q3DSSlidePlayer(Q3DSAnimationManager *animationManager,
+ Q3DSSceneManager *sceneManager,
+ Q3DSComponentNode *component,
+ Q3DSSlide *parentSlide,
+ QObject *parent = nullptr);
+
+ Q3DSSlidePlayer *aquireComponentPlayer(Q3DSComponentNode *component, Q3DSSlide *parent);
+
+ void init();
+ void reset();
+ void setInternalState(PlayerState state);
+ void onDurationChanged(float duration);
+ Q_INVOKABLE void onSlideFinished(void *slide);
+
+ void handleCurrentSlideChanged(Q3DSSlide *slide, Q3DSSlide *previousSlide);
+
+ // TODO: Move out to a "slide manager"?
+ void updateSlideVisibility(Q3DSSlide *slide, bool visible);
+ bool isSlideVisible(Q3DSSlide *slide);
+
+ struct Data {
+ Q3DSSlideDeck *slideDeck = nullptr;
+ PlayerState state = PlayerState::Idle;
+ float position = 0.0f;
+ float duration = 0.0f;
+ float playbackRate = 1.0f;
+ int loopCount = 0;
+ } m_data;
+
+ Q3DSSceneManager *m_sceneManager;
+ Q3DSComponentNode *m_component = nullptr;
+ Q3DSSlide *m_parent = nullptr;
+ Q3DSAnimationManager *m_animationManager;
+ PlayerMode m_mode = PlayerMode::Viewer;
+ PlayerType m_type = PlayerType::Slide;
+};
+
+class Q3DSV_PRIVATE_EXPORT Q3DSSlideDeck
+{
+public:
+ Q3DSSlideDeck(Q3DSSlide *masterSlide)
+ : m_masterSlide(masterSlide)
+ {
+ Q_ASSERT(masterSlide);
+ if (!masterSlide->firstChild()) {
+ qWarning("No slides?");
+ return;
+ }
+
+ m_index = 0;
+ }
+
+ int slideCount() const { return m_masterSlide->childCount(); }
+ bool isEmpty() const { return (slideCount() == 0); }
+ Q3DSSlide *currentSlide() const
+ {
+ if (!m_masterSlide)
+ return nullptr;
+
+ if (isEmpty())
+ return nullptr;
+
+ Q_ASSERT(m_index < slideCount());
+
+ return static_cast<Q3DSSlide *>(m_masterSlide->childAtIndex(m_index));
+ }
+
+ Q3DSSlide *slideAtIndex(int index) const
+ {
+ const int count = slideCount();
+ if (index < 0 || index > count - 1)
+ return nullptr;
+
+ return static_cast<Q3DSSlide *>(m_masterSlide->childAtIndex(index));
+ }
+
+ void setCurrentSlide(int index)
+ {
+ Q_ASSERT(m_masterSlide);
+ const int count = m_masterSlide->childCount();
+ if ((index < 0) || (index > count - 1)) {
+ qWarning("Invalid index!");
+ return;
+ }
+
+ if (index == m_index)
+ return;
+
+ if (count < 1)
+ return;
+
+ m_index = index;
+
+ if (m_player)
+ m_player->reload();
+ }
+
+ Q3DSSlide *nextSlide()
+ {
+ if (!m_masterSlide)
+ return nullptr;
+
+ if (isEmpty() || m_index == -1)
+ return nullptr;
+
+ if (m_index < slideCount() - 1) {
+ return (m_lastSlide = static_cast<Q3DSSlide *>(m_masterSlide->childAtIndex(++m_index)));
+ } else {
+ return nullptr;
+ }
+ }
+
+ Q3DSSlide *previousSlide()
+ {
+ if (!m_masterSlide)
+ return nullptr;
+
+ if (isEmpty() || m_index == -1)
+ return nullptr;
+
+ if ((m_index > 0) && (m_index < slideCount())) {
+ return (m_lastSlide = static_cast<Q3DSSlide *>(m_masterSlide->childAtIndex(--m_index)));
+ } else {
+ return nullptr;
+ }
+ }
+
+ int indexOfSlide(Q3DSSlide *slide)
+ {
+ Q_ASSERT(m_masterSlide);
+
+ Q3DSSlide *ns = static_cast<Q3DSSlide *>(m_masterSlide->firstChild());
+ int index = 0;
+ bool found = false;
+ while (ns) {
+ if (ns == slide) {
+ found = true;
+ break;
+ }
+ ns = static_cast<Q3DSSlide *>(ns->nextSibling());
+ ++index;
+ }
+
+ return found ? index : -1;
+ }
+
+private:
+ void bind(Q3DSSlidePlayer *player)
+ {
+ if (player == m_player)
+ return;
+
+ if (m_player)
+ m_player->setSlideDeck(nullptr);
+
+ m_player = player;
+ }
+
+ friend class Q3DSSlidePlayer;
+ Q3DSSlidePlayer *m_player = nullptr;
+ Q3DSSlide *m_masterSlide = nullptr;
+ Q3DSSlide *m_lastSlide = nullptr;
+ int m_index = -1;
+};
+
+QT_END_NAMESPACE
+
+#endif // Q3DSSLIDEPLAYER_P_H