00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "albumiconitem.h"
00026
00027
00028
00029 #include <QFont>
00030 #include <QFontMetrics>
00031 #include <QPainter>
00032 #include <QPalette>
00033 #include <QPen>
00034 #include <QPixmap>
00035 #include <QStringList>
00036
00037
00038
00039 #include <kglobal.h>
00040 #include <kio/global.h>
00041 #include <klocale.h>
00042 #include <kstringhandler.h>
00043 #include <kurl.h>
00044
00045
00046
00047 #include "albumiconview.h"
00048 #include "albummanager.h"
00049 #include "albumsettings.h"
00050 #include "icongroupitem.h"
00051 #include "imageinfo.h"
00052 #include "themeengine.h"
00053 #include "thumbbar.h"
00054 #include "thumbnailloadthread.h"
00055 #include "thumbnailsize.h"
00056
00057 namespace Digikam
00058 {
00059
00060 class AlbumIconItemPriv
00061 {
00062 public:
00063
00064 AlbumIconItemPriv()
00065 {
00066 dirty = true;
00067 view = 0;
00068 }
00069
00070 bool dirty;
00071
00072 QRect tightPixmapRect;
00073
00074 ImageInfo info;
00075
00076 AlbumIconView *view;
00077 };
00078
00079 AlbumIconItem::AlbumIconItem(IconGroupItem* parent, const ImageInfo& info)
00080 : IconItem(parent), d(new AlbumIconItemPriv)
00081 {
00082 d->view = (AlbumIconView*) parent->iconView();
00083 d->info = info;
00084 }
00085
00086 AlbumIconItem::~AlbumIconItem()
00087 {
00088 delete d;
00089 }
00090
00091 void AlbumIconItem::dateToString(const QDateTime& datetime, QString& str)
00092 {
00093 str = KGlobal::locale()->formatDateTime(datetime, KLocale::ShortDate, false);
00094 }
00095
00096 QString AlbumIconItem::squeezedText(QPainter* p, int width, const QString& text)
00097 {
00098 QString fullText(text);
00099 fullText.replace('\n',' ');
00100 QFontMetrics fm(p->fontMetrics());
00101 int textWidth = fm.width(fullText);
00102
00103 if (textWidth > width)
00104 {
00105
00106 QString squeezedText = "...";
00107 int squeezedWidth = fm.width(squeezedText);
00108
00109
00110 int letters = fullText.length() * (width - squeezedWidth) / textWidth;
00111 if (width < squeezedWidth) letters=1;
00112 squeezedText = fullText.left(letters) + "...";
00113 squeezedWidth = fm.width(squeezedText);
00114
00115 if (squeezedWidth < width)
00116 {
00117
00118
00119 do
00120 {
00121 ++letters;
00122 squeezedText = fullText.left(letters) + "...";
00123 squeezedWidth = fm.width(squeezedText);
00124 }
00125 while (squeezedWidth < width);
00126
00127 --letters;
00128 squeezedText = fullText.left(letters) + "...";
00129 }
00130 else if (squeezedWidth > width)
00131 {
00132
00133
00134 do
00135 {
00136 --letters;
00137 squeezedText = fullText.left(letters) + "...";
00138 squeezedWidth = fm.width(squeezedText);
00139 }
00140 while (letters && squeezedWidth > width);
00141 }
00142
00143 if (letters >= 5)
00144 {
00145 return squeezedText;
00146 }
00147 }
00148
00149 return fullText;
00150 }
00151
00152 bool AlbumIconItem::isDirty()
00153 {
00154 return d->dirty;
00155 }
00156
00157 ImageInfo AlbumIconItem::imageInfo() const
00158 {
00159 return d->info;
00160 }
00161
00162 QString AlbumIconItem::filePath() const
00163 {
00164 return d->info.filePath();
00165 }
00166
00167 int AlbumIconItem::compare(IconItem *item)
00168 {
00169 const AlbumSettings *settings = d->view->settings();
00170 AlbumIconItem *iconItem = static_cast<AlbumIconItem*>(item);
00171
00172 switch (settings->getImageSortOrder())
00173 {
00174 case(AlbumSettings::ByIName):
00175 {
00176 return KStringHandler::naturalCompare(d->info.name(), iconItem->d->info.name());
00177 }
00178 case(AlbumSettings::ByIPath):
00179 {
00180 return KStringHandler::naturalCompare(d->info.fileUrl().path(), iconItem->d->info.fileUrl().path());
00181 }
00182 case(AlbumSettings::ByIDate):
00183 {
00184 if (d->info.dateTime() < iconItem->d->info.dateTime())
00185 return -1;
00186 else if (d->info.dateTime() > iconItem->d->info.dateTime())
00187 return 1;
00188 else
00189 return 0;
00190 }
00191 case(AlbumSettings::ByISize):
00192 {
00193 int mysize(d->info.fileSize());
00194 int hissize(iconItem->d->info.fileSize());
00195 if (mysize < hissize)
00196 return -1;
00197 else if (mysize > hissize)
00198 return 1;
00199 else
00200 return 0;
00201 }
00202 case(AlbumSettings::ByIRating):
00203 {
00204 int myrating(d->info.rating());
00205 int hisrating(iconItem->d->info.rating());
00206 if (myrating < hisrating)
00207 return 1;
00208 else if (myrating > hisrating)
00209 return -1;
00210 else
00211 return 0;
00212 }
00213 }
00214
00215 return 0;
00216 }
00217
00218 QRect AlbumIconItem::thumbnailRect() const
00219 {
00220 QRect pixmapRect = d->view->itemPixmapRect();
00221 QRect r = rect();
00222
00223 pixmapRect.translate(r.x(), r.y());
00224 return pixmapRect;
00225 }
00226
00227 QRect AlbumIconItem::clickToOpenRect()
00228 {
00229 if (d->tightPixmapRect.isNull())
00230 return rect();
00231
00232 QRect pixmapRect = d->tightPixmapRect;
00233 QRect r = rect();
00234
00235 pixmapRect.translate(r.x(), r.y());
00236 return pixmapRect;
00237 }
00238
00239 QRect AlbumIconItem::clickToRateRect()
00240 {
00241 QRect ratingRect = d->view->itemRatingRect();
00242 QRect r = rect();
00243
00244 ratingRect.translate(r.x(), r.y());
00245 return ratingRect;
00246 }
00247
00248 void AlbumIconItem::paintItem(QPainter *p)
00249 {
00250 QRect r;
00251 const AlbumSettings *settings = d->view->settings();
00252 ThemeEngine* te = ThemeEngine::instance();
00253
00254 QPixmap pix;
00255 if (isSelected())
00256 pix = d->view->itemBaseSelPixmap();
00257 else
00258 pix = d->view->itemBaseRegPixmap();
00259
00260 p->setPen(isSelected() ? te->textSelColor() : te->textRegColor());
00261
00262 d->dirty = true;
00263
00264 QPixmap thumbnail;
00265 if (ThumbnailLoadThread::defaultIconViewThread()->find(d->info.filePath(), thumbnail))
00266 {
00267 r = d->view->itemPixmapRect();
00268 p->drawPixmap(r.x() + (r.width()-thumbnail.width())/2,
00269 r.y() + (r.height()-thumbnail.height())/2,
00270 thumbnail);
00271
00272 d->tightPixmapRect.setRect(r.x() + (r.width()-thumbnail.width())/2,
00273 r.y() + (r.height()-thumbnail.height())/2,
00274 thumbnail.width(), thumbnail.height());
00275 d->dirty = false;
00276
00277 p->save();
00278 QRegion pixmapClipRegion = QRegion(d->view->itemRect()) - QRegion(d->tightPixmapRect);
00279 p->setClipRegion(pixmapClipRegion);
00280 p->drawPixmap(0, 0, pix);
00281
00282 QPixmap borderPix = d->view->thumbnailBorderPixmap(d->tightPixmapRect.size());
00283 p->drawPixmap(d->tightPixmapRect.x()-3, d->tightPixmapRect.y()-3, borderPix);
00284
00285 p->restore();
00286 }
00287 else
00288 {
00289
00290 p->drawPixmap(0, 0, pix);
00291 }
00292
00293 if (settings->getIconShowRating())
00294 {
00295 r = d->view->itemRatingRect();
00296 QPixmap ratingPixmap;
00297
00298 if (!editRating())
00299 ratingPixmap = d->view->ratingPixmap(d->info.rating(), isSelected());
00300 else
00301 ratingPixmap = d->view->ratingPixmap(-1, isSelected());
00302
00303 p->drawPixmap(r, ratingPixmap);
00304 }
00305
00306 if (settings->getIconShowName())
00307 {
00308 r = d->view->itemNameRect();
00309 p->setFont(d->view->itemFontReg());
00310 p->drawText(r, Qt::AlignCenter, squeezedText(p, r.width(), d->info.name()));
00311 }
00312
00313 p->setFont(d->view->itemFontCom());
00314
00315 if (settings->getIconShowComments())
00316 {
00317 QString comments = d->info.comment();
00318
00319 r = d->view->itemCommentsRect();
00320 p->drawText(r, Qt::AlignCenter, squeezedText(p, r.width(), comments));
00321 }
00322
00323 p->setFont(d->view->itemFontXtra());
00324
00325 if (settings->getIconShowDate())
00326 {
00327 QDateTime date(d->info.dateTime());
00328
00329 r = d->view->itemDateRect();
00330 p->setFont(d->view->itemFontXtra());
00331 QString str;
00332 dateToString(date, str);
00333 str = i18nc("date of image creation", "created: %1",str);
00334 p->drawText(r, Qt::AlignCenter, squeezedText(p, r.width(), str));
00335 }
00336
00337 if (settings->getIconShowModDate())
00338 {
00339 QDateTime date(d->info.modDateTime());
00340
00341 r = d->view->itemModDateRect();
00342 p->setFont(d->view->itemFontXtra());
00343 QString str;
00344 dateToString(date, str);
00345 str = i18nc("date of last image modification", "modified: %1",str);
00346 p->drawText(r, Qt::AlignCenter, squeezedText(p, r.width(), str));
00347 }
00348
00349 if (settings->getIconShowResolution())
00350 {
00351 QSize dims = d->info.dimensions();
00352 if (dims.isValid())
00353 {
00354 QString mpixels, resolution;
00355 mpixels.setNum(dims.width()*dims.height()/1000000.0, 'f', 2);
00356 resolution = (!dims.isValid()) ? i18nc("unknown image resolution", "Unknown")
00357 : i18nc("%1 width, %2 height, %3 mpixels", "%1x%2 (%3Mpx)",
00358 dims.width(),dims.height(),mpixels);
00359 r = d->view->itemResolutionRect();
00360 p->drawText(r, Qt::AlignCenter, squeezedText(p, r.width(), resolution));
00361 }
00362 }
00363
00364 if (settings->getIconShowSize())
00365 {
00366 r = d->view->itemSizeRect();
00367 p->drawText(r, Qt::AlignCenter,
00368 squeezedText(p, r.width(), KIO::convertSize(d->info.fileSize())));
00369 }
00370
00371 p->setFont(d->view->itemFontCom());
00372 p->setPen(isSelected() ? te->textSpecialSelColor() : te->textSpecialRegColor());
00373
00374 if (settings->getIconShowTags())
00375 {
00376 QString tags = AlbumManager::instance()->tagNames(d->info.tagIds()).join(", ");
00377
00378 r = d->view->itemTagRect();
00379 p->drawText(r, Qt::AlignCenter, squeezedText(p, r.width(), tags));
00380 }
00381
00382 if (this == d->view->currentItem())
00383 {
00384 r = d->view->itemRect();
00385 p->setPen(QPen(isSelected() ? te->textSelColor() : te->textRegColor(), 1, Qt::DotLine));
00386 p->drawRect(1, 1, r.width()-3, r.height()-3);
00387 }
00388
00389 if (isHighlighted())
00390 {
00391 paintToggleSelectButton(p);
00392
00393 r = d->view->itemRect();
00394 p->setPen(QPen(d->view->palette().color(QPalette::Highlight), 3, Qt::SolidLine));
00395 p->drawRect(1, 1, r.width()-3, r.height()-3);
00396 }
00397 }
00398
00399 void AlbumIconItem::setRating(int rating)
00400 {
00401 d->info.setRating(rating);
00402 }
00403
00404 int AlbumIconItem::rating() const
00405 {
00406 return d->info.rating();
00407 }
00408
00409 }