From 54ec4a26f5f041f4ecd5e6290249766f6821b648 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 2 Aug 2019 10:04:02 +1000 Subject: [PATCH] implemented working playhead --- app/panel/timeline/timeline.cpp | 4 ++ app/widget/timelineview/timelineview.cpp | 43 +++++++++++++++++-- app/widget/timelineview/timelineview.h | 10 ++++- .../timelineview/timelineviewclipitem.cpp | 7 ++- 4 files changed, 58 insertions(+), 6 deletions(-) diff --git a/app/panel/timeline/timeline.cpp b/app/panel/timeline/timeline.cpp index 4382a563c..c38cbe04a 100644 --- a/app/panel/timeline/timeline.cpp +++ b/app/panel/timeline/timeline.cpp @@ -20,6 +20,7 @@ #include "timeline.h" +#include #include TimelinePanel::TimelinePanel(QWidget *parent) : @@ -38,6 +39,9 @@ TimelinePanel::TimelinePanel(QWidget *parent) : view_ = new TimelineView(this); layout->addWidget(view_); + + connect(view_->horizontalScrollBar(), SIGNAL(valueChanged(int)), ruler_, SLOT(SetScroll(int))); + connect(ruler_, SIGNAL(TimeChanged(const int64_t&)), view_, SLOT(SetTime(const int64_t&))); // End test code Retranslate(); diff --git a/app/widget/timelineview/timelineview.cpp b/app/widget/timelineview/timelineview.cpp index 7fd554e18..76ce32f2b 100644 --- a/app/widget/timelineview/timelineview.cpp +++ b/app/widget/timelineview/timelineview.cpp @@ -22,16 +22,28 @@ #include #include +#include TimelineView::TimelineView(QWidget *parent) : - QGraphicsView(parent) + QGraphicsView(parent), + playhead_(0) { setScene(&scene_); setAlignment(Qt::AlignLeft | Qt::AlignVCenter); setDragMode(RubberBandDrag); + setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn); // Set default scale SetScale(1.0); + + // FIXME: Make CSS configurable + playhead_line_ = new QGraphicsLineItem(); + playhead_line_->setPen(QPen(Qt::red)); + + // Ensure playhead line is always on top + playhead_line_->setZValue(100); + + scene_.addItem(playhead_line_); } void TimelineView::AddClip(ClipBlock *clip) @@ -57,6 +69,8 @@ void TimelineView::SetScale(const double &scale) foreach (TimelineViewClipItem* item, clip_items_) { item->SetScale(scale_); } + + UpdatePlayheadPosition(); } void TimelineView::SetTimebase(const rational &timebase) @@ -66,14 +80,25 @@ void TimelineView::SetTimebase(const rational &timebase) foreach (TimelineViewClipItem* item, clip_items_) { item->SetTimebase(timebase_); } + + UpdatePlayheadPosition(); } void TimelineView::Clear() { + scene_.removeItem(playhead_line_); + scene_.clear(); clip_items_.clear(); - // FIXME: Does QGraphicsScene take ownership of these items or do I have to delete them manually after the scene - // clear? + + scene_.addItem(playhead_line_); +} + +void TimelineView::SetTime(const int64_t time) +{ + playhead_ = time; + + UpdatePlayheadPosition(); } void TimelineView::mousePressEvent(QMouseEvent *event) @@ -88,6 +113,7 @@ void TimelineView::mousePressEvent(QMouseEvent *event) TimelineViewClipItem* clip_item = static_cast(item); ghost->setRect(clip_item->rect()); + ghost->setPos(clip_item->pos()); ghost_items_.append(ghost); @@ -121,3 +147,14 @@ void TimelineView::mouseReleaseEvent(QMouseEvent *event) ghost_items_.clear(); } } + +void TimelineView::UpdatePlayheadPosition() +{ + if (timebase_.denominator() != 0) { + double timebase_dbl = timebase_.ToDouble(); + + double playhead_x = double(playhead_ * timebase_.numerator()) / double(timebase_.denominator()) / timebase_dbl * scale_; + + playhead_line_->setLine(playhead_x, 0, playhead_x, height()); + } +} diff --git a/app/widget/timelineview/timelineview.h b/app/widget/timelineview/timelineview.h index 7c6bd6c6f..1b3dcfb2a 100644 --- a/app/widget/timelineview/timelineview.h +++ b/app/widget/timelineview/timelineview.h @@ -29,6 +29,7 @@ class TimelineView : public QGraphicsView { + Q_OBJECT public: TimelineView(QWidget* parent); @@ -40,23 +41,30 @@ public: void Clear(); +public slots: + void SetTime(const int64_t time); + protected: virtual void mousePressEvent(QMouseEvent *event) override; virtual void mouseMoveEvent(QMouseEvent *event) override; virtual void mouseReleaseEvent(QMouseEvent *event) override; private: + void UpdatePlayheadPosition(); + QGraphicsScene scene_; double scale_; rational timebase_; - rational playhead_; + int64_t playhead_; QVector clip_items_; QVector ghost_items_; + + QGraphicsLineItem* playhead_line_; }; #endif // TIMELINEVIEW_H diff --git a/app/widget/timelineview/timelineviewclipitem.cpp b/app/widget/timelineview/timelineviewclipitem.cpp index fe401c7c5..9c8389f96 100644 --- a/app/widget/timelineview/timelineviewclipitem.cpp +++ b/app/widget/timelineview/timelineviewclipitem.cpp @@ -60,9 +60,12 @@ void TimelineViewClipItem::UpdateRect() } double timebase_dbl = timebase_.ToDouble(); + double item_left = clip_->in().ToDouble() / timebase_dbl * scale_; - double item_right = clip_->out().ToDouble() / timebase_dbl * scale_; - setRect(item_left, 0, item_right - item_left - 1, 100); + double item_width = clip_->length().ToDouble() / timebase_dbl * scale_; + + setRect(0, 0, item_width - 1, 100); + setPos(item_left, 0.0); } void TimelineViewClipItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)