From d4d73da80c57e4b9ae9e5f21235198734f02d708 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Blin?= <sebastien.blin@savoirfairelinux.com> Date: Wed, 22 Sep 2021 11:32:46 -0400 Subject: [PATCH] utils: improve conversationAvatar for swarm Change-Id: I59383870785900a8413bc15377d6de427f48384b --- src/utils.cpp | 34 ++++++++++++++++++++++++++++++++-- src/utils.h | 1 + 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/utils.cpp b/src/utils.cpp index 68a313974..31c4e75d9 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -396,10 +396,23 @@ Utils::conversationAvatar(LRCInstance* instance, auto& accInfo = instance->accountModel().getAccountInfo( accountId.isEmpty() ? instance->get_currentAccountId() : accountId); auto* convModel = accInfo.conversationModel.get(); - Q_FOREACH (const auto peerUri, convModel->peersForConversation(convId)) { - auto peerAvatar = Utils::contactPhoto(instance, peerUri, size); + auto members = convModel->peersForConversation(convId); + if (members.size() < 1) + return avatar; + if (members.size() == 1) { + // Only member in the swarm or 1:1, draw only peer's avatar + auto peerAvatar = Utils::contactPhoto(instance, members[0], size); painter.drawImage(avatar.rect(), peerAvatar); + return avatar; } + // Else, combine avatars + auto idx = 0; + auto peerAAvatar = Utils::contactPhoto(instance, members[0], size); + auto peerBAvatar = Utils::contactPhoto(instance, members[1], size); + peerAAvatar = Utils::halfCrop(peerAAvatar, true); + peerBAvatar = Utils::halfCrop(peerBAvatar, false); + painter.drawImage(avatar.rect(), peerAAvatar); + painter.drawImage(avatar.rect(), peerBAvatar); } catch (const std::exception& e) { qDebug() << Q_FUNC_INFO << e.what(); } @@ -453,6 +466,23 @@ Utils::getCirclePhoto(const QImage original, int sizePhoto) return target; } +QImage +Utils::halfCrop(const QImage original, bool leftSide) +{ + auto width = original.size().width(); + auto height = original.size().height(); + QImage target(width, height, QImage::Format_ARGB32_Premultiplied); + target.fill(Qt::transparent); + + QPainter painter(&target); + painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); + painter.setBrush(QBrush(Qt::white)); + painter.drawRect(leftSide ? 0 : width / 2 + 2, 0, width / 2 - (leftSide ? 2 : 0), height); + painter.setCompositionMode(QPainter::CompositionMode_SourceIn); + painter.drawImage(0, 0, original, 0, 0); + return target; +} + QSize Utils::getRealSize(QScreen* screen) { diff --git a/src/utils.h b/src/utils.h index af20999e6..1b4f9ae04 100644 --- a/src/utils.h +++ b/src/utils.h @@ -95,6 +95,7 @@ QImage conversationAvatar(LRCInstance* instance, const QSize& size = defaultAvatarSize, const QString& accountId = {}); QImage getCirclePhoto(const QImage original, int sizePhoto); +QImage halfCrop(const QImage original, bool leftSide); QColor getAvatarColor(const QString& canonicalUri); QImage fallbackAvatar(const QString& canonicalUriStr, const QString& letterStr = {}, -- GitLab