invite list: fixes fallback avatars
- adds fallback avatars for invites
- uses fallback avatar image file for contacts and invites with
only ringIds
Change-Id: Ia7b702b17533a7aeccb777b3d851420327392b63
Reviewed-by: Kateryna Kostiuk <kateryna.kostiuk@savoirfairelinux.com>
diff --git a/src/delegates/ImageManipulationDelegate.h b/src/delegates/ImageManipulationDelegate.h
index 59acf1e..ebc1a0d 100644
--- a/src/delegates/ImageManipulationDelegate.h
+++ b/src/delegates/ImageManipulationDelegate.h
@@ -67,6 +67,7 @@
private:
//Helper
QPixmap drawDefaultUserPixmap(const QSize& size, const char color, const char letter);
+ QPixmap drawDefaultUserPixmapUriOnly(const QSize& size, const char color);
CGImageRef resizeCGImage(CGImageRef image, const QSize& size);
QHash<QString, QPixmap> m_hDefaultUserPixmap;
diff --git a/src/delegates/ImageManipulationDelegate.mm b/src/delegates/ImageManipulationDelegate.mm
index c251015..f2014b6 100644
--- a/src/delegates/ImageManipulationDelegate.mm
+++ b/src/delegates/ImageManipulationDelegate.mm
@@ -204,12 +204,15 @@
char letterForDefaultUserPixmap(const lrc::api::contact::Info& contact)
{
- if (!contact.profileInfo.alias.empty())
+ if (!contact.profileInfo.alias.empty()) {
return std::toupper(contact.profileInfo.alias.at(0));
- else if(contact.profileInfo.type == lrc::api::profile::Type::RING && !contact.registeredName.empty())
+ } else if((contact.profileInfo.type == lrc::api::profile::Type::RING ||
+ contact.profileInfo.type == lrc::api::profile::Type::PENDING) &&
+ !contact.registeredName.empty()) {
return std::toupper(contact.registeredName.at(0));
- else
+ } else {
return std::toupper(contact.profileInfo.uri.at(0));
+ }
}
QVariant ImageManipulationDelegate::conversationPhoto(const lrc::api::conversation::Info& conversation,
@@ -274,8 +277,16 @@
return pxm;
} else {
char color = contact.profileInfo.uri.at(0);
- char letter = letterForDefaultUserPixmap(contact);
- return drawDefaultUserPixmap(size, color, letter);
+
+ if (!contact.profileInfo.alias.empty()) {
+ return drawDefaultUserPixmap(size, color, std::toupper(contact.profileInfo.alias.at(0)));
+ } else if((contact.profileInfo.type == lrc::api::profile::Type::RING ||
+ contact.profileInfo.type == lrc::api::profile::Type::PENDING) &&
+ !contact.registeredName.empty()) {
+ return drawDefaultUserPixmap(size, color, std::toupper(contact.registeredName.at(0)));
+ } else {
+ return drawDefaultUserPixmapUriOnly(size, color);
+ }
}
} catch (const std::out_of_range& e) {
return drawDefaultUserPixmap(size, '?', '?');
@@ -322,6 +333,36 @@
return avatar;
}
+ QPixmap ImageManipulationDelegate::drawDefaultUserPixmapUriOnly(const QSize& size, const char color) {
+ // We start with a transparent avatar
+ QPixmap avatar(size);
+ avatar.fill(Qt::transparent);
+
+ // We pick a color based on the passed character
+ QColor avColor = ImageManipulationDelegate::avatarColors_[color % 16];
+
+ // We draw a circle with this color
+ QPainter painter(&avatar);
+ painter.setRenderHints(QPainter::Antialiasing|QPainter::SmoothPixmapTransform);
+ painter.setPen(Qt::transparent);
+ painter.setBrush(avColor);
+ painter.drawEllipse(avatar.rect());
+
+ // Then we paint the avatar in the circle
+ QRect textRect = avatar.rect();
+ QImage defaultAvatarImage;
+ QRect rect = QRect(0, 0, size.width(), size.height());
+ NSURL *bundleURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]];
+ NSString *imagePath = [bundleURL.absoluteString stringByAppendingString:@"Contents/Resources/default_avatar_overlay.png"];
+ if (defaultAvatarImage.load(QString::fromNSString(imagePath).mid(7))) {
+ painter.drawImage(avatar.rect(), defaultAvatarImage);
+ } else {
+ painter.drawText(avatar.rect(), QString('?'), QTextOption(Qt::AlignCenter));
+ }
+
+ return avatar;
+ }
+
CGImageRef ImageManipulationDelegate::resizeCGImage(CGImageRef image, const QSize& size) {
// create context, keeping original image properties
CGContextRef context = CGBitmapContextCreate(NULL, size.width(), size.height(),