give the selection cards their own parts instead of label blobs
This commit is contained in:
68
src/ui/selection/StatusPill.cpp
Normal file
68
src/ui/selection/StatusPill.cpp
Normal file
@@ -0,0 +1,68 @@
|
||||
#include "StatusPill.h"
|
||||
|
||||
#include <QGuiApplication>
|
||||
#include <QHBoxLayout>
|
||||
#include <QLabel>
|
||||
#include <QPainter>
|
||||
#include <QPixmap>
|
||||
#include <QRectF>
|
||||
|
||||
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<int>(kDotSizePx * dpr),
|
||||
static_cast<int>(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());
|
||||
}
|
||||
Reference in New Issue
Block a user