From 1725f01459b77250ef7100b27d4c7f9ea70024a3 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 22 Jun 2020 00:38:00 +1000 Subject: [PATCH] paramview: changed to static viewer-bound and fixed various scrolling issues --- app/panel/param/param.cpp | 2 - app/panel/param/param.h | 2 - app/widget/keyframeview/keyframeview.cpp | 9 ++- app/widget/keyframeview/keyframeview.h | 10 +++ app/widget/keyframeview/keyframeviewbase.cpp | 18 +++-- app/widget/nodeparamview/nodeparamview.cpp | 78 +++++++++---------- app/widget/nodeparamview/nodeparamview.h | 15 ++-- app/widget/timebased/timebased.h | 4 +- .../timelinewidget/view/timelineview.cpp | 1 - .../timelinewidget/view/timelineviewbase.cpp | 7 -- .../timelinewidget/view/timelineviewbase.h | 4 - app/window/mainwindow/mainwindow.cpp | 1 + 12 files changed, 81 insertions(+), 70 deletions(-) diff --git a/app/panel/param/param.cpp b/app/panel/param/param.cpp index 649998cdf..47d81df49 100644 --- a/app/panel/param/param.cpp +++ b/app/panel/param/param.cpp @@ -29,7 +29,6 @@ ParamPanel::ParamPanel(QWidget* parent) : { NodeParamView* view = new NodeParamView(); connect(view, &NodeParamView::InputDoubleClicked, this, &ParamPanel::CreateCurvePanel); - connect(view, &NodeParamView::TimeTargetChanged, this, &ParamPanel::TimeTargetChanged); connect(view, &NodeParamView::RequestSelectNode, this, &ParamPanel::RequestSelectNode); connect(view, &NodeParamView::OpenedNode, this, &ParamPanel::OpeningNode); connect(view, &NodeParamView::ClosedNode, this, &ParamPanel::ClosingNode); @@ -104,7 +103,6 @@ void ParamPanel::CreateCurvePanel(NodeInput *input) connect(view, &NodeParamView::TimebaseChanged, panel, &CurvePanel::SetTimebase); connect(view, &NodeParamView::TimeChanged, panel, &CurvePanel::SetTimestamp); - connect(view, &NodeParamView::TimeTargetChanged, panel, &CurvePanel::SetTimeTarget); connect(panel, &CurvePanel::TimeChanged, view, &NodeParamView::SetTimestamp); connect(panel, &CurvePanel::TimeChanged, view, &NodeParamView::TimeChanged); connect(panel, &CurvePanel::CloseRequested, this, &ParamPanel::ClosingCurvePanel); diff --git a/app/panel/param/param.h b/app/panel/param/param.h index 0227e45ba..e75350d6b 100644 --- a/app/panel/param/param.h +++ b/app/panel/param/param.h @@ -41,8 +41,6 @@ public slots: virtual void DeleteSelected() override; signals: - void TimeTargetChanged(Node* node); - void RequestSelectNode(const QList& target); void FoundGizmos(Node* node); diff --git a/app/widget/keyframeview/keyframeview.cpp b/app/widget/keyframeview/keyframeview.cpp index cfbac331f..2d6b880e9 100644 --- a/app/widget/keyframeview/keyframeview.cpp +++ b/app/widget/keyframeview/keyframeview.cpp @@ -23,7 +23,8 @@ OLIVE_NAMESPACE_ENTER KeyframeView::KeyframeView(QWidget *parent) : - KeyframeViewBase(parent) + KeyframeViewBase(parent), + max_scroll_(0) { setAlignment(Qt::AlignLeft | Qt::AlignTop); } @@ -35,6 +36,12 @@ void KeyframeView::wheelEvent(QWheelEvent *event) } } +void KeyframeView::SceneRectUpdateEvent(QRectF &rect) +{ + rect.setY(0); + rect.setHeight(max_scroll_); +} + void KeyframeView::AddKeyframe(NodeKeyframePtr key, int y) { QPoint global_pt(0, y); diff --git a/app/widget/keyframeview/keyframeview.h b/app/widget/keyframeview/keyframeview.h index 505ea4f58..90361c8e5 100644 --- a/app/widget/keyframeview/keyframeview.h +++ b/app/widget/keyframeview/keyframeview.h @@ -31,12 +31,22 @@ class KeyframeView : public KeyframeViewBase public: KeyframeView(QWidget* parent = nullptr); + void SetMaxScroll(int i) + { + max_scroll_ = i; + } + protected: virtual void wheelEvent(QWheelEvent* event) override; + virtual void SceneRectUpdateEvent(QRectF& rect) override; + public slots: void AddKeyframe(NodeKeyframePtr key, int y); +private: + int max_scroll_; + }; OLIVE_NAMESPACE_EXIT diff --git a/app/widget/keyframeview/keyframeviewbase.cpp b/app/widget/keyframeview/keyframeviewbase.cpp index 257a12e09..e6c4ad480 100644 --- a/app/widget/keyframeview/keyframeviewbase.cpp +++ b/app/widget/keyframeview/keyframeviewbase.cpp @@ -101,14 +101,18 @@ void KeyframeViewBase::RemoveKeyframe(NodeKeyframePtr key) KeyframeViewItem *KeyframeViewBase::AddKeyframeInternal(NodeKeyframePtr key) { - KeyframeViewItem* item = new KeyframeViewItem(key); - item->SetTimeTarget(GetTimeTarget()); - item->SetScale(GetScale()); - item_map_.insert(key.get(), item); - scene()->addItem(item); + KeyframeViewItem* item = item_map_.value(key.get()); - if (hidden_tracks_.contains(key->track())) { - item->setVisible(false); + if (!item) { + item = new KeyframeViewItem(key); + item->SetTimeTarget(GetTimeTarget()); + item->SetScale(GetScale()); + item_map_.insert(key.get(), item); + scene()->addItem(item); + + if (hidden_tracks_.contains(key->track())) { + item->setVisible(false); + } } return item; diff --git a/app/widget/nodeparamview/nodeparamview.cpp b/app/widget/nodeparamview/nodeparamview.cpp index bc7f1e07d..eab4bd815 100644 --- a/app/widget/nodeparamview/nodeparamview.cpp +++ b/app/widget/nodeparamview/nodeparamview.cpp @@ -43,18 +43,19 @@ NodeParamView::NodeParamView(QWidget *parent) : // Set up scroll area for params QScrollArea* scroll_area = new QScrollArea(); + scroll_area->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn); scroll_area->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); scroll_area->setWidgetResizable(true); splitter->addWidget(scroll_area); // Param widget - QWidget* param_widget_area = new QWidget(); - scroll_area->setWidget(param_widget_area); + param_widget_area_ = new QWidget(); + scroll_area->setWidget(param_widget_area_); // Set up scroll area layout - param_layout_ = new QVBoxLayout(param_widget_area); + param_layout_ = new QVBoxLayout(param_widget_area_); param_layout_->setSpacing(0); - param_layout_->setMargin(0); + param_layout_->setContentsMargins(0, ruler()->height(), 0, 0); // Add a stretch to allow empty space at the bottom of the layout param_layout_->addStretch(); @@ -73,7 +74,6 @@ NodeParamView::NodeParamView(QWidget *parent) : keyframe_view_->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); ConnectTimelineView(keyframe_view_); connect(keyframe_view_, &KeyframeView::RequestCenterScrollOnPlayhead, this, &NodeParamView::CenterScrollOnPlayhead); - bottom_item_ = keyframe_view_->scene()->addRect(0, 0, 1, 1); keyframe_area_layout->addWidget(keyframe_view_); // Connect ruler and keyframe view together @@ -122,19 +122,15 @@ NodeParamView::NodeParamView(QWidget *parent) : void NodeParamView::SetNodes(QList nodes) { - ConnectViewerNode(nullptr); - // If we already have item widgets, delete them all now foreach (NodeParamViewItem* item, items_) { emit ClosedNode(item->GetNode()); emit FoundGizmos(nullptr); - delete item; + item->deleteLater(); } items_.clear(); - emit TimeTargetChanged(nullptr); // Reset keyframe view - SetTimebase(rational()); keyframe_view_->Clear(); // Set the internal list to the one we've received @@ -158,10 +154,6 @@ void NodeParamView::SetNodes(QList nodes) items_.append(item); - QMetaObject::invokeMethod(item, - "SignalAllKeyframes", - Qt::QueuedConnection); - emit OpenedNode(node); if (!found_gizmos && node->HasGizmos()) { @@ -170,28 +162,7 @@ void NodeParamView::SetNodes(QList nodes) } } - ViewerOutput* viewer = nodes_.first()->FindOutputNode(); - - ConnectViewerNode(viewer); - - if (viewer) { - SetTimebase(viewer->video_params().time_base()); - - rational time = Timecode::timestamp_to_time(this->GetTimestamp(), timebase()); - - // Set viewer as a time target - keyframe_view_->SetTimeTarget(viewer); - - foreach (NodeParamViewItem* item, items_) { - item->SetTimeTarget(viewer); - item->SetTime(time); - } - - emit TimeTargetChanged(viewer); - } - - // Forces the scroll to update to this time - keyframe_view_->SetTime(GetTimestamp()); + QMetaObject::invokeMethod(this, "PlaceKeyframesOnView", Qt::QueuedConnection); } } @@ -214,6 +185,8 @@ void NodeParamView::TimebaseChangedEvent(const rational &timebase) TimeBasedWidget::TimebaseChangedEvent(timebase); keyframe_view_->SetTimebase(timebase); + + UpdateItemTime(GetTimestamp()); } void NodeParamView::TimeChangedEvent(const int64_t ×tamp) @@ -225,6 +198,28 @@ void NodeParamView::TimeChangedEvent(const int64_t ×tamp) UpdateItemTime(timestamp); } +void NodeParamView::ConnectedNodeChanged(ViewerOutput *n) +{ + // Set viewer as a time target + keyframe_view_->SetTimeTarget(n); + + foreach (NodeParamViewItem* item, items_) { + item->SetTimeTarget(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_; @@ -254,11 +249,16 @@ void NodeParamView::ItemRequestedTimeChanged(const rational &time) SetTimeAndSignal(Timecode::time_to_timestamp(time, keyframe_view_->timebase())); } -void NodeParamView::ForceKeyframeViewToScroll(int min, int max) +void NodeParamView::ForceKeyframeViewToScroll() { - Q_UNUSED(min) + keyframe_view_->SetMaxScroll(param_widget_area_->height() - ruler()->height()); +} - bottom_item_->setY(keyframe_view_->viewport()->height() + max); +void NodeParamView::PlaceKeyframesOnView() +{ + foreach (NodeParamViewItem* item, items_) { + QMetaObject::invokeMethod(item, "SignalAllKeyframes", Qt::QueuedConnection); + } } OLIVE_NAMESPACE_EXIT diff --git a/app/widget/nodeparamview/nodeparamview.h b/app/widget/nodeparamview/nodeparamview.h index fd6fe4220..71d4edcfd 100644 --- a/app/widget/nodeparamview/nodeparamview.h +++ b/app/widget/nodeparamview/nodeparamview.h @@ -47,8 +47,6 @@ public: signals: void InputDoubleClicked(NodeInput* input); - void TimeTargetChanged(Node* target); - void RequestSelectNode(const QList& target); void OpenedNode(Node* n); @@ -64,6 +62,11 @@ protected: virtual void TimebaseChangedEvent(const rational&) override; virtual void TimeChangedEvent(const int64_t &) override; + 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); @@ -77,14 +80,16 @@ private: QScrollBar* vertical_scrollbar_; - QGraphicsRectItem* bottom_item_; - int last_scroll_val_; + QWidget* param_widget_area_; + private slots: void ItemRequestedTimeChanged(const rational& time); - void ForceKeyframeViewToScroll(int min, int max); + void ForceKeyframeViewToScroll(); + + void PlaceKeyframesOnView(); }; diff --git a/app/widget/timebased/timebased.h b/app/widget/timebased/timebased.h index 49012af1c..bf5b8ac40 100644 --- a/app/widget/timebased/timebased.h +++ b/app/widget/timebased/timebased.h @@ -52,6 +52,8 @@ public: void SetScaleAndCenterOnPlayhead(const double& scale); + TimeRuler* ruler() const; + public slots: void SetTimestamp(int64_t timestamp); @@ -89,8 +91,6 @@ public slots: void GoToOut(); - TimeRuler* ruler() const; - protected slots: void SetTimeAndSignal(const int64_t& t); diff --git a/app/widget/timelinewidget/view/timelineview.cpp b/app/widget/timelinewidget/view/timelineview.cpp index 2d3cc4511..d3ae73c56 100644 --- a/app/widget/timelinewidget/view/timelineview.cpp +++ b/app/widget/timelinewidget/view/timelineview.cpp @@ -45,7 +45,6 @@ TimelineView::TimelineView(Qt::Alignment vertical_alignment, QWidget *parent) : setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn); setBackgroundRole(QPalette::Window); setContextMenuPolicy(Qt::CustomContextMenu); - SetLimitYAxis(true); viewport()->setMouseTracking(true); connect(scene(), &QGraphicsScene::selectionChanged, this, &TimelineView::SelectionChanged); diff --git a/app/widget/timelinewidget/view/timelineviewbase.cpp b/app/widget/timelinewidget/view/timelineviewbase.cpp index c945f80db..c044f425e 100644 --- a/app/widget/timelinewidget/view/timelineviewbase.cpp +++ b/app/widget/timelinewidget/view/timelineviewbase.cpp @@ -39,7 +39,6 @@ TimelineViewBase::TimelineViewBase(QWidget *parent) : playhead_scene_left_(-1), playhead_scene_right_(-1), dragging_playhead_(false), - limit_y_axis_(false), snapped_(false), snap_service_(nullptr) { @@ -271,10 +270,4 @@ bool TimelineViewBase::WheelEventIsAZoomEvent(QWheelEvent *event) return (static_cast(event->modifiers() & Qt::ControlModifier) == !Config::Current()["ScrollZooms"].toBool()); } -void TimelineViewBase::SetLimitYAxis(bool) -{ - limit_y_axis_ = true; - UpdateSceneRect(); -} - OLIVE_NAMESPACE_EXIT diff --git a/app/widget/timelinewidget/view/timelineviewbase.h b/app/widget/timelinewidget/view/timelineviewbase.h index e664f5178..cb667dd41 100644 --- a/app/widget/timelinewidget/view/timelineviewbase.h +++ b/app/widget/timelinewidget/view/timelineviewbase.h @@ -73,8 +73,6 @@ protected: bool WheelEventIsAZoomEvent(QWheelEvent* event); - void SetLimitYAxis(bool e); - rational GetPlayheadTime() const; bool PlayheadPress(QMouseEvent* event); @@ -97,8 +95,6 @@ private: QGraphicsScene scene_; - bool limit_y_axis_; - bool snapped_; QList snap_time_; diff --git a/app/window/mainwindow/mainwindow.cpp b/app/window/mainwindow/mainwindow.cpp index 98538cc77..38f364cb2 100644 --- a/app/window/mainwindow/mainwindow.cpp +++ b/app/window/mainwindow/mainwindow.cpp @@ -518,6 +518,7 @@ void MainWindow::RemoveProjectPanel(ProjectPanel *panel) void MainWindow::TimelineFocused(ViewerOutput* viewer) { sequence_viewer_panel_->ConnectViewerNode(viewer); + param_panel_->ConnectViewerNode(viewer); Sequence* seq = nullptr;