From a86558f9a66116a18b1ad18686935e4d9a22b074 Mon Sep 17 00:00:00 2001 From: Jim Broadus Date: Fri, 9 Apr 2021 23:21:51 -0700 Subject: [PATCH] playlist: Fix queued item painting QueuedItemDelegate::DrawBox leaves the painter in a state that can cause artifacts. Specifically, there are cases where the item text is not visible. To fix this, push the painter state before making changes and pop it after drawing. --- src/playlist/playlistdelegates.cpp | 15 ++++++++++----- src/playlist/playlistdelegates.h | 2 +- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/playlist/playlistdelegates.cpp b/src/playlist/playlistdelegates.cpp index 837f8152a..a51c8c5c5 100644 --- a/src/playlist/playlistdelegates.cpp +++ b/src/playlist/playlistdelegates.cpp @@ -69,19 +69,16 @@ void QueuedItemDelegate::paint(QPainter* painter, opacity /= kQueueOpacitySteps; opacity *= 1.0 - kQueueOpacityLowerBound; opacity += kQueueOpacityLowerBound; - painter->setOpacity(opacity); DrawBox(painter, option.rect, option.font, QString::number(queue_pos + 1), - kQueueBoxLength); - - painter->setOpacity(1.0); + kQueueBoxLength, opacity); } } } void QueuedItemDelegate::DrawBox(QPainter* painter, const QRect& line_rect, const QFont& font, const QString& text, - int width) const { + int width, float opacity) const { QFont smaller = font; smaller.setPointSize(smaller.pointSize() - 1); smaller.setBold(true); @@ -101,6 +98,11 @@ void QueuedItemDelegate::DrawBox(QPainter* painter, const QRect& line_rect, gradient.setColorAt(0.0, kQueueBoxGradientColor1); gradient.setColorAt(1.0, kQueueBoxGradientColor2); + // Push painter state + painter->save(); + + painter->setOpacity(opacity); + // Turn on antialiasing painter->setRenderHint(QPainter::Antialiasing); @@ -114,6 +116,9 @@ void QueuedItemDelegate::DrawBox(QPainter* painter, const QRect& line_rect, painter->setFont(smaller); painter->drawText(rect, Qt::AlignCenter, text); painter->translate(-0.5, -0.5); + + // Pop painter state + painter->restore(); } int QueuedItemDelegate::queue_indicator_size(const QModelIndex& index) const { diff --git a/src/playlist/playlistdelegates.h b/src/playlist/playlistdelegates.h index f5d0b3fe0..53c4b83c1 100644 --- a/src/playlist/playlistdelegates.h +++ b/src/playlist/playlistdelegates.h @@ -37,7 +37,7 @@ class QueuedItemDelegate : public QStyledItemDelegate { void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const; void DrawBox(QPainter* painter, const QRect& line_rect, const QFont& font, - const QString& text, int width = -1) const; + const QString& text, int width = -1, float opacity = 1.0) const; int queue_indicator_size(const QModelIndex& index) const;