implemented working playhead
This commit is contained in:
@@ -20,6 +20,7 @@
|
||||
|
||||
#include "timeline.h"
|
||||
|
||||
#include <QScrollBar>
|
||||
#include <QVBoxLayout>
|
||||
|
||||
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();
|
||||
|
||||
@@ -22,16 +22,28 @@
|
||||
|
||||
#include <QMouseEvent>
|
||||
#include <QtMath>
|
||||
#include <QPen>
|
||||
|
||||
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<TimelineViewClipItem*>(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());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<TimelineViewClipItem*> clip_items_;
|
||||
|
||||
QVector<TimelineViewGhostItem*> ghost_items_;
|
||||
|
||||
QGraphicsLineItem* playhead_line_;
|
||||
};
|
||||
|
||||
#endif // TIMELINEVIEW_H
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user