📄 queueframe.cpp
字号:
ctrlDirs.DeleteItem(oldRoot);
parent = newRoot;
} else {
// Use this root as parent
parent = next;
next = ctrlDirs.GetChildItem(parent);
}
} else {
parent = startAt;
next = ctrlDirs.GetChildItem(parent);
i = getDir(parent).length();
dcassert(Util::strnicmp(getDir(parent), dir, getDir(parent).length()) == 0);
}
HTREEITEM firstParent = parent;
while( i < dir.length() ) {
while(next != NULL) {
if(next != fileLists) {
const tstring& n = getDir(next);
if(Util::strnicmp(n.c_str()+i, dir.c_str()+i, n.length()-i) == 0) {
// Found a part, we assume it's the best one we can find...
i = n.length();
parent = next;
next = ctrlDirs.GetChildItem(next);
break;
}
}
next = ctrlDirs.GetNextSiblingItem(next);
}
if(next == NULL) {
// We didn't find it, add...
j = dir.find('\\', i);
dcassert(j != string::npos);
tstring name = dir.substr(i, j-i);
tvi.hParent = parent;
tvi.item.pszText = const_cast<TCHAR*>(name.c_str());
tvi.item.lParam = (LPARAM) new tstring(dir.substr(0, j+1));
parent = ctrlDirs.InsertItem(&tvi);
i = j + 1;
}
}
if(firstParent != NULL)
ctrlDirs.Expand(firstParent);
return parent;
}
void QueueFrame::removeDirectory(const tstring& dir, bool isFileList /* = false */) {
// First, find the last name available
string::size_type i = 0;
HTREEITEM next = ctrlDirs.GetRootItem();
HTREEITEM parent = NULL;
if(isFileList) {
dcassert(fileLists != NULL);
delete (tstring*)ctrlDirs.GetItemData(fileLists);
ctrlDirs.DeleteItem(fileLists);
fileLists = NULL;
return;
} else {
while(i < dir.length()) {
while(next != NULL) {
if(next != fileLists) {
const tstring& n = getDir(next);
if(Util::strnicmp(n.c_str()+i, dir.c_str()+i, n.length()-i) == 0) {
// Match!
parent = next;
next = ctrlDirs.GetChildItem(next);
i = n.length();
break;
}
}
next = ctrlDirs.GetNextSiblingItem(next);
}
if(next == NULL)
break;
}
}
next = parent;
while((ctrlDirs.GetChildItem(next) == NULL) && (directories.find(getDir(next)) == directories.end())) {
delete (tstring*)ctrlDirs.GetItemData(next);
parent = ctrlDirs.GetParentItem(next);
ctrlDirs.DeleteItem(next);
if(parent == NULL)
break;
next = parent;
}
}
void QueueFrame::removeDirectories(HTREEITEM ht) {
HTREEITEM next = ctrlDirs.GetChildItem(ht);
while(next != NULL) {
removeDirectories(next);
next = ctrlDirs.GetNextSiblingItem(ht);
}
delete (tstring*)ctrlDirs.GetItemData(ht);
ctrlDirs.DeleteItem(ht);
}
void QueueFrame::on(QueueManagerListener::Removed, QueueItem* aQI) {
QueueItemInfo* qi = NULL;
{
Lock l(cs);
QueueIter i = queue.find(aQI);
dcassert(i != queue.end());
qi = i->second;
queue.erase(i);
dirty = true;
}
speak(REMOVE_ITEM, qi);
}
void QueueFrame::on(QueueManagerListener::Moved, QueueItem* aQI) {
QueueItemInfo* qi = NULL;
QueueItemInfo* qi2 = new QueueItemInfo(aQI);
{
Lock l(cs);
dcassert(queue.find(aQI) != queue.end());
QueueIter i = queue.find(aQI);
qi = i->second;
i->second = qi2;
}
speak(REMOVE_ITEM, qi);
speak(ADD_ITEM, qi2);
}
void QueueFrame::on(QueueManagerListener::SourcesUpdated, QueueItem* aQI) {
QueueItemInfo* ii = NULL;
{
Lock l(cs);
dcassert(queue.find(aQI) != queue.end());
ii = queue[aQI];
ii->setPriority(aQI->getPriority());
ii->setStatus(aQI->getStatus());
ii->setDownloadedBytes(aQI->getDownloadedBytes());
ii->setTTH(aQI->getTTH());
{
for(QueueItemInfo::SourceIter i = ii->getSources().begin(); i != ii->getSources().end(); ) {
if(!aQI->isSource(i->getUser())) {
i = ii->getSources().erase(i);
} else {
++i;
}
}
for(QueueItem::Source::Iter j = aQI->getSources().begin(); j != aQI->getSources().end(); ++j) {
if(!ii->isSource((*j)->getUser())) {
ii->getSources().push_back(QueueItemInfo::SourceInfo(*(*j)));
}
}
}
{
for(QueueItemInfo::SourceIter i = ii->getBadSources().begin(); i != ii->getBadSources().end(); ) {
if(!aQI->isBadSource(i->getUser())) {
i = ii->getBadSources().erase(i);
} else {
++i;
}
}
for(QueueItem::Source::Iter j = aQI->getBadSources().begin(); j != aQI->getBadSources().end(); ++j) {
if(!ii->isBadSource((*j)->getUser())) {
ii->getBadSources().push_back(QueueItemInfo::SourceInfo(*(*j)));
}
}
}
ii->updateMask |= QueueItemInfo::MASK_PRIORITY | QueueItemInfo::MASK_USERS | QueueItemInfo::MASK_ERRORS | QueueItemInfo::MASK_STATUS | QueueItemInfo::MASK_DOWNLOADED | QueueItemInfo::MASK_TTH;
}
speak(UPDATE_ITEM, ii);
}
LRESULT QueueFrame::onSpeaker(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) {
Lock l(cs);
spoken = false;
for(TaskIter ti = tasks.begin(); ti != tasks.end(); ++ti) {
if(ti->first == ADD_ITEM) {
QueueItemInfo* ii = (QueueItemInfo*)ti->second;
dcassert(ctrlQueue.findItem(ii) == -1);
addQueueItem(ii, false);
updateStatus();
} else if(ti->first == REMOVE_ITEM) {
QueueItemInfo* ii = (QueueItemInfo*)ti->second;
if(!showTree || isCurDir(ii->getPath()) ) {
dcassert(ctrlQueue.findItem(ii) != -1);
ctrlQueue.deleteItem(ii);
}
if(!ii->isSet(QueueItem::FLAG_USER_LIST)) {
queueSize-=ii->getSize();
dcassert(queueSize >= 0);
}
queueItems--;
dcassert(queueItems >= 0);
pair<DirectoryIter, DirectoryIter> i = directories.equal_range(ii->getPath());
DirectoryIter j;
for(j = i.first; j != i.second; ++j) {
if(j->second == 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()))
curDir = Util::emptyStringT;
}
delete ii;
updateStatus();
if (BOOLSETTING(BOLD_QUEUE)) {
setDirty();
}
dirty = true;
} else if(ti->first == UPDATE_ITEM) {
QueueItemInfo* ii = (QueueItemInfo*)ti->second;
if(!showTree || isCurDir(ii->getPath())) {
dcassert(ctrlQueue.findItem(ii) != -1);
ii->update();
ctrlQueue.updateItem(ii);
}
}
}
if(tasks.size() > 0) {
tasks.clear();
}
return 0;
}
void QueueFrame::moveSelected() {
int n = ctrlQueue.GetSelectedCount();
if(n == 1) {
// Single file, get the full filename and move...
QueueItemInfo* ii = ctrlQueue.getItemData(ctrlQueue.GetNextItem(-1, LVNI_SELECTED));
tstring name = ii->getTarget();
tstring ext = Util::getFileExt(name);
tstring ext2;
if (!ext.empty())
{
ext = ext.substr(1); // remove leading dot so default extension works when browsing for file
ext2 = _T("*.") + ext;
ext2 += (TCHAR)0;
ext2 += _T("*.") + ext;
}
ext2 += _T("*.*");
ext2 += (TCHAR)0;
ext2 += _T("*.*");
ext2 += (TCHAR)0;
if(WinUtil::browseFile(name, m_hWnd, true, ii->getPath(), ext2.c_str(), ext.empty() ? NULL : ext.c_str())) {
QueueManager::getInstance()->move(Text::fromT(ii->getTarget()), Text::fromT(name));
}
} else if(n > 1) {
tstring name;
if(showTree) {
name = curDir;
}
if(WinUtil::browseDirectory(name, m_hWnd)) {
int i = -1;
while( (i = ctrlQueue.GetNextItem(i, LVNI_SELECTED)) != -1) {
QueueItemInfo* ii = ctrlQueue.getItemData(i);
QueueManager::getInstance()->move(Text::fromT(ii->getTarget()), Text::fromT(name + ii->getTargetFileName()));
}
}
}
}
void QueueFrame::moveSelectedDir() {
if(ctrlDirs.GetSelectedItem() == NULL)
return;
dcassert(!curDir.empty());
tstring name = curDir;
if(WinUtil::browseDirectory(name, m_hWnd)) {
moveDir(ctrlDirs.GetSelectedItem(), name);
}
}
void QueueFrame::moveDir(HTREEITEM ht, const tstring& target) {
HTREEITEM next = ctrlDirs.GetChildItem(ht);
while(next != NULL) {
moveDir(next, target + Util::getLastDir(getDir(next)) + _T(PATH_SEPARATOR_STR));
next = ctrlDirs.GetNextSiblingItem(next);
}
tstring* s = (tstring*)ctrlDirs.GetItemData(ht);
DirectoryPair p = directories.equal_range(*s);
for(DirectoryIter i = p.first; i != p.second; ++i) {
QueueItemInfo* qi = i->second;
QueueManager::getInstance()->move(Text::fromT(qi->getTarget()), Text::fromT(target + qi->getTargetFileName()));
}
}
LRESULT QueueFrame::onContextMenu(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled) {
if (reinterpret_cast<HWND>(wParam) == ctrlQueue && ctrlQueue.GetSelectedCount() > 0) {
POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
if(pt.x == -1 && pt.y == -1) {
WinUtil::getContextMenuPos(ctrlQueue, pt);
}
usingDirMenu = false;
CMenuItemInfo mi;
while(browseMenu.GetMenuItemCount() > 0) {
browseMenu.RemoveMenu(0, MF_BYPOSITION);
}
while(removeMenu.GetMenuItemCount() > 2) {
removeMenu.RemoveMenu(2, MF_BYPOSITION);
}
while(removeAllMenu.GetMenuItemCount() > 0) {
removeAllMenu.RemoveMenu(0, MF_BYPOSITION);
}
while(pmMenu.GetMenuItemCount() > 0) {
pmMenu.RemoveMenu(0, MF_BYPOSITION);
}
while(readdMenu.GetMenuItemCount() > 2) {
readdMenu.RemoveMenu(2, MF_BYPOSITION);
}
if(ctrlQueue.GetSelectedCount() == 1) {
QueueItemInfo* ii = ctrlQueue.getItemData(ctrlQueue.GetNextItem(-1, LVNI_SELECTED));
menuItems = 0;
int pmItems = 0;
QueueItemInfo::SourceIter i;
for(i = ii->getSources().begin(); i != ii->getSources().end(); ++i) {
tstring nick = WinUtil::getNicks(i->getUser());
mi.fMask = MIIM_ID | MIIM_TYPE | MIIM_DATA;
mi.fType = MFT_STRING;
mi.dwTypeData = (LPTSTR)nick.c_str();
mi.dwItemData = (ULONG_PTR)&(*i);
mi.wID = IDC_BROWSELIST + menuItems;
browseMenu.InsertMenuItem(menuItems, TRUE, &mi);
mi.wID = IDC_REMOVE_SOURCE + 1 + menuItems; // "All" is before sources
removeMenu.InsertMenuItem(menuItems + 2, TRUE, &mi); // "All" and separator come first
mi.wID = IDC_REMOVE_SOURCES + menuItems;
removeAllMenu.InsertMenuItem(menuItems, TRUE, &mi);
if(i->getUser()->isOnline()) {
mi.wID = IDC_PM + menuItems;
pmMenu.InsertMenuItem(menuItems, TRUE, &mi);
pmItems++;
}
menuItems++;
}
readdItems = 0;
for(i = ii->getBadSources().begin(); i != ii->getBadSources().end(); ++i) {
tstring nick = WinUtil::getNicks(i->getUser());
mi.fMask = MIIM_ID | MIIM_TYPE | MIIM_DATA;
mi.fType = MFT_STRING;
mi.dwTypeData = (LPTSTR)nick.c_str();
mi.dwItemData = (ULONG_PTR)&(*i);
mi.wID = IDC_READD + 1 + readdItems; // "All" is before sources
readdMenu.InsertMenuItem(readdItems + 2, TRUE, &mi); // "All" and separator come first
readdItems++;
}
if(menuItems == 0) {
singleMenu.EnableMenuItem((UINT_PTR)(HMENU)browseMenu, MFS_GRAYED);
singleMenu.EnableMenuItem((UINT_PTR)(HMENU)removeMenu, MFS_GRAYED);
singleMenu.EnableMenuItem((UINT_PTR)(HMENU)removeAllMenu, MFS_GRAYED);
}
else {
singleMenu.EnableMenuItem((UINT_PTR)(HMENU)browseMenu, MFS_ENABLED);
singleMenu.EnableMenuItem((UINT_PTR)(HMENU)removeMenu, MFS_ENABLED);
singleMenu.EnableMenuItem((UINT_PTR)(HMENU)removeAllMenu, MFS_ENABLED);
}
if(pmItems == 0) {
singleMenu.EnableMenuItem((UINT_PTR)(HMENU)pmMenu, MFS_GRAYED);
}
else {
singleMenu.EnableMenuItem((UINT_PTR)(HMENU)pmMenu, MFS_ENABLED);
}
if(readdItems == 0) {
singleMenu.EnableMenuItem((UINT_PTR)(HMENU)readdMenu, MFS_GRAYED);
}
else {
singleMenu.EnableMenuItem((UINT_PTR)(HMENU)readdMenu, MFS_ENABLED);
}
if(ii->getTTH() == NULL) {
singleMenu.EnableMenuItem(IDC_BITZI_LOOKUP, MFS_GRAYED);
singleMenu.EnableMenuItem(IDC_COPY_MAGNET, MFS_GRAYED);
} else {
singleMenu.EnableMenuItem(IDC_BITZI_LOOKUP, MFS_ENABLED);
singleMenu.EnableMenuItem(IDC_COPY_MAGNET, MFS_ENABLED);
}
singleMenu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, m_hWnd);
} else {
multiMenu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, m_hWnd);
}
return TRUE;
} else if (reinterpret_cast<HWND>(wParam) == ctrlDirs && ctrlDirs.GetSelectedItem() != NULL) {
POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
if(pt.x == -1 && pt.y == -1) {
WinUtil::getContextMenuPos(ctrlDirs, pt);
} else {
// Strange, windows doesn't change the selection on right-click... (!)
UINT a = 0;
ctrlDirs.ScreenToClient(&pt);
HTREEITEM ht = ctrlDirs.HitTest(pt, &a);
if(ht != NULL && ht != ctrlDirs.GetSelectedItem())
ctrlDirs.SelectItem(ht);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -