node: split off traversing functions from renderer for usage elsewhere

Fixes issue where Viewer node wouldn't pick up correct length if a tracks
weren't in use.
This commit is contained in:
itsmattkc
2020-03-13 15:31:15 +11:00
parent 41da5dbd53
commit 9e4c79699e
18 changed files with 218 additions and 142 deletions
+9 -2
View File
@@ -13,9 +13,13 @@ FootageViewerWidget::FootageViewerWidget(QWidget *parent) :
audio_node_ = new AudioInput();
viewer_node_ = new ViewerOutput();
waveform_view_ = new QWidget();
waveform_view_->setAutoFillBackground(true);
waveform_view_->setStyleSheet("background: black;");
stack()->addWidget(waveform_view_);
NodeParam::ConnectEdge(video_node_->output(), viewer_node_->texture_input());
NodeParam::ConnectEdge(audio_node_->output(), viewer_node_->samples_input());
NodeParam::ConnectEdge(video_node_->output(), viewer_node_->length_input());
connect(gl_widget_, &ViewerGLWidget::DragStarted, this, &FootageViewerWidget::StartFootageDrag);
}
@@ -55,6 +59,10 @@ void FootageViewerWidget::SetFootage(Footage *footage)
if (video_stream) {
video_node_->SetFootage(video_stream);
viewer_node_->set_video_params(VideoParams(video_stream->width(), video_stream->height(), video_stream->frame_rate().flipped()));
stack()->setCurrentWidget(gl_widget_);
} else {
stack()->setCurrentWidget(waveform_view_);
}
if (audio_stream) {
@@ -79,7 +87,6 @@ void FootageViewerWidget::StartFootageDrag()
return;
}
qDebug() << "Drag start!";
QDrag* drag = new QDrag(this);
QMimeData* mimedata = new QMimeData();
+2
View File
@@ -27,6 +27,8 @@ private:
ViewerOutput* viewer_node_;
QWidget* waveform_view_;
private slots:
void StartFootageDrag();
+28 -5
View File
@@ -47,9 +47,13 @@ ViewerWidget::ViewerWidget(QWidget *parent) :
QVBoxLayout* layout = new QVBoxLayout(this);
layout->setMargin(0);
// Set up stacked widget to allow switching away from the viewer widget
stack_ = new QStackedWidget();
layout->addWidget(stack_);
// Create main OpenGL-based view
sizer_ = new ViewerSizer();
layout->addWidget(sizer_);
stack_->addWidget(sizer_);
gl_widget_ = new ViewerGLWidget();
connect(gl_widget_, &ViewerGLWidget::customContextMenuRequested, this, &ViewerWidget::ShowContextMenu);
@@ -111,7 +115,13 @@ void ViewerWidget::TimeChangedEvent(const int64_t &i)
void ViewerWidget::ConnectNodeInternal(ViewerOutput *n)
{
SetTimebase(n->video_params().time_base());
if (!n->video_params().time_base().isNull()) {
SetTimebase(n->video_params().time_base());
} else if (n->audio_params().sample_rate() > 0) {
SetTimebase(rational(1, n->audio_params().sample_rate()));
} else {
SetTimebase(rational());
}
connect(n, &ViewerOutput::TimebaseChanged, this, &ViewerWidget::SetTimebase);
connect(n, &ViewerOutput::SizeChanged, this, &ViewerWidget::SizeChangedSlot);
@@ -139,7 +149,7 @@ void ViewerWidget::DisconnectNodeInternal(ViewerOutput *n)
{
Pause();
SetTimebase(0);
SetTimebase(rational());
disconnect(n, &ViewerOutput::TimebaseChanged, this, &ViewerWidget::SetTimebase);
disconnect(n, &ViewerOutput::SizeChanged, this, &ViewerWidget::SizeChangedSlot);
@@ -171,6 +181,11 @@ void ViewerWidget::resizeEvent(QResizeEvent *event)
}
}
QStackedWidget *ViewerWidget::stack() const
{
return stack_;
}
void ViewerWidget::TogglePlayPause()
{
if (IsPlaying()) {
@@ -251,7 +266,11 @@ void ViewerWidget::PlayInternal(int speed)
controls_->ShowPauseButton();
connect(gl_widget_, &ViewerGLWidget::frameSwapped, this, &ViewerWidget::PlaybackTimerUpdate);
if (stack_->currentWidget() == gl_widget_) {
connect(gl_widget_, &ViewerGLWidget::frameSwapped, this, &ViewerWidget::PlaybackTimerUpdate);
} else {
connect(AudioManager::instance(), &AudioManager::OutputNotified, this, &ViewerWidget::PlaybackTimerUpdate);
}
}
void ViewerWidget::PushScrubbedAudio()
@@ -387,7 +406,11 @@ void ViewerWidget::Pause()
playback_speed_ = 0;
controls_->ShowPlayButton();
disconnect(gl_widget_, &ViewerGLWidget::frameSwapped, this, &ViewerWidget::PlaybackTimerUpdate);
if (stack_->currentWidget() == gl_widget_) {
disconnect(gl_widget_, &ViewerGLWidget::frameSwapped, this, &ViewerWidget::PlaybackTimerUpdate);
} else {
disconnect(AudioManager::instance(), &AudioManager::OutputNotified, this, &ViewerWidget::PlaybackTimerUpdate);
}
}
}
+4
View File
@@ -115,6 +115,8 @@ protected:
virtual void resizeEvent(QResizeEvent *event) override;
QStackedWidget* stack() const;
OpenGLBackend* video_renderer_;
AudioBackend* audio_renderer_;
@@ -131,6 +133,8 @@ private:
int CalculateDivider();
QStackedWidget* stack_;
ViewerSizer* sizer_;
PlaybackControls* controls_;