diff --git a/src/utils.cpp b/src/utils.cpp index 68a313974856555fad0782a30d89fdd5953195cf..31c4e75d9c66efd7617438f869c6104770116b95 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 af20999e615debea21f7ad80b426821d2ead201f..1b4f9ae047c61e85a45f5e80b1dc8c904c08a451 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 = {},