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"