00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <qimage.h>
00021 #include <qpainter.h>
00022 #include <qdrawutil.h>
00023 #include <kimageeffect.h>
00024 #include "kselect.h"
00025
00026 #define STORE_W 8
00027 #define STORE_W2 STORE_W * 2
00028
00029
00030
00031
00032
00033
00034
00035 KXYSelector::KXYSelector( QWidget *parent, const char *name )
00036 : QWidget( parent, name )
00037 {
00038 xPos = 0;
00039 yPos = 0;
00040 minX = 0;
00041 minY = 0;
00042 maxX = 100;
00043 maxY = 100;
00044 store.setOptimization( QPixmap::BestOptim );
00045 store.resize( STORE_W2, STORE_W2 );
00046 }
00047
00048
00049 KXYSelector::~KXYSelector()
00050 {}
00051
00052
00053 void KXYSelector::setRange( int _minX, int _minY, int _maxX, int _maxY )
00054 {
00055 px = 2;
00056 py = 2;
00057 minX = _minX;
00058 minY = _minY;
00059 maxX = _maxX;
00060 maxY = _maxY;
00061 }
00062
00063 void KXYSelector::setValues( int _xPos, int _yPos )
00064 {
00065 xPos = _xPos;
00066 yPos = _yPos;
00067
00068 if ( xPos > maxX )
00069 xPos = maxX;
00070 else if ( xPos < minX )
00071 xPos = minX;
00072
00073 if ( yPos > maxY )
00074 yPos = maxY;
00075 else if ( yPos < minY )
00076 yPos = minY;
00077
00078 int xp = 2 + (width() - 4) * xPos / (maxX - minX);
00079 int yp = height() - 2 - (height() - 4) * yPos / (maxY - minY);
00080
00081 setPosition( xp, yp );
00082 }
00083
00084 QRect KXYSelector::contentsRect() const
00085 {
00086 return QRect( 2, 2, width()-4, height()-4 );
00087 }
00088
00089 void KXYSelector::paintEvent( QPaintEvent *ev )
00090 {
00091 QRect cursorRect( px - STORE_W, py - STORE_W, STORE_W2, STORE_W2);
00092 QRect paintRect = ev->rect();
00093
00094 QPainter painter;
00095 painter.begin( this );
00096
00097 QBrush brush;
00098 qDrawShadePanel( &painter, 0, 0, width(), height(), colorGroup(),
00099 TRUE, 2, &brush );
00100
00101 drawContents( &painter );
00102 if (paintRect.contains(cursorRect))
00103 {
00104 bitBlt( &store, 0, 0, this, px - STORE_W, py - STORE_W,
00105 STORE_W2, STORE_W2, CopyROP );
00106 drawCursor( &painter, px, py );
00107 }
00108 else if (paintRect.intersects(cursorRect))
00109 {
00110 repaint( cursorRect, false);
00111 }
00112
00113 painter.end();
00114 }
00115
00116 void KXYSelector::mousePressEvent( QMouseEvent *e )
00117 {
00118 setPosition( e->pos().x() - 2, e->pos().y() - 2 );
00119
00120 emit valueChanged( xPos, yPos );
00121 }
00122
00123 void KXYSelector::mouseMoveEvent( QMouseEvent *e )
00124 {
00125 setPosition( e->pos().x() - 2, e->pos().y() - 2 );
00126
00127 emit valueChanged( xPos, yPos );
00128 }
00129
00130 void KXYSelector::setPosition( int xp, int yp )
00131 {
00132 if ( xp < 2 )
00133 xp = 2;
00134 else if ( xp > width() - 2 )
00135 xp = width() - 2;
00136
00137 if ( yp < 2 )
00138 yp = 2;
00139 else if ( yp > height() - 2 )
00140 yp = height() - 2;
00141
00142 QPainter painter;
00143 painter.begin( this );
00144
00145 bitBlt( this, px - STORE_W, py - STORE_W, &store, 0, 0,
00146 STORE_W2, STORE_W2, CopyROP );
00147 bitBlt( &store, 0, 0, this, xp - STORE_W, yp - STORE_W,
00148 STORE_W2, STORE_W2, CopyROP );
00149 drawCursor( &painter, xp, yp );
00150 px = xp;
00151 py = yp;
00152
00153 painter.end();
00154
00155 xPos = ( (maxX-minX) * (xp-2) ) / ( width()-4 );
00156 yPos = maxY - ( ( (maxY-minY) * (yp-2) ) / ( height()-4 ) );
00157
00158 if ( xPos > maxX )
00159 xPos = maxX;
00160 else if ( xPos < minX )
00161 xPos = minX;
00162
00163 if ( yPos > maxY )
00164 yPos = maxY;
00165 else if ( yPos < minY )
00166 yPos = minY;
00167 }
00168
00169 void KXYSelector::drawContents( QPainter * )
00170 {}
00171
00172
00173 void KXYSelector::drawCursor( QPainter *p, int xp, int yp )
00174 {
00175 p->setPen( QPen( white ) );
00176
00177 p->drawLine( xp - 6, yp - 6, xp - 2, yp - 2 );
00178 p->drawLine( xp - 6, yp + 6, xp - 2, yp + 2 );
00179 p->drawLine( xp + 6, yp - 6, xp + 2, yp - 2 );
00180 p->drawLine( xp + 6, yp + 6, xp + 2, yp + 2 );
00181 }
00182
00183
00184
00185
00186
00187
00188
00189
00190 KSelector::KSelector( QWidget *parent, const char *name )
00191 : QWidget( parent, name ), QRangeControl()
00192 {
00193 _orientation = Horizontal;
00194 _indent = TRUE;
00195 }
00196
00197 KSelector::KSelector( Orientation o, QWidget *parent, const char *name )
00198 : QWidget( parent, name ), QRangeControl()
00199 {
00200 _orientation = o;
00201 _indent = TRUE;
00202 }
00203
00204
00205 KSelector::~KSelector()
00206 {}
00207
00208
00209 QRect KSelector::contentsRect() const
00210 {
00211 if ( orientation() == Vertical )
00212 return QRect( 2, 5, width()-9, height()-10 );
00213 else
00214 return QRect( 5, 2, width()-10, height()-9 );
00215 }
00216
00217 void KSelector::paintEvent( QPaintEvent * )
00218 {
00219 QPainter painter;
00220
00221 painter.begin( this );
00222
00223 drawContents( &painter );
00224
00225 QBrush brush;
00226
00227 if ( indent() )
00228 {
00229 if ( orientation() == Vertical )
00230 qDrawShadePanel( &painter, 0, 3, width()-5, height()-6,
00231 colorGroup(), TRUE, 2, &brush );
00232 else
00233 qDrawShadePanel( &painter, 3, 0, width()-6, height()-5,
00234 colorGroup(), TRUE, 2, &brush );
00235 }
00236
00237 QPoint pos = calcArrowPos( value() );
00238 drawArrow( &painter, TRUE, pos );
00239
00240 painter.end();
00241 }
00242
00243 void KSelector::mousePressEvent( QMouseEvent *e )
00244 {
00245 moveArrow( e->pos() );
00246 }
00247
00248 void KSelector::mouseMoveEvent( QMouseEvent *e )
00249 {
00250 moveArrow( e->pos() );
00251 }
00252
00253 void KSelector::valueChange()
00254 {
00255 QPainter painter;
00256 QPoint pos;
00257
00258 painter.begin( this );
00259
00260 pos = calcArrowPos( prevValue() );
00261 drawArrow( &painter, FALSE, pos );
00262
00263 pos = calcArrowPos( value() );
00264 drawArrow( &painter, TRUE, pos );
00265
00266 painter.end();
00267 }
00268
00269 void KSelector::moveArrow( const QPoint &pos )
00270 {
00271 int val;
00272
00273 if ( orientation() == Vertical )
00274 val = ( maxValue() - minValue() ) * (height()-pos.y()-3)
00275 / (height()-10) + minValue();
00276 else
00277 val = ( maxValue() - minValue() ) * (width()-pos.x()-3)
00278 / (width()-10) + minValue();
00279
00280 if ( val > maxValue() )
00281 val = maxValue();
00282 if ( val < minValue() )
00283 val = minValue();
00284
00285 emit valueChanged( val );
00286 setValue( val );
00287 }
00288
00289 QPoint KSelector::calcArrowPos( int val )
00290 {
00291 QPoint p;
00292
00293 if ( orientation() == Vertical )
00294 {
00295 p.setY( height() - ( (height()-10) * val
00296 / ( maxValue() - minValue() ) + 5 ) );
00297 p.setX( width() - 5 );
00298 }
00299 else
00300 {
00301 p.setX( width() - ( (width()-10) * val
00302 / ( maxValue() - minValue() ) + 5 ) );
00303 p.setY( height() - 5 );
00304 }
00305
00306 return p;
00307 }
00308
00309 void KSelector::drawContents( QPainter * )
00310 {}
00311
00312 void KSelector::drawArrow( QPainter *painter, bool show, const QPoint &pos )
00313 {
00314 if ( show )
00315 {
00316 QPointArray array(3);
00317
00318 painter->setPen( QPen() );
00319 painter->setBrush( QBrush( colorGroup().buttonText() ) );
00320 if ( orientation() == Vertical )
00321 {
00322 array.setPoint( 0, pos.x()+0, pos.y()+0 );
00323 array.setPoint( 1, pos.x()+5, pos.y()+5 );
00324 array.setPoint( 2, pos.x()+5, pos.y()-5 );
00325 }
00326 else
00327 {
00328 array.setPoint( 0, pos.x()+0, pos.y()+0 );
00329 array.setPoint( 1, pos.x()+5, pos.y()+5 );
00330 array.setPoint( 2, pos.x()-5, pos.y()+5 );
00331 }
00332
00333 painter->drawPolygon( array );
00334 }
00335 else
00336 {
00337 if ( orientation() == Vertical )
00338 {
00339 repaint(pos.x(), pos.y()-5, 6, 11, true);
00340 }
00341 else
00342 {
00343 repaint(pos.x()-5, pos.y(), 11, 6, true);
00344 }
00345 }
00346 }
00347
00348
00349
00350 KGradientSelector::KGradientSelector( QWidget *parent, const char *name )
00351 : KSelector( parent, name )
00352 {
00353 init();
00354 }
00355
00356
00357 KGradientSelector::KGradientSelector( Orientation o, QWidget *parent,
00358 const char *name )
00359 : KSelector( o, parent, name )
00360 {
00361 init();
00362 }
00363
00364
00365 KGradientSelector::~KGradientSelector()
00366 {}
00367
00368
00369 void KGradientSelector::init()
00370 {
00371 color1.setRgb( 0, 0, 0 );
00372 color2.setRgb( 255, 255, 255 );
00373
00374 text1 = text2 = "";
00375 }
00376
00377
00378 void KGradientSelector::drawContents( QPainter *painter )
00379 {
00380 QImage image( contentsRect().width(), contentsRect().height(), 32 );
00381
00382 QColor col;
00383 float scale;
00384
00385 int redDiff = color2.red() - color1.red();
00386 int greenDiff = color2.green() - color1.green();
00387 int blueDiff = color2.blue() - color1.blue();
00388
00389 if ( orientation() == Vertical )
00390 {
00391 for ( int y = 0; y < image.height(); y++ )
00392 {
00393 scale = 1.0 * y / image.height();
00394 col.setRgb( color1.red() + int(redDiff*scale),
00395 color1.green() + int(greenDiff*scale),
00396 color1.blue() + int(blueDiff*scale) );
00397
00398 unsigned int *p = (uint *) image.scanLine( y );
00399 for ( int x = 0; x < image.width(); x++ )
00400 *p++ = col.rgb();
00401 }
00402 }
00403 else
00404 {
00405 unsigned int *p = (uint *) image.scanLine( 0 );
00406
00407 for ( int x = 0; x < image.width(); x++ )
00408 {
00409 scale = 1.0 * x / image.width();
00410 col.setRgb( color1.red() + int(redDiff*scale),
00411 color1.green() + int(greenDiff*scale),
00412 color1.blue() + int(blueDiff*scale) );
00413 *p++ = col.rgb();
00414 }
00415
00416 for ( int y = 1; y < image.height(); y++ )
00417 memcpy( image.scanLine( y ), image.scanLine( y - 1),
00418 sizeof( unsigned int ) * image.width() );
00419 }
00420
00421 QColor ditherPalette[8];
00422
00423 for ( int s = 0; s < 8; s++ )
00424 ditherPalette[s].setRgb( color1.red() + redDiff * s / 8,
00425 color1.green() + greenDiff * s / 8,
00426 color1.blue() + blueDiff * s / 8 );
00427
00428 KImageEffect::dither( image, ditherPalette, 8 );
00429
00430 QPixmap p;
00431 p.convertFromImage( image );
00432
00433 painter->drawPixmap( contentsRect().x(), contentsRect().y(), p );
00434
00435 if ( orientation() == Vertical )
00436 {
00437 int yPos = contentsRect().top() + painter->fontMetrics().ascent() + 2;
00438 int xPos = contentsRect().left() + (contentsRect().width() -
00439 painter->fontMetrics().width( text2 )) / 2;
00440 QPen pen( color2 );
00441 painter->setPen( pen );
00442 painter->drawText( xPos, yPos, text2 );
00443
00444 yPos = contentsRect().bottom() - painter->fontMetrics().descent() - 2;
00445 xPos = contentsRect().left() + (contentsRect().width() -
00446 painter->fontMetrics().width( text1 )) / 2;
00447 pen.setColor( color1 );
00448 painter->setPen( pen );
00449 painter->drawText( xPos, yPos, text1 );
00450 }
00451 else
00452 {
00453 int yPos = contentsRect().bottom()-painter->fontMetrics().descent()-2;
00454
00455 QPen pen( color2 );
00456 painter->setPen( pen );
00457 painter->drawText( contentsRect().left() + 2, yPos, text1 );
00458
00459 pen.setColor( color1 );
00460 painter->setPen( pen );
00461 painter->drawText( contentsRect().right() -
00462 painter->fontMetrics().width( text2 ) - 2, yPos, text2 );
00463 }
00464 }
00465
00466
00467
00468 void KXYSelector::virtual_hook( int, void* )
00469 { }
00470
00471 void KSelector::virtual_hook( int, void* )
00472 { }
00473
00474 void KGradientSelector::virtual_hook( int id, void* data )
00475 { KSelector::virtual_hook( id, data ); }
00476
00477 #include "kselect.moc"
00478