00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include <qimage.h>
00013 #include <qpainter.h>
00014
00015
00016 #include "clickableLabel.h"
00017
00018 #include <iostream>
00019 using namespace std;
00020
00021
00022 ClickableLabel::ClickableLabel( QWidget* parent, const char* name ) : QLabel( parent, name )
00023 {
00024 setWFlags(WRepaintNoErase);
00025 enabled = true;
00026 invisible = false;
00027 pressed = false;
00028 setMouseTracking(true);
00029 }
00030
00031 void ClickableLabel::paintEvent(QPaintEvent *e)
00032 {
00033 QPixmap buffer( size() );
00034 QPainter bufferPainter( &buffer );
00035 bufferPainter.setClipping(false);
00036 bufferPainter.fillRect( buffer.rect(), backgroundBrush() );
00037
00038
00039 if( !invisible )
00040 { bufferPainter.drawImage( QPoint(0,0), pixmap()->convertToImage() ); }
00041
00042 bufferPainter.end();
00043 bitBlt( this, e->rect().x(), e->rect().y(),
00044 &buffer,
00045 e->rect().x(), e->rect().y(),
00046 e->rect().width(), e->rect().height() );
00047 }
00048
00049 void ClickableLabel::setPixmap( const QPixmap &p )
00050 {
00051 defaultPixmap = p;
00052 defaultPixmap.detach();
00053 QLabel::setPixmap( p );
00054 }
00055
00056 void ClickableLabel::setEnabled( bool val )
00057 {
00058 if( val )
00059 setPixmap( defaultPixmap );
00060 else if( ! defaultPixmap.isNull() )
00061 {
00062
00063 QImage newImage = defaultPixmap.convertToImage();
00064 QImage alpha = newImage.createAlphaMask();
00065 int x, y;
00066 for(y=0; y<newImage.height(); y++)
00067 {
00068 for(x=0; x<newImage.width(); x++)
00069 {
00070 if(alpha.isNull() || qRed(alpha.pixel(x,y)) == 0)
00071 {
00072 QRgb rgb = newImage.pixel(x,y);
00073 int gray = qGray(rgb);
00074 double alpha = 0.5;
00075 gray = (int) (alpha*gray+(1-alpha)*255);
00076 rgb = qRgb( gray, gray, gray );
00077 newImage.setPixel( x, y, rgb );
00078 }
00079 }
00080 }
00081 QPixmap newPixmap;
00082 newPixmap.convertFromImage( newImage );
00083 QLabel::setPixmap( newPixmap );
00084 }
00085
00086 enabled = val;
00087 }
00088
00089 void ClickableLabel::mouseMoveEvent( QMouseEvent* e )
00090 {
00091 if( !enabled ) return;
00092
00093 QPoint p = e->pos();
00094 if( p.x() < 0 || p.y() < 0 ||
00095 p.x() >= width() || p.y() >= height() )
00096 {
00097 if(!defaultPixmap.isNull())
00098 { this->setPixmap( defaultPixmap ); }
00099 }
00100 else
00101 {
00102 if( pressed )
00103 setActive();
00104 else
00105 setHighlighted();
00106 }
00107 }
00108
00109 void ClickableLabel::leaveEvent ( QEvent * )
00110 {
00111 if( !enabled ) return;
00112
00113 if(!defaultPixmap.isNull())
00114 { this->setPixmap( defaultPixmap ); }
00115 }
00116
00117 void ClickableLabel::enterEvent ( QEvent * )
00118 {
00119 if( !enabled ) return;
00120
00121 if( pressed )
00122 setActive();
00123 else
00124 setHighlighted();
00125 }
00126
00127 void ClickableLabel::setActive()
00128 {
00129 if( ! defaultPixmap.isNull() )
00130 {
00131
00132 QImage newImage = defaultPixmap.convertToImage();
00133 QImage alpha = newImage.createAlphaMask();
00134 int x, y;
00135 for(y=0; y<newImage.height(); y++)
00136 {
00137 for(x=0; x<newImage.width(); x++)
00138 {
00139 if(alpha.isNull() || qRed(alpha.pixel(x,y)) == 0)
00140 {
00141 QRgb rgb = newImage.pixel(x,y);
00142 int r = (int) (0.5*qRed(rgb));
00143 int g = (int) (0.5*qGreen(rgb));
00144 int b = (int) (0.5*qBlue(rgb));
00145 rgb = qRgb( r, g, b );
00146 newImage.setPixel( x, y, rgb );
00147 }
00148 }
00149 }
00150 QPixmap newPixmap;
00151 newPixmap.convertFromImage( newImage );
00152 QLabel::setPixmap( newPixmap );
00153 }
00154 }
00155
00156 void ClickableLabel::setHighlighted()
00157 {
00158 if( ! defaultPixmap.isNull() )
00159 {
00160
00161 QImage newImage = defaultPixmap.convertToImage();
00162 QImage alpha = newImage.createAlphaMask();
00163 int x, y;
00164 for(y=0; y<newImage.height(); y++)
00165 {
00166 for(x=0; x<newImage.width(); x++)
00167 {
00168 if(alpha.isNull() || qRed(alpha.pixel(x,y)) == 0)
00169 {
00170 QRgb rgb = newImage.pixel(x,y);
00171 int r = (int) (0.8*qRed(rgb));
00172 int g = (int) (0.8*qGreen(rgb));
00173 int b = (int) (0.8*qBlue(rgb));
00174 rgb = qRgba( r, g, b, qAlpha(rgb) );
00175 newImage.setPixel( x, y, rgb );
00176 }
00177 }
00178 }
00179 QPixmap newPixmap;
00180 newPixmap.convertFromImage( newImage );
00181 QLabel::setPixmap( newPixmap );
00182 }
00183 }
00184
00185 void ClickableLabel::mousePressEvent ( QMouseEvent * )
00186 {
00187 if( !enabled ) return;
00188
00189 pressed = true;
00190 setActive();
00191 }
00192
00193 void ClickableLabel::mouseReleaseEvent ( QMouseEvent *e )
00194 {
00195 if( !enabled || invisible ) return;
00196
00197 pressed = false;
00198
00199
00200 if(!defaultPixmap.isNull())
00201 { this->setPixmap( defaultPixmap ); }
00202
00203
00204 if(e->pos().x() >= 0 &&
00205 e->pos().y() >= 0 &&
00206 e->pos().x() < width() &&
00207 e->pos().y() < height() )
00208 {
00209 emit clicked();
00210 }
00211 }
00212
00213 void ClickableLabel::setInvisible( bool val )
00214 {
00215
00216 if( invisible != val)
00217 {
00218 invisible = val;
00219 repaint();
00220 }
00221 }
00222
00223