diff --git a/ui/utils/message.cpp b/ui/utils/message.cpp index d3d9f77..ecb54f8 100644 --- a/ui/utils/message.cpp +++ b/ui/utils/message.cpp @@ -255,5 +255,9 @@ const Shared::Message & Message::getMessage() const void Message::setAvatarPath(const QString& p_path) { - avatar->setPath(p_path); + if (p_path.size() == 0) { + avatar->setPath(Shared::iconPath("user", true)); + } else { + avatar->setPath(p_path); + } } diff --git a/ui/utils/messageline.cpp b/ui/utils/messageline.cpp index e7d190d..d692308 100644 --- a/ui/utils/messageline.cpp +++ b/ui/utils/messageline.cpp @@ -27,6 +27,7 @@ MessageLine::MessageLine(bool p_room, QWidget* parent): myMessages(), palMessages(), uploadPaths(), + palAvatars(), layout(new QVBoxLayout(this)), myName(), myAvatarPath(), @@ -88,6 +89,12 @@ MessageLine::Position MessageLine::message(const Shared::Message& msg, bool forc } else { sender = jid; } + + std::map::iterator aItr = palAvatars.find(jid); + if (aItr != palAvatars.end()) { + aPath = aItr->second; + } + outgoing = false; } } @@ -185,6 +192,38 @@ void MessageLine::setPalName(const QString& jid, const QString& name) } } +void MessageLine::setPalAvatar(const QString& jid, const QString& path) +{ + std::map::iterator itr = palAvatars.find(jid); + if (itr == palAvatars.end()) { + palAvatars.insert(std::make_pair(jid, path)); + } else { + itr->second = path; + } + + std::map::iterator pItr = palMessages.find(jid); + if (pItr != palMessages.end()) { + for (Index::const_iterator itr = pItr->second.begin(), end = pItr->second.end(); itr != end; ++itr) { + itr->second->setAvatarPath(path); + } + } +} + +void MessageLine::dropPalAvatar(const QString& jid) +{ + std::map::iterator itr = palAvatars.find(jid); + if (itr != palNames.end()) { + palNames.erase(itr); + + std::map::iterator pItr = palMessages.find(jid); + if (pItr != palMessages.end()) { + for (Index::const_iterator itr = pItr->second.begin(), end = pItr->second.end(); itr != end; ++itr) { + itr->second->setAvatarPath(""); + } + } + } +} + void MessageLine::resizeEvent(QResizeEvent* event) { QWidget::resizeEvent(event); diff --git a/ui/utils/messageline.h b/ui/utils/messageline.h index 4ef226c..707ff39 100644 --- a/ui/utils/messageline.h +++ b/ui/utils/messageline.h @@ -55,6 +55,8 @@ public: void appendMessageWithUpload(const Shared::Message& msg, const QString& path); void removeMessage(const QString& messageId); void setMyAvatarPath(const QString& p_path); + void setPalAvatar(const QString& jid, const QString& path); + void dropPalAvatar(const QString& jid); signals: void resize(int amount); @@ -85,6 +87,7 @@ private: Index myMessages; std::map palMessages; std::map uploadPaths; + std::map palAvatars; QVBoxLayout* layout; QString myName; diff --git a/ui/widgets/chat.cpp b/ui/widgets/chat.cpp index 43a4144..b8f49ba 100644 --- a/ui/widgets/chat.cpp +++ b/ui/widgets/chat.cpp @@ -25,6 +25,7 @@ Chat::Chat(Models::Account* acc, Models::Contact* p_contact, QWidget* parent): setName(p_contact->getContactName()); updateState(); setStatus(p_contact->getStatus()); + setAvatar(p_contact->getAvatarPath()); connect(contact, &Models::Contact::childChanged, this, &Chat::onContactChanged); } @@ -46,6 +47,9 @@ void Chat::onContactChanged(Models::Item* item, int row, int col) case 5: setStatus(contact->getStatus()); break; + case 7: + setAvatar(contact->getAvatarPath()); + break; } } } @@ -89,3 +93,13 @@ void Chat::setName(const QString& name) line->setPalName(getJid(), name); } +void Chat::setAvatar(const QString& path) +{ + Conversation::setAvatar(path); + + if (path.size() == 0) { + line->dropPalAvatar(contact->getJid()); + } else { + line->setPalAvatar(contact->getJid(), path); + } +} diff --git a/ui/widgets/chat.h b/ui/widgets/chat.h index d36cbbf..5c0eb63 100644 --- a/ui/widgets/chat.h +++ b/ui/widgets/chat.h @@ -34,6 +34,7 @@ public: ~Chat(); void addMessage(const Shared::Message & data) override; + void setAvatar(const QString& path) override; protected slots: void onContactChanged(Models::Item* item, int row, int col); diff --git a/ui/widgets/conversation.cpp b/ui/widgets/conversation.cpp index 52e4b4c..89a2a7f 100644 --- a/ui/widgets/conversation.cpp +++ b/ui/widgets/conversation.cpp @@ -384,6 +384,11 @@ void Conversation::onClearButton() m_ui->messageEditor->clear(); } +void Conversation::setAvatar(const QString& path) +{ + m_ui->avatar->setPixmap(path.size() == 0 ? Shared::iconPath("user", true) : path); +} + void Conversation::onAttachResize(const QSize& oldSize, const QSize& newSize) { int oh = oldSize.height(); @@ -419,4 +424,3 @@ VisibilityCatcher::VisibilityCatcher(QWidget* parent): QObject(parent) { } - diff --git a/ui/widgets/conversation.h b/ui/widgets/conversation.h index 594801a..5e68965 100644 --- a/ui/widgets/conversation.h +++ b/ui/widgets/conversation.h @@ -78,6 +78,7 @@ public: void responseLocalFile(const QString& messageId, const QString& path); void fileError(const QString& messageId, const QString& error); void responseFileProgress(const QString& messageId, qreal progress); + virtual void setAvatar(const QString& path); signals: void sendMessage(const Shared::Message& message); diff --git a/ui/widgets/conversation.ui b/ui/widgets/conversation.ui index 0eb7ae8..acdc80b 100644 --- a/ui/widgets/conversation.ui +++ b/ui/widgets/conversation.ui @@ -71,6 +71,12 @@ + + + 16777215 + 100 + + true @@ -92,6 +98,9 @@ + + true + @@ -140,9 +149,18 @@ + + + 60 + 60 + + + + true + diff --git a/ui/widgets/room.cpp b/ui/widgets/room.cpp index 0e0ecc6..49c422c 100644 --- a/ui/widgets/room.cpp +++ b/ui/widgets/room.cpp @@ -25,6 +25,7 @@ Room::Room(Models::Account* acc, Models::Room* p_room, QWidget* parent): setName(p_room->getName()); line->setMyName(room->getNick()); setStatus(room->getSubject()); + setAvatar(room->getAvatarPath()); connect(room, &Models::Room::childChanged, this, &Room::onRoomChanged); }