blob: 0f774adc098f51cd48d7a9888cf3b2a886faf8ed [file] [log] [blame]
Edric Milareta0ebd062016-01-13 12:18:23 -05001/***************************************************************************
Anthony Léonard2fde81d2017-04-17 10:06:55 -04002 * Copyright (C) 2015-2017 by Savoir-faire Linux *
Edric Milareta0ebd062016-01-13 12:18:23 -05003 * Author: Edric Ladent Milaret <edric.ladent-milaret@savoirfairelinux.com>*
Olivier SOLDANO47aa97f2017-04-04 10:40:00 -04004 * Author: Anthony Léonard <anthony.leonard@savoirfairelinux.com> *
5 * Author: Olivier Soldano <olivier.soldano@savoirfairelinux.com> *
Edric Milareta0ebd062016-01-13 12:18:23 -05006 * *
7 * This program is free software; you can redistribute it and/or modify *
8 * it under the terms of the GNU General Public License as published by *
9 * the Free Software Foundation; either version 3 of the License, or *
10 * (at your option) any later version. *
11 * *
12 * This program is distributed in the hope that it will be useful, *
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15 * GNU General Public License for more details. *
16 * *
17 * You should have received a copy of the GNU General Public License *
18 * along with this program. If not, see <http://www.gnu.org/licenses/>. *
19 **************************************************************************/
20
21#include "pixbufmanipulator.h"
22
Edric Milaret25236d92016-03-28 09:40:58 -040023#include <QSize>
24#include <QMetaType>
25#include <QImage>
26#include <QIODevice>
27#include <QByteArray>
28#include <QBuffer>
Edric Milareta0ebd062016-01-13 12:18:23 -050029
Edric Milaret25236d92016-03-28 09:40:58 -040030#include "person.h"
31#include "call.h"
32#include "contactmethod.h"
33#include "profilemodel.h"
34#include "profile.h"
35
36#include "utils.h"
37
38#undef interface
39
40/*Namespace Interfaces collide with QBuffer*/
41QByteArray QImageToByteArray(QImage image)
42{
43 QByteArray ba;
44 QBuffer buffer(&ba);
45 buffer.open(QIODevice::WriteOnly);
46 image.save(&buffer, "PNG");
47 return ba;
48}
Edric Milareta0ebd062016-01-13 12:18:23 -050049
50namespace Interfaces {
51
52PixbufManipulator::PixbufManipulator()
Edric Milareta13b48c2016-01-18 14:42:35 -050053 : fallbackAvatar_(QImage(":/images/user/btn-default-userpic.svg"))
Edric Milareta0ebd062016-01-13 12:18:23 -050054{}
55
56QImage
57PixbufManipulator::scaleAndFrame(const QImage photo, const QSize& size)
58{
59 return photo.scaled(size, Qt::KeepAspectRatio, Qt::SmoothTransformation);
60}
61
62QVariant
63PixbufManipulator::callPhoto(Call* c, const QSize& size, bool displayPresence)
64{
Olivier SOLDANOad0fabb2016-11-25 09:08:01 -050065 if (!c || c->type() == Call::Type::CONFERENCE){
Edric Milareta0ebd062016-01-13 12:18:23 -050066 return QVariant::fromValue(scaleAndFrame(fallbackAvatar_, size));
Olivier SOLDANOad0fabb2016-11-25 09:08:01 -050067 }
Edric Milareta0ebd062016-01-13 12:18:23 -050068 return callPhoto(c->peerContactMethod(), size, displayPresence);
69}
70
71QVariant
72PixbufManipulator::callPhoto(const ContactMethod* n, const QSize& size, bool displayPresence)
73{
74 if (n && n->contact()) {
75 return contactPhoto(n->contact(), size, displayPresence);
76 } else {
77 return QVariant::fromValue(scaleAndFrame(fallbackAvatar_, size));
78 }
79}
80
81QVariant
82PixbufManipulator::contactPhoto(Person* c, const QSize& size, bool displayPresence)
83{
84 Q_UNUSED(displayPresence);
85
86 /**
87 * try to get the photo
88 * otherwise use the fallback avatar
89 */
90
91 QImage photo;
92
Olivier SOLDANOad0fabb2016-11-25 09:08:01 -050093 if (c->photo().isValid()){
Edric Milareta0ebd062016-01-13 12:18:23 -050094 photo = c->photo().value<QImage>();
Olivier SOLDANOad0fabb2016-11-25 09:08:01 -050095 } else {
Edric Milareta0ebd062016-01-13 12:18:23 -050096 photo = fallbackAvatar_;
Olivier SOLDANOad0fabb2016-11-25 09:08:01 -050097 }
Edric Milareta0ebd062016-01-13 12:18:23 -050098 return QVariant::fromValue(scaleAndFrame(photo, size));
99}
100
101QVariant PixbufManipulator::personPhoto(const QByteArray& data, const QString& type)
102{
Edric Milaret25236d92016-03-28 09:40:58 -0400103 QImage avatar;
104 QByteArray ba = type.toLatin1();
105 const char* c_str2 = ba.data();
106 if (avatar.loadFromData(data.fromBase64(data), c_str2))
107 return Utils::getCirclePhoto(avatar, avatar.size().width());
108 return fallbackAvatar_;
Edric Milareta0ebd062016-01-13 12:18:23 -0500109}
110
111QVariant
112PixbufManipulator::numberCategoryIcon(const QVariant& p, const QSize& size, bool displayPresence, bool isPresent)
113{
114 Q_UNUSED(p)
115 Q_UNUSED(size)
116 Q_UNUSED(displayPresence)
117 Q_UNUSED(isPresent)
118 return QVariant();
119}
120
121QVariant
122PixbufManipulator::securityIssueIcon(const QModelIndex& index)
123{
124 Q_UNUSED(index)
125 return QVariant();
126}
127
Edric Milaret25236d92016-03-28 09:40:58 -0400128
129
Edric Milareta0ebd062016-01-13 12:18:23 -0500130QByteArray
131PixbufManipulator::toByteArray(const QVariant& pxm)
132{
Edric Milaret25236d92016-03-28 09:40:58 -0400133 auto image = pxm.value<QImage>();
134 QByteArray ba = QImageToByteArray(image);
135 return ba;
Edric Milareta0ebd062016-01-13 12:18:23 -0500136}
137
138QVariant
139PixbufManipulator::collectionIcon(const CollectionInterface* interface, PixmapManipulatorI::CollectionIconHint hint) const
140{
141 Q_UNUSED(interface)
142 Q_UNUSED(hint)
143 return QVariant();
144}
145QVariant
146PixbufManipulator::securityLevelIcon(const SecurityEvaluationModel::SecurityLevel level) const
147{
148 Q_UNUSED(level)
149 return QVariant();
150}
151QVariant
152PixbufManipulator::historySortingCategoryIcon(const CategorizedHistoryModel::SortedProxy::Categories cat) const
153{
154 Q_UNUSED(cat)
155 return QVariant();
156}
157QVariant
158PixbufManipulator::contactSortingCategoryIcon(const CategorizedContactModel::SortedProxy::Categories cat) const
159{
160 Q_UNUSED(cat)
161 return QVariant();
162}
163QVariant
164PixbufManipulator::userActionIcon(const UserActionElement& state) const
165{
166 Q_UNUSED(state)
167 return QVariant();
168}
169
170QVariant PixbufManipulator::decorationRole(const QModelIndex& index)
171{
172 Q_UNUSED(index)
173 return QVariant();
174}
175
176QVariant PixbufManipulator::decorationRole(const Call* c)
177{
Edric Milareta13b48c2016-01-18 14:42:35 -0500178 QImage photo;
Edric Milareta0ebd062016-01-13 12:18:23 -0500179 if (c && c->peerContactMethod()
180 && c->peerContactMethod()->contact()
181 && c->peerContactMethod()->contact()->photo().isValid()) {
Edric Milareta13b48c2016-01-18 14:42:35 -0500182 photo = c->peerContactMethod()->contact()->photo().value<QImage>();
Edric Milareta0ebd062016-01-13 12:18:23 -0500183 }
Edric Milareta13b48c2016-01-18 14:42:35 -0500184 else
185 photo = fallbackAvatar_;
186 return QVariant::fromValue(scaleAndFrame(photo, imgSize_));
Edric Milareta0ebd062016-01-13 12:18:23 -0500187}
188
189QVariant PixbufManipulator::decorationRole(const ContactMethod* cm)
190{
Edric Milareta13b48c2016-01-18 14:42:35 -0500191 QImage photo;
Edric Milareta0ebd062016-01-13 12:18:23 -0500192 if (cm && cm->contact() && cm->contact()->photo().isValid())
Edric Milareta13b48c2016-01-18 14:42:35 -0500193 photo = cm->contact()->photo().value<QImage>();
194 else
195 photo = fallbackAvatar_;
196 return QVariant::fromValue(scaleAndFrame(photo, imgSize_));
Edric Milareta0ebd062016-01-13 12:18:23 -0500197}
198
199QVariant PixbufManipulator::decorationRole(const Person* p)
200{
Edric Milareta13b48c2016-01-18 14:42:35 -0500201 QImage photo;
Edric Milareta0ebd062016-01-13 12:18:23 -0500202 if (p && p->photo().isValid())
Edric Milareta13b48c2016-01-18 14:42:35 -0500203 photo = p->photo().value<QImage>();
204 else
205 photo = fallbackAvatar_;
206 return QVariant::fromValue(scaleAndFrame(photo, imgSize_));
Edric Milareta0ebd062016-01-13 12:18:23 -0500207}
208
Edric Milareta7cf8652016-04-19 15:37:51 -0400209QVariant PixbufManipulator::decorationRole(const Account* acc)
210{
211 Q_UNUSED(acc)
Edric Milaret25236d92016-03-28 09:40:58 -0400212 return Utils::getCirclePhoto(ProfileModel::instance().
213 selectedProfile()->person()->photo().value<QImage>(),
214 imgSize_.width());
Edric Milareta7cf8652016-04-19 15:37:51 -0400215}
216
Edric Milareta0ebd062016-01-13 12:18:23 -0500217} // namespace Interfaces