📄 downloadlistctrl.cpp
字号:
if (buffer.IsEmpty())
buffer = GetResString(IDS_UNKNOWN);
dc->DrawText(buffer,buffer.GetLength(),lpRect, DLC_DT_TEXT);
break;
}
case 7: // prio
if (lpUpDownClient->GetDownloadState()==DS_ONQUEUE){
if( lpUpDownClient->IsRemoteQueueFull() ){
buffer = GetResString(IDS_QUEUEFULL);
dc->DrawText(buffer,buffer.GetLength(),lpRect, DLC_DT_TEXT);
}
else{
if ( lpUpDownClient->GetRemoteQueueRank()){
buffer.Format(_T("QR: %u"),lpUpDownClient->GetRemoteQueueRank());
dc->DrawText(buffer,buffer.GetLength(),lpRect, DLC_DT_TEXT);
}
else{
dc->DrawText(buffer,buffer.GetLength(),lpRect, DLC_DT_TEXT);
}
}
} else {
dc->DrawText(buffer,buffer.GetLength(),lpRect, DLC_DT_TEXT);
}
break;
case 8: { // status
if (lpCtrlItem->type == AVAILABLE_SOURCE){
buffer = lpUpDownClient->GetDownloadStateDisplayString();
}
else {
buffer = GetResString(IDS_ASKED4ANOTHERFILE);
// ZZ:DownloadManager -->
if(thePrefs.IsExtControlsEnabled()) {
if(!lpUpDownClient->IsInOtherRequestList(lpCtrlItem->owner)) {
buffer += _T(" (") + GetResString(IDS_NONEEDEDPARTS) + _T(")");
} else if(lpUpDownClient->GetDownloadState() == DS_DOWNLOADING) {
buffer += _T(" (") + GetResString(IDS_TRANSFERRING) + _T(")");
} else if(lpUpDownClient->IsSwapSuspended(lpCtrlItem->owner)) {
buffer += _T(" (") + GetResString(IDS_SOURCESWAPBLOCKED) + _T(")");
}
if (lpUpDownClient && lpUpDownClient->reqfile && lpUpDownClient->reqfile->GetFileName()){
buffer.AppendFormat(_T(": \"%s\""),lpUpDownClient->reqfile->GetFileName());
}
}
// <-- ZZ:DownloadManager
}
// ZZ:DownloadManager -->
if(thePrefs.IsExtControlsEnabled() && !lpUpDownClient->m_OtherRequests_list.IsEmpty()) {
buffer.Append(_T("*"));
}
// ZZ:DownloadManager <--
dc->DrawText(buffer,buffer.GetLength(),lpRect, DLC_DT_TEXT);
break;
}
case 9: // remaining time & size
break;
}
}
}
void CDownloadListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct){
if (!theApp.emuledlg->IsRunning())
return;
if (!lpDrawItemStruct->itemData)
return;
CDC* odc = CDC::FromHandle(lpDrawItemStruct->hDC);
CtrlItem_Struct* content = (CtrlItem_Struct*)lpDrawItemStruct->itemData;
BOOL bCtrlFocused = ((GetFocus() == this) || (GetStyle() & LVS_SHOWSELALWAYS));
if ((content->type == FILE_TYPE) && (lpDrawItemStruct->itemAction | ODA_SELECT) &&
(lpDrawItemStruct->itemState & ODS_SELECTED)) {
if(bCtrlFocused)
odc->SetBkColor(m_crHighlight);
else
odc->SetBkColor(m_crNoHighlight);
}
else
odc->SetBkColor(GetBkColor());
CMemDC dc(odc, &lpDrawItemStruct->rcItem);
CFont *pOldFont = dc->SelectObject(GetFont());
COLORREF crOldTextColor = dc->SetTextColor(m_crWindowText);
int iOldBkMode;
if (m_crWindowTextBk == CLR_NONE){
DefWindowProc(WM_ERASEBKGND, (WPARAM)(HDC)dc, 0);
iOldBkMode = dc.SetBkMode(TRANSPARENT);
}
else
iOldBkMode = OPAQUE;
BOOL notLast = lpDrawItemStruct->itemID + 1 != GetItemCount();
BOOL notFirst = lpDrawItemStruct->itemID != 0;
int tree_start=0;
int tree_end=0;
RECT cur_rec = lpDrawItemStruct->rcItem;
//offset was 4, now it's the standard 2 spaces
int iOffset = dc->GetTextExtent(_T(" "), 1 ).cx*2;
CHeaderCtrl *pHeaderCtrl = GetHeaderCtrl();
int iCount = pHeaderCtrl->GetItemCount();
cur_rec.right = cur_rec.left;
cur_rec.right -= iOffset;
cur_rec.left += iOffset;
if (content->type == FILE_TYPE){
for(int iCurrent = 0; iCurrent < iCount; iCurrent++) {
int iColumn = pHeaderCtrl->OrderToIndex(iCurrent);
int cx = CListCtrl::GetColumnWidth(iColumn);
if(iColumn == 5) {
int iNextLeft = cur_rec.left + cx;
//set up tree vars
cur_rec.left = cur_rec.right + iOffset;
cur_rec.right = cur_rec.left + min(8, cx);
tree_start = cur_rec.left + 1;
tree_end = cur_rec.right;
//normal column stuff
cur_rec.left = cur_rec.right + 1;
cur_rec.right = tree_start + cx - iOffset;
DrawFileItem(dc, 5, &cur_rec, content);
cur_rec.left = iNextLeft;
} else {
cur_rec.right += cx;
DrawFileItem(dc, iColumn, &cur_rec, content);
cur_rec.left += cx;
}
}
}
else if (content->type == UNAVAILABLE_SOURCE || content->type == AVAILABLE_SOURCE){
for(int iCurrent = 0; iCurrent < iCount; iCurrent++) {
int iColumn = pHeaderCtrl->OrderToIndex(iCurrent);
int cx = CListCtrl::GetColumnWidth(iColumn);
if(iColumn == 5) {
int iNextLeft = cur_rec.left + cx;
//set up tree vars
cur_rec.left = cur_rec.right + iOffset;
cur_rec.right = cur_rec.left + min(8, cx);
tree_start = cur_rec.left + 1;
tree_end = cur_rec.right;
//normal column stuff
cur_rec.left = cur_rec.right + 1;
cur_rec.right = tree_start + cx - iOffset;
DrawSourceItem(dc, 5, &cur_rec, content);
cur_rec.left = iNextLeft;
} else {
cur_rec.right += cx;
DrawSourceItem(dc, iColumn, &cur_rec, content);
cur_rec.left += cx;
}
}
}
//draw rectangle around selected item(s)
if ((lpDrawItemStruct->itemAction | ODA_SELECT) &&
(lpDrawItemStruct->itemState & ODS_SELECTED) &&
(content->type == FILE_TYPE))
{
RECT outline_rec = lpDrawItemStruct->rcItem;
outline_rec.top--;
outline_rec.bottom++;
dc->FrameRect(&outline_rec, &CBrush(GetBkColor()));
outline_rec.top++;
outline_rec.bottom--;
outline_rec.left++;
outline_rec.right--;
if(notFirst && (GetItemState(lpDrawItemStruct->itemID - 1, LVIS_SELECTED))) {
CtrlItem_Struct* prev = (CtrlItem_Struct*)this->GetItemData(lpDrawItemStruct->itemID - 1);
if(prev->type == FILE_TYPE)
outline_rec.top--;
}
if(notLast && (GetItemState(lpDrawItemStruct->itemID + 1, LVIS_SELECTED))) {
CtrlItem_Struct* next = (CtrlItem_Struct*)this->GetItemData(lpDrawItemStruct->itemID + 1);
if(next->type == FILE_TYPE)
outline_rec.bottom++;
}
if(bCtrlFocused)
dc->FrameRect(&outline_rec, &CBrush(m_crFocusLine));
else
dc->FrameRect(&outline_rec, &CBrush(m_crNoFocusLine));
}
//draw focus rectangle around non-highlightable items when they have the focus
else if (((lpDrawItemStruct->itemState & ODS_FOCUS) == ODS_FOCUS) && (GetFocus() == this))
{
RECT focus_rec;
focus_rec.top = lpDrawItemStruct->rcItem.top;
focus_rec.bottom = lpDrawItemStruct->rcItem.bottom;
focus_rec.left = lpDrawItemStruct->rcItem.left + 1;
focus_rec.right = lpDrawItemStruct->rcItem.right - 1;
dc->FrameRect(&focus_rec, &CBrush(m_crNoFocusLine));
}
//draw tree last so it draws over selected and focus (looks better)
if(tree_start < tree_end) {
//set new bounds
RECT tree_rect;
tree_rect.top = lpDrawItemStruct->rcItem.top;
tree_rect.bottom = lpDrawItemStruct->rcItem.bottom;
tree_rect.left = tree_start;
tree_rect.right = tree_end;
dc->SetBoundsRect(&tree_rect, DCB_DISABLE);
//gather some information
BOOL hasNext = notLast &&
((CtrlItem_Struct*)this->GetItemData(lpDrawItemStruct->itemID + 1))->type != FILE_TYPE;
BOOL isOpenRoot = hasNext && content->type == FILE_TYPE;
BOOL isChild = content->type != FILE_TYPE;
//BOOL isExpandable = !isChild && ((CPartFile*)content->value)->GetSourceCount() > 0;
//might as well calculate these now
int treeCenter = tree_start + 3;
int middle = (cur_rec.top + cur_rec.bottom + 1) / 2;
//set up a new pen for drawing the tree
CPen pn, *oldpn;
pn.CreatePen(PS_SOLID, 1, m_crWindowText);
oldpn = dc->SelectObject(&pn);
if(isChild) {
//draw the line to the status bar
dc->MoveTo(tree_end, middle);
dc->LineTo(tree_start + 3, middle);
//draw the line to the child node
if(hasNext) {
dc->MoveTo(treeCenter, middle);
dc->LineTo(treeCenter, cur_rec.bottom + 1);
}
} else if(isOpenRoot) {
//draw circle
RECT circle_rec;
COLORREF crBk = dc->GetBkColor();
circle_rec.top = middle - 2;
circle_rec.bottom = middle + 3;
circle_rec.left = treeCenter - 2;
circle_rec.right = treeCenter + 3;
dc->FrameRect(&circle_rec, &CBrush(m_crWindowText));
dc->SetPixelV(circle_rec.left, circle_rec.top, crBk);
dc->SetPixelV(circle_rec.right - 1, circle_rec.top, crBk);
dc->SetPixelV(circle_rec.left, circle_rec.bottom - 1, crBk);
dc->SetPixelV(circle_rec.right - 1, circle_rec.bottom - 1, crBk);
//draw the line to the child node
if(hasNext) {
dc->MoveTo(treeCenter, middle + 3);
dc->LineTo(treeCenter, cur_rec.bottom + 1);
}
} /*else if(isExpandable) {
//draw a + sign
dc->MoveTo(treeCenter, middle - 2);
dc->LineTo(treeCenter, middle + 3);
dc->MoveTo(treeCenter - 2, middle);
dc->LineTo(treeCenter + 3, middle);
}*/
//draw the line back up to parent node
if(notFirst && isChild) {
dc->MoveTo(treeCenter, middle);
dc->LineTo(treeCenter, cur_rec.top - 1);
}
//put the old pen back
dc->SelectObject(oldpn);
pn.DeleteObject();
}
//put the original objects back
if (m_crWindowTextBk == CLR_NONE)
dc.SetBkMode(iOldBkMode);
dc->SelectObject(pOldFont);
dc->SetTextColor(crOldTextColor);
}
// modifier-keys -view filtering [Ese Juani+xrmb]
void CDownloadListCtrl::HideSources(CPartFile* toCollapse, bool isShift, bool isCtrl, bool isAlt)
{
SetRedraw(false);
int pre,post;
pre = post = 0;
for(int i = 0; i < GetItemCount(); i++) {
CtrlItem_Struct* item = (CtrlItem_Struct*)this->GetItemData(i);
if(item->owner == toCollapse) {
pre++;
if(isShift || isCtrl || isAlt){
EDownloadState ds=((CUpDownClient*)item->value)->GetDownloadState();
if((isShift && ds==DS_DOWNLOADING) ||
(isCtrl && ((CUpDownClient*)item->value)->GetRemoteQueueRank()> 0) ||
(isAlt && ds!=DS_NONEEDEDPARTS)) continue;
}
item->dwUpdated = 0;
item->status.DeleteObject();
DeleteItem(i--);
post++;
}
}
if (pre-post==0) toCollapse->srcarevisible = false;
SetRedraw(true);
}
BEGIN_MESSAGE_MAP(CDownloadListCtrl, CMuleListCtrl)
ON_WM_CONTEXTMENU()
ON_WM_SYSCOLORCHANGE()
ON_NOTIFY_REFLECT(LVN_ITEMACTIVATE, OnItemActivate)
ON_NOTIFY_REFLECT(LVN_ITEMCHANGED, OnListModified)
ON_NOTIFY_REFLECT(LVN_INSERTITEM, OnListModified)
ON_NOTIFY_REFLECT(LVN_DELETEITEM, OnListModified)
ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnColumnClick)
ON_NOTIFY_REFLECT(NM_DBLCLK, OnNMDblclkDownloadlist)
ON_NOTIFY_REFLECT(LVN_GETDISPINFO, OnGetDispInfo)
ON_NOTIFY_REFLECT(LVN_GETINFOTIP, OnLvnGetInfoTip)
ON_WM_KEYDOWN()
END_MESSAGE_MAP()
void CDownloadListCtrl::ExpandCollapseItem(int item,uint8 expand,bool collapsesource){
if (item==-1) return;
CtrlItem_Struct* content = (CtrlItem_Struct*)this->GetItemData(item);
// modifier-keys -view filtering [Ese Juani+xrmb]
bool isShift=GetAsyncKeyState(VK_SHIFT) < 0;
bool isCtrl=GetAsyncKeyState(VK_CONTROL) < 0;
bool isAlt=GetAsyncKeyState(VK_MENU) < 0;
if (collapsesource && content->parent!=NULL) {// to collapse/expand files when one of its source is selected
content=content->parent;
LVFINDINFO find;
find.flags = LVFI_PARAM;
find.lParam = (LPARAM)content;
item = FindItem(&find);
if (item==-1) return;
}
if (!content || content->type != FILE_TYPE) return;
CPartFile* partfile = reinterpret_cast<CPartFile*>(content->value);
if (!partfile) return;
if (partfile->GetStatus()==PS_COMPLETE) {
TCHAR* buffer = new TCHAR[MAX_PATH];
_stprintf(buffer,_T("%s"),partfile->GetFullName());
ShellOpenFile(buffer, NULL);
delete[] buffer;
return;
}
// Check if the source branch is disable
if(partfile->srcarevisible == false ) {
if (expand>COLLAPSE_ONLY){
SetRedraw(false);
// Go throught the whole list to find out the sources for this file
// Remark: don't use GetSourceCount() => UNAVAILABLE_SOURCE
for(ListItems::const_iterator it = m_ListItems.begin(); it != m_ListItems.end(); it++){
const CtrlItem_Struct* cur_item = it->second;
if(cur_item->owner == partfile){
if(isShift || isCtrl || isAlt) {
ASSERT(cur_item->type != FILE_TYPE);
EDownloadState ds=((CUpDownClient*)cur_item->value)->GetDownloadState();
if(!(isShift && ds==DS_DOWNLOADING ||
isCtrl && ((CUpDownClient*)cur_item->value)->GetRemoteQueueRank()>0 ||
isAlt && ds!=DS_NONEEDEDPARTS))
continue; // skip this source
}
partfile->srcarevisible = true;
InsertItem(LVIF_PARAM|LVIF_TEXT,item+1,LPSTR_TEXTCALLBACK,0,0,0,(LPARAM)cur_item);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -