/*
* %kadu copyright begin%
* Copyright 2012 Wojciech Treter (juzefwt@gmail.com)
* Copyright 2012, 2014 Bartosz Brachaczek (b.brachaczek@gmail.com)
* Copyright 2011, 2013, 2014 Rafał Przemysław Malinowski (rafal.przemyslaw.malinowski@gmail.com)
* %kadu copyright end%
* Copyright 2010 Dariusz Markowicz
*
* 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 of
* the License, 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.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#include
#include
#include
#include
#include
#include
#include "contacts/contact.h"
#include "gui/widgets/talkable-delegate-configuration.h"
#include "model/roles.h"
#include "avatar-painter.h"
AvatarPainter::AvatarPainter(TalkableDelegateConfiguration *configuration, const QStyleOptionViewItemV4 &option, const QRect &avatarRect, const QModelIndex &index) :
Configuration(configuration), Option(option), AvatarRect(avatarRect), Index(index)
{
Avatar = Index.data(AvatarRole).value();
}
bool AvatarPainter::greyOut()
{
if (!Configuration->avatarGreyOut())
return false;
Contact contact = Index.data(ContactRole).value();
return contact.currentStatus().isDisconnected();
}
QString AvatarPainter::cacheKey()
{
return QString("msi-%1-%2,%3,%4")
.arg(Avatar.cacheKey())
.arg(greyOut())
.arg(Configuration->avatarBorder())
.arg(Option.state & QStyle::State_Selected ? 1 : 0);
}
QPixmap AvatarPainter::getOrCreateCacheItem()
{
QString key = cacheKey();
QPixmap cached;
if (QPixmapCache::find(key, &cached))
return cached;
QPixmap item = QPixmap(AvatarRect.size());
item.fill(QColor(0, 0, 0, 0));
QPainter cachePainter;
cachePainter.begin(&item);
doPaint(&cachePainter, item.size());
cachePainter.end();
QPixmapCache::insert(key, item);
return item;
}
void AvatarPainter::paintFromCache(QPainter *painter)
{
QPixmap cached = getOrCreateCacheItem();
painter->drawPixmap(AvatarRect, cached);
}
QPixmap AvatarPainter::cropped()
{
int minDimension = Avatar.height() < Avatar.width()
? Avatar.height()
: Avatar.width();
int x = (Avatar.width() - minDimension) / 2;
int y = (Avatar.height() - minDimension) / 2;
QImage cropped = Avatar.toImage().copy(x, y, minDimension, minDimension);
return QPixmap::fromImage(cropped);
}
void AvatarPainter::doPaint(QPainter *painter, const QSize &size)
{
QPixmap displayAvatar;
QPixmap croppedAvatar = cropped();
if (croppedAvatar.height() > size.height() || croppedAvatar.width() > size.width())
displayAvatar = croppedAvatar.scaled(size, Qt::KeepAspectRatio, Qt::SmoothTransformation);
else
displayAvatar = croppedAvatar;
QRect displayRect = displayAvatar.rect();
displayRect.moveTop((size.height() - displayRect.height()) / 2);
displayRect.moveLeft((size.width() - displayRect.width()) / 2);
// grey out offline contacts' avatar
displayAvatar = greyOut()
? QIcon(displayAvatar).pixmap(displayAvatar.size(), QIcon::Disabled)
: displayAvatar;
int radius = 3;
QPainterPath displayRectPath;
displayRectPath.addRoundedRect(displayRect, radius, radius);
painter->setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
painter->setClipPath(displayRectPath);
painter->drawPixmap(displayRect, displayAvatar);
painter->setClipping(false);
// draw avatar border
if (Configuration->avatarBorder())
painter->drawRoundedRect(displayRect, radius, radius);
}
void AvatarPainter::paint(QPainter *painter)
{
if (!Configuration->showAvatars() || AvatarRect.isEmpty() || Avatar.isNull())
return;
paintFromCache(painter);
}