📄 queueframe.cpp
字号:
ctrlDirs.ClientToScreen(&pt);
}
usingDirMenu = true;
dirMenu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, m_hWnd);
return TRUE;
}
bHandled = FALSE;
return FALSE;
}
LRESULT QueueFrame::onSearchAlternates(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
if(ctrlQueue.GetSelectedCount() == 1) {
int i = ctrlQueue.GetNextItem(-1, LVNI_SELECTED);
QueueItemInfo* ii = ctrlQueue.getItemData(i);
if(ii->getTTH() != NULL) {
WinUtil::searchHash(ii->getTTH());
} else {
tstring searchString = Text::toT(SearchManager::clean(Text::fromT(ii->getTargetFileName())));
if(!searchString.empty()) {
bool bigFile = (ii->getSize() > 10*1024*1024);
if(bigFile) {
SearchFrame::openWindow(searchString, ii->getSize()-1, SearchManager::SIZE_ATLEAST, ShareManager::getInstance()->getType(Text::fromT(ii->getTargetFileName())));
} else {
SearchFrame::openWindow(searchString, ii->getSize()+1, SearchManager::SIZE_ATMOST, ShareManager::getInstance()->getType(Text::fromT(ii->getTargetFileName())));
}
}
}
}
return 0;
}
LRESULT QueueFrame::onBitziLookup(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
if(ctrlQueue.GetSelectedCount() == 1) {
int i = ctrlQueue.GetNextItem(-1, LVNI_SELECTED);
QueueItemInfo* ii = ctrlQueue.getItemData(i);
WinUtil::bitziLink(ii->getTTH());
}
return 0;
}
LRESULT QueueFrame::onCopyMagnet(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
if(ctrlQueue.GetSelectedCount() == 1) {
int i = ctrlQueue.GetNextItem(-1, LVNI_SELECTED);
QueueItemInfo* ii = ctrlQueue.getItemData(i);
WinUtil::copyMagnet(ii->getTTH(), ii->getTargetFileName());
}
return 0;
}
LRESULT QueueFrame::onBrowseList(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
if(ctrlQueue.GetSelectedCount() == 1) {
CMenuItemInfo mi;
mi.fMask = MIIM_DATA;
browseMenu.GetMenuItemInfo(wID, FALSE, &mi);
QueueItemInfo::SourceInfo* s = (QueueItemInfo::SourceInfo*)mi.dwItemData;
try {
QueueManager::getInstance()->addList(s->getUser(), QueueItem::FLAG_CLIENT_VIEW);
} catch(const Exception&) {
}
}
return 0;
}
LRESULT QueueFrame::onReadd(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
if(ctrlQueue.GetSelectedCount() == 1) {
int i = ctrlQueue.GetNextItem(-1, LVNI_SELECTED);
QueueItemInfo* ii = ctrlQueue.getItemData(i);
CMenuItemInfo mi;
mi.fMask = MIIM_DATA;
readdMenu.GetMenuItemInfo(wID, FALSE, &mi);
if(wID == IDC_READD) {
// re-add all sources
for(QueueItemInfo::SourceIter s = ii->getBadSources().begin(); s != ii->getBadSources().end(); ) {
QueueManager::getInstance()->readd(Text::fromT(ii->getTarget()), s->getUser());
}
} else {
QueueItemInfo::SourceInfo* s = (QueueItemInfo::SourceInfo*)mi.dwItemData;
try {
QueueManager::getInstance()->readd(Text::fromT(ii->getTarget()), s->getUser());
} catch(const Exception& e) {
ctrlStatus.SetText(0, Text::toT(e.getError()).c_str());
}
}
}
return 0;
}
LRESULT QueueFrame::onRemoveSource(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
if(ctrlQueue.GetSelectedCount() == 1) {
int i = ctrlQueue.GetNextItem(-1, LVNI_SELECTED);
QueueItemInfo* ii = ctrlQueue.getItemData(i);
if(wID == IDC_REMOVE_SOURCE) {
for(QueueItemInfo::SourceIter si = ii->getSources().begin(); si != ii->getSources().end(); ) {
QueueManager::getInstance()->removeSource(Text::fromT(ii->getTarget()), si->getUser(), QueueItem::Source::FLAG_REMOVED);
}
} else {
CMenuItemInfo mi;
mi.fMask = MIIM_DATA;
removeMenu.GetMenuItemInfo(wID, FALSE, &mi);
QueueItemInfo::SourceInfo* s = (QueueItemInfo::SourceInfo*)mi.dwItemData;
QueueManager::getInstance()->removeSource(Text::fromT(ii->getTarget()), s->getUser(), QueueItem::Source::FLAG_REMOVED);
}
}
return 0;
}
LRESULT QueueFrame::onRemoveSources(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
CMenuItemInfo mi;
mi.fMask = MIIM_DATA;
removeAllMenu.GetMenuItemInfo(wID, FALSE, &mi);
QueueItemInfo::SourceInfo* s = (QueueItemInfo::SourceInfo*)mi.dwItemData;
QueueManager::getInstance()->removeSource(s->getUser(), QueueItem::Source::FLAG_REMOVED);
return 0;
}
LRESULT QueueFrame::onPM(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
if(ctrlQueue.GetSelectedCount() == 1) {
CMenuItemInfo mi;
mi.fMask = MIIM_DATA;
pmMenu.GetMenuItemInfo(wID, FALSE, &mi);
QueueItemInfo::SourceInfo* s = (QueueItemInfo::SourceInfo*)mi.dwItemData;
PrivateFrame::openWindow(s->getUser());
}
return 0;
}
LRESULT QueueFrame::onPriority(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
QueueItem::Priority p;
switch(wID) {
case IDC_PRIORITY_PAUSED: p = QueueItem::PAUSED; break;
case IDC_PRIORITY_LOWEST: p = QueueItem::LOWEST; break;
case IDC_PRIORITY_LOW: p = QueueItem::LOW; break;
case IDC_PRIORITY_NORMAL: p = QueueItem::NORMAL; break;
case IDC_PRIORITY_HIGH: p = QueueItem::HIGH; break;
case IDC_PRIORITY_HIGHEST: p = QueueItem::HIGHEST; break;
default: p = QueueItem::DEFAULT; break;
}
if(usingDirMenu) {
setPriority(ctrlDirs.GetSelectedItem(), p);
} else {
int i = -1;
while( (i = ctrlQueue.GetNextItem(i, LVNI_SELECTED)) != -1) {
QueueManager::getInstance()->setPriority(Text::fromT(ctrlQueue.getItemData(i)->getTarget()), p);
}
}
return 0;
}
void QueueFrame::removeDir(HTREEITEM ht) {
if(ht == NULL)
return;
HTREEITEM child = ctrlDirs.GetChildItem(ht);
while(child) {
removeDir(child);
child = ctrlDirs.GetNextSiblingItem(child);
}
const tstring& name = getDir(ht);
DirectoryPair dp = directories.equal_range(name);
for(DirectoryIter i = dp.first; i != dp.second; ++i) {
QueueManager::getInstance()->remove(Text::fromT(i->second->getTarget()));
}
}
/*
* @param inc True = increase, False = decrease
*/
void QueueFrame::changePriority(bool inc){
int i = -1;
while( (i = ctrlQueue.GetNextItem(i, LVNI_SELECTED)) != -1){
QueueItem::Priority p = ctrlQueue.getItemData(i)->getPriority();
if ((inc && p == QueueItem::HIGHEST) || (!inc && p == QueueItem::PAUSED)){
// Trying to go higher than HIGHEST or lower than PAUSED
// so do nothing
continue;
}
switch(p){
case QueueItem::HIGHEST: p = QueueItem::HIGH; break;
case QueueItem::HIGH: p = inc ? QueueItem::HIGHEST : QueueItem::NORMAL; break;
case QueueItem::NORMAL: p = inc ? QueueItem::HIGH : QueueItem::LOW; break;
case QueueItem::LOW: p = inc ? QueueItem::NORMAL : QueueItem::LOWEST; break;
case QueueItem::LOWEST: p = inc ? QueueItem::LOW : QueueItem::PAUSED; break;
case QueueItem::PAUSED: p = QueueItem::LOWEST; break;
}
QueueManager::getInstance()->setPriority(Text::fromT(ctrlQueue.getItemData(i)->getTarget()), p);
}
}
void QueueFrame::setPriority(HTREEITEM ht, const QueueItem::Priority& p) {
if(ht == NULL)
return;
HTREEITEM child = ctrlDirs.GetChildItem(ht);
while(child) {
setPriority(child, p);
child = ctrlDirs.GetNextSiblingItem(child);
}
const tstring& name = getDir(ht);
DirectoryPair dp = directories.equal_range(name);
for(DirectoryIter i = dp.first; i != dp.second; ++i) {
QueueManager::getInstance()->setPriority(Text::fromT(i->second->getTarget()), p);
}
}
void QueueFrame::updateStatus() {
if(ctrlStatus.IsWindow()) {
int64_t total = 0;
int cnt = ctrlQueue.GetSelectedCount();
if(cnt == 0) {
cnt = ctrlQueue.GetItemCount();
if(showTree) {
for(int i = 0; i < cnt; ++i) {
QueueItemInfo* ii = ctrlQueue.getItemData(i);
total += (ii->getSize() > 0) ? ii->getSize() : 0;
}
} else {
total = queueSize;
}
} else {
int i = -1;
while( (i = ctrlQueue.GetNextItem(i, LVNI_SELECTED)) != -1) {
QueueItemInfo* ii = ctrlQueue.getItemData(i);
total += (ii->getSize() > 0) ? ii->getSize() : 0;
}
}
tstring tmp1 = Text::toT(STRING(ITEMS) + ": " + Util::toString(cnt));
tstring tmp2 = Text::toT(STRING(SIZE) + ": " + Util::formatBytes(total));
bool u = false;
int w = WinUtil::getTextWidth(tmp1, ctrlStatus.m_hWnd);
if(statusSizes[1] < w) {
statusSizes[1] = w;
u = true;
}
ctrlStatus.SetText(2, tmp1.c_str());
w = WinUtil::getTextWidth(tmp2, ctrlStatus.m_hWnd);
if(statusSizes[2] < w) {
statusSizes[2] = w;
u = true;
}
ctrlStatus.SetText(3, tmp2.c_str());
if(dirty) {
tmp1 = Text::toT(STRING(FILES) + ": " + Util::toString(queueItems));
tmp2 = Text::toT(STRING(SIZE) + ": " + Util::formatBytes(queueSize));
w = WinUtil::getTextWidth(tmp2, ctrlStatus.m_hWnd);
if(statusSizes[3] < w) {
statusSizes[3] = w;
u = true;
}
ctrlStatus.SetText(4, tmp1.c_str());
w = WinUtil::getTextWidth(tmp2, ctrlStatus.m_hWnd);
if(statusSizes[4] < w) {
statusSizes[4] = w;
u = true;
}
ctrlStatus.SetText(5, tmp2.c_str());
dirty = false;
}
if(u)
UpdateLayout(TRUE);
}
}
void QueueFrame::UpdateLayout(BOOL bResizeBars /* = TRUE */) {
RECT rect;
GetClientRect(&rect);
// position bars and offset their dimensions
UpdateBarsPosition(rect, bResizeBars);
if(ctrlStatus.IsWindow()) {
CRect sr;
int w[6];
ctrlStatus.GetClientRect(sr);
w[5] = sr.right - 16;
#define setw(x) w[x] = max(w[x+1] - statusSizes[x], 0)
setw(4); setw(3); setw(2); setw(1);
w[0] = 16;
ctrlStatus.SetParts(6, w);
ctrlStatus.GetRect(0, sr);
ctrlShowTree.MoveWindow(sr);
}
if(showTree) {
if(GetSinglePaneMode() != SPLIT_PANE_NONE) {
SetSinglePaneMode(SPLIT_PANE_NONE);
updateQueue();
}
} else {
if(GetSinglePaneMode() != SPLIT_PANE_RIGHT) {
SetSinglePaneMode(SPLIT_PANE_RIGHT);
updateQueue();
}
}
CRect rc = rect;
SetSplitterRect(rc);
}
LRESULT QueueFrame::onClose(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) {
if(!closed) {
QueueManager::getInstance()->removeListener(this);
closed = true;
PostMessage(WM_CLOSE);
return 0;
} else {
HTREEITEM ht = ctrlDirs.GetRootItem();
while(ht != NULL) {
clearTree(ht);
ht = ctrlDirs.GetNextSiblingItem(ht);
}
SettingsManager::getInstance()->set(SettingsManager::QUEUEFRAME_SHOW_TREE, ctrlShowTree.GetCheck() == BST_CHECKED);
{
Lock l(cs);
for(QueueIter i = queue.begin(); i != queue.end(); ++i) {
delete i->second;
}
queue.clear();
}
ctrlQueue.DeleteAllItems();
WinUtil::saveHeaderOrder(ctrlQueue, SettingsManager::QUEUEFRAME_ORDER,
SettingsManager::QUEUEFRAME_WIDTHS, COLUMN_LAST, columnIndexes, columnSizes);
bHandled = FALSE;
return 0;
}
}
LRESULT QueueFrame::onItemChanged(int /*idCtrl*/, LPNMHDR /* pnmh */, BOOL& /*bHandled*/) {
updateQueue();
return 0;
}
void QueueFrame::onTab() {
if(showTree) {
HWND focus = ::GetFocus();
if(focus == ctrlDirs.m_hWnd) {
ctrlQueue.SetFocus();
} else if(focus == ctrlQueue.m_hWnd) {
ctrlDirs.SetFocus();
}
}
}
void QueueFrame::updateQueue() {
Lock l(cs);
ctrlQueue.DeleteAllItems();
pair<DirectoryIter, DirectoryIter> i;
if(showTree) {
i = directories.equal_range(getSelectedDir());
} else {
i.first = directories.begin();
i.second = directories.end();
}
ctrlQueue.SetRedraw(FALSE);
for(DirectoryIter j = i.first; j != i.second; ++j) {
QueueItemInfo* ii = j->second;
ii->update();
ctrlQueue.insertItem(ctrlQueue.GetItemCount(), ii, WinUtil::getIconIndex(ii->getTarget()));
}
ctrlQueue.resort();
ctrlQueue.SetRedraw(TRUE);
curDir = getSelectedDir();
updateStatus();
}
void QueueFrame::clearTree(HTREEITEM item) {
HTREEITEM next = ctrlDirs.GetChildItem(item);
while(next != NULL) {
clearTree(next);
next = ctrlDirs.GetNextSiblingItem(next);
}
delete (tstring*)ctrlDirs.GetItemData(item);
}
// Put it here to avoid a copy for each recursion...
static TCHAR tmpBuf[1024];
void QueueFrame::moveNode(HTREEITEM item, HTREEITEM parent) {
TVINSERTSTRUCT tvis;
memset(&tvis, 0, sizeof(tvis));
tvis.itemex.hItem = item;
tvis.itemex.mask = TVIF_CHILDREN | TVIF_HANDLE | TVIF_IMAGE | TVIF_INTEGRAL | TVIF_PARAM |
TVIF_SELECTEDIMAGE | TVIF_STATE | TVIF_TEXT;
tvis.itemex.pszText = tmpBuf;
tvis.itemex.cchTextMax = 1024;
ctrlDirs.GetItem((TVITEM*)&tvis.itemex);
tvis.hInsertAfter = TVI_SORT;
tvis.hParent = parent;
HTREEITEM ht = ctrlDirs.InsertItem(&tvis);
HTREEITEM next = ctrlDirs.GetChildItem(item);
while(next != NULL) {
moveNode(next, ht);
next = ctrlDirs.GetChildItem(item);
}
ctrlDirs.DeleteItem(item);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -