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