From e681b87988493978419bb0311685e1c098cd9948 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Tue, 23 Jun 2020 05:22:58 +1000 Subject: [PATCH] curve/param/panels: leave curve panel open and have option for timebasedwidget to auto-set timebase --- app/panel/curve/curve.cpp | 5 -- app/panel/curve/curve.h | 2 - app/panel/param/param.cpp | 77 +++++++++----------- app/panel/param/param.h | 9 ++- app/widget/curvewidget/curvewidget.cpp | 11 +-- app/widget/curvewidget/curvewidget.h | 2 + app/widget/nodeparamview/nodeparamview.cpp | 12 --- app/widget/nodeparamview/nodeparamview.h | 3 - app/widget/timebased/timebased.cpp | 25 ++++++- app/widget/timebased/timebased.h | 8 ++ app/widget/timelinewidget/timelinewidget.cpp | 4 +- app/widget/viewer/viewer.cpp | 12 --- 12 files changed, 81 insertions(+), 89 deletions(-) diff --git a/app/panel/curve/curve.cpp b/app/panel/curve/curve.cpp index 2c9fc0e4b..b6179d258 100644 --- a/app/panel/curve/curve.cpp +++ b/app/panel/curve/curve.cpp @@ -49,11 +49,6 @@ void CurvePanel::SetInput(NodeInput *input) Retranslate(); } -void CurvePanel::SetTimeTarget(Node *target) -{ - static_cast(GetTimeBasedWidget())->SetTimeTarget(target); -} - void CurvePanel::IncreaseTrackHeight() { CurveWidget* c = static_cast(GetTimeBasedWidget()); diff --git a/app/panel/curve/curve.h b/app/panel/curve/curve.h index 4b25b2b22..982a4d0b4 100644 --- a/app/panel/curve/curve.h +++ b/app/panel/curve/curve.h @@ -39,8 +39,6 @@ public: public slots: void SetInput(NodeInput* input); - void SetTimeTarget(Node* target); - virtual void IncreaseTrackHeight() override; virtual void DecreaseTrackHeight() override; diff --git a/app/panel/param/param.cpp b/app/panel/param/param.cpp index 47d81df49..1bd3355d7 100644 --- a/app/panel/param/param.cpp +++ b/app/panel/param/param.cpp @@ -30,8 +30,6 @@ ParamPanel::ParamPanel(QWidget* parent) : NodeParamView* view = new NodeParamView(); connect(view, &NodeParamView::InputDoubleClicked, this, &ParamPanel::CreateCurvePanel); connect(view, &NodeParamView::RequestSelectNode, this, &ParamPanel::RequestSelectNode); - connect(view, &NodeParamView::OpenedNode, this, &ParamPanel::OpeningNode); - connect(view, &NodeParamView::ClosedNode, this, &ParamPanel::ClosingNode); connect(view, &NodeParamView::FoundGizmos, this, &ParamPanel::FoundGizmos); SetTimeBasedWidget(view); @@ -50,13 +48,7 @@ void ParamPanel::SetTimestamp(const int64_t ×tamp) TimeBasedPanel::SetTimestamp(timestamp); // Ensure all CurvePanels are updated with this time too - QHash::const_iterator i; - - for (i=open_curve_panels_.begin(); i!=open_curve_panels_.end(); i++) { - if (i.value() && i.value() != sender()) { - i.value()->SetTimestamp(timestamp); - } - } + ParamViewTimeChanged(timestamp); } void ParamPanel::DeleteSelected() @@ -97,50 +89,51 @@ void ParamPanel::CreateCurvePanel(NodeInput *input) panel = Core::instance()->main_window()->AppendCurvePanel(); panel->SetInput(input); - panel->SetTimebase(view->timebase()); + panel->ConnectViewerNode(view->GetConnectedNode()); panel->SetTimestamp(view->GetTimestamp()); - panel->SetTimeTarget(view->GetTimeTarget()); - connect(view, &NodeParamView::TimebaseChanged, panel, &CurvePanel::SetTimebase); - connect(view, &NodeParamView::TimeChanged, panel, &CurvePanel::SetTimestamp); - connect(panel, &CurvePanel::TimeChanged, view, &NodeParamView::SetTimestamp); - connect(panel, &CurvePanel::TimeChanged, view, &NodeParamView::TimeChanged); + connect(view, &NodeParamView::TimeChanged, this, &ParamPanel::ParamViewTimeChanged); + connect(panel, &CurvePanel::TimeChanged, this, &ParamPanel::CurvePanelTimeChanged); connect(panel, &CurvePanel::CloseRequested, this, &ParamPanel::ClosingCurvePanel); open_curve_panels_.insert(input, panel); } -void ParamPanel::OpeningNode(Node *n) -{ - QList inputs = n->GetInputsIncludingArrays(); - - foreach (NodeInput* i, inputs) { - if (open_curve_panels_.contains(i)) { - // We had a CurvePanel open for this input that was closed in ClosingNode(), re-open it - CreateCurvePanel(i); - } - } -} - -void ParamPanel::ClosingNode(Node *n) -{ - QList inputs = n->GetInputsIncludingArrays(); - - foreach (NodeInput* i, inputs) { - CurvePanel* panel = open_curve_panels_.value(i); - - // Close the panel (this also destroys it), but keep a reference in the hash - if (panel) { - panel->close(); - open_curve_panels_.insert(i, nullptr); - } - } -} - void ParamPanel::ClosingCurvePanel() { CurvePanel* panel = static_cast(sender()); open_curve_panels_.remove(panel->GetInput()); } +void ParamPanel::ParamViewTimeChanged(const int64_t &time) +{ + // Ensure all CurvePanels are updated with this time too + QHash::const_iterator i; + + for (i=open_curve_panels_.begin(); i!=open_curve_panels_.end(); i++) { + // If connected viewers are the same, set the timestamp + if (i.value()->GetConnectedViewer() == GetConnectedViewer()) { + i.value()->SetTimestamp(time); + } + } +} + +void ParamPanel::CurvePanelTimeChanged(const int64_t &time) +{ + GetTimeBasedWidget()->SetTimestamp(time); + emit GetTimeBasedWidget()->TimeChanged(time); + + CurvePanel* src = static_cast(sender()); + + // Ensure all CurvePanels are updated with this time too + QHash::const_iterator i; + + for (i=open_curve_panels_.begin(); i!=open_curve_panels_.end(); i++) { + // If connected viewers are the same and the panel isn't the source, set the timestamp + if (i.value() != src && i.value()->GetConnectedViewer() == src->GetConnectedViewer()) { + i.value()->SetTimestamp(time); + } + } +} + OLIVE_NAMESPACE_EXIT diff --git a/app/panel/param/param.h b/app/panel/param/param.h index e75350d6b..12bc1715e 100644 --- a/app/panel/param/param.h +++ b/app/panel/param/param.h @@ -51,15 +51,16 @@ protected: private slots: void CreateCurvePanel(NodeInput* input); - void OpeningNode(Node* n); - - void ClosingNode(Node* n); - void ClosingCurvePanel(); private: QHash open_curve_panels_; +private slots: + void ParamViewTimeChanged(const int64_t& time); + + void CurvePanelTimeChanged(const int64_t& time); + }; OLIVE_NAMESPACE_EXIT diff --git a/app/widget/curvewidget/curvewidget.cpp b/app/widget/curvewidget/curvewidget.cpp index 2453618f9..aa294deb2 100644 --- a/app/widget/curvewidget/curvewidget.cpp +++ b/app/widget/curvewidget/curvewidget.cpp @@ -218,8 +218,6 @@ void CurveWidget::ScaleChangedEvent(const double &scale) void CurveWidget::TimeTargetChangedEvent(Node *target) { - ConnectViewerNode(nullptr); - key_control_->SetTimeTarget(target); view_->SetTimeTarget(target); @@ -227,12 +225,11 @@ void CurveWidget::TimeTargetChangedEvent(Node *target) if (bridge_) { bridge_->SetTimeTarget(target); } +} - // FIXME: If a non-viewer node is ever set here, it will fail to update the length - ViewerOutput* viewer = dynamic_cast(target); - if (viewer) { - ConnectViewerNode(viewer); - } +void CurveWidget::ConnectedNodeChanged(ViewerOutput *n) +{ + SetTimeTarget(n); } void CurveWidget::UpdateInputLabel() diff --git a/app/widget/curvewidget/curvewidget.h b/app/widget/curvewidget/curvewidget.h index a1c2035c0..7c33b49c7 100644 --- a/app/widget/curvewidget/curvewidget.h +++ b/app/widget/curvewidget/curvewidget.h @@ -59,6 +59,8 @@ protected: virtual void TimeTargetChangedEvent(Node* target) override; + virtual void ConnectedNodeChanged(ViewerOutput* n) override; + private: void UpdateInputLabel(); diff --git a/app/widget/nodeparamview/nodeparamview.cpp b/app/widget/nodeparamview/nodeparamview.cpp index eab4bd815..03ce22f18 100644 --- a/app/widget/nodeparamview/nodeparamview.cpp +++ b/app/widget/nodeparamview/nodeparamview.cpp @@ -208,18 +208,6 @@ void NodeParamView::ConnectedNodeChanged(ViewerOutput *n) } } -void NodeParamView::ConnectNodeInternal(ViewerOutput *n) -{ - SetTimebase(n->video_params().time_base()); -} - -void NodeParamView::DisconnectNodeInternal(ViewerOutput *n) -{ - Q_UNUSED(n) - - SetTimebase(rational()); -} - const QList &NodeParamView::nodes() { return nodes_; diff --git a/app/widget/nodeparamview/nodeparamview.h b/app/widget/nodeparamview/nodeparamview.h index 71d4edcfd..9fe697d97 100644 --- a/app/widget/nodeparamview/nodeparamview.h +++ b/app/widget/nodeparamview/nodeparamview.h @@ -64,9 +64,6 @@ protected: virtual void ConnectedNodeChanged(ViewerOutput* n) override; - virtual void ConnectNodeInternal(ViewerOutput* n) override; - virtual void DisconnectNodeInternal(ViewerOutput* n) override; - private: void UpdateItemTime(const int64_t ×tamp); diff --git a/app/widget/timebased/timebased.cpp b/app/widget/timebased/timebased.cpp index 6c83257d2..b2e15b03b 100644 --- a/app/widget/timebased/timebased.cpp +++ b/app/widget/timebased/timebased.cpp @@ -36,7 +36,8 @@ TimeBasedWidget::TimeBasedWidget(bool ruler_text_visible, bool ruler_cache_statu viewer_node_(nullptr), auto_max_scrollbar_(false), points_(nullptr), - toggle_show_all_(false) + toggle_show_all_(false), + auto_set_timebase_(true) { ruler_ = new TimeRuler(ruler_text_visible, ruler_cache_status_visible, this); connect(ruler_, &TimeRuler::TimeChanged, this, &TimeBasedWidget::SetTimeAndSignal); @@ -79,6 +80,11 @@ void TimeBasedWidget::ConnectViewerNode(ViewerOutput *node) DisconnectNodeInternal(viewer_node_); disconnect(viewer_node_, &ViewerOutput::LengthChanged, this, &TimeBasedWidget::UpdateMaximumScroll); + disconnect(viewer_node_, &ViewerOutput::TimebaseChanged, this, &TimeBasedWidget::SetTimebase); + + if (auto_set_timebase_) { + SetTimebase(rational()); + } points_ = nullptr; ruler()->ConnectTimelinePoints(nullptr); @@ -95,6 +101,18 @@ void TimeBasedWidget::ConnectViewerNode(ViewerOutput *node) ruler()->ConnectTimelinePoints(points_); } + if (auto_set_timebase_) { + if (!viewer_node_->video_params().time_base().isNull()) { + SetTimebase(viewer_node_->video_params().time_base()); + } else if (viewer_node_->audio_params().sample_rate() > 0) { + SetTimebase(viewer_node_->audio_params().time_base()); + } else { + SetTimebase(rational()); + } + + connect(viewer_node_, &ViewerOutput::TimebaseChanged, this, &TimeBasedWidget::SetTimebase); + } + ConnectNodeInternal(viewer_node_); } @@ -332,6 +350,11 @@ void TimeBasedWidget::CenterScrollOnPlayhead() scrollbar_->setValue(qRound(TimeToScene(Timecode::timestamp_to_time(ruler_->GetTime(), timebase()))) - scrollbar_->width()/2); } +void TimeBasedWidget::SetAutoSetTimebase(bool e) +{ + auto_set_timebase_ = e; +} + void TimeBasedWidget::SetPoint(Timeline::MovementMode m, const rational& time) { if (!points_) { diff --git a/app/widget/timebased/timebased.h b/app/widget/timebased/timebased.h index bf5b8ac40..008514d26 100644 --- a/app/widget/timebased/timebased.h +++ b/app/widget/timebased/timebased.h @@ -127,6 +127,12 @@ protected slots: */ void CenterScrollOnPlayhead(); + /** + * @brief By default, TimeBasedWidget will set the timebase to the viewer node's video timebase. + * Set this to false if you want to set your own timebase. + */ + void SetAutoSetTimebase(bool e); + signals: void TimeChanged(const int64_t&); @@ -170,6 +176,8 @@ private: double toggle_show_all_old_scale_; int toggle_show_all_old_scroll_; + bool auto_set_timebase_; + private slots: void UpdateMaximumScroll(); diff --git a/app/widget/timelinewidget/timelinewidget.cpp b/app/widget/timelinewidget/timelinewidget.cpp index b89ffe00d..504293a75 100644 --- a/app/widget/timelinewidget/timelinewidget.cpp +++ b/app/widget/timelinewidget/timelinewidget.cpp @@ -147,8 +147,10 @@ TimelineWidget::TimelineWidget(QWidget *parent) : view_splitter->setSizes({INT_MAX, INT_MAX}); // FIXME: Magic number - SetMaximumScale(TimelineViewBase::kMaximumScale); SetScale(90.0); + + SetMaximumScale(TimelineViewBase::kMaximumScale); + SetAutoSetTimebase(false); } TimelineWidget::~TimelineWidget() diff --git a/app/widget/viewer/viewer.cpp b/app/widget/viewer/viewer.cpp index 6280ad88f..77ffb8102 100644 --- a/app/widget/viewer/viewer.cpp +++ b/app/widget/viewer/viewer.cpp @@ -168,15 +168,6 @@ void ViewerWidget::TimeChangedEvent(const int64_t &i) void ViewerWidget::ConnectNodeInternal(ViewerOutput *n) { - if (!n->video_params().time_base().isNull()) { - SetTimebase(n->video_params().time_base()); - } else if (n->audio_params().sample_rate() > 0) { - SetTimebase(n->audio_params().time_base()); - } else { - SetTimebase(rational()); - } - - connect(n, &ViewerOutput::TimebaseChanged, this, &ViewerWidget::SetTimebase); connect(n, &ViewerOutput::SizeChanged, this, &ViewerWidget::SizeChangedSlot); connect(n, &ViewerOutput::LengthChanged, this, &ViewerWidget::LengthChangedSlot); connect(n, &ViewerOutput::ParamsChanged, this, &ViewerWidget::UpdateRendererParameters); @@ -231,9 +222,6 @@ void ViewerWidget::DisconnectNodeInternal(ViewerOutput *n) } cache_wait_timer_.stop(); - SetTimebase(rational()); - - disconnect(n, &ViewerOutput::TimebaseChanged, this, &ViewerWidget::SetTimebase); disconnect(n, &ViewerOutput::SizeChanged, this, &ViewerWidget::SizeChangedSlot); disconnect(n, &ViewerOutput::LengthChanged, this, &ViewerWidget::LengthChangedSlot); disconnect(n, &ViewerOutput::ParamsChanged, this, &ViewerWidget::UpdateRendererParameters);