← Back to team overview

linuxdcpp-team team mailing list archive

[Branch ~dcplusplus-team/dcplusplus/trunk] Rev 2635: Users frame fixes

 

------------------------------------------------------------
revno: 2635
fixes bug: https://launchpad.net/bugs/832350
committer: Jacek Sieka <arnetheduck@xxxxxxxxx>
branch nick: dcplusplus
timestamp: Thu 2011-10-13 22:43:14 +0900
message:
  Users frame fixes
modified:
  dcpp/FavoriteManager.cpp
  dcpp/FavoriteManager.h
  dcpp/FavoriteManagerListener.h
  dcpp/stdinc.h
  win32/HubFrame.cpp
  win32/HubFrame.h
  win32/UsersFrame.cpp
  win32/UsersFrame.h
  win32/stdafx.h


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

Your team Dcplusplus-team is subscribed to branch lp:dcplusplus.
To unsubscribe from this branch go to https://code.launchpad.net/~dcplusplus-team/dcplusplus/trunk/+edit-subscription
=== modified file 'dcpp/FavoriteManager.cpp'
--- dcpp/FavoriteManager.cpp	2011-10-01 14:33:43 +0000
+++ dcpp/FavoriteManager.cpp	2011-10-13 13:43:14 +0000
@@ -580,6 +580,7 @@
 	if(i != users.end()) {
 		FavoriteUser& fu = i->second;
 		fu.update(info);
+		fire(FavoriteManagerListener::UserUpdated(), i->second);
 		save();
 	}
 }
@@ -618,6 +619,12 @@
 	return false;
 }
 
+optional<FavoriteUser> FavoriteManager::getFavoriteUser(const UserPtr &aUser) const {
+	Lock l(cs);
+	auto i = users.find(aUser->getCID());
+	return i == users.end() ? optional<FavoriteUser>() : i->second;
+}
+
 bool FavoriteManager::hasSlot(const UserPtr& aUser) const {
 	Lock l(cs);
 	FavoriteMap::const_iterator i = users.find(aUser->getCID());
@@ -643,6 +650,9 @@
 		i->second.setFlag(FavoriteUser::FLAG_GRANTSLOT);
 	else
 		i->second.unsetFlag(FavoriteUser::FLAG_GRANTSLOT);
+
+	fire(FavoriteManagerListener::UserUpdated(), i->second);
+
 	save();
 }
 void FavoriteManager::setUserDescription(const UserPtr& aUser, const string& description) {
@@ -651,6 +661,9 @@
 	if(i == users.end())
 		return;
 	i->second.setDescription(description);
+
+	fire(FavoriteManagerListener::UserUpdated(), i->second);
+
 	save();
 }
 

=== modified file 'dcpp/FavoriteManager.h'
--- dcpp/FavoriteManager.h	2011-10-02 12:14:41 +0000
+++ dcpp/FavoriteManager.h	2011-10-13 13:43:14 +0000
@@ -19,6 +19,8 @@
 #ifndef DCPLUSPLUS_DCPP_FAVORITE_MANAGER_H
 #define DCPLUSPLUS_DCPP_FAVORITE_MANAGER_H
 
+#include <boost/optional.hpp>
+
 #include "SettingsManager.h"
 
 #include "CriticalSection.h"
@@ -34,6 +36,8 @@
 
 namespace dcpp {
 
+using boost::optional;
+
 class SimpleXML;
 
 /**
@@ -72,6 +76,7 @@
 	bool isFavoriteUser(const UserPtr& aUser) const { Lock l(cs); return users.find(aUser->getCID()) != users.end(); }
 	void removeFavoriteUser(const UserPtr& aUser);
 
+	optional<FavoriteUser> getFavoriteUser(const UserPtr& aUser) const;
 	bool hasSlot(const UserPtr& aUser) const;
 	void setUserDescription(const UserPtr& aUser, const string& description);
 	void setAutoGrant(const UserPtr& aUser, bool grant);

=== modified file 'dcpp/FavoriteManagerListener.h'
--- dcpp/FavoriteManagerListener.h	2011-03-29 20:40:28 +0000
+++ dcpp/FavoriteManagerListener.h	2011-10-13 13:43:14 +0000
@@ -35,10 +35,11 @@
 	typedef X<3> FavoriteAdded;
 	typedef X<4> FavoriteRemoved;
 	typedef X<5> UserAdded;
-	typedef X<6> UserRemoved;
-	typedef X<7> StatusChanged;
-	typedef X<8> LoadedFromCache;
-	typedef X<9> Corrupted;
+	typedef X<6> UserUpdated;
+	typedef X<7> UserRemoved;
+	typedef X<8> StatusChanged;
+	typedef X<9> LoadedFromCache;
+	typedef X<10> Corrupted;
 	
 	virtual void on(DownloadStarting, const string&) noexcept { }
 	virtual void on(DownloadFailed, const string&) noexcept { }
@@ -46,6 +47,7 @@
 	virtual void on(FavoriteAdded, const FavoriteHubEntryPtr) noexcept { }
 	virtual void on(FavoriteRemoved, const FavoriteHubEntryPtr) noexcept { }
 	virtual void on(UserAdded, const FavoriteUser&) noexcept { }
+	virtual void on(UserUpdated, const FavoriteUser&) noexcept { }
 	virtual void on(UserRemoved, const FavoriteUser&) noexcept { }
 	virtual void on(StatusChanged, const UserPtr&) noexcept { }
 	virtual void on(LoadedFromCache, const string&, const string&) noexcept { }

=== modified file 'dcpp/stdinc.h'
--- dcpp/stdinc.h	2011-05-04 19:32:00 +0000
+++ dcpp/stdinc.h	2011-10-13 13:43:14 +0000
@@ -70,6 +70,7 @@
 
 #include <boost/intrusive_ptr.hpp>
 #include <boost/noncopyable.hpp>
+#include <boost/optional.hpp>
 #include <boost/range/algorithm/find_if.hpp>
 #include <boost/range/algorithm/find.hpp>
 #include <boost/regex.hpp>

=== modified file 'win32/HubFrame.cpp'
--- win32/HubFrame.cpp	2011-10-10 20:18:18 +0000
+++ win32/HubFrame.cpp	2011-10-13 13:43:14 +0000
@@ -793,7 +793,7 @@
 void HubFrame::on(Connected, Client*) noexcept {
 	callAsync([this] { onConnected(); });
 }
-void HubFrame::on(UserUpdated, Client*, const OnlineUser& user) noexcept {
+void HubFrame::on(ClientListener::UserUpdated, Client*, const OnlineUser& user) noexcept {
 	addTask(UPDATE_USER_JOIN, user);
 }
 void HubFrame::on(UsersUpdated, Client*, const OnlineUserList& aList) noexcept {

=== modified file 'win32/HubFrame.h'
--- win32/HubFrame.h	2011-09-30 11:33:12 +0000
+++ win32/HubFrame.h	2011-10-13 13:43:14 +0000
@@ -276,7 +276,7 @@
 	// ClientListener
 	virtual void on(Connecting, Client*) noexcept;
 	virtual void on(Connected, Client*) noexcept;
-	virtual void on(UserUpdated, Client*, const OnlineUser&) noexcept;
+	virtual void on(ClientListener::UserUpdated, Client*, const OnlineUser&) noexcept;
 	virtual void on(UsersUpdated, Client*, const OnlineUserList&) noexcept;
 	virtual void on(ClientListener::UserRemoved, Client*, const OnlineUser&) noexcept;
 	virtual void on(Redirect, Client*, const string&) noexcept;

=== modified file 'win32/UsersFrame.cpp'
--- win32/UsersFrame.cpp	2011-10-10 20:18:18 +0000
+++ win32/UsersFrame.cpp	2011-10-13 13:43:14 +0000
@@ -226,38 +226,51 @@
 	SettingsManager::getInstance()->set(SettingsManager::USERSFRAME_WIDTHS, WinUtil::toString(users->getColumnWidths()));
 }
 
-UsersFrame::UserInfo::UserInfo(const FavoriteUser& u) :
-UserInfoBase(HintedUser(u.getUser(), Util::emptyString)) /// @todo fav users aren't aware of hub hints for now
-{
-	update(u);
-}
-
-UsersFrame::UserInfo::UserInfo(const UserPtr& u) :
-UserInfoBase(HintedUser(u, Util::emptyString)) /// @todo fav users aren't aware of hub hints for now
-{
-	update(u);
+UsersFrame::UserInfo::UserInfo(const UserPtr& u, bool visible) :
+UserInfoBase(HintedUser(u, Util::emptyString))
+{
+	update(u, visible);
 }
 
 void UsersFrame::UserInfo::remove() {
 	FavoriteManager::getInstance()->removeFavoriteUser(user);
 }
 
-void UsersFrame::UserInfo::update(const UserPtr& u) {
-	columns[COLUMN_NICK] = WinUtil::getNicks(u, Util::emptyString);
-	columns[COLUMN_HUB] = u->isOnline() ? WinUtil::getHubNames(u, Util::emptyString).first : Util::emptyStringT;
-	columns[COLUMN_SEEN] = u->isOnline() ? T_("Online") : Text::toT(Util::formatTime("%Y-%m-%d %H:%M", FavoriteManager::getInstance()->getLastSeen(u)));
+void UsersFrame::UserInfo::update(const UserPtr& u, bool visible) {
+	auto fu = FavoriteManager::getInstance()->getFavoriteUser(u);
+	if(fu) {
+		isFavorite = true;
+		grantSlot = fu->isSet(FavoriteUser::FLAG_GRANTSLOT);
+		columns[COLUMN_NICK] = Text::toT(fu->getNick());
+		if(!visible) {
+			return;
+		}
+		columns[COLUMN_DESCRIPTION] = Text::toT(fu->getDescription());
+
+		if(u->isOnline()) {
+			columns[COLUMN_SEEN] = T_("Online");
+			columns[COLUMN_HUB] = WinUtil::getHubNames(u, Util::emptyString).first;
+		} else {
+			columns[COLUMN_SEEN] = fu->getLastSeen() > 0 ? Text::toT(Util::formatTime("%Y-%m-%d %H:%M", fu->getLastSeen())) : T_("Offline");
+			columns[COLUMN_HUB] = Text::toT(fu->getUrl());
+		}
+	} else {
+		isFavorite = false;
+		grantSlot = false;
+		columns[COLUMN_NICK] = WinUtil::getNicks(u, Util::emptyString);
+
+		if(!visible) {
+			return;
+		}
+		if(u->isOnline()) {
+			columns[COLUMN_SEEN] = T_("Online");
+			columns[COLUMN_HUB] = WinUtil::getHubNames(u, Util::emptyString).first;
+		} else {
+			columns[COLUMN_SEEN] = T_("Offline");
+		}
+	}
+
 	columns[COLUMN_CID] = Text::toT(u->getCID().toBase32());
-
-	isFavorite = FavoriteManager::getInstance()->isFavoriteUser(u);
-	grantSlot = FavoriteManager::getInstance()->hasSlot(u);
-}
-
-void UsersFrame::UserInfo::update(const FavoriteUser& u) {
-	columns[COLUMN_NICK] = Text::toT(u.getNick());
-	columns[COLUMN_HUB] = u.getUser()->isOnline() ? WinUtil::getHubNames(u.getUser(), Util::emptyString).first : Text::toT(u.getUrl());
-	columns[COLUMN_SEEN] = u.getUser()->isOnline() ? T_("Online") : Text::toT(Util::formatTime("%Y-%m-%d %H:%M", u.getLastSeen()));
-	columns[COLUMN_DESCRIPTION] = Text::toT(u.getDescription());
-	columns[COLUMN_CID] = Text::toT(u.getUser()->getCID().toBase32());
 }
 
 void UsersFrame::addUser(const UserPtr& aUser) {
@@ -267,11 +280,11 @@
 
 	auto ui = userInfos.find(aUser);
 	if(ui == userInfos.end()) {
-		auto x = dwt::make_shared<UserInfo>(aUser);
-		userInfos.insert(std::make_pair(aUser, x));
+		auto x = userInfos.insert(std::make_pair(aUser, UserInfo(aUser, false))).first;
 
-		if(matches(*x)) {
-			users->insert(x.get());
+		if(matches(x->second)) {
+			x->second.update(aUser, true);
+			users->insert(&x->second);
 		}
 	} else {
 		updateUser(aUser);
@@ -281,16 +294,19 @@
 void UsersFrame::updateUser(const UserPtr& aUser) {
 	auto ui = userInfos.find(aUser);
 	if(ui != userInfos.end()) {
-		if(!show(aUser, true)) {
-			users->erase(ui->second.get());
-			userInfos.erase(ui);
+		ui->second.update(aUser, false);
+
+		if(!show(aUser, false)) {
+			users->erase(&ui->second);
+			if(!show(aUser, true)) {
+				userInfos.erase(aUser);
+			}
 			return;
 		}
 
-		ui->second->update(aUser);
-
-		if(matches(*ui->second)) {
-			auto i = users->find(ui->second.get());
+		if(matches(ui->second)) {
+			ui->second.update(aUser, true);
+			auto i = users->find(&ui->second);
 			if(i != -1) {
 				if(users->getSelected() == i) {
 					handleSelectionChanged();
@@ -298,7 +314,7 @@
 					users->update(i);
 				}
 			} else {
-				users->insert(ui->second.get());
+				users->insert(&ui->second);
 			}
 		}
 	}
@@ -460,15 +476,10 @@
 		} else {
 			FavoriteManager::getInstance()->addFavoriteUser(ui->getUser());
 		}
-
-		ui->isFavorite = !ui->isFavorite;
-		users->update(item.first);
 		break;
 
 	case COLUMN_SLOT:
 		FavoriteManager::getInstance()->setAutoGrant(ui->getUser(), !ui->grantSlot);
-		ui->grantSlot = !ui->grantSlot;
-		users->update(item.first);
 		break;
 
 	default:
@@ -482,8 +493,9 @@
 	HoldRedraw h(users);
 	users->clear();
 	for(auto i = userInfos.begin(); i != userInfos.end(); ++i) {
-		if(matches(*i->second)) {
-			users->insert(i->second.get());
+		if(matches(i->second)) {
+			i->second.update(i->first, true);
+			users->insert(&i->second);
 		}
 	}
 }
@@ -534,6 +546,10 @@
 	callAsync([=] { addUser(u); });
 }
 
+void UsersFrame::on(FavoriteManagerListener::UserUpdated, const FavoriteUser& aUser) noexcept {
+	auto u = aUser.getUser();
+	callAsync([=] { updateUser(u); });
+}
 void UsersFrame::on(UserRemoved, const FavoriteUser& aUser) noexcept {
 	auto u = aUser.getUser();
 	callAsync([=] { updateUser(u); });
@@ -547,7 +563,7 @@
 	callAsync([=] { addUser(aUser); });
 }
 
-void UsersFrame::on(UserUpdated, const UserPtr& aUser) noexcept {
+void UsersFrame::on(ClientManagerListener::UserUpdated, const UserPtr& aUser) noexcept {
 	callAsync([=] { updateUser(aUser); });
 }
 

=== modified file 'win32/UsersFrame.h'
--- win32/UsersFrame.h	2011-05-04 19:32:00 +0000
+++ win32/UsersFrame.h	2011-10-13 13:43:14 +0000
@@ -82,8 +82,7 @@
 
 	class UserInfo : public UserInfoBase {
 	public:
-		UserInfo(const UserPtr& u);
-		UserInfo(const FavoriteUser& u);
+		UserInfo(const UserPtr& u, bool visible);
 
 		const tstring& getText(int col) const {
 			return columns[col];
@@ -107,8 +106,7 @@
 
 		void remove();
 
-		void update(const UserPtr& u);
-		void update(const FavoriteUser& u);
+		void update(const UserPtr& u, bool visible);
 
 		tstring columns[COLUMN_LAST];
 
@@ -134,8 +132,7 @@
 
 	static dwt::ImageListPtr userIcons;
 
-	// TODO change to unique_ptr once g++ map supports it (no move insert in 4.5 it seems...)
-	std::unordered_map<UserPtr, dwt::shared_ptr<UserInfo>, User::Hash> userInfos;
+	std::unordered_map<UserPtr, UserInfo, User::Hash> userInfos;
 
 	bool startup;
 
@@ -159,12 +156,13 @@
 
 	// FavoriteManagerListener
 	virtual void on(UserAdded, const FavoriteUser& aUser) noexcept;
+	virtual void on(FavoriteManagerListener::UserUpdated, const FavoriteUser& aUser) noexcept;
 	virtual void on(UserRemoved, const FavoriteUser& aUser) noexcept;
 	virtual void on(StatusChanged, const UserPtr& aUser) noexcept;
 
 	// ClientManagerListner
 	virtual void on(UserConnected, const UserPtr& aUser) noexcept;
-	virtual void on(UserUpdated, const UserPtr& aUser) noexcept;
+	virtual void on(ClientManagerListener::UserUpdated, const UserPtr& aUser) noexcept;
 	virtual void on(UserDisconnected, const UserPtr& aUser) noexcept;
 
 	// UploadManagerListener

=== modified file 'win32/stdafx.h'
--- win32/stdafx.h	2011-08-22 16:13:21 +0000
+++ win32/stdafx.h	2011-10-13 13:43:14 +0000
@@ -30,6 +30,7 @@
 
 #ifdef HAS_PCH
 
+
 #include <dwt/forward.h>
 #include <dwt/util/StringUtils.h>
 #include <dwt/widgets/Button.h>