diff options
Diffstat (limited to 'src/utilities/cameragui/cameraiconitem.cpp')
-rw-r--r-- | src/utilities/cameragui/cameraiconitem.cpp | 302 |
1 files changed, 302 insertions, 0 deletions
diff --git a/src/utilities/cameragui/cameraiconitem.cpp b/src/utilities/cameragui/cameraiconitem.cpp new file mode 100644 index 00000000..c68f7855 --- /dev/null +++ b/src/utilities/cameragui/cameraiconitem.cpp @@ -0,0 +1,302 @@ +/* ============================================================ + * + * This file is a part of digiKam project + * http://www.digikam.org + * + * Date : 2004-09-21 + * Description : camera icon view item + * + * Copyright (C) 2004-2005 by Renchi Raju <[email protected]> + * Copyright (C) 2006-2009 by Gilles Caulier <caulier dot gilles at gmail dot com> + * + * This program is free software; you can redistribute it + * and/or modify it under the terms of the GNU General + * Public License as published by the Free Software Foundation; + * either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * ============================================================ */ + +// TQt includes. + +#include <tqpainter.h> +#include <tqpixmap.h> + +// KDE includes. + +#include <kiconloader.h> + +// Local includes. + +#include "iconview.h" +#include "thumbnailsize.h" +#include "albumiconitem.h" +#include "gpiteminfo.h" +#include "themeengine.h" +#include "cameraiconview.h" +#include "cameraiconitem.h" + +namespace Digikam +{ + +class CameraIconViewItemPriv +{ + +public: + + CameraIconViewItemPriv() + { + itemInfo = 0; + } + + TQString downloadName; + + TQPixmap pixmap; + TQPixmap thumbnail; + + TQRect pixRect; + TQRect textRect; + TQRect extraRect; + + GPItemInfo *itemInfo; +}; + +CameraIconViewItem::CameraIconViewItem(IconGroupItem* parent, const GPItemInfo& itemInfo, + const TQImage& thumbnail, const TQString& downloadName) + : IconItem(parent) +{ + d = new CameraIconViewItemPriv; + d->itemInfo = new GPItemInfo(itemInfo); + d->downloadName = downloadName; + setThumbnail(thumbnail); +} + +CameraIconViewItem::~CameraIconViewItem() +{ + delete d->itemInfo; + delete d; +} + +void CameraIconViewItem::setThumbnail(const TQImage& thumbnail) +{ + d->thumbnail = TQPixmap(thumbnail); +} + +GPItemInfo* CameraIconViewItem::itemInfo() const +{ + return d->itemInfo; +} + +void CameraIconViewItem::paintItem() +{ + CameraIconView* view = (CameraIconView*)iconView(); + TQFont fn(view->font()); + + TQPixmap pix; + TQRect r(rect()); + + if (isSelected()) + pix = *(view->itemBaseSelPixmap()); + else + pix = *(view->itemBaseRegPixmap()); + + ThemeEngine* te = ThemeEngine::instance(); + + TQPainter p(&pix); + + TQString itemName = AlbumIconItem::squeezedText(&p, r.width()-5, d->itemInfo->name); + TQString downloadName = AlbumIconItem::squeezedText(&p, r.width()-5, d->downloadName); + calcRect(itemName, downloadName); + + p.setPen(isSelected() ? te->textSelColor() : te->textRegColor()); + + p.drawPixmap(d->pixRect.x() + (d->pixRect.width() - d->pixmap.width()) /2, + d->pixRect.y() + (d->pixRect.height() - d->pixmap.height()) /2, + d->pixmap); + + p.drawText(d->textRect, TQt::AlignHCenter|TQt::AlignTop, itemName); + + if (!d->downloadName.isEmpty()) + { + if (fn.pointSize() > 0) + fn.setPointSize(TQMAX(fn.pointSize()-2, 6)); + + p.setFont(fn); + p.setPen(isSelected() ? te->textSpecialSelColor() : te->textSpecialRegColor()); + p.drawText(d->extraRect, TQt::AlignHCenter|TQt::AlignTop, downloadName); + } + + if (this == iconView()->currentItem()) + { + p.setPen(TQPen(isSelected() ? TQt::white : TQt::black, 1, TQt::DotLine)); + p.drawRect(0, 0, r.width(), r.height()); + } + + // Draw download status icon. + TQPixmap downloaded; + + switch (d->itemInfo->downloaded) + { + case GPItemInfo::NewPicture: + { + downloaded = TQPixmap(view->newPicturePixmap()); + break; + } + case GPItemInfo::DownloadedYes: + { + downloaded = SmallIcon( "button_ok" ); + break; + } + case GPItemInfo::DownloadStarted: + { + downloaded = SmallIcon( "system-run" ); + break; + } + case GPItemInfo::DownloadFailed: + { + downloaded = SmallIcon( "button_cancel" ); + break; + } + /* TODO: see B.K.O #107316 : disable temporally the unknow download status until + a new method to identify the already downloaded pictures from camera is + implemented. + + case GPItemInfo::DownloadUnknow: + { + downloaded = view->unknowPicturePixmap(); + break; + } + */ + } + + if (!downloaded.isNull()) + p.drawPixmap(rect().width() - downloaded.width() - 5, 5, downloaded); + + // If camera item is locked (read only), draw a "Lock" icon. + if (d->itemInfo->writePermissions == 0) + p.drawPixmap(5, 5, SmallIcon( "encrypted" )); + + p.end(); + + r = TQRect(view->contentsToViewport(TQPoint(r.x(), r.y())), + TQSize(r.width(), r.height())); + + bitBlt(view->viewport(), r.x(), r.y(), &pix); +} + +void CameraIconViewItem::setDownloadName(const TQString& downloadName) +{ + d->downloadName = downloadName; + repaint(); +} + +TQString CameraIconViewItem::getDownloadName() const +{ + return d->downloadName; +} + +void CameraIconViewItem::setDownloaded(int status) +{ + d->itemInfo->downloaded = status; + repaint(); +} + +bool CameraIconViewItem::isDownloaded() const +{ + return (d->itemInfo->downloaded == GPItemInfo::DownloadedYes); +} + +void CameraIconViewItem::toggleLock() +{ + if (d->itemInfo->writePermissions == 0) + d->itemInfo->writePermissions = 1; + else + d->itemInfo->writePermissions = 0; + + repaint(); +} + +void CameraIconViewItem::calcRect(const TQString& itemName, const TQString& downloadName) +{ + CameraIconView* view = (CameraIconView*)iconView(); + int thumbSize = view->thumbnailSize().size(); + d->pixmap = TQPixmap(d->thumbnail.convertToImage().smoothScale(thumbSize, thumbSize, TQImage::ScaleMin)); + d->pixRect = TQRect(0,0,0,0); + d->textRect = TQRect(0,0,0,0); + d->extraRect = TQRect(0,0,0,0); + TQRect itemRect = rect(); + itemRect.moveTopLeft(TQPoint(0, 0)); + + d->pixRect.setWidth(thumbSize); + d->pixRect.setHeight(thumbSize); + + TQFontMetrics fm(iconView()->font()); + TQRect r = TQRect(fm.boundingRect(0, 0, thumbSize, 0xFFFFFFFF, + TQt::AlignHCenter | TQt::AlignTop, + itemName)); + d->textRect.setWidth(r.width()); + d->textRect.setHeight(r.height()); + + if (!d->downloadName.isEmpty()) + { + TQFont fn(iconView()->font()); + if (fn.pointSize() > 0) + { + fn.setPointSize(TQMAX(fn.pointSize()-2, 6)); + } + + fm = TQFontMetrics(fn); + r = TQRect(fm.boundingRect(0, 0, thumbSize, 0xFFFFFFFF, + TQt::AlignHCenter | TQt::WordBreak, + downloadName)); + d->extraRect.setWidth(r.width()); + d->extraRect.setHeight(r.height()); + + d->textRect.setWidth(TQMAX(d->textRect.width(), d->extraRect.width())); + d->textRect.setHeight(d->textRect.height() + d->extraRect.height()); + } + + int w = TQMAX(d->textRect.width(), d->pixRect.width() ); + int h = d->textRect.height() + d->pixRect.height() ; + + itemRect.setWidth(w+4); + itemRect.setHeight(h+4); + + // Center the pix and text rect + d->pixRect = TQRect(2, 2, d->pixRect.width(), d->pixRect.height()); + d->textRect = TQRect((itemRect.width() - d->textRect.width())/2, + itemRect.height() - d->textRect.height(), + d->textRect.width(), d->textRect.height()); + + if (!d->extraRect.isEmpty()) + { + d->extraRect = TQRect((itemRect.width() - d->extraRect.width())/2, + itemRect.height() - d->extraRect.height(), + d->extraRect.width(), d->extraRect.height()); + } +} + +TQRect CameraIconViewItem::clickToOpenRect() +{ + TQRect r(rect()); + + if (d->pixmap.isNull()) + { + TQRect pixRect(d->pixRect); + pixRect.moveBy(r.x(), r.y()); + return pixRect; + } + + TQRect pixRect(d->pixRect.x() + (d->pixRect.width() - d->pixmap.width())/2, + d->pixRect.y() + (d->pixRect.height() - d->pixmap.height())/2, + d->pixmap.width(), d->pixmap.height()); + pixRect.moveBy(r.x(), r.y()); + return pixRect; +} + +} // namespace Digikam |