You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
133 lines
2.6 KiB
133 lines
2.6 KiB
#include <QtGui> |
|
#include "hled.h" |
|
|
|
struct HLed::Private |
|
{ |
|
public: |
|
Private() |
|
: darkerFactor(300), color(Qt::green), isOn(true) |
|
{ } |
|
|
|
int darkerFactor; |
|
QColor color; |
|
bool isOn; |
|
}; |
|
|
|
HLed::HLed(QWidget *parent) |
|
:QWidget(parent), m_d(new Private) |
|
{ |
|
} |
|
|
|
HLed::~HLed() |
|
{ |
|
delete m_d; |
|
} |
|
|
|
QColor HLed::color() const |
|
{ |
|
return m_d->color; |
|
} |
|
|
|
void HLed::setColor(const QColor &color) |
|
{ |
|
if (m_d->color == color) |
|
return; |
|
update(); |
|
} |
|
|
|
QSize HLed::sizeHint() const |
|
{ |
|
return QSize(20, 20); |
|
} |
|
|
|
QSize HLed::minimumSizeHint() const |
|
{ |
|
return QSize(16, 16); |
|
} |
|
|
|
void HLed::toggle() |
|
{ |
|
m_d->isOn = !m_d->isOn; |
|
update(); |
|
} |
|
|
|
void HLed::turnOn(bool on) |
|
{ |
|
m_d->isOn = on; |
|
update(); |
|
} |
|
|
|
void HLed::turnOff(bool off) |
|
{ |
|
turnOn(!off); |
|
} |
|
|
|
void HLed::paintEvent(QPaintEvent * /*event*/) |
|
{ |
|
int width = ledWidth(); |
|
|
|
QPainter painter(this); |
|
painter.setRenderHint(QPainter::Antialiasing); |
|
|
|
QColor color = m_d->isOn ? m_d->color |
|
: m_d->color.darker(m_d->darkerFactor); |
|
|
|
QBrush brush; |
|
brush.setStyle(Qt::SolidPattern); |
|
brush.setColor(color); |
|
painter.setBrush(brush); |
|
// draw plain |
|
painter.drawEllipse(1, 1, width-1, width-1); |
|
|
|
QPen pen; |
|
pen.setWidth(2); |
|
|
|
int pos = width / 5 + 1; |
|
int lightWidth = width * 2 / 3; |
|
int lightQuote = 130 * 2 / (lightWidth ? lightWidth : 1) + 100; |
|
|
|
// draw bright spot |
|
while (lightWidth) { |
|
color = color.lighter(lightQuote); |
|
pen.setColor(color); |
|
painter.setPen(pen); |
|
painter.drawEllipse(pos, pos, lightWidth, lightWidth); |
|
lightWidth--; |
|
|
|
if (!lightWidth) |
|
break; |
|
|
|
painter.drawEllipse(pos, pos, lightWidth, lightWidth); |
|
lightWidth--; |
|
|
|
if (!lightWidth) |
|
break; |
|
|
|
painter.drawEllipse(pos, pos, lightWidth, lightWidth); |
|
pos++; |
|
lightWidth--; |
|
} |
|
|
|
//draw border |
|
painter.setBrush(Qt::NoBrush); |
|
|
|
int angle = -720; |
|
color = palette().color(QPalette::Light); |
|
|
|
for (int arc=120; arc<2880; arc+=240) { |
|
pen.setColor(color); |
|
painter.setPen(pen); |
|
int w = width - pen.width()/2; |
|
painter.drawArc(pen.width()/2, pen.width()/2, w, w, angle+arc, 240); |
|
painter.drawArc(pen.width()/2, pen.width()/2, w, w, angle-arc, 240); |
|
color = color.darker(110); |
|
} |
|
} |
|
|
|
int HLed::ledWidth() const |
|
{ |
|
int width = qMin(this->width(), this->height()); |
|
width -= 2; |
|
return width > 0 ? width : 0; |
|
} |
|
|
|
|