00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
#define PAINT_BENCH
00022
#undef PAINT_BENCH
00023
00024
#ifdef PAINT_BENCH
00025
#include <qdatetime.h>
00026
#include <stdio.h>
00027
#endif
00028
00029
00030
#include <qpainter.h>
00031
#include <qimage.h>
00032
#include <qcolor.h>
00033
#include <kapplication.h>
00034
#include <kpixmapeffect.h>
00035
#include "kled.h"
00036
00037
00038
class KLed::KLedPrivate
00039 {
00040
friend class KLed;
00041
00042
int dark_factor;
00043
QColor offcolor;
00044
QPixmap *off_map;
00045
QPixmap *on_map;
00046 };
00047
00048
00049
00050 KLed::KLed(
QWidget *parent,
const char *name)
00051 :
QWidget( parent, name),
00052 led_state(On),
00053 led_look(Raised),
00054 led_shape(Circular)
00055 {
00056
QColor col(green);
00057 d =
new KLed::KLedPrivate;
00058 d->dark_factor = 300;
00059 d->offcolor = col.dark(300);
00060 d->off_map = 0;
00061 d->on_map = 0;
00062
00063
setColor(col);
00064 }
00065
00066
00067 KLed::KLed(
const QColor& col,
QWidget *parent,
const char *name)
00068 :
QWidget( parent, name),
00069 led_state(On),
00070 led_look(Raised),
00071 led_shape(Circular)
00072 {
00073 d =
new KLed::KLedPrivate;
00074 d->dark_factor = 300;
00075 d->offcolor = col.dark(300);
00076 d->off_map = 0;
00077 d->on_map = 0;
00078
00079
setColor(col);
00080
00081 }
00082
00083 KLed::KLed(
const QColor& col, KLed::State state,
00084 KLed::Look look, KLed::Shape shape,
QWidget *parent,
const char *name )
00085 :
QWidget(parent, name),
00086 led_state(state),
00087 led_look(look),
00088 led_shape(shape)
00089 {
00090 d =
new KLed::KLedPrivate;
00091 d->dark_factor = 300;
00092 d->offcolor = col.dark(300);
00093 d->off_map = 0;
00094 d->on_map = 0;
00095
00096
00097
setColor(col);
00098 }
00099
00100
00101 KLed::~KLed()
00102 {
00103
delete d->off_map;
00104
delete d->on_map;
00105
delete d;
00106 }
00107
00108
void
00109 KLed::paintEvent(
QPaintEvent *)
00110 {
00111
#ifdef PAINT_BENCH
00112
const int rounds = 1000;
00113
QTime t;
00114 t.start();
00115
for (
int i=0; i<rounds; i++) {
00116
#endif
00117
switch(led_shape)
00118 {
00119
case Rectangular:
00120
switch (led_look)
00121 {
00122
case Sunken :
00123 paintRectFrame(
false);
00124
break;
00125
case Raised :
00126 paintRectFrame(
true);
00127
break;
00128
case Flat :
00129
paintRect();
00130
break;
00131
default :
00132 qWarning(
"%s: in class KLed: no KLed::Look set",qApp->argv()[0]);
00133 }
00134
break;
00135
case Circular:
00136
switch (led_look)
00137 {
00138
case Flat :
00139
paintFlat();
00140
break;
00141
case Raised :
00142
paintRound();
00143
break;
00144
case Sunken :
00145
paintSunken();
00146
break;
00147
default:
00148 qWarning(
"%s: in class KLed: no KLed::Look set",qApp->argv()[0]);
00149 }
00150
break;
00151
default:
00152 qWarning(
"%s: in class KLed: no KLed::Shape set",qApp->argv()[0]);
00153
break;
00154 }
00155
#ifdef PAINT_BENCH
00156
}
00157
int ready = t.elapsed();
00158 qWarning(
"elapsed: %d msec. for %d rounds", ready, rounds);
00159
#endif
00160
}
00161
00162
int
00163 KLed::ensureRoundLed()
00164 {
00165
00166
00167
int width = this->width();
00168
00169
if (width > this->height())
00170 width = this->height();
00171 width -= 2;
00172
if (width < 0)
00173 width = 0;
00174
00175
return width;
00176 }
00177
00178
bool
00179 KLed::paintCachedPixmap()
00180 {
00181
if (led_state) {
00182
if (d->on_map) {
00183
QPainter paint(
this);
00184 paint.drawPixmap(0, 0, *d->on_map);
00185
return true;
00186 }
00187 }
else {
00188
if (d->off_map) {
00189
QPainter paint(
this);
00190 paint.drawPixmap(0, 0, *d->off_map);
00191
return true;
00192 }
00193 }
00194
00195
return false;
00196 }
00197
00198
void
00199 KLed::paintFlat()
00200 {
00201
if (
paintCachedPixmap())
return;
00202
00203
QPainter paint;
00204
QColor color;
00205
QBrush brush;
00206
QPen pen;
00207
00208
int width =
ensureRoundLed();
00209
00210
00211
int scale = 3;
00212
QPixmap *tmpMap = 0;
00213
00214 width *= scale;
00215
00216 tmpMap =
new QPixmap(width + 6, width + 6);
00217 tmpMap->fill(paletteBackgroundColor());
00218
00219
00220
00221 paint.begin(tmpMap);
00222
00223
00224 color = ( led_state ) ? led_color : d->offcolor;
00225
00226
00227
00228 brush.setStyle( QBrush::SolidPattern );
00229 brush.setColor( color );
00230
00231 pen.setWidth( scale );
00232 color = colorGroup().dark();
00233 pen.setColor( color );
00234
00235 paint.setPen( pen );
00236 paint.setBrush( brush );
00237
00238
00239 paint.drawEllipse( scale, scale, width - scale * 2, width - scale * 2 );
00240
00241 paint.end();
00242
00243
00244 QPixmap *&dest = led_state ? d->on_map : d->off_map;
00245
QImage i = tmpMap->convertToImage();
00246 width /= 3;
00247 i = i.smoothScale(width, width);
00248
delete tmpMap;
00249 dest =
new QPixmap(i);
00250 paint.begin(
this);
00251 paint.drawPixmap(0, 0, *dest);
00252 paint.end();
00253
00254 }
00255
00256
void
00257 KLed::paintRound()
00258 {
00259
if (
paintCachedPixmap())
return;
00260
00261
QPainter paint;
00262
QColor color;
00263
QBrush brush;
00264
QPen pen;
00265
00266
00267
int width =
ensureRoundLed();
00268
00269
int scale = 3;
00270
QPixmap *tmpMap = 0;
00271
00272 width *= scale;
00273
00274 tmpMap =
new QPixmap(width + 6, width + 6);
00275 tmpMap->fill(paletteBackgroundColor());
00276 paint.begin(tmpMap);
00277
00278
00279 color = ( led_state ) ? led_color : d->offcolor;
00280
00281
00282
00283 brush.setStyle( QBrush::SolidPattern );
00284 brush.setColor( color );
00285 paint.setBrush( brush );
00286
00287
00288 paint.drawEllipse( scale, scale, width - scale*2, width - scale*2 );
00289
00290
00291
00292
00293
00294
00295 pen.setWidth( 2 * scale );
00296
00297
00298
int pos = width/5 + 1;
00299
int light_width = width;
00300 light_width *= 2;
00301 light_width /= 3;
00302
00303
00304
int light_quote = (130*2/(light_width?light_width:1))+100;
00305
00306
00307
while (light_width) {
00308 color = color.light( light_quote );
00309 pen.setColor( color );
00310 paint.setPen( pen );
00311 paint.drawEllipse( pos, pos, light_width, light_width );
00312 light_width--;
00313
if (!light_width)
00314
break;
00315 paint.drawEllipse( pos, pos, light_width, light_width );
00316 light_width--;
00317
if (!light_width)
00318
break;
00319 paint.drawEllipse( pos, pos, light_width, light_width );
00320 pos++; light_width--;
00321 }
00322
00323
00324
00325
00326
00327 pen.setWidth( 2 * scale + 1 );
00328 color = colorGroup().dark();
00329 pen.setColor( color );
00330 paint.setPen( pen );
00331 brush.setStyle( QBrush::NoBrush );
00332 paint.setBrush( brush );
00333
00334 paint.drawEllipse( 2, 2, width, width );
00335
00336 paint.end();
00337
00338
00339 QPixmap *&dest = led_state ? d->on_map : d->off_map;
00340
QImage i = tmpMap->convertToImage();
00341 width /= 3;
00342 i = i.smoothScale(width, width);
00343
delete tmpMap;
00344 dest =
new QPixmap(i);
00345 paint.begin(
this);
00346 paint.drawPixmap(0, 0, *dest);
00347 paint.end();
00348
00349 }
00350
00351
void
00352 KLed::paintSunken()
00353 {
00354
if (
paintCachedPixmap())
return;
00355
00356
QPainter paint;
00357
QColor color;
00358
QBrush brush;
00359
QPen pen;
00360
00361
00362
00363
int width =
ensureRoundLed();
00364
00365
int scale = 3;
00366
QPixmap *tmpMap = 0;
00367
00368 width *= scale;
00369
00370 tmpMap =
new QPixmap(width, width);
00371 tmpMap->fill(paletteBackgroundColor());
00372 paint.begin(tmpMap);
00373
00374
00375 color = ( led_state ) ? led_color : d->offcolor;
00376
00377
00378
00379 brush.setStyle( QBrush::SolidPattern );
00380 brush.setColor( color );
00381 paint.setBrush( brush );
00382
00383
00384 paint.drawEllipse( scale, scale, width - scale*2, width - scale*2 );
00385
00386
00387
00388
00389
00390
00391 pen.setWidth( 2 * scale );
00392
00393
00394
int pos = width/5 + 1;
00395
int light_width = width;
00396 light_width *= 2;
00397 light_width /= 3;
00398
00399
00400
int light_quote = (130*2/(light_width?light_width:1))+100;
00401
00402
00403
while (light_width) {
00404 color = color.light( light_quote );
00405 pen.setColor( color );
00406 paint.setPen( pen );
00407 paint.drawEllipse( pos, pos, light_width, light_width );
00408 light_width--;
00409
if (!light_width)
00410
break;
00411 paint.drawEllipse( pos, pos, light_width, light_width );
00412 light_width--;
00413
if (!light_width)
00414
break;
00415 paint.drawEllipse( pos, pos, light_width, light_width );
00416 pos++; light_width--;
00417 }
00418
00419
00420
00421
00422
00423 pen.setWidth( 2 * scale + 1 );
00424 brush.setStyle( QBrush::NoBrush );
00425 paint.setBrush( brush );
00426
00427
00428
00429
00430
int angle = -720;
00431 color = colorGroup().light();
00432
00433
for (
int arc = 120; arc < 2880; arc += 240 ) {
00434 pen.setColor( color );
00435 paint.setPen( pen );
00436
int w = width - pen.width()/2 - scale + 1;
00437 paint.drawArc( pen.width()/2, pen.width()/2, w, w, angle + arc, 240 );
00438 paint.drawArc( pen.width()/2, pen.width()/2, w, w, angle - arc, 240 );
00439 color = color.dark( 110 );
00440 }
00441
00442 paint.end();
00443
00444
00445
00446 QPixmap *&dest = led_state ? d->on_map : d->off_map;
00447
QImage i = tmpMap->convertToImage();
00448 width /= 3;
00449 i = i.smoothScale(width, width);
00450
delete tmpMap;
00451 dest =
new QPixmap(i);
00452 paint.begin(
this);
00453 paint.drawPixmap(0, 0, *dest);
00454 paint.end();
00455
00456 }
00457
00458
void
00459 KLed::paintRect()
00460 {
00461
QPainter painter(
this);
00462
QBrush lightBrush(led_color);
00463
QBrush darkBrush(d->offcolor);
00464
QPen pen(led_color.dark(300));
00465
int w=width();
00466
int h=height();
00467
00468
switch(led_state)
00469 {
00470
case On:
00471 painter.setBrush(lightBrush);
00472 painter.drawRect(0, 0, w, h);
00473
break;
00474
case Off:
00475 painter.setBrush(darkBrush);
00476 painter.drawRect(0, 0, w, h);
00477 painter.setPen(pen);
00478 painter.drawLine(0, 0, w, 0);
00479 painter.drawLine(0, h-1, w, h-1);
00480
00481
int i;
00482
for(i=0; i < w; i+= 4 )
00483 painter.drawLine(i, 1, i, h-1);
00484
break;
00485
default:
break;
00486 }
00487 }
00488
00489
void
00490 KLed::paintRectFrame(
bool raised)
00491 {
00492
QPainter painter(
this);
00493
QBrush lightBrush(led_color);
00494
QBrush darkBrush(d->offcolor);
00495
int w=width();
00496
int h=height();
00497
QColor black=Qt::black;
00498
QColor white=Qt::white;
00499
00500
if(raised)
00501 {
00502 painter.setPen(white);
00503 painter.drawLine(0, 0, 0, h-1);
00504 painter.drawLine(1, 0, w-1, 0);
00505 painter.setPen(black);
00506 painter.drawLine(1, h-1, w-1, h-1);
00507 painter.drawLine(w-1, 1, w-1, h-1);
00508 painter.fillRect(1, 1, w-2, h-2,
00509 (led_state==On)? lightBrush : darkBrush);
00510 }
else {
00511 painter.setPen(black);
00512 painter.drawRect(0,0,w,h);
00513 painter.drawRect(0,0,w-1,h-1);
00514 painter.setPen(white);
00515 painter.drawRect(1,1,w-1,h-1);
00516 painter.fillRect(2, 2, w-4, h-4,
00517 (led_state==On)? lightBrush : darkBrush);
00518 }
00519 }
00520
00521 KLed::State
00522
KLed::state()
const
00523
{
00524
return led_state;
00525 }
00526
00527
KLed::Shape
00528 KLed::shape()
const
00529
{
00530
return led_shape;
00531 }
00532
00533
QColor
00534
KLed::color()
const
00535
{
00536
return led_color;
00537 }
00538
00539
KLed::Look
00540
KLed::look()
const
00541
{
00542
return led_look;
00543 }
00544
00545
void
00546 KLed::setState( State state )
00547 {
00548
if (led_state != state)
00549 {
00550 led_state = state;
00551 update();
00552 }
00553 }
00554
00555
void
00556 KLed::toggleState()
00557 {
00558
toggle();
00559 }
00560
00561
void
00562 KLed::setShape(KLed::Shape s)
00563 {
00564
if(led_shape!=s)
00565 {
00566 led_shape = s;
00567 update();
00568 }
00569 }
00570
00571
void
00572 KLed::setColor(
const QColor& col)
00573 {
00574
if(led_color!=col) {
00575
if(d->on_map) {
delete d->on_map; d->on_map = 0; }
00576
if(d->off_map) {
delete d->off_map; d->off_map = 0; }
00577 led_color = col;
00578 d->offcolor = col.dark(d->dark_factor);
00579 update();
00580 }
00581 }
00582
00583
void
00584 KLed::setDarkFactor(
int darkfactor)
00585 {
00586
if (d->dark_factor != darkfactor) {
00587 d->dark_factor = darkfactor;
00588 d->offcolor = led_color.dark(darkfactor);
00589 update();
00590 }
00591 }
00592
00593
int
00594
KLed::darkFactor()
const
00595
{
00596
return d->dark_factor;
00597 }
00598
00599
void
00600 KLed::setLook( Look look )
00601 {
00602
if(led_look!=look)
00603 {
00604 led_look = look;
00605 update();
00606 }
00607 }
00608
00609
void
00610 KLed::toggle()
00611 {
00612 led_state = (led_state == On) ? Off : On;
00613
00614 update();
00615 }
00616
00617
void
00618 KLed::on()
00619 {
00620
setState(On);
00621 }
00622
00623
void
00624 KLed::off()
00625 {
00626
setState(Off);
00627 }
00628
00629
QSize
00630 KLed::sizeHint()
const
00631
{
00632
return QSize(16, 16);
00633 }
00634
00635
QSize
00636 KLed::minimumSizeHint()
const
00637
{
00638
return QSize(16, 16 );
00639 }
00640
00641
void KLed::virtual_hook(
int,
void* )
00642 { }
00643
00644
#include "kled.moc"