← Back to team overview

linuxdcpp-team team mailing list archive

[Branch ~dcplusplus-team/dcplusplus/trunk] Rev 2430: more user frame fun

 

------------------------------------------------------------
revno: 2430
committer: Jacek Sieka <arnetheduck@xxxxxxxxx>
branch nick: dcplusplus
timestamp: Sat 2011-02-19 20:20:08 +0100
message:
  more user frame fun
modified:
  dcpp/UploadManager.cpp
  dcpp/UploadManager.h
  win32/UsersFrame.cpp
  win32/UsersFrame.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/UploadManager.cpp'
--- dcpp/UploadManager.cpp	2011-01-02 17:12:02 +0000
+++ dcpp/UploadManager.cpp	2011-02-19 19:20:08 +0000
@@ -391,9 +391,19 @@
 	return u;
 }
 
-const UploadManager::FileSet& UploadManager::getWaitingUserFiles(const UserPtr &u) {
-	Lock l(cs);
-	return waitingFiles.find(u)->second;
+UploadManager::FileSet UploadManager::getWaitingUserFiles(const UserPtr &u) const {
+	Lock l(cs);
+	auto i = waitingFiles.find(u);
+	if(i == waitingFiles.end()) {
+		return FileSet();
+	}
+
+	return i->second;
+}
+
+bool UploadManager::isWaiting(const UserPtr &u) const {
+	Lock l(cs);
+	return waitingFiles.find(u) != waitingFiles.end();
 }
 
 void UploadManager::addConnection(UserConnectionPtr conn) {

=== modified file 'dcpp/UploadManager.h'
--- dcpp/UploadManager.h	2011-01-02 17:12:02 +0000
+++ dcpp/UploadManager.h	2011-02-19 19:20:08 +0000
@@ -59,7 +59,8 @@
 	typedef unordered_map<UserPtr, FileSet, User::Hash> FilesMap;
 	void clearUserFiles(const UserPtr&);
 	HintedUserList getWaitingUsers() const;
-	const FileSet& getWaitingUserFiles(const UserPtr&);
+	bool isWaiting(const UserPtr &) const;
+	FileSet getWaitingUserFiles(const UserPtr&) const;
 
 	/** @internal */
 	void addConnection(UserConnectionPtr conn);

=== modified file 'win32/UsersFrame.cpp'
--- win32/UsersFrame.cpp	2011-02-19 17:20:34 +0000
+++ win32/UsersFrame.cpp	2011-02-19 19:20:08 +0000
@@ -25,6 +25,8 @@
 #include <dcpp/FavoriteManager.h>
 #include <dcpp/ClientManager.h>
 #include <dcpp/QueueManager.h>
+#include <dcpp/UploadManager.h>
+
 #include <dcpp/version.h>
 
 #include <dwt/widgets/Splitter.h>
@@ -68,7 +70,7 @@
 	users(0),
 	startup(true)
 {
-	filterGrid = addChild(Grid::Seed(1, 4));
+	filterGrid = addChild(Grid::Seed(1, 5));
 
 	filter = filterGrid->addChild(WinUtil::Seeds::textBox);
 	filter->onUpdated(std::bind(&UsersFrame::handleFilterUpdated, this));
@@ -85,9 +87,13 @@
 	showFavs->onClicked(std::bind(&UsersFrame::handleFilterUpdated, this));
 
 	showQueue = filterGrid->addChild(WinUtil::Seeds::checkBox);
-	showQueue->setText(_T("Download queue"));
+	showQueue->setText(_T("Pending download"));
 	showQueue->onClicked(std::bind(&UsersFrame::handleFilterUpdated, this));
 
+	showWaiting = filterGrid->addChild(WinUtil::Seeds::checkBox);
+	showWaiting->setText(_T("Pending upload"));
+	showWaiting->onClicked(std::bind(&UsersFrame::handleFilterUpdated, this));
+
 	splitter = addChild(VSplitter::Seed(0.7));
 
 	if(!userIcons) {
@@ -131,22 +137,14 @@
 		auto &ou = ClientManager::getInstance()->getUsers();
 
 		for(auto i = ou.begin(); i != ou.end(); ++i) {
-			if(i->second->isOnline()) {
-				addUser(i->second);
-			}
-		}
-	}
-
-	{
-		auto fu = FavoriteManager::getInstance()->getFavoriteUsers();
-
-		for(auto i = fu.begin(); i != fu.end(); ++i) {
-			addUser(i->second.getUser());
+			addUser(i->second);
 		}
 	}
 
 	FavoriteManager::getInstance()->addListener(this);
 	ClientManager::getInstance()->addListener(this);
+	UploadManager::getInstance()->addListener(this);
+	QueueManager::getInstance()->addListener(this);
 
 	initStatus();
 
@@ -180,6 +178,9 @@
 bool UsersFrame::preClosing() {
 	FavoriteManager::getInstance()->removeListener(this);
 	ClientManager::getInstance()->removeListener(this);
+	UploadManager::getInstance()->removeListener(this);
+	QueueManager::getInstance()->removeListener(this);
+
 	return true;
 }
 
@@ -223,46 +224,45 @@
 }
 
 void UsersFrame::addUser(const UserPtr& aUser) {
+	if(!show(aUser, true)) {
+		return;
+	}
+
 	auto ui = userInfos.find(aUser);
 	if(ui == userInfos.end()) {
 		auto x = make_shared<UserInfo>(aUser);
-		if(matches(*x)){
+		userInfos.insert(std::make_pair(aUser, x));
+
+		if(matches(*x)) {
 			users->insert(x.get());
 		}
-
-		userInfos.insert(std::make_pair(aUser, std::move(x)));
 	} else {
-		// TODO Update
+		updateUser(aUser);
 	}
 }
 
 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);
+			return;
+		}
+
 		ui->second->update(aUser);
 
 		if(matches(*ui->second)) {
 			auto i = users->find(ui->second.get());
 			if(i != -1) {
 				users->update(i);
+			} else {
+				users->insert(ui->second.get());
 			}
 		}
 	}
 }
 
-void UsersFrame::removeUser(const UserPtr& aUser) {
-	if(FavoriteManager::getInstance()->isFavoriteUser(aUser)) {
-		updateUser(aUser);
-		return;
-	}
-
-	auto ui = userInfos.find(aUser);
-	if(ui != userInfos.end()) {
-		users->erase(ui->second.get());
-		userInfos.erase(ui);
-	}
-}
-
 void UsersFrame::handleSelectionChanged() {
 	// Clear old items
 	auto children = userInfo->getChildren<Control>();
@@ -404,21 +404,28 @@
 }
 
 bool UsersFrame::matches(const UserInfo &ui) {
-
 	auto txt = filter->getText();
 	if(!txt.empty() && Util::findSubString(ui.columns[COLUMN_NICK], txt) == string::npos) {
 		return false;
 	}
 
-	if(showOnline->getChecked() && ui.getUser().user->isOnline()) {
-		return true;
-	}
-
-	if(showFavs->getChecked() && FavoriteManager::getInstance()->isFavoriteUser(ui.getUser())) {
-		return true;
-	}
-
-	if(showQueue->getChecked() && QueueManager::getInstance()->getQueued(ui.getUser()) > 0) {
+	return show(ui.getUser(), false);
+}
+
+bool UsersFrame::show(const UserPtr &u, bool any) const {
+	if((any || showOnline->getChecked()) && u->isOnline()) {
+		return true;
+	}
+
+	if((any || showFavs->getChecked()) && FavoriteManager::getInstance()->isFavoriteUser(u)) {
+		return true;
+	}
+
+	if((any || showQueue->getChecked()) && QueueManager::getInstance()->getQueued(u) > 0) {
+		return true;
+	}
+
+	if((any || showWaiting->getChecked()) && UploadManager::getInstance()->isWaiting(u)) {
 		return true;
 	}
 
@@ -430,7 +437,7 @@
 }
 
 void UsersFrame::on(UserAdded, const FavoriteUser& aUser) throw() {
-	callAsync(std::bind(&UsersFrame::updateUser, this, aUser.getUser()));
+	callAsync(std::bind(&UsersFrame::addUser, this, aUser.getUser()));
 }
 
 void UsersFrame::on(UserRemoved, const FavoriteUser& aUser) throw() {
@@ -450,5 +457,31 @@
 }
 
 void UsersFrame::on(UserDisconnected, const UserPtr& aUser) throw() {
-	callAsync(std::bind(&UsersFrame::removeUser, this, aUser));
+	callAsync(std::bind(&UsersFrame::updateUser, this, aUser));
+}
+
+void UsersFrame::on(WaitingAddFile, const HintedUser& aUser, const string&) throw() {
+	callAsync(std::bind(&UsersFrame::addUser, this, aUser.user));
+}
+
+void UsersFrame::on(WaitingRemoveUser, const HintedUser& aUser) throw() {
+	callAsync(std::bind(&UsersFrame::updateUser, this, aUser.user));
+}
+
+void UsersFrame::on(Added, QueueItem* qi) throw() {
+	for(auto i = qi->getSources().begin(); i != qi->getSources().end(); ++i) {
+		callAsync(std::bind(&UsersFrame::addUser, this, i->getUser().user));
+	}
+}
+
+void UsersFrame::on(SourcesUpdated, QueueItem* qi) throw() {
+	for(auto i = qi->getSources().begin(); i != qi->getSources().end(); ++i) {
+		callAsync(std::bind(&UsersFrame::updateUser, this, i->getUser().user));
+	}
+}
+
+void UsersFrame::on(Removed, QueueItem* qi) throw() {
+	for(auto i = qi->getSources().begin(); i != qi->getSources().end(); ++i) {
+		callAsync(std::bind(&UsersFrame::updateUser, this, i->getUser().user));
+	}
 }

=== modified file 'win32/UsersFrame.h'
--- win32/UsersFrame.h	2011-02-19 15:32:03 +0000
+++ win32/UsersFrame.h	2011-02-19 19:20:08 +0000
@@ -21,6 +21,8 @@
 
 #include <dcpp/FavoriteManagerListener.h>
 #include <dcpp/ClientManagerListener.h>
+#include <dcpp/UploadManagerListener.h>
+#include <dcpp/QueueManagerListener.h>
 
 #include "StaticFrame.h"
 #include "WinUtil.h"
@@ -33,6 +35,8 @@
 	public StaticFrame<UsersFrame>,
 	private FavoriteManagerListener,
 	private ClientManagerListener,
+	private UploadManagerListener,
+	private QueueManagerListener,
 	public AspectUserInfo<UsersFrame>
 {
 	typedef StaticFrame<UsersFrame> BaseType;
@@ -128,6 +132,7 @@
 	CheckBoxPtr showFavs;
 	CheckBoxPtr showOnline;
 	CheckBoxPtr showQueue;
+	CheckBoxPtr showWaiting;
 
 	static dwt::ImageListPtr userIcons;
 
@@ -138,7 +143,6 @@
 
 	void addUser(const UserPtr& aUser);
 	void updateUser(const UserPtr& aUser);
-	void removeUser(const UserPtr& aUser);
 
 	void handleDescription();
 	void handleRemove();
@@ -150,6 +154,8 @@
 	void handleFilterUpdated();
 	bool matches(const UserInfo& ui);
 
+	bool show(const UserPtr& u, bool any) const;
+
 	// AspectUserInfo
 	UserInfoList selectedUsersImpl() const;
 
@@ -162,6 +168,15 @@
 	virtual void on(UserConnected, const UserPtr& aUser) throw();
 	virtual void on(UserUpdated, const UserPtr& aUser) throw();
 	virtual void on(UserDisconnected, const UserPtr& aUser) throw();
+
+	// UploadManagerListener
+	virtual void on(WaitingAddFile, const HintedUser&, const string&) throw();
+	virtual void on(WaitingRemoveUser, const HintedUser&) throw();
+
+	// QueueManagerListener
+	virtual void on(Added, QueueItem*) throw();
+	virtual void on(SourcesUpdated, QueueItem*) throw();
+	virtual void on(Removed, QueueItem*) throw();
 };
 
 #endif // !defined(USERS_FRAME_H)