aboutsummaryrefslogtreecommitdiffstats
path: root/src/carddelegate.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/carddelegate.cpp')
-rw-r--r--src/carddelegate.cpp31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/carddelegate.cpp b/src/carddelegate.cpp
index 9a98c69..6541932 100644
--- a/src/carddelegate.cpp
+++ b/src/carddelegate.cpp
@@ -26,6 +26,7 @@
#include <QApplication>
#include <QDateTime>
#include <QGuiApplication>
+#include <QLinearGradient>
#include <QPainter>
#include <QRegularExpression>
#include <QStyle>
@@ -100,6 +101,18 @@ QColor CardDelegate::mutedChipColour(const QColor &chipColour)
return QColor::fromHslF(h, s * kSaturationScale, l, a);
}
+QRect CardDelegate::fadeRectFor(const QRect &card, const QRect &innermostSpine)
+{
+ // The EXCLUSIVE right edge, then a rect built from it: QRect::right() is
+ // inclusive, which is the trap CardLayout already documents.
+ const int end = card.left() + int(card.width() * kFadeFraction);
+ const int start = innermostSpine.isEmpty() ? card.left()
+ : innermostSpine.left();
+ if (end <= start)
+ return QRect();
+ return QRect(start, card.top(), end - start, card.height());
+}
+
QColor CardDelegate::accentLineColour(const QColor &accountColour)
{
if (!accountColour.isValid())
@@ -178,6 +191,24 @@ void CardDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
root.data(ThreadListModel::AccountColourRole).value<QColor>();
const QColor lineColour = accentLineColour(accountColour);
+ // The account's fade. Under everything but the chrome, so the selection
+ // highlight and the doomed-row tint still cover it: a selected row reading
+ // mostly as selection is expected, not a fault.
+ const QRect fade =
+ fadeRectFor(option.rect,
+ card.spines.isEmpty() ? QRect() : card.spines.last());
+ if (!fade.isEmpty() && accountColour.isValid()) {
+ QColor from = lineColour;
+ // A reply's wash is weaker than its root's, so an expanded thread
+ // reads as one block with the root leading it.
+ from.setAlphaF(card.accentRect.isEmpty() ? 0.14 : 0.30);
+ QLinearGradient gradient(fade.topLeft(), fade.topRight());
+ gradient.setColorAt(0.0, from);
+ from.setAlphaF(0.0);
+ gradient.setColorAt(1.0, from);
+ painter->fillRect(fade, gradient);
+ }
+
// The accent bar, thread cards only. Drawn after the chrome so the
// selection highlight cannot cover it: which account a card belongs to
// must stay readable on the row the user is looking at.