Main Page | Namespace List | Class Hierarchy | Class List | File List | Class Members | File Members

clickableLabel.cpp

Go to the documentation of this file.
00001 //============================================== 00002 // copyright : (C) 2003-2005 by Will Stokes 00003 //============================================== 00004 // This program is free software; you can redistribute it 00005 // and/or modify it under the terms of the GNU General 00006 // Public License as published by the Free Software 00007 // Foundation; either version 2 of the License, or 00008 // (at your option) any later version. 00009 //============================================== 00010 00011 //Systemwide includes 00012 #include <qimage.h> 00013 #include <qpainter.h> 00014 00015 //Projectwide includes 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 //only paint label if not invisible 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 //create over exposed gray version 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 //create darkened out version 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 //create slightly darker version 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 //restore pixmap if exists 00200 if(!defaultPixmap.isNull()) 00201 { this->setPixmap( defaultPixmap ); } 00202 00203 //if mouse still over button emit clicked signal 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 //avoid repainting when not necessary 00216 if( invisible != val) 00217 { 00218 invisible = val; 00219 repaint(); 00220 } 00221 } 00222 //============================================== 00223

Generated on Sun Mar 4 19:42:55 2007 for AlbumShaper by doxygen 1.3.7