From cc34f0e251f04151cbce24d791f861550e41fb81 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Wed, 3 Jun 2020 03:49:39 +1000 Subject: [PATCH] viewer: ensure view is updated if the cache is shifted Also moves "ForceUpdate" to a queued connection so it occurs as soon as the rest of the processing is done. This ensures the viewer isn't updated too early. --- app/render/playbackcache.cpp | 4 ++++ app/render/playbackcache.h | 2 ++ app/widget/viewer/viewer.cpp | 11 ++++++++++- app/widget/viewer/viewer.h | 6 ++++-- 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/app/render/playbackcache.cpp b/app/render/playbackcache.cpp index 0a826fc54..ec124dbaf 100644 --- a/app/render/playbackcache.cpp +++ b/app/render/playbackcache.cpp @@ -82,7 +82,11 @@ void PlaybackCache::Shift(const rational &from, const rational &to) locker.unlock(); emit Invalidated(invalidate_range); + } else { + locker.unlock(); } + + emit Shifted(from, to); } void PlaybackCache::Validate(const TimeRange &r) diff --git a/app/render/playbackcache.h b/app/render/playbackcache.h index 566f5d6a6..9229e8122 100644 --- a/app/render/playbackcache.h +++ b/app/render/playbackcache.h @@ -75,6 +75,8 @@ signals: void Validated(const OLIVE_NAMESPACE::TimeRange& r); + void Shifted(const OLIVE_NAMESPACE::rational& from, const OLIVE_NAMESPACE::rational& to); + void LengthChanged(const OLIVE_NAMESPACE::rational& r); protected: diff --git a/app/widget/viewer/viewer.cpp b/app/widget/viewer/viewer.cpp index 1fc2f9288..9e43f45b1 100644 --- a/app/widget/viewer/viewer.cpp +++ b/app/widget/viewer/viewer.cpp @@ -177,6 +177,7 @@ void ViewerWidget::ConnectNodeInternal(ViewerOutput *n) connect(n, &ViewerOutput::LengthChanged, this, &ViewerWidget::LengthChangedSlot); connect(n, &ViewerOutput::ParamsChanged, this, &ViewerWidget::UpdateRendererParameters); connect(n->video_frame_cache(), &FrameHashCache::Invalidated, this, &ViewerWidget::ViewerInvalidatedVideoRange); + connect(n->video_frame_cache(), &FrameHashCache::Shifted, this, &ViewerWidget::ViewerShiftedRange); connect(n->audio_playback_cache(), &FrameHashCache::Invalidated, this, &ViewerWidget::ViewerInvalidatedRange); connect(n, &ViewerOutput::GraphChangedFrom, this, &ViewerWidget::UpdateStack); @@ -231,6 +232,7 @@ void ViewerWidget::DisconnectNodeInternal(ViewerOutput *n) disconnect(n, &ViewerOutput::LengthChanged, this, &ViewerWidget::LengthChangedSlot); disconnect(n, &ViewerOutput::ParamsChanged, this, &ViewerWidget::UpdateRendererParameters); disconnect(n->video_frame_cache(), &FrameHashCache::Invalidated, this, &ViewerWidget::ViewerInvalidatedVideoRange); + disconnect(n->video_frame_cache(), &FrameHashCache::Shifted, this, &ViewerWidget::ViewerShiftedRange); disconnect(n->audio_playback_cache(), &FrameHashCache::Invalidated, this, &ViewerWidget::ViewerInvalidatedRange); disconnect(n, &ViewerOutput::GraphChangedFrom, this, &ViewerWidget::UpdateStack); @@ -1204,7 +1206,7 @@ void ViewerWidget::SetZoomFromMenu(QAction *action) void ViewerWidget::ViewerInvalidatedVideoRange(const TimeRange &range) { if (GetTime() >= range.in() && (GetTime() < range.out() || range.in() == range.out())) { - ForceUpdate(); + QMetaObject::invokeMethod(this, "ForceUpdate", Qt::QueuedConnection); } ViewerInvalidatedRange(); @@ -1221,4 +1223,11 @@ void ViewerWidget::ViewerInvalidatedRange() } } +void ViewerWidget::ViewerShiftedRange(const rational &from, const rational &to) +{ + if (GetTime() >= qMin(from, to)) { + QMetaObject::invokeMethod(this, "ForceUpdate", Qt::QueuedConnection); + } +} + OLIVE_NAMESPACE_EXIT diff --git a/app/widget/viewer/viewer.h b/app/widget/viewer/viewer.h index 8b27312dd..19c774688 100644 --- a/app/widget/viewer/viewer.h +++ b/app/widget/viewer/viewer.h @@ -85,8 +85,6 @@ public: */ void SetFullScreen(QScreen* screen = nullptr); - void ForceUpdate(); - RenderBackend* renderer() const { return renderer_; @@ -122,6 +120,8 @@ public slots: */ void SetSignalCursorColorEnabled(bool e); + void ForceUpdate(); + signals: /** * @brief Wrapper for ViewerGLWidget::CursorColor() @@ -272,6 +272,8 @@ private slots: void ViewerInvalidatedRange(); + void ViewerShiftedRange(const OLIVE_NAMESPACE::rational& from, const OLIVE_NAMESPACE::rational& to); + void UpdateStack(); void ContextMenuSetFullScreen(QAction* action);