From c2dc47077e505ba1d45f203772dc6aa4f26656e4 Mon Sep 17 00:00:00 2001
From: Kevin Smith <git@kismith.co.uk>
Date: Sat, 9 Jul 2011 11:42:47 +0100
Subject: Remember status type for chat list items.

Resolves: #905

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;
-- 
cgit v0.10.2-6-g49f6