• Skip to content
  • Skip to link menu
KDE 4.4 API Reference
  • KDE API Reference
  • API Reference
  • Sitemap
  • Contact Us
 

digikam

albumiconitem.cpp

Go to the documentation of this file.
00001 /* ============================================================
00002  *
00003  * This file is a part of digiKam project
00004  * http://www.digikam.org
00005  *
00006  * Date        : 2003-04-25
00007  * Description : implementation to render album icon item.
00008  *
00009  * Copyright (C) 2003-2005 by Renchi Raju <renchi@pooh.tam.uiuc.edu>
00010  * Copyright (C) 2003-2008 by Gilles Caulier <caulier dot gilles at gmail dot com>
00011  *
00012  * This program is free software; you can redistribute it
00013  * and/or modify it under the terms of the GNU General
00014  * Public License as published by the Free Software Foundation;
00015  * either version 2, or (at your option)
00016  * any later version.
00017  *
00018  * This program is distributed in the hope that it will be useful,
00019  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00020  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00021  * GNU General Public License for more details.
00022  *
00023  * ============================================================ */
00024 
00025 #include "albumiconitem.h"
00026 
00027 // Qt includes
00028 
00029 #include <QFont>
00030 #include <QFontMetrics>
00031 #include <QPainter>
00032 #include <QPalette>
00033 #include <QPen>
00034 #include <QPixmap>
00035 #include <QStringList>
00036 
00037 // KDE includes
00038 
00039 #include <kglobal.h>
00040 #include <kio/global.h>
00041 #include <klocale.h>
00042 #include <kstringhandler.h>
00043 #include <kurl.h>
00044 
00045 // Local includes
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         // start with the dots only
00106         QString squeezedText = "...";
00107         int squeezedWidth    = fm.width(squeezedText);
00108 
00109         // estimate how many letters we can add to the dots on both sides
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             // we estimated too short
00118             // add letters while text < label
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             // we estimated too long
00133             // remove letters while text > label
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         // simplified
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 }  // namespace Digikam

digikam

Skip menu "digikam"
  • Main Page
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members

API Reference

Skip menu "API Reference"
  • digikam
Generated for API Reference by doxygen 1.5.9-20090814
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal