File indexing completed on 2024-05-12 04:19:36

0001 // SPDX-FileCopyrightText: 2021 Noah Davis <noahadvs@gmail.com>
0002 // SPDX-License-Identifier: LGPL-2.1-or-later
0003 
0004 #include "decoratedtag.h"
0005 #include <KColorUtils>
0006 #include <QEvent>
0007 #include <QPaintEvent>
0008 #include <QStylePainter>
0009 
0010 using namespace Gwenview;
0011 
0012 class Gwenview::DecoratedTagPrivate
0013 {
0014     Q_DECLARE_PUBLIC(DecoratedTag)
0015 public:
0016     DecoratedTagPrivate(DecoratedTag *q)
0017         : q_ptr(q)
0018     {
0019     }
0020     DecoratedTag *q_ptr = nullptr;
0021 
0022     void updateMargins();
0023     qreal horizontalMargin;
0024     qreal verticalMargin;
0025 };
0026 
0027 void DecoratedTagPrivate::updateMargins()
0028 {
0029     Q_Q(DecoratedTag);
0030     horizontalMargin = q->fontMetrics().descent() + 2;
0031     verticalMargin = 2;
0032     q->setContentsMargins(horizontalMargin, verticalMargin, horizontalMargin, verticalMargin);
0033 }
0034 
0035 DecoratedTag::DecoratedTag(QWidget *parent, Qt::WindowFlags f)
0036     : QLabel(parent, f)
0037     , d_ptr(new DecoratedTagPrivate(this))
0038 {
0039     Q_D(DecoratedTag);
0040     d->updateMargins();
0041 }
0042 
0043 DecoratedTag::DecoratedTag(const QString &text, QWidget *parent, Qt::WindowFlags f)
0044     : QLabel(text, parent, f)
0045     , d_ptr(new DecoratedTagPrivate(this))
0046 {
0047     Q_D(DecoratedTag);
0048     d->updateMargins();
0049 }
0050 
0051 Gwenview::DecoratedTag::~DecoratedTag() noexcept = default;
0052 
0053 void DecoratedTag::changeEvent(QEvent *event)
0054 {
0055     Q_D(DecoratedTag);
0056     if (event->type() == QEvent::FontChange) {
0057         d->updateMargins();
0058     }
0059 }
0060 
0061 void DecoratedTag::paintEvent(QPaintEvent *event)
0062 {
0063     Q_D(const DecoratedTag);
0064     QStylePainter painter(this);
0065     painter.setRenderHint(QPainter::Antialiasing);
0066     const QColor penColor = KColorUtils::mix(palette().base().color(), palette().text().color(), 0.3);
0067     // QPainter is bad at drawing lines that are exactly 1px.
0068     // Using QPen::setCosmetic(true) with a 1px pen width
0069     // doesn't look quite as good as just using 1.001px.
0070     const qreal penWidth = 1.001;
0071     const qreal penMargin = penWidth / 2;
0072     QPen pen(penColor, penWidth);
0073     pen.setCosmetic(true);
0074     QRectF rect = event->rect();
0075     rect.adjust(penMargin, penMargin, -penMargin, -penMargin);
0076     painter.setBrush(palette().base());
0077     painter.setPen(pen);
0078     painter.drawRoundedRect(rect, d->horizontalMargin, d->horizontalMargin);
0079     QLabel::paintEvent(event);
0080 }
0081 
0082 #include "moc_decoratedtag.cpp"