← Back to team overview

linuxdcpp-team team mailing list archive

[Branch ~dcplusplus-team/dcplusplus/trunk] Rev 2561: show bundle contents

 

------------------------------------------------------------
revno: 2561
committer: Jacek Sieka <arnetheduck@xxxxxxxxx>
branch nick: dcplusplus
timestamp: Sun 2011-06-19 20:17:09 +0200
message:
  show bundle contents
modified:
  dcpp/Bundle.cpp
  dcpp/Bundle.h
  win32/QueueFrame.cpp
  win32/QueueFrame.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/Bundle.cpp'
--- dcpp/Bundle.cpp	2011-05-28 15:31:50 +0000
+++ dcpp/Bundle.cpp	2011-06-19 18:17:09 +0000
@@ -19,10 +19,12 @@
 #include "stdinc.h"
 #include "Bundle.h"
 
+#include <boost/range/algorithm/find_if.hpp>
 #include <boost/range/algorithm/for_each.hpp>
 
 namespace dcpp {
 
+using boost::find_if;
 using boost::for_each;
 
 TTHValue Bundle::getHash() const {
@@ -33,4 +35,8 @@
 	return TTHValue(ret.finalize());
 }
 
+bool Bundle::contains(const TTHValue &tth) const {
+	return find_if(entries, [&](const Entry &e) { return e.tth == tth; }) != entries.end();
+}
+
 }

=== modified file 'dcpp/Bundle.h'
--- dcpp/Bundle.h	2011-05-28 15:31:50 +0000
+++ dcpp/Bundle.h	2011-06-19 18:17:09 +0000
@@ -52,6 +52,7 @@
 	};
 
 	TTHValue getHash() const;
+	bool contains(const TTHValue& tth) const;
 
 	string name;
 

=== modified file 'win32/QueueFrame.cpp'
--- win32/QueueFrame.cpp	2011-06-19 15:00:44 +0000
+++ win32/QueueFrame.cpp	2011-06-19 18:17:09 +0000
@@ -22,6 +22,11 @@
 #include <dcpp/QueueManager.h>
 #include <dcpp/version.h>
 
+#include <boost/range/adaptor/filtered.hpp>
+#include <boost/range/adaptor/map.hpp>
+#include <boost/range/algorithm/find.hpp>
+#include <boost/range/algorithm/for_each.hpp>
+
 #include <dwt/widgets/Grid.h>
 #include <dwt/widgets/FolderDialog.h>
 #include <dwt/widgets/MessageBox.h>
@@ -40,6 +45,11 @@
 using dwt::SplitterContainer;
 using dwt::FolderDialog;
 
+using boost::for_each;
+using boost::find;
+using boost::adaptors::filtered;
+using boost::adaptors::map_values;
+
 const string QueueFrame::id = "Queue";
 const string& QueueFrame::getId() const { return id; }
 
@@ -255,7 +265,7 @@
 	if(updateDir) {
 		addDirectory(dir, ii->isSet(QueueItem::FLAG_USER_LIST));
 	}
-	if(!showTree->getChecked() || isCurDir(dir)) {
+	if(isVisible(ii)) {
 		ii->update();
 		if(noSort) {
 			files->insert(files->size(), ii);
@@ -281,18 +291,46 @@
 	layout();
 }
 
+bool QueueFrame::isVisible(const QueueItemInfo* qii) const {
+	if(!showTree->getChecked()) { return true; }
+
+	auto selected = dirs->getSelectedData();
+	if(!selected) { return false; }
+
+	if(selected->getIsBundle()) {
+		auto bii = bundleInfos.find(TTHValue(selected->getDir()));
+		if(bii == bundleInfos.end()) { return false; }
+		return bii->second->getBundleItem().getBundle()->contains(qii->getTTH());
+	}
+	return isCurDir(qii->getPath());
+}
+
 void QueueFrame::updateFiles() {
 	HoldRedraw hold(files);
 
 	files->clear();
-	auto i = showTree->getChecked()
-		? directories.equal_range(getSelectedDir())
-		: make_pair(directories.begin(), directories.end());
-
-	for(auto j = i.first; j != i.second; ++j) {
-		QueueItemInfo* ii = j->second;
-		ii->update();
-		files->insert(files->size(), ii);
+
+	auto add = [&](QueueItemInfo* qii) {
+		qii->update();
+		files->insert(files->size(), qii);
+	};
+
+	if(showTree->getChecked()) {
+		auto sel = dirs->getSelectedData();
+		if(sel) {
+			if(sel->getIsBundle()) {
+				auto bii = bundleInfos.find(TTHValue(sel->getDir()));
+				if(bii != bundleInfos.end()) {
+					auto filter = [&](QueueItemInfo* qii) {
+						return bii->second->getBundleItem().getBundle()->contains(qii->getTTH());
+					};
+
+					for_each(directories | map_values | filtered(filter), add);
+				}
+			} else {
+				for_each(directories.equal_range(sel->getDir()) | map_values, add);
+			}
+		}
 	}
 
 	files->resort();
@@ -1054,7 +1092,7 @@
 		return;
 	}
 
-	if(!showTree->getChecked() || isCurDir(ii->getPath()) ) {
+	if(isVisible(ii)) {
 		dcassert(files->find(ii) != -1);
 		files->erase(ii);
 	}
@@ -1100,7 +1138,7 @@
 
 	ii->updateMask |= QueueItemInfo::MASK_PRIORITY | QueueItemInfo::MASK_USERS | QueueItemInfo::MASK_ERRORS | QueueItemInfo::MASK_STATUS | QueueItemInfo::MASK_DOWNLOADED;
 
-	if(!showTree->getChecked() || isCurDir(ii->getPath())) {
+	if(isVisible(ii)) {
 		dcassert(files->find(ii) != -1);
 		ii->update();
 		files->update(ii);

=== modified file 'win32/QueueFrame.h'
--- win32/QueueFrame.h	2011-06-19 15:00:44 +0000
+++ win32/QueueFrame.h	2011-06-19 18:17:09 +0000
@@ -241,6 +241,7 @@
 	void removeDirectory(const string& dir, bool isFileList = false);
 
 	bool isCurDir(const string& aDir) const;
+	bool isVisible(const QueueItemInfo *qii) const;
 
 	QueueItemInfo* getItemInfo(const string& target);