00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
#include <qpixmap.h>
00013
#include <qstring.h>
00014
#include <qpainter.h>
00015
#include <qiconview.h>
00016
#include <qfontmetrics.h>
00017
#include <qapplication.h>
00018
00019
00020
#include "subalbumPreviewWidget.h"
00021
#include "subalbumsIconView.h"
00022
#include "../backend/subalbum.h"
00023
#include "../backend/photo.h"
00024
#include "../backend/tools/imageTools.h"
00025
#include "subalbumsWidget.h"
00026
#include "layoutWidget.h"
00027
#include "subalbumWidget.h"
00028
#include "photoPreviewWidget.h"
00029
#include "../backend/tools/guiTools.h"
00030
00031
#include "../backend/album.h"
00032
00033
00034 SubalbumPreviewWidget::SubalbumPreviewWidget(
SubalbumsIconView* parent,
Subalbum* salbum )
00035 :
QIconViewItem(parent,
00036
clipText( salbum->getName(), 2, parent->getTextWidth()),
00037 *salbum->getRepresentativeImage(
MEDIUM) )
00038 {
00039
mousedOver =
false;
00040 this->parent = parent;
00041
subalbum = salbum;
00042
00043
00044
initializeItemRect();
00045 }
00046
00047 Subalbum*
SubalbumPreviewWidget::getSubalbum()
00048 {
00049
return subalbum;
00050 }
00051
00052 void SubalbumPreviewWidget::paintFocus( QPainter*,
const QColorGroup& ) { }
00053
00054 void SubalbumPreviewWidget::paint( QPainter *p )
00055 {
00056
paintItem( p, QColorGroup() );
00057 }
00058
00059 void SubalbumPreviewWidget::paintItem( QPainter* p,
const QColorGroup&)
00060 {
00061 QColor lightLightBlue( 152, 180, 226 );
00062 QColor darkLightBlue(193, 210, 238);
00063 QColor darkBlue(35, 75, 139);
00064 QColor background = darkLightBlue;
00065
00066
00067
static QPixmap
buffer;
00068 QRect r = rect();
00069 QSize newSize = r.size().expandedTo(
buffer.size() );
00070
buffer.resize(newSize);
00071
buffer.fill( background );
00072
00073
00074 QPainter bufferPainter(&
buffer,
this);
00075 bufferPainter.translate( -r.x(), -r.y() );
00076
00077
00078 bufferPainter.setClipping(
false);
00079
00080
00081
bool paintRect =
false;
00082 QColor paintColor;
00083
if(isSelected()) { paintColor = darkBlue; paintRect =
true; }
00084
else if(
mousedOver) { paintColor = lightLightBlue; paintRect =
true; }
00085
00086
if(paintRect)
00087 {
00088
00089
00090
00091
00092 QRect r2 = r;
00093 r2.setLeft( r.left() + 4);
00094 r2.setRight( r.right() - 4);
00095 r2.setTop( r.top() );
00096 r2.setBottom( r.bottom() );
00097 bufferPainter.fillRect( r2,
blendColors( paintColor, background, 0.40 ) );
00098
00099 r2.setLeft( r2.left() + 1);
00100 r2.setRight( r2.right() - 1);
00101 bufferPainter.fillRect( r2,
blendColors( paintColor, background, 0.67 ) );
00102
00103
00104 r2.setLeft( r2.left() - 3);
00105 r2.setRight( r2.right() + 3);
00106 r2.setTop( r2.top() + 1 );
00107 r2.setBottom( r2.bottom() - 1);
00108 bufferPainter.fillRect( r2,
blendColors( paintColor, background, 0.40 ) );
00109
00110 r2.setLeft( r2.left() + 1);
00111 r2.setRight( r2.right() - 1);
00112 bufferPainter.fillRect( r2,
blendColors( paintColor, background, 0.67 ) );
00113
00114
00115 r2.setLeft( r2.left() - 2);
00116 r2.setRight( r2.right() + 2);
00117 r2.setTop( r2.top() + 1 );
00118 r2.setBottom( r2.bottom() - 1);
00119 bufferPainter.fillRect( r2,
blendColors( paintColor, background, 0.40) );
00120
00121 r2.setTop( r2.top() + 1);
00122 r2.setBottom( r2.bottom() - 1);
00123 bufferPainter.fillRect( r2,
blendColors( paintColor, background, 0.67) );
00124
00125
00126 r2.setLeft( r2.left() - 1 );
00127 r2.setRight( r2.right() + 1 );
00128 r2.setTop( r2.top() + 1);
00129 r2.setBottom( r2.bottom() - 1);
00130 bufferPainter.fillRect( r2,
blendColors( paintColor, background, 0.40) );
00131
00132 r2.setTop( r2.top() + 1);
00133 r2.setBottom( r2.bottom() - 1);
00134 bufferPainter.fillRect( r2,
blendColors( paintColor, background, 0.67) );
00135
00136
00137 r2 = r;
00138 r2.setLeft( r.left() + 1);
00139 r2.setRight( r.right() - 1);
00140 r2.setTop( r.top() + 4 );
00141 r2.setBottom( r.bottom() - 4);
00142 bufferPainter.fillRect( r2, paintColor );
00143
00144 r2.setLeft( r2.left() + 1);
00145 r2.setRight( r2.right() - 1);
00146 r2.setTop( r2.top() - 2 );
00147 r2.setBottom( r2.bottom() + 2 );
00148 bufferPainter.fillRect( r2, paintColor );
00149
00150 r2.setLeft( r2.left() + 2);
00151 r2.setRight( r2.right() - 2);
00152 r2.setTop( r2.top() - 1 );
00153 r2.setBottom( r2.bottom() + 1 );
00154 bufferPainter.fillRect( r2, paintColor );
00155 }
00156
00157
00158 bufferPainter.drawPixmap( x()+4 , y() + 4, *pixmap());
00159
00160
00161
int align = AlignLeft | AlignTop | BreakAnywhere;
00162
if(isSelected())
00163 bufferPainter.setPen( white );
00164
else
00165 bufferPainter.setPen( black );
00166 bufferPainter.drawText( x() + 4 + pixmapRect().
width(),
00167 y() + 4,
00168 textRect().
width(), textRect().
height(),
00169 align, text() );
00170
00171
00172 p->drawPixmap( x(), y(),
buffer );
00173 }
00174
00175 void SubalbumPreviewWidget::dropped( QDropEvent *e,
const QValueList<QIconDragItem> & )
00176 {
00177
00178
if(e->source() == NULL)
00179
return;
00180
00181
00182
00183
00184
if(e->source()->parentWidget() ==
parent)
00185 {
00186
if(e->pos().y() < (y() + (
height()/2)))
00187 {
00188
parent->currentItem()->move(x(), y() - 1);
00189 }
00190
else
00191 {
00192
parent->currentItem()->move(x(), y() + (
height()/2) + 1);
00193 }
00194 }
00195
00196
else
00197 {
00198
00199
00200
00201
if(
00202 !isSelected() &&
00203 (
00204 e->source()->parentWidget() ==
00205 ((
LayoutWidget*)(
parent->parentWidget()->parentWidget()))->getSubalbum()->getPhotos()
00206 )
00207 )
00208 {
00209
00210
00211
00212
SubalbumWidget* oldSubalbumWidget = ((
LayoutWidget*)(
parent->parentWidget()->parentWidget()))->getSubalbum();
00213
Subalbum* oldSubalbum = oldSubalbumWidget->
getSubalbum();
00214
QIconViewItem* current = oldSubalbumWidget->
getPhotos()->firstItem();
00215
while(current != NULL)
00216 {
00217
00218
if(current->isSelected())
00219 {
00220
00221
Photo* photo = ((
PhotoPreviewWidget*)current)->getPhoto();
00222
00223
00224 oldSubalbum->
photoMoved(photo);
00225
00226
00227
subalbum->
addPhoto(photo);
00228
00229
00230
QIconViewItem* temp = current;
00231 current = current->nextItem();
00232
delete temp;
00233 }
00234
else
00235 {
00236 current = current->nextItem();
00237 }
00238 }
00239
00240
00241 oldSubalbumWidget->
getPhotos()->arrangeItemsInGrid();
00242 }
00243 }
00244 }
00245
00246 bool SubalbumPreviewWidget::acceptDrop(
const QMimeSource *)
const
00247
{
00248
return true;
00249 }
00250
00251 int SubalbumPreviewWidget::compare (
QIconViewItem * i )
const
00252
{
00253
if(pos().y() >= i->pos().y())
00254 {
return 1; }
00255
else
00256 {
return -1; }
00257 }
00258
00259 QPixmap*
SubalbumPreviewWidget::createSubalbumPixmap( QString imageName )
00260 {
00261
00262 QImage icon(imageName);
00263
00264
00265
if( icon.isNull() )
00266
return NULL;
00267
00268
00269
00270 QFontMetrics fm( qApp->font() );
00271
00272
00273
int idealImageHeight = fm.leading() + 2*fm.height();
00274
00275
00276
int idealImageWidth = (4 * idealImageHeight ) / 3;
00277
00278
00279
int actualImageWidth = 0;
00280
int actualImageHeight = 0;
00281
calcScaledImageDimensions( icon.width(), icon.height(),
00282 idealImageWidth, idealImageHeight,
00283 actualImageWidth, actualImageHeight );
00284
00285
00286
if(actualImageHeight == idealImageHeight - 1)
00287 {
00288 actualImageHeight = idealImageHeight;
00289 }
00290
00291 QImage scaledIcon= icon.smoothScale( actualImageWidth, actualImageHeight );
00292 QImage* paddedScaledIcon =
new QImage(idealImageWidth, idealImageHeight, scaledIcon.depth());
00293 paddedScaledIcon->setAlphaBuffer(
true);
00294
00295
00296
int x, y;
00297
for(x=0; x< idealImageWidth; x++)
00298 {
00299
for(y=0; y<idealImageHeight; y++)
00300 {
00301 paddedScaledIcon->setPixel(x,y, qRgba(255, 255, 255,0) );
00302 }
00303 }
00304
00305
00306
int xDiff = idealImageWidth - actualImageWidth;
00307
int yDiff = idealImageHeight - actualImageHeight;
00308
int x2 = 0;
00309
for(x= xDiff/2; x < (xDiff/2) + actualImageWidth; x++)
00310 {
00311
int y2 = 0;
00312
for(y= yDiff/2; y < (yDiff/2) + actualImageHeight; y++)
00313 {
00314 paddedScaledIcon->setPixel(x, y, scaledIcon.pixel(x2, y2));
00315 y2++;
00316 }
00317 x2++;
00318 }
00319
00320
00321
if(xDiff == 0)
00322 {
00323 paddedScaledIcon->setPixel(0, 0, qRgba(255, 0,0,0) );
00324 paddedScaledIcon->setPixel(idealImageWidth-1, 0, qRgba(255, 0,0,0) );
00325 paddedScaledIcon->setPixel(0, idealImageHeight-1, qRgba(255, 0,0,0) );
00326 paddedScaledIcon->setPixel(idealImageWidth-1, idealImageHeight-1, qRgba(255, 0,0,0) );
00327 }
00328
00329 QPixmap* padddedScaledPix =
new QPixmap( paddedScaledIcon->width(), paddedScaledIcon->height() );
00330 padddedScaledPix->convertFromImage( *paddedScaledIcon );
00331
delete paddedScaledIcon;
00332
return padddedScaledPix;
00333
00334 }
00335
00336 void SubalbumPreviewWidget::calcRect(
const QString & text_ )
00337 {
00338
00339 QIconViewItem::calcRect( text_ );
00340
00341
00342
initializeItemRect();
00343 }
00344
00345 void SubalbumPreviewWidget::initializeItemRect()
00346 {
00347
00348 QRect pr = pixmapRect();
00349
int prWidth = pr.width();
00350
int prHeight = pr.height();
00351 pr.setTopLeft( QPoint(3,3) );
00352 pr.setBottomRight( QPoint(pr.left()+prWidth, pr.top()+prHeight) );
00353 setPixmapRect( pr );
00354
00355
00356
int textWidth =
parent->
getTextWidth();
00357 QRect tr = textRect();
00358 tr.setTop( pixmapRect().top() );
00359 tr.setBottom( pixmapRect().bottom() );
00360 tr.setLeft( pixmapRect().right() + 2 );
00361 tr.setRight( tr.left() + textWidth );
00362 setTextRect( tr );
00363
00364
00365
int itemW = 3 + pixmapRect().width() + (tr.left() - pr.right()) + textRect().width() + 3;
00366
int itemH = 3 + pixmapRect().height() + 3;
00367 setItemRect( QRect( pixmapRect().left() - 3, pixmapRect().top() - 3, itemW, itemH ) );
00368 }
00369
00370 void SubalbumPreviewWidget::setText (
const QString & text )
00371 {
00372 QIconViewItem::setText(
clipText(text, 2,
parent->
getTextWidth()),
false );
00373 }
00374
00375 void SubalbumPreviewWidget::setMousedOver(
bool val)
00376 {
00377
mousedOver = val;
00378 }
00379
00380 QColor
SubalbumPreviewWidget::blendColors( QColor a, QColor b,
double alpha)
00381 {
00382
double alpha2 = 1-alpha;
00383
return QColor( (
int)(alpha*a.red() + alpha2*
b.red()),
00384 (
int)(alpha*a.green() + alpha2*
b.green()),
00385 (
int)(alpha*a.blue() + alpha2*
b.blue()) );
00386 }
00387