← Back to team overview

linuxdcpp-team team mailing list archive

[Branch ~dcplusplus-team/dcplusplus/trunk] Rev 2992: cache file list dir info in the threaded loader - almost removes GUI freezes when loading large l...

 

------------------------------------------------------------
revno: 2992
committer: poy <poy@xxxxxxxxxx>
branch nick: trunk
timestamp: Thu 2012-07-12 19:50:02 +0200
message:
  cache file list dir info in the threaded loader - almost removes GUI freezes when loading large lists
modified:
  dwt/include/dwt/widgets/Tree.h
  win32/DirectoryListingFrame.cpp
  win32/DirectoryListingFrame.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 'dwt/include/dwt/widgets/Tree.h'
--- dwt/include/dwt/widgets/Tree.h	2012-07-11 17:13:42 +0000
+++ dwt/include/dwt/widgets/Tree.h	2012-07-12 17:50:02 +0000
@@ -240,11 +240,12 @@
 	virtual ~Tree()
 	{}
 
+	TreeViewPtr tree;
+
 private:
 	ImageListPtr itsNormalImageList;
 	ImageListPtr itsStateImageList;
 
-	TreeViewPtr tree;
 	HeaderPtr header;
 
 	std::map<HTREEITEM, std::vector<tstring>> texts;

=== modified file 'win32/DirectoryListingFrame.cpp'
--- win32/DirectoryListingFrame.cpp	2012-07-11 17:13:42 +0000
+++ win32/DirectoryListingFrame.cpp	2012-07-12 17:50:02 +0000
@@ -413,9 +413,8 @@
 	typedef std::function<void (tstring)> ErrorF;
 
 public:
-	FileListLoader(DirectoryListing* dl, const string& path, SuccessF successF, ErrorF errorF) :
-	dl(dl),
-	path(path),
+	FileListLoader(DirectoryListingFrame& parent, SuccessF successF, ErrorF errorF) :
+	parent(parent),
 	successF(successF),
 	errorF(errorF)
 	{
@@ -423,9 +422,10 @@
 
 	int run() {
 		try {
-			dl->loadFile(path);
-			dl->sortDirs();
-			ADLSearchManager::getInstance()->matchListing(*dl);
+			parent.dl->loadFile(parent.path);
+			ADLSearchManager::getInstance()->matchListing(*parent.dl);
+			parent.dl->sortDirs();
+			cacheInfo(parent.dl->getRoot());
 			successF();
 		} catch(const Exception& e) {
 			errorF(Text::toT(e.getError()));
@@ -434,10 +434,16 @@
 	}
 
 private:
-	DirectoryListing* dl;
-	const string& path;
+	DirectoryListingFrame& parent;
 	SuccessF successF;
 	ErrorF errorF;
+
+	void cacheInfo(DirectoryListing::Directory* d) {
+		for(auto i: d->directories) {
+			parent.dirCache[i] = make_unique<DirectoryListingFrame::ItemInfo>(i);
+			cacheInfo(i);
+		}
+	}
 };
 
 void DirectoryListingFrame::loadFile(const tstring& dir) {
@@ -477,12 +483,13 @@
 		setDirty(SettingsManager::BOLD_FL);
 	};
 
-	loader = new FileListLoader(dl.get(), path, [this, dir, finishLoad] { callAsync([=] {
+	loader = new FileListLoader(*this, [this, dir, finishLoad] { callAsync([=] {
 		// success callback
 		loaded = true;
 		finishLoad();
 		addRecent();
 		refreshTree(dir);
+		dirCache.clear();
 	}); }, [this, finishLoad](tstring s) { callAsync([=] {
 		// error callback
 		error = std::move(s);
@@ -512,7 +519,6 @@
 		}
 
 		auto base = dl->updateXML(txt);
-		dl->sortDirs();
 		dl->save(path);
 
 		// remove previous ADLS matches.
@@ -534,6 +540,8 @@
 		}
 		ADLSearchManager::getInstance()->matchListing(*dl);
 
+		dl->sortDirs();
+
 		loaded = true;
 		addRecent();
 
@@ -1060,7 +1068,8 @@
 }
 
 void DirectoryListingFrame::addDir(DirectoryListing::Directory* d, HTREEITEM parent) {
-	auto item = dirs->insert(new ItemInfo(d), parent);
+	auto cached = dirCache.find(d);
+	auto item = dirs->insert(cached != dirCache.end() ? cached->second.release() : new ItemInfo(d), parent);
 	if(d->getAdls())
 		dirs->setItemState(item, TVIS_BOLD, TVIS_BOLD);
 	updateDir(d, item);

=== modified file 'win32/DirectoryListingFrame.h'
--- win32/DirectoryListingFrame.h	2012-07-11 17:13:42 +0000
+++ win32/DirectoryListingFrame.h	2012-07-12 17:50:02 +0000
@@ -19,6 +19,10 @@
 #ifndef DCPLUSPLUS_WIN32_DIRECTORY_LISTING_FRAME_H
 #define DCPLUSPLUS_WIN32_DIRECTORY_LISTING_FRAME_H
 
+#include <deque>
+#include <memory>
+#include <unordered_map>
+
 #include <dcpp/forward.h>
 #include <dcpp/ClientManagerListener.h>
 #include <dcpp/DirectoryListing.h>
@@ -32,6 +36,8 @@
 #include "UserInfoBase.h"
 
 using std::deque;
+using std::unique_ptr;
+using std::unordered_map;
 
 class FileListLoader;
 
@@ -50,6 +56,8 @@
 
 	using IRecent<DirectoryListingFrame>::setText;
 
+	friend class FileListLoader;
+
 public:
 	enum Status {
 		STATUS_SHOW_TREE,
@@ -155,6 +163,7 @@
 
 	FileListLoader* loader;
 	LabelPtr loading;
+	unordered_map<DirectoryListing::Directory*, unique_ptr<ItemInfo>> dirCache;
 
 	RebarPtr rebar;
 	ComboBoxPtr pathBox;

=== modified file 'win32/stdafx.h'
--- win32/stdafx.h	2012-07-11 17:13:42 +0000
+++ win32/stdafx.h	2012-07-12 17:50:02 +0000
@@ -48,6 +48,7 @@
 #include <dwt/widgets/Table.h>
 #include <dwt/widgets/TabView.h>
 #include <dwt/widgets/TextBox.h>
+#include <dwt/widgets/Tree.h>
 #include <dwt/widgets/Window.h>
 
 #include "ComboBox.h"