← Back to team overview

linuxdcpp-team team mailing list archive

[Branch ~linuxdcpp-team/linuxdcpp/trunk] Rev 389: PM tab label now shows when user's nick, hub or online status changes

 

------------------------------------------------------------
revno: 389
committer: Steven Sheehy <steven.sheehy@xxxxxxxxx>
branch nick: trunk
timestamp: Thu 2010-09-09 20:26:40 -0500
message:
  PM tab label now shows when user's nick, hub or online status changes
modified:
  Changelog.txt
  linux/hub.cc
  linux/hub.hh
  linux/mainwindow.cc
  linux/mainwindow.hh
  linux/privatemessage.cc
  linux/privatemessage.hh


--
lp:linuxdcpp
https://code.launchpad.net/~linuxdcpp-team/linuxdcpp/trunk

Your team LinuxDC++ Team is subscribed to branch lp:linuxdcpp.
To unsubscribe from this branch go to https://code.launchpad.net/~linuxdcpp-team/linuxdcpp/trunk/+edit-subscription
=== modified file 'Changelog.txt'
--- Changelog.txt	2010-09-05 06:03:16 +0000
+++ Changelog.txt	2010-09-10 01:26:40 +0000
@@ -59,6 +59,8 @@
 [2010-09-04] Renamed Nick to User for consistency and grammar. (Steven)
 [2010-09-04] Show preferences dialog on initial startup. (Steven)
 [2010-09-05] lp#308683: Fixed downloading files multiple times when grouping by TTH. (Steven)
+[2010-09-07] Added icons to the notebook tab labels. (Steven)
+[2010-09-09] PM tab label now shows when user's nick, hub or online status changes. (Steven)
 
 *** 1.0.3 2009-02-01 ***
 [2008-08-10] lp#256236: Fixed a crash on startup when using auto-open options.

=== modified file 'linux/hub.cc'
--- linux/hub.cc	2010-09-08 02:51:30 +0000
+++ linux/hub.cc	2010-09-10 01:26:40 +0000
@@ -201,7 +201,7 @@
 	return FALSE;
 }
 
-void Hub::updateUser_gui(ParamMap params)
+void Hub::updateUser_gui(ParamMap params, bool showJoin)
 {
 	GtkTreeIter iter;
 	int64_t shared = Util::toInt64(params["Shared"]);
@@ -239,19 +239,6 @@
 		totalShared += shared;
 		userMap[params["User"]] = cid;
 
-		if (BOOLSETTING(SHOW_JOINS))
-		{
-			addStatusMessage_gui(params["User"] + _(" has joined"));
-			string line = params["User"] + _(" has joined hub ") + client->getHubName();
-			WulforManager::get()->getMainWindow()->addPrivateStatusMessage_gui(cid, line);
-		}
-		else if (BOOLSETTING(FAV_SHOW_JOINS))
-		{
-			typedef Func1<Hub, string> F1;
-			F1 *func = new F1(this, &Hub::checkFavoriteUserJoin_client, cid);
-			WulforManager::get()->dispatchClientFunc(func);
-		}
-
 		gtk_list_store_insert_with_values(nickStore, &iter, userMap.size(),
 			nickView.col("User"), params["User"].c_str(),
 			nickView.col("Shared"), shared,
@@ -266,6 +253,9 @@
 			-1);
 
 		userIters[cid] = iter;
+
+		if (showJoin)
+			addStatusMessage_gui(params["User"] + _(" has joined"));
 	}
 
 	setStatus_gui("statusUsers", Util::toString(userMap.size()) + _(" Users"));
@@ -1457,26 +1447,7 @@
 		client->reconnect();
 }
 
-void Hub::checkFavoriteUserJoin_client(string cid)
-{
-	UserPtr user = ClientManager::getInstance()->findUser(CID(cid));
-
-	if (user && FavoriteManager::getInstance()->isFavoriteUser(user))
-	{
-		string message = WulforUtil::getNicks(user) + _(" has joined");
-		typedef Func1<Hub, std::string> F1;
-		F1 *func = new F1(this, &Hub::addStatusMessage_gui, message);
-		WulforManager::get()->dispatchGuiFunc(func);
-
-		string statusMessage = WulforUtil::getNicks(user) + _(" has joined hub ") + client->getHubName();
-		typedef Func2<MainWindow, string, string> F2;
-		F2 *func2 = new F2(WulforManager::get()->getMainWindow(),
-			&MainWindow::addPrivateStatusMessage_gui, cid, statusMessage);
-		WulforManager::get()->dispatchGuiFunc(func2);
-	}
-}
-
-void Hub::getParams_client(ParamMap &params, Identity &id)
+void Hub::getParams_client(ParamMap &params, const Identity &id)
 {
 	if (id.getUser()->isSet(User::DCPLUSPLUS))
 		params["Icon"] = "dc++";
@@ -1506,10 +1477,16 @@
 	params["CID"] = id.getUser()->getCID().toBase32();
 }
 
+bool Hub::showJoins_client(const UserPtr &user)
+{
+	return BOOLSETTING(SHOW_JOINS) || (BOOLSETTING(FAV_SHOW_JOINS) && 
+		FavoriteManager::getInstance()->isFavoriteUser(user));
+}
+
 void Hub::on(ClientListener::Connecting, Client *) throw()
 {
 	typedef Func1<Hub, string> F1;
-	F1 *f1 = new F1(this, &Hub::addStatusMessage_gui, _("Connecting to ") + client->getHubUrl() + "...");
+	F1 *f1 = new F1(this, &Hub::addStatusMessage_gui, _("Connecting to ") + client->getHubUrl());
 	WulforManager::get()->dispatchGuiFunc(f1);
 }
 
@@ -1526,9 +1503,11 @@
 
 	if (!id.isHidden())
 	{
+		bool showJoin = showJoins_client(id.getUser());
 		ParamMap params;
 		getParams_client(params, id);
-		Func1<Hub, ParamMap> *func = new Func1<Hub, ParamMap>(this, &Hub::updateUser_gui, params);
+		typedef Func2<Hub, ParamMap, bool> F2;
+		F2 *func = new F2(this, &Hub::updateUser_gui, params, showJoin);
 		WulforManager::get()->dispatchGuiFunc(func);
 	}
 }
@@ -1536,17 +1515,18 @@
 void Hub::on(ClientListener::UsersUpdated, Client *, const OnlineUserList &list) throw()
 {
 	Identity id;
-	typedef Func1<Hub, ParamMap> F1;
-	F1 *func;
+	typedef Func2<Hub, ParamMap, bool> F2;
+	F2 *func;
 
 	for (OnlineUserList::const_iterator it = list.begin(); it != list.end(); ++it)
 	{
 		id = (*it)->getIdentity();
 		if (!id.isHidden())
 		{
+			bool showJoin = showJoins_client(id.getUser());
 			ParamMap params;
 			getParams_client(params, id);
-			func = new F1(this, &Hub::updateUser_gui, params);
+			func = new F2(this, &Hub::updateUser_gui, params, showJoin);
 			WulforManager::get()->dispatchGuiFunc(func);
 		}
 	}
@@ -1559,17 +1539,10 @@
 	typedef Func1<Hub, string> F1;
 	F1 *func;
 
-	if (BOOLSETTING(SHOW_JOINS) || (BOOLSETTING(FAV_SHOW_JOINS) &&
-		FavoriteManager::getInstance()->isFavoriteUser(user.getUser())))
+	if (showJoins_client(user.getUser()))
 	{
 		func = new F1(this, &Hub::addStatusMessage_gui, nick + _(" has quit"));
 		WulforManager::get()->dispatchGuiFunc(func);
-
-		string statusMessage = nick + _(" has quit hub ") + client->getHubName();
-		typedef Func2<MainWindow, string, string> F2;
-		F2 *func2 = new F2(WulforManager::get()->getMainWindow(),
-			&MainWindow::addPrivateStatusMessage_gui, cid, statusMessage);
-		WulforManager::get()->dispatchGuiFunc(func2);
 	}
 
 	func = new F1(this, &Hub::removeUser_gui, cid);

=== modified file 'linux/hub.hh'
--- linux/hub.hh	2010-08-09 03:11:55 +0000
+++ linux/hub.hh	2010-09-10 01:26:40 +0000
@@ -50,7 +50,7 @@
 		void setStatus_gui(std::string statusBar, std::string text);
 		bool findUser_gui(const std::string &cid, GtkTreeIter *iter);
 		bool findNick_gui(const std::string &nick, GtkTreeIter *iter);
-		void updateUser_gui(ParamMap id);
+		void updateUser_gui(ParamMap id, bool showJoin);
 		void removeUser_gui(std::string cid);
 		void removeTag_gui(const std::string &nick);
 		void clearNickList_gui();
@@ -102,9 +102,9 @@
 		void rebuildHashData_client();
 		void refreshFileList_client();
 		void addAsFavorite_client();
-		void checkFavoriteUserJoin_client(std::string cid);
 		void addFavoriteUser_client(const std::string cid);
-		void getParams_client(ParamMap &user, dcpp::Identity &id);
+		void getParams_client(ParamMap &params, const dcpp::Identity &id);
+		bool showJoins_client(const dcpp::UserPtr &user);
 
 		// Client callbacks
 		virtual void on(dcpp::ClientListener::Connecting, dcpp::Client *) throw();

=== modified file 'linux/mainwindow.cc'
--- linux/mainwindow.cc	2010-09-05 00:43:46 +0000
+++ linux/mainwindow.cc	2010-09-10 01:26:40 +0000
@@ -615,14 +615,6 @@
 		raisePage_gui(entry->getContainer());
 }
 
-void MainWindow::addPrivateStatusMessage_gui(string cid, string message)
-{
-	BookEntry *entry = findBookEntry(Entry::PRIVATE_MESSAGE, cid);
-
-	if (entry != NULL)
-		dynamic_cast<PrivateMessage*>(entry)->addStatusMessage_gui(message);
-}
-
 void MainWindow::showPublicHubs_gui()
 {
 	BookEntry *entry = findBookEntry(Entry::PUBLIC_HUBS);

=== modified file 'linux/mainwindow.hh'
--- linux/mainwindow.hh	2010-05-30 03:15:23 +0000
+++ linux/mainwindow.hh	2010-09-10 01:26:40 +0000
@@ -71,7 +71,6 @@
 		void showFinishedUploads_gui();
 		void showHub_gui(std::string address, std::string encoding = "");
 		void addPrivateMessage_gui(std::string cid, std::string hubUrl = "", std::string message = "", bool useSetting = FALSE);
-		void addPrivateStatusMessage_gui(std::string cid, std::string message = "");
 		void showPublicHubs_gui();
 		void showShareBrowser_gui(dcpp::UserPtr user, std::string file, std::string dir, bool useSetting);
 		Search *addSearch_gui();

=== modified file 'linux/privatemessage.cc'
--- linux/privatemessage.cc	2010-09-08 02:51:30 +0000
+++ linux/privatemessage.cc	2010-09-10 01:26:40 +0000
@@ -30,8 +30,11 @@
 using namespace std;
 using namespace dcpp;
 
+const std::string PrivateMessage::USER_AVAILABLE_ICON = "user-available";
+const std::string PrivateMessage::USER_OFFLINE_ICON = "user-offline";
+
 PrivateMessage::PrivateMessage(const string &cid, const string &hubUrl):
-	BookEntry(Entry::PRIVATE_MESSAGE, WulforUtil::getNicks(cid), "privatemessage.glade", cid),
+	BookEntry(Entry::PRIVATE_MESSAGE, cid, "privatemessage.glade", cid),
 	cid(cid),
 	hubUrl(hubUrl),
 	historyIndex(0),
@@ -80,14 +83,15 @@
 
 	gtk_widget_grab_focus(getWidget("entry"));
 	history.push_back("");
-	UserPtr user = ClientManager::getInstance()->findUser(CID(cid));
+	user = ClientManager::getInstance()->findUser(CID(cid));
 	isBot = user ? user->isSet(User::BOT) : FALSE;
 
-	setLabel_gui(WulforUtil::getNicks(cid) + " [" + WulforUtil::getHubNames(cid) + "]");
+	updateUserStatus_gui(WulforUtil::getNicks(cid), WulforUtil::getHubNames(cid));
 }
 
 PrivateMessage::~PrivateMessage()
 {
+	ClientManager::getInstance()->removeListener(this);
 	if (handCursor)
 	{
 		gdk_cursor_unref(handCursor);
@@ -97,6 +101,7 @@
 
 void PrivateMessage::show()
 {
+	ClientManager::getInstance()->addListener(this);
 }
 
 void PrivateMessage::addMessage_gui(string message)
@@ -261,6 +266,14 @@
 	}
 }       
 
+void PrivateMessage::updateUserStatus_gui(string nicks, string hubs, bool online, string statusMessage)
+{
+	setLabel_gui(nicks + " - " + hubs);
+	setIcon_gui(online ? USER_AVAILABLE_ICON : USER_OFFLINE_ICON);
+
+	if (!statusMessage.empty())
+		addStatusMessage_gui(statusMessage);
+}
 
 gboolean PrivateMessage::onFocusIn_gui(GtkWidget *widget, GdkEventFocus *event, gpointer data)
 {
@@ -342,6 +355,7 @@
 			typedef Func0<PrivateMessage> F0;
 			F0 *func = new F0(pm, &PrivateMessage::addFavoriteUser_client);
 			WulforManager::get()->dispatchClientFunc(func);
+			pm->addStatusMessage_gui(_("Added user to favorites list"));
 		}
 		else if (command == _("getlist"))
 		{
@@ -354,6 +368,7 @@
 			typedef Func0<PrivateMessage> F0;
 			F0 *func = new F0(pm, &PrivateMessage::grantSlot_client);
 			WulforManager::get()->dispatchClientFunc(func);
+			pm->addStatusMessage_gui(_("Slot granted"));
 		}
 		else if (command == _("help"))
 		{
@@ -561,8 +576,7 @@
 
 void PrivateMessage::sendMessage_client(std::string message)
 {
-	UserPtr user = ClientManager::getInstance()->findUser(CID(cid));
-	if (user && user->isOnline())
+	if (user->isOnline())
 	{
 		// FIXME: WTF does the 3rd param (bool thirdPerson) do? A: Used for /me stuff
 		ClientManager::getInstance()->privateMessage(user, message, false, hubUrl);
@@ -577,26 +591,14 @@
 
 void PrivateMessage::addFavoriteUser_client()
 {
-	UserPtr user = ClientManager::getInstance()->findUser(CID(cid));
-	if (user)
-	{
-		FavoriteManager::getInstance()->addFavoriteUser(user);
-	}
-	else
-	{
-		typedef Func1<PrivateMessage, string> F1;
-		F1 *func = new F1(this, &PrivateMessage::addStatusMessage_gui, _("Added user to favorites list"));
-		WulforManager::get()->dispatchGuiFunc(func);
-	}
+	FavoriteManager::getInstance()->addFavoriteUser(user);
 }
 
 void PrivateMessage::getFileList_client()
 {
 	try
 	{
-		UserPtr user = ClientManager::getInstance()->findUser(CID(cid));
-		if (user)
-			QueueManager::getInstance()->addList(user, hubUrl, QueueItem::FLAG_CLIENT_VIEW);
+		QueueManager::getInstance()->addList(user, hubUrl, QueueItem::FLAG_CLIENT_VIEW);
 	}
 	catch (const Exception& e)
 	{
@@ -608,15 +610,58 @@
 
 void PrivateMessage::grantSlot_client()
 {
-	UserPtr user = ClientManager::getInstance()->findUser(CID(cid));
-	if (user)
-	{
-		UploadManager::getInstance()->reserveSlot(user, hubUrl);
-	}
-	else
-	{
-		typedef Func1<PrivateMessage, string> F1;
-		F1 *func = new F1(this, &PrivateMessage::addStatusMessage_gui, _("Slot granted"));
+	UploadManager::getInstance()->reserveSlot(user, hubUrl);
+}
+
+void PrivateMessage::on(ClientManagerListener::UserConnected, const UserPtr& aUser) throw()
+{
+	if (aUser == user)
+	{
+		string statusMessage;
+		string nicks = WulforUtil::getNicks(user); // TODO: Use aUser->hubHint on later cores
+		string hubs = WulforUtil::getHubNames(cid);
+
+		if (BOOLSETTING(SHOW_JOINS) || (BOOLSETTING(FAV_SHOW_JOINS) && 
+			FavoriteManager::getInstance()->isFavoriteUser(user)))
+		{
+			statusMessage = nicks + _(" has joined");
+		}
+
+		typedef Func4<PrivateMessage, string, string, bool, string> F4;
+		F4 *func = new F4(this, &PrivateMessage::updateUserStatus_gui, nicks, hubs, user->isOnline(), statusMessage);
+		WulforManager::get()->dispatchGuiFunc(func);
+	}
+}
+
+void PrivateMessage::on(ClientManagerListener::UserDisconnected, const UserPtr& aUser) throw()
+{
+	if (aUser == user)
+	{
+		string statusMessage;
+		string nicks = WulforUtil::getNicks(user);
+		string hubs = WulforUtil::getHubNames(cid);
+
+		if (BOOLSETTING(SHOW_JOINS) || (BOOLSETTING(FAV_SHOW_JOINS) && 
+			FavoriteManager::getInstance()->isFavoriteUser(user)))
+		{
+			statusMessage = nicks + _(" has quit");
+		}
+
+		typedef Func4<PrivateMessage, string, string, bool, string> F4;
+		F4 *func = new F4(this, &PrivateMessage::updateUserStatus_gui, nicks, hubs, user->isOnline(), statusMessage);
+		WulforManager::get()->dispatchGuiFunc(func);
+	}
+}
+
+void PrivateMessage::on(ClientManagerListener::UserUpdated, const OnlineUser& aUser) throw()
+{
+	if (aUser.getUser() == user)
+	{
+		string nicks = WulforUtil::getNicks(user);
+		string hubs = WulforUtil::getHubNames(cid);
+
+		typedef Func4<PrivateMessage, string, string, bool, string> F4;
+		F4 *func = new F4(this, &PrivateMessage::updateUserStatus_gui, nicks, hubs, user->isOnline(), "");
 		WulforManager::get()->dispatchGuiFunc(func);
 	}
 }

=== modified file 'linux/privatemessage.hh'
--- linux/privatemessage.hh	2009-08-15 04:40:26 +0000
+++ linux/privatemessage.hh	2010-09-10 01:26:40 +0000
@@ -24,10 +24,12 @@
 
 #include <dcpp/stdinc.h>
 #include <dcpp/DCPlusPlus.h>
+#include <dcpp/ClientManagerListener.h>
 #include "bookentry.hh"
 
 class PrivateMessage:
-	public BookEntry
+	public BookEntry,
+	public dcpp::ClientManagerListener
 {
 	public:
 		PrivateMessage(const std::string &cid, const std::string &hubUrl);
@@ -42,6 +44,7 @@
 		// GUI functions
 		void addLine_gui(const std::string &line);
 		void updateCursor(GtkWidget *widget);
+		void updateUserStatus_gui(std::string nicks, std::string hubs, bool online = TRUE, std::string statusMessage = "");
 
 		// GUI callbacks
 		static gboolean onFocusIn_gui(GtkWidget *widget, GdkEventFocus *event, gpointer data);
@@ -66,8 +69,16 @@
 		void getFileList_client();
 		void grantSlot_client();
 
+		// Client callbacks
+		virtual void on(dcpp::ClientManagerListener::UserConnected, const dcpp::UserPtr& aUser) throw();
+		virtual void on(dcpp::ClientManagerListener::UserDisconnected, const dcpp::UserPtr& aUser) throw();
+		virtual void on(dcpp::ClientManagerListener::UserUpdated, const dcpp::OnlineUser& aUser) throw();
+
+		static const std::string USER_AVAILABLE_ICON;
+		static const std::string USER_OFFLINE_ICON;
 		GtkTextBuffer *buffer;
 		GtkTextMark *mark;
+		dcpp::UserPtr user;
 		std::string cid;
 		std::string hubUrl;
 		bool isBot;