summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Swift/Controllers/Chat/ChatsManager.cpp19
-rw-r--r--Swift/Controllers/UIInterfaces/ChatListWindow.h11
2 files changed, 25 insertions, 5 deletions
diff --git a/Swift/Controllers/Chat/ChatsManager.cpp b/Swift/Controllers/Chat/ChatsManager.cpp
index a2abbad..0efbdfd 100644
--- a/Swift/Controllers/Chat/ChatsManager.cpp
+++ b/Swift/Controllers/Chat/ChatsManager.cpp
@@ -132,7 +132,9 @@ void ChatsManager::loadRecents() {
std::string activity(recent[1]);
bool isMUC = recent[2] == "true";
std::string nick(recent[3]);
- ChatListWindow::Chat chat(jid, nickResolver_->jidToNick(jid), activity, 0, isMUC, nick);
+ Presence::ref presence = presenceOracle_->getHighestPriorityPresence(jid.toBare());
+ StatusShow::Type type = presence ? presence->getShow() : StatusShow::None;
+ ChatListWindow::Chat chat(jid, nickResolver_->jidToNick(jid), activity, 0, type, isMUC, nick);
prependRecent(chat);
}
handleUnreadCountChanged(NULL);
@@ -177,7 +179,10 @@ ChatListWindow::Chat ChatsManager::createChatListChatItem(const JID& jid, const
if (controller) {
unreadCount = controller->getUnreadCount();
}
- return ChatListWindow::Chat(jid, nickResolver_->jidToNick(jid), activity, unreadCount, false);
+
+ Presence::ref presence = presenceOracle_->getHighestPriorityPresence(jid.toBare());
+ StatusShow::Type type = presence ? presence->getShow() : StatusShow::None;
+ return ChatListWindow::Chat(jid, nickResolver_->jidToNick(jid), activity, unreadCount, type, false);
}
void ChatsManager::handleChatActivity(const JID& jid, const std::string& activity) {
@@ -265,6 +270,16 @@ void ChatsManager::handleUIEvent(boost::shared_ptr<UIEvent> event) {
*/
void ChatsManager::handlePresenceChange(boost::shared_ptr<Presence> newPresence) {
if (mucRegistry_->isMUC(newPresence->getFrom().toBare())) return;
+
+ foreach (ChatListWindow::Chat& chat, recentChats_) {
+ if (newPresence->getFrom().toBare() == chat.jid.toBare()) {
+ Presence::ref presence = presenceOracle_->getHighestPriorityPresence(chat.jid.toBare());
+ chat.setStatusType(presence ? presence->getShow() : StatusShow::None);
+ chatListWindow_->setRecents(recentChats_);
+ break;
+ }
+ }
+
//if (newPresence->getType() != Presence::Unavailable) return;
JID fullJID(newPresence->getFrom());
std::map<JID, ChatController*>::iterator it = chatControllers_.find(fullJID);
diff --git a/Swift/Controllers/UIInterfaces/ChatListWindow.h b/Swift/Controllers/UIInterfaces/ChatListWindow.h
index 477de04..94d400d 100644
--- a/Swift/Controllers/UIInterfaces/ChatListWindow.h
+++ b/Swift/Controllers/UIInterfaces/ChatListWindow.h
@@ -9,16 +9,17 @@
#include <list>
#include <boost/shared_ptr.hpp>
#include <Swiften/MUC/MUCBookmark.h>
+#include <Swiften/Elements/StatusShow.h>
-#include "Swiften/Base/boost_bsignals.h"
+#include <Swiften/Base/boost_bsignals.h>
namespace Swift {
class ChatListWindow {
public:
class Chat {
public:
- Chat(const JID& jid, const std::string& chatName, const std::string& activity, int unreadCount, bool isMUC, const std::string& nick = "")
- : jid(jid), chatName(chatName), activity(activity), isMUC(isMUC), nick(nick), unreadCount(unreadCount) {}
+ Chat(const JID& jid, const std::string& chatName, const std::string& activity, int unreadCount, StatusShow::Type statusType, bool isMUC, const std::string& nick = "")
+ : jid(jid), chatName(chatName), activity(activity), statusType(statusType), isMUC(isMUC), nick(nick), unreadCount(unreadCount) {}
/** Assume that nicks and other transient features aren't important for equality */
bool operator==(const Chat& other) const {
return jid.toBare() == other.jid.toBare()
@@ -27,9 +28,13 @@ namespace Swift {
void setUnreadCount(int unread) {
unreadCount = unread;
}
+ void setStatusType(StatusShow::Type type) {
+ statusType = type;
+ }
JID jid;
std::string chatName;
std::string activity;
+ StatusShow::Type statusType;
bool isMUC;
std::string nick;
int unreadCount;