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