14 #include <QStringList>
15 #include <QStyleOption>
16 #include <QSvgRenderer>
29 const QString &offName,
int targetWidth, QWidget *parent)
30 : QWidget(parent), m_blinkState(on ? On : Off), m_colorOn(onColor), m_colorOff(offColor), m_shape(shape),
31 m_widthTarget(targetWidth), m_tooltipOn(onName), m_tooltipOff(offName), m_renderer(new QSvgRenderer(this))
37 void CLedWidget::init()
39 m_resetTimer.setSingleShot(
true);
40 m_resetTimer.setObjectName(this->objectName().isEmpty() ?
"CLedWidget::ResetTimer" :
41 this->objectName() +
"::ResetTimer");
46 void CLedWidget::setLed(LedColor ledColor)
48 Q_ASSERT_X(!m_renderer.isNull(), Q_FUNC_INFO,
"no renderer");
49 if (!m_renderer) {
return; }
52 QString ledShapeAndColor(shapes().at(
static_cast<int>(m_shape)));
53 if (ledColor == NoColor)
58 m_currentToolTip = m_tooltipOn;
59 ledShapeAndColor.append(CLedWidget::colorString(m_colorOn));
62 m_currentToolTip = m_tooltipTriState;
63 ledShapeAndColor.append(CLedWidget::colorString(m_colorTriState));
67 m_currentToolTip = m_tooltipOff;
68 ledShapeAndColor.append(CLedWidget::colorString(m_colorOff));
74 if (ledColor == m_colorOn)
76 m_currentToolTip = m_tooltipOn;
77 ledShapeAndColor.append(CLedWidget::colorString(m_colorOn));
79 else if (ledColor == m_colorOff)
81 m_currentToolTip = m_tooltipOff;
82 ledShapeAndColor.append(CLedWidget::colorString(m_colorOff));
86 m_currentToolTip = m_tooltipTriState;
87 ledShapeAndColor.append(CLedWidget::colorString(m_colorTriState));
90 this->setToolTip(m_currentToolTip);
93 m_renderer->load(ledShapeAndColor);
96 const QSize s = m_renderer->defaultSize();
97 m_whRatio = s.width() / s.height();
100 if (m_widthTarget < 0) { m_widthTarget = widths().at(
static_cast<int>(m_shape)); }
101 const double h = m_widthTarget / m_whRatio;
102 m_heightCalculated = qRound(h);
104 this->setFixedHeight(m_heightCalculated);
105 this->setFixedWidth(m_widthTarget);
109 QPixmap CLedWidget::renderToPixmap()
const
111 Q_ASSERT(!m_renderer.isNull());
114 QImage image(QSize(m_widthTarget, m_heightCalculated), QImage::Format_ARGB32);
115 image.fill(qRgba(0, 0, 0, 0));
118 QPainter painter(&image);
119 m_renderer->render(&painter);
120 return QPixmap::fromImage(image);
125 static const QString empty;
126 if (color == NoColor) {
return empty; }
127 return colorFiles().at(
static_cast<int>(color));
130 void CLedWidget::resetState()
132 if (m_value == m_blinkState) {
return; }
133 m_blinkState = m_value;
141 m_tooltipTriState = triState;
159 m_tooltipTriState = triStateTooltip;
165 m_tooltipTriState = tooltip;
166 m_colorTriState = color;
171 if (color == m_colorOn)
return;
178 if (color == m_colorOff)
return;
185 if (color == m_colorOff)
return;
186 m_colorTriState = color;
192 if (newShape == m_shape)
return;
198 const QString &toolTipOff,
int width)
203 m_tooltipOn = toolTipOn;
204 m_tooltipOff = toolTipOff;
205 m_widthTarget = width;
210 const QString &toolTipOn,
const QString &toolTipOff,
const QString &toolTipTriState,
217 m_tooltipOn = toolTipOn;
218 m_tooltipOff = toolTipOff;
219 m_tooltipTriState = toolTipTriState;
220 m_widthTarget = width;
228 State s = on ? On : Off;
231 QPointer<CLedWidget> myself(
this);
232 m_resetTimer.singleShot(resetTimeMs,
this, [=] {
233 if (!myself) {
return; }
242 if (m_blinkState == s) {
return; }
250 this->
setOn(
true, resetTimeMs);
255 if (resetTimeMs > 0) { m_resetTimer.singleShot(resetTimeMs,
this, &CLedWidget::resetState); }
261 if (m_blinkState == TriState) {
return; }
262 m_blinkState = TriState;
268 m_blinkState = (m_blinkState == Off) ? On : Off;
279 QPainter painter(
this);
280 painter.setRenderHint(QPainter::Antialiasing,
true);
281 painter.setBackgroundMode(Qt::TransparentMode);
282 m_renderer->render(&painter);
287 if (event->button() == Qt::LeftButton)
292 else { QWidget::mousePressEvent(event); }
295 const QStringList &CLedWidget::shapes()
297 static const QStringList shapes({
":/qled/icons/qled/circle_",
":/qled/icons/qled/square_",
298 ":/qled/icons/qled/triang_",
":/qled/icons/qled/round_" });
302 const QStringList &CLedWidget::colorFiles()
304 static const QStringList colors(
305 {
"red.svg",
"green.svg",
"yellow.svg",
"grey.svg",
"orange.svg",
"purple.svg",
"blue.svg",
"black.svg" });
309 const QList<int> &CLedWidget::widths()
311 static const QList<int> widths({ 16, 16, 16, 16 });