linuxdcpp-team team mailing list archive
-
linuxdcpp-team team
-
Mailing list archive
-
Message #05730
[Branch ~dcplusplus-team/dcplusplus/trunk] Rev 2951: auto-manage some queue tab memory
------------------------------------------------------------
revno: 2951
committer: poy <poy@xxxxxxxxxx>
branch nick: trunk
timestamp: Mon 2012-06-18 16:16:49 +0200
message:
auto-manage some queue tab memory
modified:
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 'win32/QueueFrame.cpp'
--- win32/QueueFrame.cpp 2012-06-13 01:21:56 +0000
+++ win32/QueueFrame.cpp 2012-06-18 14:16:49 +0000
@@ -161,10 +161,9 @@
HoldRedraw hold(files);
HoldRedraw hold2(dirs);
- for(auto& j: li) {
- QueueItem* aQI = j.second;
- QueueItemInfo* ii = new QueueItemInfo(*aQI);
- addQueueItem(ii, true);
+ for(auto& i: li) {
+ QueueItem* aQI = i.second;
+ addQueueItem(QueueItemPtr(new QueueItemInfo(*aQI)), true);
}
// expand top-level directories.
@@ -178,11 +177,10 @@
}
QueueFrame::QueueItemInfo* QueueFrame::getItemInfo(const string& target) {
- auto path = Util::getFilePath(target);
- auto items = directories.equal_range(path);
+ auto items = directories.equal_range(Util::getFilePath(target));
for(auto i = items.first; i != items.second; ++i) {
if(i->second->getTarget() == target) {
- return i->second;
+ return i->second.get();
}
}
return 0;
@@ -229,36 +227,33 @@
}
void QueueFrame::postClosing() {
- for(auto& i: directories) {
- delete i.second;
- }
-
SettingsManager::getInstance()->set(SettingsManager::QUEUE_PANED_POS, paned->getSplitterPos(0));
SettingsManager::getInstance()->set(SettingsManager::QUEUEFRAME_ORDER, WinUtil::toString(files->getColumnOrder()));
SettingsManager::getInstance()->set(SettingsManager::QUEUEFRAME_WIDTHS, WinUtil::toString(files->getColumnWidths()));
}
-void QueueFrame::addQueueItem(QueueItemInfo* ii, bool noSort) {
+void QueueFrame::addQueueItem(QueueItemPtr&& ii, bool noSort) {
if(!ii->isSet(QueueItem::FLAG_USER_LIST)) {
queueSize+=ii->getSize();
}
queueItems++;
dirty = true;
- const string& dir = ii->getPath();
+ auto p = ii.get();
+ const auto& dir = p->getPath();
bool updateDir = (directories.find(dir) == directories.end());
- directories.emplace(dir, ii);
+ directories.emplace(dir, move(ii));
if(updateDir) {
- addDirectory(dir, ii->isSet(QueueItem::FLAG_USER_LIST));
+ addDirectory(dir, p->isSet(QueueItem::FLAG_USER_LIST));
}
if(!BOOLSETTING(QUEUEFRAME_SHOW_TREE) || isCurDir(dir)) {
- ii->update();
+ p->update();
if(noSort) {
- files->insert(files->size(), ii);
+ files->insert(files->size(), p);
} else {
- files->insert(ii);
+ files->insert(p);
}
}
}
@@ -267,7 +262,8 @@
HoldRedraw hold(files);
files->clear();
- pair<DirectoryIter, DirectoryIter> i;
+
+ decltype(directories.equal_range(string())) i;
if(BOOLSETTING(QUEUEFRAME_SHOW_TREE)) {
i = directories.equal_range(getSelectedDir());
} else {
@@ -276,9 +272,9 @@
}
for(auto j = i.first; j != i.second; ++j) {
- QueueItemInfo* ii = j->second;
+ auto& ii = j->second;
ii->update();
- files->insert(files->size(), ii);
+ files->insert(files->size(), ii.get());
}
files->resort();
@@ -657,7 +653,7 @@
auto p = directories.equal_range(dir);
for(auto i = p.first; i != p.second; ++i) {
- QueueItemInfo* ii = i->second;
+ auto& ii = i->second;
QueueManager::getInstance()->move(ii->getTarget(), target + Util::getFileName(ii->getTarget()));
}
}
@@ -747,8 +743,7 @@
removeDir(child);
child = dirs->getNextSibling(child);
}
- const string& name = getDir(ht);
- auto dp = directories.equal_range(name);
+ auto dp = directories.equal_range(getDir(ht));
for(auto i = dp.first; i != dp.second; ++i) {
QueueManager::getInstance()->remove(i->second->getTarget());
}
@@ -978,7 +973,7 @@
void QueueFrame::onAdded(QueueItemInfo* ii) {
dcassert(files->find(ii) == -1);
- addQueueItem(ii, false);
+ addQueueItem(QueueItemPtr(ii), false);
updateStatus();
}
@@ -989,13 +984,15 @@
return;
}
- if(!BOOLSETTING(QUEUEFRAME_SHOW_TREE) || isCurDir(ii->getPath()) ) {
+ const auto path = ii->getPath();
+ const auto userList = ii->isSet(QueueItem::FLAG_USER_LIST);
+ const auto isCur = isCurDir(path);
+
+ if(isCur || !BOOLSETTING(QUEUEFRAME_SHOW_TREE)) {
dcassert(files->find(ii) != -1);
files->erase(ii);
}
- bool userList = ii->isSet(QueueItem::FLAG_USER_LIST);
-
if(!userList) {
queueSize-=ii->getSize();
dcassert(queueSize >= 0);
@@ -1003,21 +1000,21 @@
queueItems--;
dcassert(queueItems >= 0);
- auto i = directories.equal_range(ii->getPath());
+ auto i = directories.equal_range(path);
auto j = i.first;
for(; j != i.second; ++j) {
- if(j->second == ii)
+ if(j->second.get() == ii)
break;
}
dcassert(j != i.second);
directories.erase(j);
- if(directories.count(ii->getPath()) == 0) {
- removeDirectory(ii->getPath(), ii->isSet(QueueItem::FLAG_USER_LIST));
- if(isCurDir(ii->getPath()))
+
+ if(directories.count(path) == 0) {
+ removeDirectory(path, userList);
+ if(isCur)
curDir.clear();
}
- delete ii;
updateStatus();
if(!userList)
setDirty(SettingsManager::BOLD_QUEUE);
=== modified file 'win32/QueueFrame.h'
--- win32/QueueFrame.h 2012-03-21 22:50:43 +0000
+++ win32/QueueFrame.h 2012-06-18 14:16:49 +0000
@@ -28,6 +28,7 @@
#include "StaticFrame.h"
+using std::unique_ptr;
using std::unordered_multimap;
class QueueFrame :
@@ -181,12 +182,14 @@
private:
- std::unique_ptr<Display> display;
+ unique_ptr<Display> display;
QueueItemInfo(const QueueItemInfo&);
QueueItemInfo& operator=(const QueueItemInfo&);
};
+ typedef unique_ptr<QueueItemInfo> QueueItemPtr;
+
SplitterContainerPtr paned;
typedef TypedTree<DirItemInfo> WidgetDirs;
@@ -197,10 +200,7 @@
typedef WidgetFiles* WidgetFilesPtr;
WidgetFilesPtr files;
- typedef unordered_multimap<string, QueueItemInfo*, noCaseStringHash, noCaseStringEq> DirectoryMap;
- typedef DirectoryMap::iterator DirectoryIter;
- typedef pair<DirectoryIter, DirectoryIter> DirectoryPair;
- DirectoryMap directories;
+ unordered_multimap<string, QueueItemPtr, noCaseStringHash, noCaseStringEq> directories;
std::string curDir;
@@ -218,7 +218,7 @@
void updateStatus();
void updateFiles();
- void addQueueItem(QueueItemInfo* qi, bool noSort);
+ void addQueueItem(QueueItemPtr&& ii, bool noSort);
void addQueueList(const QueueItem::StringMap& l);
HTREEITEM addDirectory(const string& dir, bool isFileList = false, HTREEITEM startAt = NULL);