AlbumShaper 1.0a3
clickableLabel.cpp
Go to the documentation of this file.
1//==============================================
2// copyright : (C) 2003-2005 by Will Stokes
3//==============================================
4// This program is free software; you can redistribute it
5// and/or modify it under the terms of the GNU General
6// Public License as published by the Free Software
7// Foundation; either version 2 of the License, or
8// (at your option) any later version.
9//==============================================
10
11//Systemwide includes
12#include <qimage.h>
13#include <qpainter.h>
14//Added by qt3to4:
15#include <QPixmap>
16#include <QEvent>
17#include <QLabel>
18#include <QMouseEvent>
19#include <QPaintEvent>
20
21//Projectwide includes
22#include "clickableLabel.h"
23
24#include <iostream>
25using namespace std;
26
27//==============================================
28ClickableLabel::ClickableLabel( QWidget* parent, const char* name ) : QLabel( parent, name )
29{
30 setWindowFlags(Qt::WNoAutoErase);
31 enabled = true;
32 invisible = false;
33 pressed = false;
34 setMouseTracking(true);
35}
36//==============================================
37void ClickableLabel::paintEvent(QPaintEvent *e)
38{
39 QPixmap buffer( size() );
40 QPainter bufferPainter( &buffer );
41 bufferPainter.setClipping(false);
42 bufferPainter.fillRect( buffer.rect(), backgroundBrush() );
43
44 //only paint label if not invisible
45 if( !invisible )
46 { bufferPainter.drawImage( QPoint(0,0), pixmap()->convertToImage() ); }
47
48 bufferPainter.end();
49 bitBlt( this, e->rect().x(), e->rect().y(),
50 &buffer,
51 e->rect().x(), e->rect().y(),
52 e->rect().width(), e->rect().height() );
53}
54//==============================================
55void ClickableLabel::setPixmap( const QPixmap &p )
56{
57 defaultPixmap = p;
58 defaultPixmap.detach();
59 QLabel::setPixmap( p );
60}
61//==============================================
63{
64 if( val )
66 else if( ! defaultPixmap.isNull() )
67 {
68 //create over exposed gray version
69 QImage newImage = defaultPixmap.convertToImage();
70 QImage alpha = newImage.createAlphaMask();
71 int x, y;
72 for(y=0; y<newImage.height(); y++)
73 {
74 for(x=0; x<newImage.width(); x++)
75 {
76 if(alpha.isNull() || qRed(alpha.pixel(x,y)) == 0)
77 {
78 QRgb rgb = newImage.pixel(x,y);
79 int gray = qGray(rgb);
80 double alpha = 0.5;
81 gray = (int) (alpha*gray+(1-alpha)*255);
82 rgb = qRgb( gray, gray, gray );
83 newImage.setPixel( x, y, rgb );
84 }
85 }
86 }
87 QPixmap newPixmap;
88 newPixmap.convertFromImage( newImage );
89 QLabel::setPixmap( newPixmap );
90 }
91
92 enabled = val;
93}
94//==============================================
95void ClickableLabel::mouseMoveEvent( QMouseEvent* e )
96{
97 if( !enabled ) return;
98
99 QPoint p = e->pos();
100 if( p.x() < 0 || p.y() < 0 ||
101 p.x() >= width() || p.y() >= height() )
102 {
103 if(!defaultPixmap.isNull())
104 { this->setPixmap( defaultPixmap ); }
105 }
106 else
107 {
108 if( pressed )
109 setActive();
110 else
112 }
113}
114//==============================================
116{
117 if( !enabled ) return;
118
119 if(!defaultPixmap.isNull())
120 { this->setPixmap( defaultPixmap ); }
121}
122//==============================================
124{
125 if( !enabled ) return;
126
127 if( pressed )
128 setActive();
129 else
131}
132//==============================================
134{
135 if( ! defaultPixmap.isNull() )
136 {
137 //create darkened out version
138 QImage newImage = defaultPixmap.convertToImage();
139 QImage alpha = newImage.createAlphaMask();
140 int x, y;
141 for(y=0; y<newImage.height(); y++)
142 {
143 for(x=0; x<newImage.width(); x++)
144 {
145 if(alpha.isNull() || qRed(alpha.pixel(x,y)) == 0)
146 {
147 QRgb rgb = newImage.pixel(x,y);
148 int r = (int) (0.5*qRed(rgb));
149 int g = (int) (0.5*qGreen(rgb));
150 int b = (int) (0.5*qBlue(rgb));
151 rgb = qRgb( r, g, b );
152 newImage.setPixel( x, y, rgb );
153 }
154 }
155 }
156 QPixmap newPixmap;
157 newPixmap.convertFromImage( newImage );
158 QLabel::setPixmap( newPixmap );
159 }
160}
161//==============================================
163{
164 if( ! defaultPixmap.isNull() )
165 {
166 //create slightly darker version
167 QImage newImage = defaultPixmap.convertToImage();
168 QImage alpha = newImage.createAlphaMask();
169 int x, y;
170 for(y=0; y<newImage.height(); y++)
171 {
172 for(x=0; x<newImage.width(); x++)
173 {
174 if(alpha.isNull() || qRed(alpha.pixel(x,y)) == 0)
175 {
176 QRgb rgb = newImage.pixel(x,y);
177 int r = (int) (0.8*qRed(rgb));
178 int g = (int) (0.8*qGreen(rgb));
179 int b = (int) (0.8*qBlue(rgb));
180 rgb = qRgba( r, g, b, qAlpha(rgb) );
181 newImage.setPixel( x, y, rgb );
182 }
183 }
184 }
185 QPixmap newPixmap;
186 newPixmap.convertFromImage( newImage );
187 QLabel::setPixmap( newPixmap );
188 }
189}
190//==============================================
192{
193 if( !enabled ) return;
194
195 pressed = true;
196 setActive();
197}
198//==============================================
200{
201 if( !enabled || invisible ) return;
202
203 pressed = false;
204
205 //restore pixmap if exists
206 if(!defaultPixmap.isNull())
207 { this->setPixmap( defaultPixmap ); }
208
209 //if mouse still over button emit clicked signal
210 if(e->pos().x() >= 0 &&
211 e->pos().y() >= 0 &&
212 e->pos().x() < width() &&
213 e->pos().y() < height() )
214 {
215 emit clicked();
216 }
217}
218//==============================================
220{
221 //avoid repainting when not necessary
222 if( invisible != val)
223 {
224 invisible = val;
225 repaint();
226 }
227}
228//==============================================
229
int width
Definition blur.cpp:79
int height
Definition blur.cpp:79
float * buffer
Definition blur.cpp:80
void mouseMoveEvent(QMouseEvent *e)
void mouseReleaseEvent(QMouseEvent *e)
void mousePressEvent(QMouseEvent *)
void paintEvent(QPaintEvent *e)
double buffer to avoid flicker
QPixmap defaultPixmap
ClickableLabel(QWidget *parent=0, const char *name=0)
void setInvisible(bool val)
void leaveEvent(QEvent *)
void setEnabled(bool val)
void enterEvent(QEvent *)
void setPixmap(const QPixmap &p)
long b