Skip to content
Snippets Groups Projects
Badge.cpp 3.9 KiB
Newer Older
  • Learn to ignore specific revisions
  • Nicolas Werner's avatar
    Nicolas Werner committed
    // SPDX-FileCopyrightText: 2021 Nheko Contributors
    //
    // SPDX-License-Identifier: GPL-3.0-or-later
    
    
    Konstantinos Sideris's avatar
    Konstantinos Sideris committed
    #include <QPainter>
    
    #include "Badge.h"
    
    Badge::Badge(QWidget *parent)
    
      : OverlayWidget(parent)
    
    Konstantinos Sideris's avatar
    Konstantinos Sideris committed
    {
    
            init();
    
    Konstantinos Sideris's avatar
    Konstantinos Sideris committed
    }
    
    Badge::Badge(const QIcon &icon, QWidget *parent)
    
      : OverlayWidget(parent)
    
    Konstantinos Sideris's avatar
    Konstantinos Sideris committed
    {
    
            init();
            setIcon(icon);
    
    Konstantinos Sideris's avatar
    Konstantinos Sideris committed
    }
    
    Badge::Badge(const QString &text, QWidget *parent)
    
      : OverlayWidget(parent)
    
    Konstantinos Sideris's avatar
    Konstantinos Sideris committed
    {
    
            init();
            setText(text);
    
    void
    Badge::init()
    
    Konstantinos Sideris's avatar
    Konstantinos Sideris committed
    {
    
            x_ = 0;
            y_ = 0;
            // TODO: Make padding configurable.
            padding_  = 5;
            diameter_ = 24;
    
            setAttribute(Qt::WA_TransparentForMouseEvents);
    
            QFont _font(font());
            _font.setPointSizeF(7.5);
            _font.setStyleName("Bold");
    
            setFont(_font);
            setText("");
    
    QString
    Badge::text() const
    
    Konstantinos Sideris's avatar
    Konstantinos Sideris committed
    {
    
            return text_;
    
    QIcon
    Badge::icon() const
    
    Konstantinos Sideris's avatar
    Konstantinos Sideris committed
    {
    
            return icon_;
    
    QSize
    Badge::sizeHint() const
    
    Konstantinos Sideris's avatar
    Konstantinos Sideris committed
    {
    
            const int d = diameter();
            return QSize(d + 4, d + 4);
    
    qreal
    Badge::relativeYPosition() const
    
    Konstantinos Sideris's avatar
    Konstantinos Sideris committed
    {
    
            return y_;
    
    qreal
    Badge::relativeXPosition() const
    
    Konstantinos Sideris's avatar
    Konstantinos Sideris committed
    {
    
            return x_;
    
    QPointF
    Badge::relativePosition() const
    
    Konstantinos Sideris's avatar
    Konstantinos Sideris committed
    {
    
            return QPointF(x_, y_);
    
    QColor
    Badge::backgroundColor() const
    
    Konstantinos Sideris's avatar
    Konstantinos Sideris committed
    {
    
            if (!background_color_.isValid())
                    return QColor("black");
    
            return background_color_;
    
    QColor
    Badge::textColor() const
    
    Konstantinos Sideris's avatar
    Konstantinos Sideris committed
    {
    
            if (!text_color_.isValid())
                    return QColor("white");
    
            return text_color_;
    
    void
    Badge::setTextColor(const QColor &color)
    
    Konstantinos Sideris's avatar
    Konstantinos Sideris committed
    {
    
            text_color_ = color;
    
    void
    Badge::setBackgroundColor(const QColor &color)
    
    Konstantinos Sideris's avatar
    Konstantinos Sideris committed
    {
    
            background_color_ = color;
    
    void
    Badge::setRelativePosition(const QPointF &pos)
    
    Konstantinos Sideris's avatar
    Konstantinos Sideris committed
    {
    
            setRelativePosition(pos.x(), pos.y());
    
    void
    Badge::setRelativePosition(qreal x, qreal y)
    
    Konstantinos Sideris's avatar
    Konstantinos Sideris committed
    {
    
            x_ = x;
            y_ = y;
            update();
    
    void
    Badge::setRelativeXPosition(qreal x)
    
    Konstantinos Sideris's avatar
    Konstantinos Sideris committed
    {
    
            x_ = x;
            update();
    
    void
    Badge::setRelativeYPosition(qreal y)
    
    Konstantinos Sideris's avatar
    Konstantinos Sideris committed
    {
    
            y_ = y;
            update();
    
    void
    Badge::setIcon(const QIcon &icon)
    
    Konstantinos Sideris's avatar
    Konstantinos Sideris committed
    {
    
            icon_ = icon;
            update();
    
    void
    Badge::setText(const QString &text)
    
    Konstantinos Sideris's avatar
    Konstantinos Sideris committed
    {
    
            text_ = text;
    
            if (!icon_.isNull())
                    icon_ = QIcon();
    
            size_ = fontMetrics().size(Qt::TextShowMnemonic, text);
    
            update();
    
    void
    Badge::setDiameter(int diameter)
    
            if (diameter > 0) {
                    diameter_ = diameter;
                    update();
            }
    
    void
    Badge::paintEvent(QPaintEvent *)
    
    Konstantinos Sideris's avatar
    Konstantinos Sideris committed
    {
    
            QPainter painter(this);
            painter.setRenderHint(QPainter::Antialiasing);
            painter.translate(x_, y_);
    
            QBrush brush;
            brush.setStyle(Qt::SolidPattern);
    
            painter.setBrush(brush);
            painter.setPen(Qt::NoPen);
    
            const int d = diameter();
    
            QRectF r(0, 0, d, d);
            r.translate(QPointF((width() - d), (height() - d)) / 2);
    
            if (icon_.isNull()) {
                    QPen pen;
                    // TODO: Make badge width configurable.
                    pen.setWidth(1);
                    pen.setColor(textColor());
    
                    painter.setPen(pen);
                    painter.drawEllipse(r);
    
                    painter.setPen(textColor());
                    painter.setBrush(Qt::NoBrush);
                    painter.drawText(r.translated(0, -0.5), Qt::AlignCenter, text_);
            } else {
                    painter.drawEllipse(r);
                    QRectF q(0, 0, 16, 16);
                    q.moveCenter(r.center());
                    QPixmap pixmap = icon().pixmap(16, 16);
                    QPainter icon(&pixmap);
                    icon.setCompositionMode(QPainter::CompositionMode_SourceIn);
                    icon.fillRect(pixmap.rect(), textColor());
                    painter.drawPixmap(q.toRect(), pixmap);
            }
    
    int
    Badge::diameter() const
    
    Konstantinos Sideris's avatar
    Konstantinos Sideris committed
    {
    
            if (icon_.isNull()) {
                    return qMax(size_.width(), size_.height()) + padding_;
            }
    
            return diameter_;
    
    Konstantinos Sideris's avatar
    Konstantinos Sideris committed
    }