#include "StatusPill.h" #include #include #include #include #include #include namespace { // Diameter of the status dot, in device-independent pixels. const int kDotSizePx = 8; QPixmap renderDot(const QColor& fill, const QColor& outline) { const qreal dpr = qApp ? qApp->devicePixelRatio() : 1.0; QPixmap pixmap(static_cast(kDotSizePx * dpr), static_cast(kDotSizePx * dpr)); pixmap.setDevicePixelRatio(dpr); pixmap.fill(Qt::transparent); QPainter painter(&pixmap); painter.setRenderHint(QPainter::Antialiasing, true); painter.setPen(outline.isValid() ? QPen(outline) : QPen(Qt::NoPen)); painter.setBrush(fill); // Inset by half the pen width so the outline stays inside the pixmap. painter.drawEllipse(QRectF(0.5, 0.5, kDotSizePx - 1.0, kDotSizePx - 1.0)); return pixmap; } } // namespace StatusPill::StatusPill(QWidget* parent) : QWidget(parent) { QHBoxLayout* layout = new QHBoxLayout(this); layout->setContentsMargins(0, 0, 0, 0); layout->setSpacing(4); m_dotLabel = new QLabel(this); m_captionLabel = new QLabel(this); layout->addWidget(m_dotLabel); layout->addWidget(m_captionLabel); hide(); } void StatusPill::setStatus(const QColor& dotColor, const QColor& outlineColor, const QString& caption) { if (dotColor.isValid()) { m_dotLabel->setPixmap(renderDot(dotColor, outlineColor)); m_dotLabel->show(); } else { m_dotLabel->hide(); } m_captionLabel->setText(caption); m_captionLabel->setVisible(!caption.isEmpty()); setVisible(dotColor.isValid() || !caption.isEmpty()); }