blob: 6bda006438ffa514b10fd250f47ad4ee2203be2b [file] [log] [blame]
Edric Milareta0ebd062016-01-13 12:18:23 -05001/***************************************************************************
2 * Copyright (C) 2016 by Savoir-faire Linux *
3 * Author: Edric Ladent Milaret <edric.ladent-milaret@savoirfairelinux.com>*
4 * *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 3 of the License, or *
8 * (at your option) any later version. *
9 * *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
14 * *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program. If not, see <http://www.gnu.org/licenses/>. *
17 **************************************************************************/
18
19#include "pixbufmanipulator.h"
20
Edric Milaret25236d92016-03-28 09:40:58 -040021#include <QSize>
22#include <QMetaType>
23#include <QImage>
24#include <QIODevice>
25#include <QByteArray>
26#include <QBuffer>
Edric Milareta0ebd062016-01-13 12:18:23 -050027
Edric Milaret25236d92016-03-28 09:40:58 -040028#include "person.h"
29#include "call.h"
30#include "contactmethod.h"
31#include "profilemodel.h"
32#include "profile.h"
33
34#include "utils.h"
35
36#undef interface
37
38/*Namespace Interfaces collide with QBuffer*/
39QByteArray QImageToByteArray(QImage image)
40{
41 QByteArray ba;
42 QBuffer buffer(&ba);
43 buffer.open(QIODevice::WriteOnly);
44 image.save(&buffer, "PNG");
45 return ba;
46}
Edric Milareta0ebd062016-01-13 12:18:23 -050047
48namespace Interfaces {
49
50PixbufManipulator::PixbufManipulator()
Edric Milareta13b48c2016-01-18 14:42:35 -050051 : fallbackAvatar_(QImage(":/images/user/btn-default-userpic.svg"))
Edric Milareta0ebd062016-01-13 12:18:23 -050052{}
53
54QImage
55PixbufManipulator::scaleAndFrame(const QImage photo, const QSize& size)
56{
57 return photo.scaled(size, Qt::KeepAspectRatio, Qt::SmoothTransformation);
58}
59
60QVariant
61PixbufManipulator::callPhoto(Call* c, const QSize& size, bool displayPresence)
62{
63 if (!c || c->type() == Call::Type::CONFERENCE)
64 return QVariant::fromValue(scaleAndFrame(fallbackAvatar_, size));
65 return callPhoto(c->peerContactMethod(), size, displayPresence);
66}
67
68QVariant
69PixbufManipulator::callPhoto(const ContactMethod* n, const QSize& size, bool displayPresence)
70{
71 if (n && n->contact()) {
72 return contactPhoto(n->contact(), size, displayPresence);
73 } else {
74 return QVariant::fromValue(scaleAndFrame(fallbackAvatar_, size));
75 }
76}
77
78QVariant
79PixbufManipulator::contactPhoto(Person* c, const QSize& size, bool displayPresence)
80{
81 Q_UNUSED(displayPresence);
82
83 /**
84 * try to get the photo
85 * otherwise use the fallback avatar
86 */
87
88 QImage photo;
89
90 if (c->photo().isValid())
91 photo = c->photo().value<QImage>();
92 else
93 photo = fallbackAvatar_;
94
95 return QVariant::fromValue(scaleAndFrame(photo, size));
96}
97
98QVariant PixbufManipulator::personPhoto(const QByteArray& data, const QString& type)
99{
Edric Milaret25236d92016-03-28 09:40:58 -0400100 QImage avatar;
101 QByteArray ba = type.toLatin1();
102 const char* c_str2 = ba.data();
103 if (avatar.loadFromData(data.fromBase64(data), c_str2))
104 return Utils::getCirclePhoto(avatar, avatar.size().width());
105 return fallbackAvatar_;
Edric Milareta0ebd062016-01-13 12:18:23 -0500106}
107
108QVariant
109PixbufManipulator::numberCategoryIcon(const QVariant& p, const QSize& size, bool displayPresence, bool isPresent)
110{
111 Q_UNUSED(p)
112 Q_UNUSED(size)
113 Q_UNUSED(displayPresence)
114 Q_UNUSED(isPresent)
115 return QVariant();
116}
117
118QVariant
119PixbufManipulator::securityIssueIcon(const QModelIndex& index)
120{
121 Q_UNUSED(index)
122 return QVariant();
123}
124
Edric Milaret25236d92016-03-28 09:40:58 -0400125
126
Edric Milareta0ebd062016-01-13 12:18:23 -0500127QByteArray
128PixbufManipulator::toByteArray(const QVariant& pxm)
129{
Edric Milaret25236d92016-03-28 09:40:58 -0400130 auto image = pxm.value<QImage>();
131 QByteArray ba = QImageToByteArray(image);
132 return ba;
Edric Milareta0ebd062016-01-13 12:18:23 -0500133}
134
135QVariant
136PixbufManipulator::collectionIcon(const CollectionInterface* interface, PixmapManipulatorI::CollectionIconHint hint) const
137{
138 Q_UNUSED(interface)
139 Q_UNUSED(hint)
140 return QVariant();
141}
142QVariant
143PixbufManipulator::securityLevelIcon(const SecurityEvaluationModel::SecurityLevel level) const
144{
145 Q_UNUSED(level)
146 return QVariant();
147}
148QVariant
149PixbufManipulator::historySortingCategoryIcon(const CategorizedHistoryModel::SortedProxy::Categories cat) const
150{
151 Q_UNUSED(cat)
152 return QVariant();
153}
154QVariant
155PixbufManipulator::contactSortingCategoryIcon(const CategorizedContactModel::SortedProxy::Categories cat) const
156{
157 Q_UNUSED(cat)
158 return QVariant();
159}
160QVariant
161PixbufManipulator::userActionIcon(const UserActionElement& state) const
162{
163 Q_UNUSED(state)
164 return QVariant();
165}
166
167QVariant PixbufManipulator::decorationRole(const QModelIndex& index)
168{
169 Q_UNUSED(index)
170 return QVariant();
171}
172
173QVariant PixbufManipulator::decorationRole(const Call* c)
174{
Edric Milareta13b48c2016-01-18 14:42:35 -0500175 QImage photo;
Edric Milareta0ebd062016-01-13 12:18:23 -0500176 if (c && c->peerContactMethod()
177 && c->peerContactMethod()->contact()
178 && c->peerContactMethod()->contact()->photo().isValid()) {
Edric Milareta13b48c2016-01-18 14:42:35 -0500179 photo = c->peerContactMethod()->contact()->photo().value<QImage>();
Edric Milareta0ebd062016-01-13 12:18:23 -0500180 }
Edric Milareta13b48c2016-01-18 14:42:35 -0500181 else
182 photo = fallbackAvatar_;
183 return QVariant::fromValue(scaleAndFrame(photo, imgSize_));
Edric Milareta0ebd062016-01-13 12:18:23 -0500184}
185
186QVariant PixbufManipulator::decorationRole(const ContactMethod* cm)
187{
Edric Milareta13b48c2016-01-18 14:42:35 -0500188 QImage photo;
Edric Milareta0ebd062016-01-13 12:18:23 -0500189 if (cm && cm->contact() && cm->contact()->photo().isValid())
Edric Milareta13b48c2016-01-18 14:42:35 -0500190 photo = cm->contact()->photo().value<QImage>();
191 else
192 photo = fallbackAvatar_;
193 return QVariant::fromValue(scaleAndFrame(photo, imgSize_));
Edric Milareta0ebd062016-01-13 12:18:23 -0500194}
195
196QVariant PixbufManipulator::decorationRole(const Person* p)
197{
Edric Milareta13b48c2016-01-18 14:42:35 -0500198 QImage photo;
Edric Milareta0ebd062016-01-13 12:18:23 -0500199 if (p && p->photo().isValid())
Edric Milareta13b48c2016-01-18 14:42:35 -0500200 photo = p->photo().value<QImage>();
201 else
202 photo = fallbackAvatar_;
203 return QVariant::fromValue(scaleAndFrame(photo, imgSize_));
Edric Milareta0ebd062016-01-13 12:18:23 -0500204}
205
Edric Milareta7cf8652016-04-19 15:37:51 -0400206QVariant PixbufManipulator::decorationRole(const Account* acc)
207{
208 Q_UNUSED(acc)
Edric Milaret25236d92016-03-28 09:40:58 -0400209 return Utils::getCirclePhoto(ProfileModel::instance().
210 selectedProfile()->person()->photo().value<QImage>(),
211 imgSize_.width());
Edric Milareta7cf8652016-04-19 15:37:51 -0400212}
213
Edric Milareta0ebd062016-01-13 12:18:23 -0500214} // namespace Interfaces