summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorChristian Stromme <christian.stromme@qt.io>2017-11-26 15:10:46 +0100
committerLaszlo Agocs <laszlo.agocs@qt.io>2018-02-07 11:33:09 +0000
commit1ffbc6280d42c64d040d6fcdc1cb40bcd5a511a2 (patch)
tree7df9c13c3eee3ba62c80c29fcd27e8e73241d8bd /tools
parent6da5b01c0833d3503eca747d69b1d9b354240f90 (diff)
Make seeking in the slide explorer functional
This is a bit crude, as we're missing the abstractions needed to properly control the playback of the slides, so this only adds the bare minimum for doing start/pause/seek operations in the explorer. Change-Id: I77b36ce68c3843832de04d2f6db1e7d461c92499 Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
Diffstat (limited to 'tools')
-rw-r--r--tools/q3dsviewer/q3dsmainwindow.cpp6
-rw-r--r--tools/qt3dsexplorer/slideexplorerwidget.cpp107
-rw-r--r--tools/qt3dsexplorer/slideexplorerwidget.h5
3 files changed, 83 insertions, 35 deletions
diff --git a/tools/q3dsviewer/q3dsmainwindow.cpp b/tools/q3dsviewer/q3dsmainwindow.cpp
index 88af662..b7b6043 100644
--- a/tools/q3dsviewer/q3dsmainwindow.cpp
+++ b/tools/q3dsviewer/q3dsmainwindow.cpp
@@ -96,15 +96,15 @@ Q3DStudioMainWindow::Q3DStudioMainWindow(Q3DSWindow *view, QWidget *parent)
view->engine()->setOnDemandRendering(renderOnDemand->isChecked());
});
- QAction *pauseAnims = viewMenu->addAction(tr("&Stop animations"));
+ QAction *pauseAnims = viewMenu->addAction(tr("&Pause animations"));
pauseAnims->setCheckable(true);
pauseAnims->setChecked(false);
connect(pauseAnims, &QAction::toggled, [=]() {
Q3DSSceneManager *sb = view->engine()->sceneManager();
Q3DSSlide *slide = sb->currentSlide();
if (slide) {
- sb->setAnimationsRunning(sb->masterSlide(), !pauseAnims->isChecked());
- sb->setAnimationsRunning(slide, !pauseAnims->isChecked());
+ sb->setAnimationsRunning(sb->masterSlide(), pauseAnims->isChecked());
+ sb->setAnimationsRunning(slide, pauseAnims->isChecked());
}
});
diff --git a/tools/qt3dsexplorer/slideexplorerwidget.cpp b/tools/qt3dsexplorer/slideexplorerwidget.cpp
index 8c22b9d..556cddc 100644
--- a/tools/qt3dsexplorer/slideexplorerwidget.cpp
+++ b/tools/qt3dsexplorer/slideexplorerwidget.cpp
@@ -35,6 +35,9 @@
#include <QPushButton>
#include <QSlider>
#include <QAbstractListModel>
+#include <Qt3DAnimation/qclipanimator.h>
+#include <Qt3DAnimation/qabstractanimationclip.h>
+#include <Qt3DCore/qnode.h>
QT_BEGIN_NAMESPACE
@@ -189,65 +192,110 @@ void SlideExplorerWidget::reset()
void SlideExplorerWidget::handleSelectionChanged(const QModelIndex &index)
{
auto slide = static_cast<Q3DSSlide*>(index.internalPointer());
- if (slide && m_currentSlide != slide) {
- m_currentSlide = slide;
- handleCurrentSlideChanged(m_currentSlide);
- }
+ if (slide && m_currentSlide != slide)
+ handleCurrentSlideChanged(slide, m_currentSlide);
}
-void SlideExplorerWidget::handleCurrentSlideChanged(Q3DSSlide *slide)
+void SlideExplorerWidget::handleCurrentSlideChanged(Q3DSSlide *slide, Q3DSSlide *oldSlide)
{
// Set the current slide selection
m_slideListView->setCurrentIndex(m_slideModel->getSlideIndex(slide));
- m_slideSeekSlider->setMinimum(0);
+
if (slide) {
- m_slideSeekSlider->setValue(slide->startTime());
- m_slideSeekSlider->setMaximum(slide->endTime());
- }
+ const qint32 startTime = slide->startTime();
+ const qint32 endTime = slide->endTime();
+ m_slideSeekSlider->setValue(startTime);
+ m_slideSeekSlider->setMaximum(endTime);
+ m_slideSeekSlider->setTickPosition(QSlider::TicksBelow);
+ m_slideSeekSlider->setTickInterval(1000);
+ }
+
if (m_presentation) {
m_sceneManager->setCurrentSlide(slide);
} else if (m_component) {
m_sceneManager->setComponentCurrentSlide(m_component, slide);
}
- m_isSlidePlaying = true;
- m_playSlideButton->setText("stop");
+
+ if (oldSlide) {
+ Q3DSSlideAttached *data = static_cast<Q3DSSlideAttached *>(oldSlide->attached());
+ if (data && !data->animators.isEmpty()) {
+ Qt3DAnimation::QClipAnimator *animator = data->animators.at(0);
+ animator->clearPropertyTrackings();
+ animator->disconnect();
+ }
+
+ m_currentSlide = slide;
+ }
+
+ if (slide) {
+ Q3DSSlideAttached *data = static_cast<Q3DSSlideAttached *>(slide->attached());
+ if (!data->animators.isEmpty()) {
+ Qt3DAnimation::QClipAnimator *animator = data->animators.at(0);
+ QObject::connect(animator, &Qt3DAnimation::QClipAnimator::normalizedTimeChanged, [this](float t) {
+ const qint32 duration = m_currentSlide->endTime() - m_currentSlide->startTime();
+ m_slideSeekSlider->setValue(int(duration * t));
+ m_slideAtEnd = (t == 1.0f);
+ });
+
+ const auto onRunningChanged = [this](bool r) {
+ m_playSlideButton->setText(r ? QStringLiteral("Pause") : QStringLiteral("Play"));
+ m_isSlidePlaying = r;
+ };
+ onRunningChanged(animator->isRunning());
+ QObject::connect(animator, &Qt3DAnimation::QClipAnimator::runningChanged, onRunningChanged);
+
+
+ animator->setPropertyTracking(QStringLiteral("normalizedTime"), Qt3DCore::QNode::TrackAllValues);
+ animator->setPropertyTracking(QStringLiteral("running"), Qt3DCore::QNode::TrackAllValues);
+ }
+ }
}
void SlideExplorerWidget::switchToNextSlide()
{
auto nextSlide = m_slideModel->getNextSlide(m_currentSlide);
- if (nextSlide) {
- m_currentSlide = nextSlide;
- handleCurrentSlideChanged(m_currentSlide);
- }
+ if (nextSlide)
+ handleCurrentSlideChanged(nextSlide, m_currentSlide);
}
void SlideExplorerWidget::switchToPrevSlide()
{
auto prevSlide = m_slideModel->getPrevSlide(m_currentSlide);
- if (prevSlide) {
- m_currentSlide = prevSlide;
- handleCurrentSlideChanged(m_currentSlide);
- }
+ if (prevSlide)
+ handleCurrentSlideChanged(prevSlide, m_currentSlide);
}
void SlideExplorerWidget::playCurrentSlide()
{
- if (m_isSlidePlaying) {
- m_playSlideButton->setText("play");
- } else {
- m_playSlideButton->setText("stop");
- }
- m_isSlidePlaying = !m_isSlidePlaying;
if (m_sceneManager) {
- m_sceneManager->setAnimationsRunning(m_currentSlide, m_isSlidePlaying);
- m_sceneManager->setAnimationsRunning(m_masterSlide, m_isSlidePlaying);
+ m_isSlidePlaying = !m_isSlidePlaying;
+ const bool restart = m_isSlidePlaying && m_slideAtEnd;
+ m_sceneManager->setAnimationsRunning(m_currentSlide, m_isSlidePlaying, restart);
+ m_sceneManager->setAnimationsRunning(m_masterSlide, m_isSlidePlaying, restart);
}
}
void SlideExplorerWidget::seekInCurrentSlide(int value)
{
- Q_UNUSED(value)
+ static const auto seekInSlide = [](Q3DSSlide *slide, float normalizedTime) {
+ Q3DSSlideAttached *data = static_cast<Q3DSSlideAttached *>(slide->attached());
+ if (!data)
+ return;
+ for (Qt3DAnimation::QClipAnimator *animator : data->animators)
+ animator->setNormalizedTime(normalizedTime);
+ };
+
+ Q3DSSlideAttached *data = static_cast<Q3DSSlideAttached *>(m_currentSlide->attached());
+ if (!data)
+ return;
+
+ if (data->animators.isEmpty())
+ return;
+
+ const float durationInMS = m_currentSlide->endTime() - m_currentSlide->startTime();
+ const float normalized = value / durationInMS;
+
+ seekInSlide(m_currentSlide, normalized);
}
void SlideExplorerWidget::init()
@@ -281,13 +329,12 @@ void SlideExplorerWidget::updateModel()
if (m_presentation) {
m_masterSlide = m_presentation->masterSlide();
m_currentSlide = m_sceneManager->currentSlide();
-
} else if (m_component) {
m_masterSlide = m_component->masterSlide();
m_currentSlide = m_component->currentSlide();
}
m_slideModel->setMasterSlide(m_masterSlide);
- handleCurrentSlideChanged(m_currentSlide);
+ handleCurrentSlideChanged(m_currentSlide, nullptr);
}
}
diff --git a/tools/qt3dsexplorer/slideexplorerwidget.h b/tools/qt3dsexplorer/slideexplorerwidget.h
index 7575b3a..8f76fb6 100644
--- a/tools/qt3dsexplorer/slideexplorerwidget.h
+++ b/tools/qt3dsexplorer/slideexplorerwidget.h
@@ -56,7 +56,7 @@ public:
private slots:
void handleSelectionChanged(const QModelIndex &index);
- void handleCurrentSlideChanged(Q3DSSlide *slide);
+ void handleCurrentSlideChanged(Q3DSSlide *slide, Q3DSSlide *oldSlide);
void switchToNextSlide();
void switchToPrevSlide();
void playCurrentSlide();
@@ -77,7 +77,8 @@ private:
QSlider *m_slideSeekSlider;
SlideListModel *m_slideModel;
- bool m_isSlidePlaying;
+ bool m_isSlidePlaying = false;
+ bool m_slideAtEnd = false;
};
QT_END_NAMESPACE