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>
25 using namespace std;
26 
27 //==============================================
28 ClickableLabel::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 //==============================================
37 void 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 //==============================================
55 void 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 //==============================================
95 void 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
111  setHighlighted();
112  }
113 }
114 //==============================================
115 void ClickableLabel::leaveEvent ( QEvent * )
116 {
117  if( !enabled ) return;
118 
119  if(!defaultPixmap.isNull())
120  { this->setPixmap( defaultPixmap ); }
121 }
122 //==============================================
123 void ClickableLabel::enterEvent ( QEvent * )
124 {
125  if( !enabled ) return;
126 
127  if( pressed )
128  setActive();
129  else
130  setHighlighted();
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 //==============================================
191 void ClickableLabel::mousePressEvent ( QMouseEvent * )
192 {
193  if( !enabled ) return;
194 
195  pressed = true;
196  setActive();
197 }
198 //==============================================
199 void ClickableLabel::mouseReleaseEvent ( QMouseEvent *e )
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 
void leaveEvent(QEvent *)
long b
Definition: jpegInternal.h:125
void mouseMoveEvent(QMouseEvent *e)
void setPixmap(const QPixmap &p)
QPixmap defaultPixmap
int width
Definition: blur.cpp:79
void paintEvent(QPaintEvent *e)
double buffer to avoid flicker
void setEnabled(bool val)
void mouseReleaseEvent(QMouseEvent *e)
void enterEvent(QEvent *)
float * buffer
Definition: blur.cpp:80
void mousePressEvent(QMouseEvent *)
ClickableLabel(QWidget *parent=0, const char *name=0)
void setInvisible(bool val)
int height
Definition: blur.cpp:79