← Back to team overview

linuxdcpp-team team mailing list archive

[Branch ~dcplusplus-team/dcplusplus/trunk] Rev 2658: improve multiple hub closing

 

------------------------------------------------------------
revno: 2658
committer: poy <poy@xxxxxxxxxx>
branch nick: trunk
timestamp: Sun 2011-10-30 15:24:14 +0100
message:
  improve multiple hub closing
modified:
  win32/HubFrame.cpp
  win32/HubFrame.h
  win32/MainWindow.cpp
  win32/PrivateFrame.cpp
  win32/PrivateFrame.h
  win32/SearchFrame.cpp
  win32/SearchFrame.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 'win32/HubFrame.cpp'
--- win32/HubFrame.cpp	2011-10-25 18:53:49 +0000
+++ win32/HubFrame.cpp	2011-10-30 14:24:14 +0000
@@ -67,52 +67,63 @@
 HubFrame::FrameList HubFrame::frames;
 
 void HubFrame::openWindow(TabViewPtr parent, const string& url, bool activate, bool connect) {
-	for(FrameIter i = frames.begin(); i != frames.end(); ++i) {
-		HubFrame* frame = *i;
-		if(frame->url == url) {
-			if(activate)
-				frame->activate();
-			else
-				frame->setDirty(SettingsManager::BOLD_HUB);
-			return;
-		}
+	auto i = find_if(frames.begin(), frames.end(), [&url](HubFrame* frame) { return frame->url == url; });
+
+	if(i == frames.end()) {
+		auto frame = new HubFrame(parent, url, connect);
+		if(activate)
+			frame->activate();
+
+	} else {
+		auto frame = *i;
+		if(activate)
+			frame->activate();
+		else
+			frame->setDirty(SettingsManager::BOLD_HUB);
 	}
-
-	auto frame = new HubFrame(parent, url, connect);
-	if(activate)
-		frame->activate();
 }
 
 void HubFrame::activateWindow(const string& url) {
-	for(auto i = frames.cbegin(), iend = frames.cend(); i != iend; ++i) {
-		auto frame = *i;
-		if(frame->url == url) {
-			frame->activate();
-		}
+	auto i = find_if(frames.begin(), frames.end(), [&url](HubFrame* frame) { return frame->url == url; });
+	if(i != frames.end()) {
+		(*i)->activate();
 	}
 }
 
-void HubFrame::closeAll(bool all) {
-	for(FrameIter i = frames.begin(); i != frames.end(); ++i) {
-		HubFrame* frame = *i;
-		if(all || !(frame->client->isConnected())) {
+void HubFrame::closeAll(ClosePred f) {
+	if(!WinUtil::mainWindow->getEnabled())
+		return;
+
+	auto toClose = frames;
+	if(f) {
+		toClose.erase(std::remove_if(toClose.begin(), toClose.end(), f), toClose.end());
+	}
+
+	if(!toClose.empty() && (!BOOLSETTING(CONFIRM_HUB_CLOSING) || dwt::MessageBox(WinUtil::mainWindow).show(
+		str(TF_("Really close %1% hub windows?") % toClose.size()), _T(APPNAME) _T(" ") _T(VERSIONSTRING),
+		dwt::MessageBox::BOX_YESNO, dwt::MessageBox::BOX_ICONQUESTION) == IDYES))
+	{
+		for(auto i = toClose.begin(); i != toClose.end(); ++i) {
+			auto frame = *i;
+			frame->confirmClose = false;
 			frame->close(true);
 		}
 	}
 }
 
+void HubFrame::closeAll(bool disconnected) {
+	closeAll(disconnected ? [](HubFrame* frame) { return frame->client->isConnected(); } : ClosePred());
+}
+
 void HubFrame::closeFavGroup(const string& group, bool reversed) {
-	for(FrameIter i = frames.begin(); i != frames.end(); ++i) {
-		HubFrame* frame = *i;
+	closeAll([&](HubFrame* frame) -> bool {
 		FavoriteHubEntry* fav = FavoriteManager::getInstance()->getFavoriteHubEntry(frame->url);
-		if((fav && fav->getGroup() == group) ^ reversed) {
-			frame->close(true);
-		}
-	}
+		return (fav && fav->getGroup() == group) ^ !reversed;
+	});
 }
 
 void HubFrame::resortUsers() {
-	for(FrameIter i = frames.begin(); i != frames.end(); ++i)
+	for(auto i = frames.begin(); i != frames.end(); ++i)
 		(*i)->resortForFavsFirst(true);
 }
 
@@ -151,6 +162,7 @@
 resort(false),
 showJoins(BOOLSETTING(SHOW_JOINS)),
 favShowJoins(BOOLSETTING(FAV_SHOW_JOINS)),
+confirmClose(true),
 currentUser(0),
 hubMenu(false),
 inTabComplete(false)
@@ -259,9 +271,12 @@
 }
 
 bool HubFrame::preClosing() {
-	if(BOOLSETTING(CONFIRM_HUB_CLOSING) && !WinUtil::mainWindow->closing() &&
-		dwt::MessageBox(this).show(getText() + _T("\n\n") + T_("Really close?"), _T(APPNAME) _T(" ") _T(VERSIONSTRING), dwt::MessageBox::BOX_YESNO, dwt::MessageBox::BOX_ICONQUESTION) != IDYES)
+	if(BOOLSETTING(CONFIRM_HUB_CLOSING) && confirmClose && !WinUtil::mainWindow->closing() &&
+		dwt::MessageBox(this).show(getText() + _T("\n\n") + T_("Really close?"), _T(APPNAME) _T(" ") _T(VERSIONSTRING),
+		dwt::MessageBox::BOX_YESNO, dwt::MessageBox::BOX_ICONQUESTION) != IDYES)
+	{
 		return false;
+	}
 
 	FavoriteManager::getInstance()->removeListener(this);
 	client->removeListener(this);

=== modified file 'win32/HubFrame.h'
--- win32/HubFrame.h	2011-10-13 13:43:14 +0000
+++ win32/HubFrame.h	2011-10-30 14:24:14 +0000
@@ -67,8 +67,14 @@
 
 	static void openWindow(TabViewPtr parent, const string& url, bool activate = true, bool connect = true);
 	static void activateWindow(const string& url);
-	static void closeAll(bool all);
+
+private:
+	typedef std::function<bool (HubFrame*)> ClosePred;
+	static void closeAll(ClosePred f = 0);
+public:
+	static void closeAll(bool disconnected);
 	static void closeFavGroup(const string& group, bool reversed);
+
 	static void resortUsers();
 
 	WindowParams getWindowParams() const;
@@ -172,6 +178,7 @@
 	bool resort;
 	bool showJoins;
 	bool favShowJoins;
+	bool confirmClose;
 
 	TaskQueue tasks; // todo get rid of TaskQueue
 
@@ -187,7 +194,6 @@
 	bool inTabComplete;
 
 	typedef std::vector<HubFrame*> FrameList;
-	typedef FrameList::iterator FrameIter;
 	static FrameList frames;
 
 	HubFrame(TabViewPtr parent, const string& url, bool connect);

=== modified file 'win32/MainWindow.cpp'
--- win32/MainWindow.cpp	2011-10-21 19:32:21 +0000
+++ win32/MainWindow.cpp	2011-10-30 14:24:14 +0000
@@ -325,14 +325,14 @@
 	{
 		MenuPtr window = mainMenu->appendPopup(T_("&Window"));
 
-		window->appendItem(T_("Close all hubs"), [] { HubFrame::closeAll(true); }, WinUtil::menuIcon(IDI_HUB));
-		window->appendItem(T_("Close disconnected hubs"), [] { HubFrame::closeAll(false); }, WinUtil::menuIcon(IDI_HUB_OFF));
+		window->appendItem(T_("Close all hubs"), [] { HubFrame::closeAll(false); }, WinUtil::menuIcon(IDI_HUB));
+		window->appendItem(T_("Close disconnected hubs"), [] { HubFrame::closeAll(true); }, WinUtil::menuIcon(IDI_HUB_OFF));
 		window->appendItem(T_("Close all hubs of a favorite group"), [this] { handleCloseFavGroup(false); }, WinUtil::menuIcon(IDI_FAVORITE_HUBS));
 		window->appendItem(T_("Close hubs not in a favorite group"), [this] { handleCloseFavGroup(true); }, WinUtil::menuIcon(IDI_FAVORITE_HUBS));
 		window->appendSeparator();
 
-		window->appendItem(T_("Close all PM windows"), &PrivateFrame::closeAll, WinUtil::menuIcon(IDI_PRIVATE));
-		window->appendItem(T_("Close all offline PM windows"), &PrivateFrame::closeAllOffline, WinUtil::menuIcon(IDI_PRIVATE_OFF));
+		window->appendItem(T_("Close all PM windows"), [] { PrivateFrame::closeAll(false); }, WinUtil::menuIcon(IDI_PRIVATE));
+		window->appendItem(T_("Close all offline PM windows"), [] { PrivateFrame::closeAll(true); }, WinUtil::menuIcon(IDI_PRIVATE_OFF));
 		window->appendSeparator();
 
 		window->appendItem(T_("Close all file list windows"), &DirectoryListingFrame::closeAll, WinUtil::menuIcon(IDI_DIRECTORY));

=== modified file 'win32/PrivateFrame.cpp'
--- win32/PrivateFrame.cpp	2011-10-20 14:14:24 +0000
+++ win32/PrivateFrame.cpp	2011-10-30 14:24:14 +0000
@@ -44,25 +44,19 @@
 void PrivateFrame::openWindow(TabViewPtr parent, const HintedUser& replyTo_, const tstring& msg,
 	const string& logPath, bool activate)
 {
-	PrivateFrame* pf;
-	FrameIter i = frames.find(replyTo_);
-	if(i == frames.end()) {
-		pf = new PrivateFrame(parent, replyTo_, logPath);
-	} else {
-		pf = i->second;
-	}
+	auto i = frames.find(replyTo_);
+	auto frame = (i == frames.end()) ? new PrivateFrame(parent, replyTo_, logPath) : i->second;
 	if(activate)
-		pf->activate();
+		frame->activate();
 	if(!msg.empty())
-		pf->sendMessage(msg);
-
+		frame->sendMessage(msg);
 }
 
 void PrivateFrame::gotMessage(TabViewPtr parent, const UserPtr& from, const UserPtr& to, const UserPtr& replyTo,
 							  const tstring& aMessage, const string& hubHint)
 {
 	const UserPtr& user = (replyTo == ClientManager::getInstance()->getMe()) ? to : replyTo;
-	FrameIter i = frames.find(user);
+	auto i = frames.find(user);
 	if(i == frames.end()) {
 		auto p = new PrivateFrame(parent, HintedUser(user, hubHint));
 		if(!BOOLSETTING(POPUNDER_PM))
@@ -85,15 +79,11 @@
 		i->second->activate();
 }
 
-void PrivateFrame::closeAll(){
-	for(FrameIter i = frames.begin(); i != frames.end(); ++i)
-		i->second->close(true);
-}
-
-void PrivateFrame::closeAllOffline() {
-	for(FrameIter i = frames.begin(); i != frames.end(); ++i) {
-		if(!i->second->online)
+void PrivateFrame::closeAll(bool offline) {
+	for(auto i = frames.begin(); i != frames.end(); ++i) {
+		if(!offline || !i->second->online) {
 			i->second->close(true);
+		}
 	}
 }
 

=== modified file 'win32/PrivateFrame.h'
--- win32/PrivateFrame.h	2011-10-20 14:14:24 +0000
+++ win32/PrivateFrame.h	2011-10-30 14:24:14 +0000
@@ -62,8 +62,7 @@
 		const string& logPath = Util::emptyString, bool activate = true);
 	static void activateWindow(const UserPtr& u);
 	static bool isOpen(const UserPtr& u) { return frames.find(u) != frames.end(); }
-	static void closeAll();
-	static void closeAllOffline();
+	static void closeAll(bool offline);
 
 	WindowParams getWindowParams() const;
 	static void parseWindowParams(TabViewPtr parent, const WindowParams& params);
@@ -81,7 +80,6 @@
 	bool online;
 
 	typedef unordered_map<UserPtr, PrivateFrame*, User::Hash> FrameMap;
-	typedef FrameMap::iterator FrameIter;
 	static FrameMap frames;
 
 	PrivateFrame(TabViewPtr parent, const HintedUser& replyTo_, const string& logPath = Util::emptyString);

=== modified file 'win32/SearchFrame.cpp'
--- win32/SearchFrame.cpp	2011-10-20 14:14:24 +0000
+++ win32/SearchFrame.cpp	2011-10-30 14:24:14 +0000
@@ -104,7 +104,7 @@
 }
 
 void SearchFrame::closeAll() {
-	for(FrameIter i = frames.begin(); i != frames.end(); ++i)
+	for(auto i = frames.begin(); i != frames.end(); ++i)
 		(*i)->close(true);
 }
 

=== modified file 'win32/SearchFrame.h'
--- win32/SearchFrame.h	2011-10-17 19:39:46 +0000
+++ win32/SearchFrame.h	2011-10-30 14:24:14 +0000
@@ -155,7 +155,6 @@
 	};
 
 	typedef set<SearchFrame*> FrameSet;
-	typedef FrameSet::iterator FrameIter;
 	static FrameSet frames;
 
 	SplitterContainerPtr paned;