1
//////////////////////////////////////////////////////////////////////////////
5
// Copyright (C) 2003-2004 Renchi Raju <renchi at pooh.tam.uiuc.edu>
6
// Gilles Caulier <caulier dot gilles at free.fr>
8
// This program is free software; you can redistribute it and/or modify
9
// it under the terms of the GNU General Public License as published by
10
// the Free Software Foundation; either version 2 of the License, or
11
// (at your option) any later version.
13
// This program is distributed in the hope that it will be useful,
14
// but WITHOUT ANY WARRANTY; without even the implied warranty of
15
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
// GNU General Public License for more details.
18
// You should have received a copy of the GNU General Public License
19
// along with this program; if not, write to the Free Software
20
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22
//////////////////////////////////////////////////////////////////////////////
1
/* ============================================================
3
* This file is a part of digiKam project
4
* http://www.digikam.org
7
* Description : implementation to render album icon item.
9
* Copyright (C) 2003-2005 by Renchi Raju <renchi@pooh.tam.uiuc.edu>
10
* Copyright (C) 2003-2007 by Gilles Caulier <caulier dot gilles at gmail dot com>
12
* This program is free software; you can redistribute it
13
* and/or modify it under the terms of the GNU General
14
* Public License as published by the Free Software Foundation;
15
* either version 2, or (at your option)
18
* This program is distributed in the hope that it will be useful,
19
* but WITHOUT ANY WARRANTY; without even the implied warranty of
20
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21
* GNU General Public License for more details.
23
* ============================================================ */
26
27
#include <qpainter.h>
27
28
#include <qpixmap.h>
28
29
#include <qpalette.h>
30
32
#include <qfontmetrics.h>
50
52
#include "albumiconview.h"
51
53
#include "albumiconitem.h"
58
class AlbumIconItemPriv
71
QRect tightPixmapRect;
53
78
static void dateToString(const QDateTime& datetime, QString& str)
55
80
str = KGlobal::locale()->formatDateTime(datetime, true, false);
58
static QString squeezedText(QPainter* p, int width, const QString& text)
83
AlbumIconItem::AlbumIconItem(IconGroupItem* parent, ImageInfo* info)
86
d = new AlbumIconItemPriv;
87
d->view = (AlbumIconView*) parent->iconView();
91
AlbumIconItem::~AlbumIconItem()
96
QString AlbumIconItem::squeezedText(QPainter* p, int width, const QString& text)
60
98
QString fullText(text);
61
99
fullText.replace("\n"," ");
62
100
QFontMetrics fm(p->fontMetrics());
63
101
int textWidth = fm.width(fullText);
64
if (textWidth > width) {
103
if (textWidth > width)
65
105
// start with the dots only
66
106
QString squeezedText = "...";
67
107
int squeezedWidth = fm.width(squeezedText);
104
AlbumIconItem::AlbumIconItem(IconGroupItem* parent, ImageInfo* info)
107
view_ = (AlbumIconView*) parent->iconView();
113
AlbumIconItem::~AlbumIconItem()
152
bool AlbumIconItem::isDirty()
117
157
ImageInfo* AlbumIconItem::imageInfo() const
122
162
int AlbumIconItem::compare(IconItem *item)
124
const AlbumSettings *settings = view_->settings();
164
const AlbumSettings *settings = d->view->settings();
125
165
AlbumIconItem *iconItem = static_cast<AlbumIconItem*>(item);
127
167
switch (settings->getImageSortOrder())
129
case(AlbumSettings::ByIName):
131
return info_->name().localeAwareCompare(iconItem->info_->name());
133
case(AlbumSettings::ByIPath):
135
return info_->kurl().path().compare(iconItem->info_->kurl().path());
137
case(AlbumSettings::ByIDate):
139
if (info_->dateTime() < iconItem->info_->dateTime())
141
else if (info_->dateTime() > iconItem->info_->dateTime())
146
case(AlbumSettings::ByISize):
148
int mysize(info_->fileSize());
149
int hissize(iconItem->info_->fileSize());
150
if (mysize < hissize)
152
else if (mysize > hissize)
157
case(AlbumSettings::ByIRating):
159
int myrating(info_->rating());
160
int hisrating(iconItem->info_->rating());
161
if (myrating < hisrating)
163
else if (myrating > hisrating)
169
case(AlbumSettings::ByIName):
171
return d->info->name().localeAwareCompare(iconItem->d->info->name());
173
case(AlbumSettings::ByIPath):
175
return d->info->kurl().path().compare(iconItem->d->info->kurl().path());
177
case(AlbumSettings::ByIDate):
179
if (d->info->dateTime() < iconItem->d->info->dateTime())
181
else if (d->info->dateTime() > iconItem->d->info->dateTime())
186
case(AlbumSettings::ByISize):
188
int mysize(d->info->fileSize());
189
int hissize(iconItem->d->info->fileSize());
190
if (mysize < hissize)
192
else if (mysize > hissize)
197
case(AlbumSettings::ByIRating):
199
int myrating(d->info->rating());
200
int hisrating(iconItem->d->info->rating());
201
if (myrating < hisrating)
203
else if (myrating > hisrating)
189
const AlbumSettings *settings = view_->settings();
229
const AlbumSettings *settings = d->view->settings();
191
231
if (isSelected())
192
pix = *(view_->itemBaseSelPixmap());
232
pix = *(d->view->itemBaseSelPixmap());
194
pix = *(view_->itemBaseRegPixmap());
234
pix = *(d->view->itemBaseRegPixmap());
196
Digikam::ThemeEngine* te = Digikam::ThemeEngine::instance();
236
ThemeEngine* te = ThemeEngine::instance();
198
238
QPainter p(&pix);
199
239
p.setPen(isSelected() ? te->textSelColor() : te->textRegColor());
204
QPixmap *thumbnail = view_->pixmapManager()->find(info_->kurl());
244
QPixmap *thumbnail = d->view->pixmapManager()->find(d->info->kurl());
207
r = view_->itemPixmapRect();
247
r = d->view->itemPixmapRect();
208
248
p.drawPixmap(r.x() + (r.width()-thumbnail->width())/2,
209
249
r.y() + (r.height()-thumbnail->height())/2,
211
tightPixmapRect_.setRect(r.x() + (r.width()-thumbnail->width())/2,
251
d->tightPixmapRect.setRect(r.x() + (r.width()-thumbnail->width())/2,
212
252
r.y() + (r.height()-thumbnail->height())/2,
213
253
thumbnail->width(), thumbnail->height());
217
257
if (settings->getIconShowRating())
219
r = view_->itemRatingRect();
220
QPixmap ratingPixmap = view_->ratingPixmap();
259
r = d->view->itemRatingRect();
260
QPixmap ratingPixmap = d->view->ratingPixmap();
222
int rating = info_->rating();
262
int rating = d->info->rating();
225
265
x = r.x() + (r.width() - rating * ratingPixmap.width())/2;
226
266
w = rating * ratingPixmap.width();
228
268
p.drawTiledPixmap(x, r.y(), w, r.height(), ratingPixmap);
232
271
if (settings->getIconShowName())
234
r = view_->itemNameRect();
235
p.setFont(view_->itemFontReg());
273
r = d->view->itemNameRect();
274
p.setFont(d->view->itemFontReg());
236
275
p.drawText(r, Qt::AlignCenter, squeezedText(&p, r.width(),
240
p.setFont(view_->itemFontCom());
279
p.setFont(d->view->itemFontCom());
242
281
if (settings->getIconShowComments())
244
QString comments = info_->caption();
283
QString comments = d->info->caption();
246
r = view_->itemCommentsRect();
285
r = d->view->itemCommentsRect();
247
286
p.drawText(r, Qt::AlignCenter, squeezedText(&p, r.width(), comments));
250
p.setFont(view_->itemFontXtra());
289
p.setFont(d->view->itemFontXtra());
252
291
if (settings->getIconShowDate())
254
QDateTime date(info_->dateTime());
256
r = view_->itemDateRect();
257
p.setFont(view_->itemFontXtra());
259
dateToString(date, str);
293
QDateTime date(d->info->dateTime());
295
r = d->view->itemDateRect();
296
p.setFont(d->view->itemFontXtra());
298
dateToString(date, str);
299
str = i18n("created : %1").arg(str);
300
p.drawText(r, Qt::AlignCenter, squeezedText(&p, r.width(), str));
303
if (settings->getIconShowModDate())
305
QDateTime date(d->info->modDateTime());
307
r = d->view->itemModDateRect();
308
p.setFont(d->view->itemFontXtra());
310
dateToString(date, str);
311
str = i18n("modified : %1").arg(str);
260
312
p.drawText(r, Qt::AlignCenter, squeezedText(&p, r.width(), str));
263
315
if (settings->getIconShowResolution())
265
QSize dims = info_->dimensions();
317
QSize dims = d->info->dimensions();
266
318
if (dims.isValid())
268
QString resolution = QString("%1x%2 %3")
271
.arg(i18n("pixels"));
272
r = view_->itemResolutionRect();
320
QString mpixels, resolution;
321
mpixels.setNum(dims.width()*dims.height()/1000000.0, 'f', 2);
322
resolution = (!dims.isValid()) ? i18n("Unknown") : i18n("%1x%2 (%3Mpx)")
323
.arg(dims.width()).arg(dims.height()).arg(mpixels);
324
r = d->view->itemResolutionRect();
273
325
p.drawText(r, Qt::AlignCenter, squeezedText(&p, r.width(), resolution));
277
329
if (settings->getIconShowSize())
279
r = view_->itemSizeRect();
331
r = d->view->itemSizeRect();
280
332
p.drawText(r, Qt::AlignCenter,
281
333
squeezedText(&p, r.width(),
282
KIO::convertSize(info_->fileSize())));
334
KIO::convertSize(d->info->fileSize())));
285
p.setFont(view_->itemFontCom());
337
p.setFont(d->view->itemFontCom());
286
338
p.setPen(isSelected() ? te->textSpecialSelColor() : te->textSpecialRegColor());
288
340
if (settings->getIconShowTags())
290
QString tags = info_->tagNames().join(", ");
342
QString tags = d->info->tagNames().join(", ");
292
r = view_->itemTagRect();
344
r = d->view->itemTagRect();
293
345
p.drawText(r, Qt::AlignCenter,
294
346
squeezedText(&p, r.width(), tags));
297
if (this == view_->currentItem())
349
if (this == d->view->currentItem())
299
351
p.setPen(QPen(isSelected() ? te->textSelColor() : te->textRegColor(),
300
352
0, Qt::DotLine));