From f34eb0dfb62c466678a79ca4340a4a384958c0b4 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sat, 5 Oct 2019 08:27:07 +1000 Subject: [PATCH] added vertical alignment to timelineview --- app/node/output/timeline/tracklist.cpp | 12 ++++--- app/widget/timelineview/timelineview.cpp | 36 ++++++++++++++----- app/widget/timelineview/timelineview.h | 4 +-- .../timelineview/timelineviewplayheaditem.cpp | 2 +- app/widget/timelinewidget/timelinewidget.cpp | 2 +- 5 files changed, 39 insertions(+), 17 deletions(-) diff --git a/app/node/output/timeline/tracklist.cpp b/app/node/output/timeline/tracklist.cpp index 904c82eaa..d2a6e4a20 100644 --- a/app/node/output/timeline/tracklist.cpp +++ b/app/node/output/timeline/tracklist.cpp @@ -145,12 +145,14 @@ void TrackList::AddTrack() NodeParam::ConnectEdge(track->track_output(), current_last_track->track_input()); // FIXME: Test code only - AlphaOverBlend* blend = new AlphaOverBlend(); - GetParentGraph()->AddNode(blend); + if (current_last_track->texture_output()->IsConnected()) { + AlphaOverBlend* blend = new AlphaOverBlend(); + GetParentGraph()->AddNode(blend); - NodeParam::ConnectEdge(track->texture_output(), blend->blend_input()); - NodeParam::ConnectEdge(current_last_track->texture_output(), blend->base_input()); - NodeParam::ConnectEdge(blend->texture_output(), current_last_track->texture_output()->edges().first()->input()); + NodeParam::ConnectEdge(track->texture_output(), blend->blend_input()); + NodeParam::ConnectEdge(current_last_track->texture_output(), blend->base_input()); + NodeParam::ConnectEdge(blend->texture_output(), current_last_track->texture_output()->edges().first()->input()); + } // End test code } } diff --git a/app/widget/timelineview/timelineview.cpp b/app/widget/timelineview/timelineview.cpp index e83e43b54..a309639d8 100644 --- a/app/widget/timelineview/timelineview.cpp +++ b/app/widget/timelineview/timelineview.cpp @@ -33,7 +33,7 @@ #include "project/item/footage/footage.h" #include "tool/tool.h" -TimelineView::TimelineView(QWidget *parent) : +TimelineView::TimelineView(Qt::Alignment vertical_alignment, QWidget *parent) : QGraphicsView(parent), pointer_tool_(this), import_tool_(this), @@ -47,8 +47,10 @@ TimelineView::TimelineView(QWidget *parent) : timeline_node_(nullptr), playhead_(0) { + Q_ASSERT(vertical_alignment == Qt::AlignTop || vertical_alignment == Qt::AlignBottom); + setAlignment(Qt::AlignLeft | vertical_alignment); + setScene(&scene_); - setAlignment(Qt::AlignLeft | Qt::AlignTop); setDragMode(RubberBandDrag); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn); setBackgroundRole(QPalette::Window); @@ -328,6 +330,10 @@ int TimelineView::GetTrackY(int track_index) y += GetTrackHeight(i); } + if (alignment() & Qt::AlignBottom) { + y = -y - GetTrackHeight(0); + } + return y; } @@ -360,11 +366,15 @@ rational TimelineView::SceneToTime(const double &x) return rational(scaled_x_mvmt * timebase_.numerator(), timebase_.denominator()); } -int TimelineView::SceneToTrack(const double &y) +int TimelineView::SceneToTrack(double y) { int track = -1; int heights = 0; + if (alignment() & Qt::AlignBottom) { + y = -y; + } + do { track++; heights += GetTrackHeight(track); @@ -403,14 +413,24 @@ void TimelineView::UpdateSceneRect() { QRectF bounding_rect = scene_.itemsBoundingRect(); - // Ensure the scene left and top are always 0 - bounding_rect.setTopLeft(QPointF(0, 0)); - // Ensure the scene height is always AT LEAST the height of the view // The scrollbar appears to have a 1px margin on the top and bottom, hence the -2 int minimum_height = height() - horizontalScrollBar()->height() - 2; - if (bounding_rect.height() < minimum_height) { - bounding_rect.setHeight(minimum_height); + + if (alignment() & Qt::AlignBottom) { + // Ensure the scene left and bottom are always 0 + bounding_rect.setBottomLeft(QPointF(0, 0)); + + if (bounding_rect.top() > minimum_height) { + bounding_rect.setTop(-minimum_height); + } + } else { + // Ensure the scene left and top are always 0 + bounding_rect.setTopLeft(QPointF(0, 0)); + + if (bounding_rect.height() < minimum_height) { + bounding_rect.setHeight(minimum_height); + } } // Ensure the scene is always the full length of the timeline with a gap at the end to work with diff --git a/app/widget/timelineview/timelineview.h b/app/widget/timelineview/timelineview.h index 9264f5c69..3fe3916c2 100644 --- a/app/widget/timelineview/timelineview.h +++ b/app/widget/timelineview/timelineview.h @@ -45,7 +45,7 @@ class TimelineView : public QGraphicsView { Q_OBJECT public: - TimelineView(QWidget* parent = nullptr); + TimelineView(Qt::Alignment vertical_alignment = Qt::AlignTop, QWidget* parent = nullptr); void SetScale(const double& scale); @@ -345,7 +345,7 @@ private: bool HasGhosts(); rational SceneToTime(const double &x); - int SceneToTrack(const double &y); + int SceneToTrack(double y); void ClearGhosts(); diff --git a/app/widget/timelineview/timelineviewplayheaditem.cpp b/app/widget/timelineview/timelineviewplayheaditem.cpp index f2be86860..fdaa8d0a2 100644 --- a/app/widget/timelineview/timelineviewplayheaditem.cpp +++ b/app/widget/timelineview/timelineviewplayheaditem.cpp @@ -53,7 +53,7 @@ void TimelineViewPlayheadItem::UpdateRect() double width = TimeToScreenCoord(timebase_); setRect(0, 0, width, height_); - setPos(x, 0); + setPos(x, y_); } void TimelineViewPlayheadItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) diff --git a/app/widget/timelinewidget/timelinewidget.cpp b/app/widget/timelinewidget/timelinewidget.cpp index 3cc302d6f..1617f6c54 100644 --- a/app/widget/timelinewidget/timelinewidget.cpp +++ b/app/widget/timelinewidget/timelinewidget.cpp @@ -27,7 +27,7 @@ TimelineWidget::TimelineWidget(QWidget *parent) : layout->addWidget(view_splitter); // Video view - views_.append(new TimelineView()); + views_.append(new TimelineView(Qt::AlignBottom)); // Audio view views_.append(new TimelineView());