//============================================== // copyright : (C) 2003-2005 by Will Stokes //============================================== // This program is free software; you can redistribute it // and/or modify it under the terms of the GNU General // Public License as published by the Free Software // Foundation; either version 2 of the License, or // (at your option) any later version. //============================================== //Systemwide includes #include #include //Projectwide includes #include "clickableLabel.h" #include using namespace std; //============================================== ClickableLabel::ClickableLabel( QWidget* parent, const char* name ) : QLabel( parent, name ) { setWFlags(WRepaintNoErase); enabled = true; invisible = false; pressed = false; setMouseTracking(true); } //============================================== void ClickableLabel::paintEvent(QPaintEvent *e) { QPixmap buffer( size() ); QPainter bufferPainter( &buffer ); bufferPainter.setClipping(false); bufferPainter.fillRect( buffer.rect(), backgroundBrush() ); //only paint label if not invisible if( !invisible ) { bufferPainter.drawImage( QPoint(0,0), pixmap()->convertToImage() ); } bufferPainter.end(); bitBlt( this, e->rect().x(), e->rect().y(), &buffer, e->rect().x(), e->rect().y(), e->rect().width(), e->rect().height() ); } //============================================== void ClickableLabel::setPixmap( const QPixmap &p ) { defaultPixmap = p; defaultPixmap.detach(); QLabel::setPixmap( p ); } //============================================== void ClickableLabel::setEnabled( bool val ) { if( val ) setPixmap( defaultPixmap ); else if( ! defaultPixmap.isNull() ) { //create over exposed gray version QImage newImage = defaultPixmap.convertToImage(); QImage alpha = newImage.createAlphaMask(); int x, y; for(y=0; ypos(); if( p.x() < 0 || p.y() < 0 || p.x() >= width() || p.y() >= height() ) { if(!defaultPixmap.isNull()) { this->setPixmap( defaultPixmap ); } } else { if( pressed ) setActive(); else setHighlighted(); } } //============================================== void ClickableLabel::leaveEvent ( QEvent * ) { if( !enabled ) return; if(!defaultPixmap.isNull()) { this->setPixmap( defaultPixmap ); } } //============================================== void ClickableLabel::enterEvent ( QEvent * ) { if( !enabled ) return; if( pressed ) setActive(); else setHighlighted(); } //============================================== void ClickableLabel::setActive() { if( ! defaultPixmap.isNull() ) { //create darkened out version QImage newImage = defaultPixmap.convertToImage(); QImage alpha = newImage.createAlphaMask(); int x, y; for(y=0; ysetPixmap( defaultPixmap ); } //if mouse still over button emit clicked signal if(e->pos().x() >= 0 && e->pos().y() >= 0 && e->pos().x() < width() && e->pos().y() < height() ) { emit clicked(); } } //============================================== void ClickableLabel::setInvisible( bool val ) { //avoid repainting when not necessary if( invisible != val) { invisible = val; repaint(); } } //==============================================