paramview: changed to static viewer-bound and fixed various scrolling issues

This commit is contained in:
itsmattkc
2020-06-22 00:38:00 +10:00
parent e97b5a9a14
commit 1725f01459
12 changed files with 81 additions and 70 deletions
-2
View File
@@ -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);
-2
View File
@@ -41,8 +41,6 @@ public slots:
virtual void DeleteSelected() override;
signals:
void TimeTargetChanged(Node* node);
void RequestSelectNode(const QList<Node*>& target);
void FoundGizmos(Node* node);
+8 -1
View File
@@ -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);
+10
View File
@@ -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
+11 -7
View File
@@ -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;
+39 -39
View File
@@ -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<Node *> 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<Node *> 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<Node *> nodes)
}
}
ViewerOutput* viewer = nodes_.first()->FindOutputNode<ViewerOutput>();
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 &timestamp)
@@ -225,6 +198,28 @@ void NodeParamView::TimeChangedEvent(const int64_t &timestamp)
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<Node *> &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
+10 -5
View File
@@ -47,8 +47,6 @@ public:
signals:
void InputDoubleClicked(NodeInput* input);
void TimeTargetChanged(Node* target);
void RequestSelectNode(const QList<Node*>& 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 &timestamp);
@@ -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();
};
+2 -2
View File
@@ -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);
@@ -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);
@@ -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<bool>(event->modifiers() & Qt::ControlModifier) == !Config::Current()["ScrollZooms"].toBool());
}
void TimelineViewBase::SetLimitYAxis(bool)
{
limit_y_axis_ = true;
UpdateSceneRect();
}
OLIVE_NAMESPACE_EXIT
@@ -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<rational> snap_time_;
+1
View File
@@ -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;