From 46be693b3ea9517a6b73d1dd5e88b489a6851954 Mon Sep 17 00:00:00 2001 From: itsmattkc <34096995+itsmattkc@users.noreply.github.com> Date: Tue, 19 Jul 2022 11:21:06 -0700 Subject: [PATCH] timeline: show marker text even on markers without range --- app/timeline/timelinemarker.cpp | 19 +++++++++++++++++-- app/timeline/timelinemarker.h | 2 +- .../timelinewidget/view/timelineview.cpp | 2 +- app/widget/timeruler/seekablewidget.cpp | 12 +++++++++++- 4 files changed, 30 insertions(+), 5 deletions(-) diff --git a/app/timeline/timelinemarker.cpp b/app/timeline/timelinemarker.cpp index d8b87b7fd..25de1ab9a 100644 --- a/app/timeline/timelinemarker.cpp +++ b/app/timeline/timelinemarker.cpp @@ -20,6 +20,8 @@ #include "timelinemarker.h" +#include + #include "common/qtutils.h" #include "common/xmlutils.h" #include "config/config.h" @@ -76,7 +78,7 @@ int TimelineMarker::GetMarkerHeight(const QFontMetrics &fm) return fm.height(); } -QRect TimelineMarker::Draw(QPainter *p, const QPoint &pt, double scale, bool selected) +QRect TimelineMarker::Draw(QPainter *p, const QPoint &pt, int max_right, double scale, bool selected) { QFontMetrics fm = p->fontMetrics(); @@ -96,6 +98,9 @@ QRect TimelineMarker::Draw(QPainter *p, const QPoint &pt, double scale, bool sel int top = pt.y() - marker_height; + QTextOption op(Qt::AlignLeft | Qt::AlignVCenter); + op.setWrapMode(QTextOption::NoWrap); + if (time_.out() != time_.in()) { QRect marker_rect(pt.x(), top, time_.length().toDouble() * scale, marker_height); @@ -103,7 +108,7 @@ QRect TimelineMarker::Draw(QPainter *p, const QPoint &pt, double scale, bool sel if (!name_.isEmpty()) { p->setPen(ColorCoding::GetUISelectorColor(ColorCoding::GetColor(color_))); - p->drawText(marker_rect.adjusted(marker_width/4, 0, 0, 0), name_, Qt::AlignLeft | Qt::AlignVCenter); + p->drawText(marker_rect.adjusted(marker_width/4, 0, 0, 0), name_, op); } return marker_rect; @@ -125,6 +130,16 @@ QRect TimelineMarker::Draw(QPainter *p, const QPoint &pt, double scale, bool sel p->setRenderHint(QPainter::Antialiasing); p->drawPolygon(points, 6); + if (!name_.isEmpty() && max_right != -1) { + QRect text_rect(right, top, max_right - right, marker_height); + + int padding = QtUtils::QFontMetricsWidth(p->fontMetrics(), QStringLiteral(" ")); + text_rect.adjust(padding, 0, - padding - half_width, 0); + + p->setPen(qApp->palette().text().color()); + p->drawText(text_rect, name_, op); + } + return QRect(left, top, marker_width, marker_height); } } diff --git a/app/timeline/timelinemarker.h b/app/timeline/timelinemarker.h index 7712111d2..47773d237 100644 --- a/app/timeline/timelinemarker.h +++ b/app/timeline/timelinemarker.h @@ -51,7 +51,7 @@ public: void set_color(int c); static int GetMarkerHeight(const QFontMetrics &fm); - QRect Draw(QPainter *p, const QPoint &pt, double scale, bool selected); + QRect Draw(QPainter *p, const QPoint &pt, int max_right, double scale, bool selected); signals: void TimeChanged(const TimeRange& time); diff --git a/app/widget/timelinewidget/view/timelineview.cpp b/app/widget/timelinewidget/view/timelineview.cpp index dcdb9c66b..34cca2fe6 100644 --- a/app/widget/timelinewidget/view/timelineview.cpp +++ b/app/widget/timelinewidget/view/timelineview.cpp @@ -586,7 +586,7 @@ void TimelineView::DrawBlock(QPainter *painter, bool foreground, Block *block, q if (marker->time().in() >= clip->media_in() && marker->time().out() <= clip->media_in() + clip->length()) { QPoint marker_pt(TimeToScene(clip->in() - clip->media_in() + marker->time().in()), block_top + block_height); painter->setClipRect(r); - QRect marker_rect = marker->Draw(painter, marker_pt, GetScale(), false); + QRect marker_rect = marker->Draw(painter, marker_pt, -1, GetScale(), false); clip_marker_rects_.insert(marker, marker_rect); painter->setClipping(false); } diff --git a/app/widget/timeruler/seekablewidget.cpp b/app/widget/timeruler/seekablewidget.cpp index 3ef5a135c..27d9f4ddc 100644 --- a/app/widget/timeruler/seekablewidget.cpp +++ b/app/widget/timeruler/seekablewidget.cpp @@ -277,7 +277,17 @@ void SeekableWidget::DrawMarkers(QPainter *p, int marker_bottom) break; } - QRect marker_rect = marker->Draw(p, QPoint(marker_left, marker_bottom), GetScale(), selection_manager_.IsSelected(marker)); + int max_marker_right = lim_right; + { + // Check if there's a marker next + auto next = it; + next++; + if (next != markers_->cend()) { + max_marker_right = std::min(max_marker_right, int(TimeToScene((*next)->time().in()))); + } + } + + QRect marker_rect = marker->Draw(p, QPoint(marker_left, marker_bottom), max_marker_right, GetScale(), selection_manager_.IsSelected(marker)); marker_top_ = marker_rect.top(); selection_manager_.DeclareDrawnObject(marker, marker_rect); }