From 97b91d2050daf6e973ea23a5142c3dd8b963aaa4 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 27 Dec 2019 16:38:01 +1100 Subject: [PATCH] synchronized the keyframeview and nodeparamview scroll to work together --- app/widget/nodeparamview/nodeparamview.cpp | 38 ++++++++++++++++++++-- app/widget/nodeparamview/nodeparamview.h | 11 +++++++ 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/app/widget/nodeparamview/nodeparamview.cpp b/app/widget/nodeparamview/nodeparamview.cpp index 80cd55238..d027629d1 100644 --- a/app/widget/nodeparamview/nodeparamview.cpp +++ b/app/widget/nodeparamview/nodeparamview.cpp @@ -21,16 +21,18 @@ #include "nodeparamview.h" #include +#include #include #include "common/timecodefunctions.h" #include "node/output/viewer/viewer.h" NodeParamView::NodeParamView(QWidget *parent) : - QWidget(parent) + QWidget(parent), + last_scroll_val_(0) { // Create horizontal layout to place scroll area in (and keyframe editing eventually) - QVBoxLayout* layout = new QVBoxLayout(this); + QHBoxLayout* layout = new QHBoxLayout(this); layout->setSpacing(0); layout->setMargin(0); @@ -39,6 +41,7 @@ NodeParamView::NodeParamView(QWidget *parent) : // Set up scroll area for params QScrollArea* scroll_area = new QScrollArea(); + scroll_area->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); scroll_area->setWidgetResizable(true); splitter->addWidget(scroll_area); @@ -66,6 +69,8 @@ NodeParamView::NodeParamView(QWidget *parent) : // Create keyframe view keyframe_view_ = new KeyframeView(); + keyframe_view_->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + bottom_item_ = keyframe_view_->scene()->addRect(0, 0, 1, 1); keyframe_area_layout->addWidget(keyframe_view_); // Connect ruler and keyframe view together @@ -79,6 +84,22 @@ NodeParamView::NodeParamView(QWidget *parent) : // Disable collapsing param view (but collapsing keyframe view is permitted) splitter->setCollapsible(0, false); + // Create global vertical scrollbar on the right + vertical_scrollbar_ = new QScrollBar(); + vertical_scrollbar_->setMaximum(0); + layout->addWidget(vertical_scrollbar_); + + // Connect scrollbars together + connect(scroll_area->verticalScrollBar(), &QScrollBar::rangeChanged, vertical_scrollbar_, &QScrollBar::setRange); + connect(scroll_area->verticalScrollBar(), &QScrollBar::rangeChanged, this, &NodeParamView::ForceKeyframeViewToScroll); + + connect(keyframe_view_->verticalScrollBar(), &QScrollBar::valueChanged, vertical_scrollbar_, &QScrollBar::setValue); + connect(keyframe_view_->verticalScrollBar(), &QScrollBar::valueChanged, scroll_area->verticalScrollBar(), &QScrollBar::setValue); + connect(scroll_area->verticalScrollBar(), &QScrollBar::valueChanged, vertical_scrollbar_, &QScrollBar::setValue); + connect(scroll_area->verticalScrollBar(), &QScrollBar::valueChanged, keyframe_view_->verticalScrollBar(), &QScrollBar::setValue); + connect(vertical_scrollbar_, &QScrollBar::valueChanged, scroll_area->verticalScrollBar(), &QScrollBar::setValue); + connect(vertical_scrollbar_, &QScrollBar::valueChanged, keyframe_view_->verticalScrollBar(), &QScrollBar::setValue); + // Set a default scale - FIXME: Hardcoded SetScale(120); } @@ -93,6 +114,7 @@ void NodeParamView::SetNodes(QList nodes) // Reset keyframe view SetTimebase(rational()); + keyframe_view_->Clear(); // Set the internal list to the one we've received nodes_ = nodes; @@ -122,6 +144,13 @@ void NodeParamView::SetNodes(QList nodes) SetTime(0); } +void NodeParamView::resizeEvent(QResizeEvent *event) +{ + QWidget::resizeEvent(event); + + vertical_scrollbar_->setPageStep(vertical_scrollbar_->height()); +} + const QList &NodeParamView::nodes() { return nodes_; @@ -174,3 +203,8 @@ void NodeParamView::ItemRequestedTimeChanged(const rational &time) SetTime(timestamp); emit TimeChanged(timestamp); } + +void NodeParamView::ForceKeyframeViewToScroll(int min, int max) +{ + bottom_item_->setY(keyframe_view_->viewport()->height() + max); +} diff --git a/app/widget/nodeparamview/nodeparamview.h b/app/widget/nodeparamview/nodeparamview.h index 5d9a31e6f..96bfca419 100644 --- a/app/widget/nodeparamview/nodeparamview.h +++ b/app/widget/nodeparamview/nodeparamview.h @@ -47,6 +47,9 @@ public slots: signals: void TimeChanged(const int64_t& timestamp); +protected: + virtual void resizeEvent(QResizeEvent *event) override; + private: void SetTimebase(const rational& timebase); @@ -62,11 +65,19 @@ private: QList items_; + QScrollBar* vertical_scrollbar_; + + QGraphicsRectItem* bottom_item_; + + int last_scroll_val_; + private slots: void RulerTimeChanged(const int64_t& timestamp); void ItemRequestedTimeChanged(const rational& time); + void ForceKeyframeViewToScroll(int min, int max); + }; #endif // NODEPARAMVIEW_H