AlbumShaper  1.0a3
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