diff --git a/src/ledwidget.cpp b/src/ledwidget.cpp new file mode 100644 --- /dev/null +++ b/src/ledwidget.cpp @@ -0,0 +1,129 @@ +/* + Copyright © 2018 Hasan Yavuz Özderya + + This file is part of serialplot. + + ledwidget is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + ledwidget is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with ledwidget. If not, see . +*/ + +#include "ledwidget.h" +#include +#include +#include + +LedWidget::LedWidget(QWidget* parent) : QWidget(parent), + m_color(107,223,51), + m_on(true) +{ + resize(20,20); +} + +QSize LedWidget::sizeHint() const +{ + return QSize(20,20); +} + +QSize LedWidget::minimumSizeHint() const +{ + return QSize(10, 10); +} + +void LedWidget::setColor(QColor ledColor) +{ + if (m_color == ledColor) return; + m_color = ledColor; + update(); + emit colorChanged(m_color); +} + +bool LedWidget::isOn() +{ + return m_on; +} + +void LedWidget::setOn(bool on) +{ + if (on == m_on) return; + m_on = on; + update(); + emit onChanged(on); +} + +void LedWidget::turnOn() +{ + setOn(true); +} + +void LedWidget::turnOff() +{ + setOn(false); +} + +void LedWidget::toggle() +{ + setOn(!m_on); +} + +void LedWidget::paintEvent(QPaintEvent* event) +{ + Q_UNUSED(event) + + const qreal r = std::min(width(), height()) / 2; // maximum radius including glow + const qreal glowOffset = std::max(2., r/5.); + const qreal borderOffset = std::max(1., r/10.); + const qreal shineOffset = std::max(1., r/20.); + const QPointF center(width()/2, height()/2); + + const qreal gr = r; + const qreal br = gr - glowOffset; // border shape radius + const qreal ir = br - borderOffset; // inner fill radius + const qreal sr = ir - shineOffset; + + QColor borderColor(130,130,130); + QColor shineColor(255, 255, 255, m_on ? 200 : 50); + QColor fillColor(m_color); + + QPainter painter(this); + painter.setRenderHints(QPainter::Antialiasing); + + // draw border + painter.setPen(Qt::NoPen); + painter.setBrush(borderColor); + painter.drawEllipse(center, br, br); + + // draw infill + if (!m_on) fillColor = fillColor.darker(); + painter.setBrush(fillColor); + painter.drawEllipse(center, ir, ir); + + // draw glow + if (m_on) + { + QColor glowColor(m_color); + glowColor.setAlphaF(0.5); + QRadialGradient glowGradient(center, gr, center); + glowGradient.setColorAt(0, glowColor); + glowGradient.setColorAt((r-glowOffset)/r, glowColor); + glowGradient.setColorAt(1, Qt::transparent); + painter.setBrush(glowGradient); + painter.drawEllipse(center, gr, gr); + } + + // draw shine + QRadialGradient shineGradient(center, sr, center-QPoint(sr/2,sr/2)); + shineGradient.setColorAt(0, shineColor); + shineGradient.setColorAt(1, Qt::transparent); + painter.setBrush(shineGradient); + painter.drawEllipse(center, sr, sr); +}