paramview: changed to static viewer-bound and fixed various scrolling issues
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 ×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<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
|
||||
|
||||
@@ -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 ×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();
|
||||
|
||||
};
|
||||
|
||||
|
||||
@@ -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_;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user