From be24e7e580f37e6a919089d1bfef2122f0720ed9 Mon Sep 17 00:00:00 2001 From: itsmattkc <34096995+itsmattkc@users.noreply.github.com> Date: Thu, 21 Oct 2021 13:57:49 -0700 Subject: [PATCH] timebased: set connected node before processing Fixes #1775 --- app/widget/timebased/timebasedwidget.cpp | 19 ++++++++++--------- app/widget/viewer/footageviewer.cpp | 3 ++- app/widget/viewer/viewer.cpp | 4 ++++ 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/app/widget/timebased/timebasedwidget.cpp b/app/widget/timebased/timebasedwidget.cpp index 2b3691884..d294ef466 100644 --- a/app/widget/timebased/timebasedwidget.cpp +++ b/app/widget/timebased/timebasedwidget.cpp @@ -74,17 +74,21 @@ void TimeBasedWidget::ConnectViewerNode(ViewerOutput *node) return; } - if (viewer_node_) { + // Set viewer node + ViewerOutput* old = viewer_node_; + viewer_node_ = node; + + if (old) { // Call potential derivative functions for disconnecting the viewer node - DisconnectNodeEvent(viewer_node_); + DisconnectNodeEvent(old); // Disconnect length changed signal - disconnect(viewer_node_, &ViewerOutput::LengthChanged, this, &TimeBasedWidget::UpdateMaximumScroll); - disconnect(viewer_node_, &ViewerOutput::RemovedFromGraph, this, &TimeBasedWidget::ConnectedNodeRemovedFromGraph); + disconnect(old, &ViewerOutput::LengthChanged, this, &TimeBasedWidget::UpdateMaximumScroll); + disconnect(old, &ViewerOutput::RemovedFromGraph, this, &TimeBasedWidget::ConnectedNodeRemovedFromGraph); // Disconnect rate change signals if they were connected - disconnect(viewer_node_, &ViewerOutput::FrameRateChanged, this, &TimeBasedWidget::AutoUpdateTimebase); - disconnect(viewer_node_, &ViewerOutput::SampleRateChanged, this, &TimeBasedWidget::AutoUpdateTimebase); + disconnect(old, &ViewerOutput::FrameRateChanged, this, &TimeBasedWidget::AutoUpdateTimebase); + disconnect(old, &ViewerOutput::SampleRateChanged, this, &TimeBasedWidget::AutoUpdateTimebase); // Reset timebase to null SetTimebase(rational()); @@ -94,9 +98,6 @@ void TimeBasedWidget::ConnectViewerNode(ViewerOutput *node) scrollbar_->ConnectTimelinePoints(nullptr); } - // Set viewer node - ViewerOutput* old = viewer_node_; - viewer_node_ = node; emit ConnectedNodeChanged(old, node); // Call derivatives diff --git a/app/widget/viewer/footageviewer.cpp b/app/widget/viewer/footageviewer.cpp index 2a2926f85..90624a2da 100644 --- a/app/widget/viewer/footageviewer.cpp +++ b/app/widget/viewer/footageviewer.cpp @@ -51,9 +51,10 @@ void FootageViewerWidget::DisconnectNodeEvent(ViewerOutput *n) { // Cache timestamp in case this footage is opened again later cached_timestamps_.insert(n, GetTime()); - SetTime(0); super::DisconnectNodeEvent(n); + + SetTime(0); } void FootageViewerWidget::StartFootageDragInternal(bool enable_video, bool enable_audio) diff --git a/app/widget/viewer/viewer.cpp b/app/widget/viewer/viewer.cpp index 7f9e194d4..8b115682c 100644 --- a/app/widget/viewer/viewer.cpp +++ b/app/widget/viewer/viewer.cpp @@ -532,6 +532,10 @@ void ViewerWidget::ForceRequeueFromCurrentTime() void ViewerWidget::UpdateTextureFromNode() { + if (!GetConnectedNode()) { + return; + } + rational time = GetTime(); bool frame_exists_at_time = FrameExistsAtTime(time); bool frame_might_be_still = ViewerMightBeAStill();