summary refs log tree commit diff
path: root/src/ui/Badge.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/Badge.cpp')
-rw-r--r--src/ui/Badge.cpp218
1 files changed, 218 insertions, 0 deletions
diff --git a/src/ui/Badge.cpp b/src/ui/Badge.cpp
new file mode 100644
index 00000000..6701f9b7
--- /dev/null
+++ b/src/ui/Badge.cpp
@@ -0,0 +1,218 @@
+#include <QPainter>
+
+#include "Badge.h"
+
+Badge::Badge(QWidget *parent)
+  : OverlayWidget(parent)
+{
+        init();
+}
+
+Badge::Badge(const QIcon &icon, QWidget *parent)
+  : OverlayWidget(parent)
+{
+        init();
+        setIcon(icon);
+}
+
+Badge::Badge(const QString &text, QWidget *parent)
+  : OverlayWidget(parent)
+{
+        init();
+        setText(text);
+}
+
+void
+Badge::init()
+{
+        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
+{
+        return text_;
+}
+
+QIcon
+Badge::icon() const
+{
+        return icon_;
+}
+
+QSize
+Badge::sizeHint() const
+{
+        const int d = diameter();
+        return QSize(d + 4, d + 4);
+}
+
+qreal
+Badge::relativeYPosition() const
+{
+        return y_;
+}
+
+qreal
+Badge::relativeXPosition() const
+{
+        return x_;
+}
+
+QPointF
+Badge::relativePosition() const
+{
+        return QPointF(x_, y_);
+}
+
+QColor
+Badge::backgroundColor() const
+{
+        if (!background_color_.isValid())
+                return QColor("black");
+
+        return background_color_;
+}
+
+QColor
+Badge::textColor() const
+{
+        if (!text_color_.isValid())
+                return QColor("white");
+
+        return text_color_;
+}
+
+void
+Badge::setTextColor(const QColor &color)
+{
+        text_color_ = color;
+}
+
+void
+Badge::setBackgroundColor(const QColor &color)
+{
+        background_color_ = color;
+}
+
+void
+Badge::setRelativePosition(const QPointF &pos)
+{
+        setRelativePosition(pos.x(), pos.y());
+}
+
+void
+Badge::setRelativePosition(qreal x, qreal y)
+{
+        x_ = x;
+        y_ = y;
+        update();
+}
+
+void
+Badge::setRelativeXPosition(qreal x)
+{
+        x_ = x;
+        update();
+}
+
+void
+Badge::setRelativeYPosition(qreal y)
+{
+        y_ = y;
+        update();
+}
+
+void
+Badge::setIcon(const QIcon &icon)
+{
+        icon_ = icon;
+        update();
+}
+
+void
+Badge::setText(const QString &text)
+{
+        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 *)
+{
+        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
+{
+        if (icon_.isNull()) {
+                return qMax(size_.width(), size_.height()) + padding_;
+        }
+
+        return diameter_;
+}