linuxdcpp-team team mailing list archive
-
linuxdcpp-team team
-
Mailing list archive
-
Message #05844
[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"