You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
digikam/digikam/utilities/cameragui/cameraiconitem.cpp

303 lines
8.4 KiB

/* ============================================================
*
* 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 <renchi@pooh.tam.uiuc.edu>
* 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