📄 downloadlistctrl.cpp
字号:
if (lpCtrlItem->type == AVAILABLE_SOURCE && lpUpDownClient->GetDownloadDatarate()){
if (lpUpDownClient->GetDownloadDatarate())
buffer.Format(_T("%s"), CastItoXBytes(lpUpDownClient->GetDownloadDatarate(), false, true));
dc->DrawText(buffer,buffer.GetLength(),const_cast<LPRECT>(lpRect), DLC_DT_TEXT | DT_RIGHT);
}
break;
case 5: // file info
{
CRect rcDraw(*lpRect);
rcDraw.bottom--;
rcDraw.top++;
int iWidth = rcDraw.Width();
int iHeight = rcDraw.Height();
if (lpCtrlItem->status == (HBITMAP)NULL)
VERIFY(lpCtrlItem->status.CreateBitmap(1, 1, 1, 8, NULL));
CDC cdcStatus;
HGDIOBJ hOldBitmap;
cdcStatus.CreateCompatibleDC(dc);
int cx = lpCtrlItem->status.GetBitmapDimension().cx;
DWORD dwTicks = GetTickCount();
if(lpCtrlItem->dwUpdated + DLC_BARUPDATE < dwTicks || cx != iWidth || !lpCtrlItem->dwUpdated) {
lpCtrlItem->status.DeleteObject();
lpCtrlItem->status.CreateCompatibleBitmap(dc, iWidth, iHeight);
lpCtrlItem->status.SetBitmapDimension(iWidth, iHeight);
hOldBitmap = cdcStatus.SelectObject(lpCtrlItem->status);
RECT rec_status;
rec_status.left = 0;
rec_status.top = 0;
rec_status.bottom = iHeight;
rec_status.right = iWidth;
lpUpDownClient->DrawStatusBar(&cdcStatus, &rec_status,(lpCtrlItem->type == UNAVAILABLE_SOURCE), thePrefs.UseFlatBar());
lpCtrlItem->dwUpdated = dwTicks + (rand() % 128);
} else
hOldBitmap = cdcStatus.SelectObject(lpCtrlItem->status);
dc->BitBlt(rcDraw.left, rcDraw.top, iWidth, iHeight, &cdcStatus, 0, 0, SRCCOPY);
cdcStatus.SelectObject(hOldBitmap);
}
break;
case 6:{ // sources
buffer = lpUpDownClient->GetClientSoftVer();
if (buffer.IsEmpty())
buffer = GetResString(IDS_UNKNOWN);
dc->DrawText(buffer,buffer.GetLength(),const_cast<LPRECT>(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(),const_cast<LPRECT>(lpRect), DLC_DT_TEXT);
}
else{
if ( lpUpDownClient->GetRemoteQueueRank()){
buffer.Format(_T("QR: %u"),lpUpDownClient->GetRemoteQueueRank());
dc->DrawText(buffer,buffer.GetLength(),const_cast<LPRECT>(lpRect), DLC_DT_TEXT);
}
else{
dc->DrawText(buffer,buffer.GetLength(),const_cast<LPRECT>(lpRect), DLC_DT_TEXT);
}
}
} else {
dc->DrawText(buffer,buffer.GetLength(),const_cast<LPRECT>(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->IsInNoNeededList(lpCtrlItem->owner)) {
buffer += _T(" (") + GetResString(IDS_NONEEDEDPARTS) + _T(")");
} else if(lpUpDownClient->GetDownloadState() == DS_DOWNLOADING) {
buffer += _T(" (") + GetResString(IDS_TRANSFERRING) + _T(")");
} else if(lpUpDownClient->IsSwapSuspended(lpUpDownClient->GetRequestFile())) {
buffer += _T(" (") + GetResString(IDS_SOURCESWAPBLOCKED) + _T(")");
}
if (lpUpDownClient && lpUpDownClient->GetRequestFile() && lpUpDownClient->GetRequestFile()->GetFileName()){
buffer.AppendFormat(_T(": \"%s\""),lpUpDownClient->GetRequestFile()->GetFileName());
}
}
}
if(thePrefs.IsExtControlsEnabled() && !lpUpDownClient->m_OtherRequests_list.IsEmpty()) {
buffer.Append(_T("*"));
}
// ZZ:DownloadManager <--
dc->DrawText(buffer,buffer.GetLength(),const_cast<LPRECT>(lpRect), DLC_DT_TEXT);
break;
}
case 9: // remaining time & size
break;
case 10: // last seen complete
break;
case 11: // last received
break;
case 12: // category
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;
if (m_fontBold.m_hObject){
if (content->type == FILE_TYPE){
if (((const CPartFile*)content->value)->GetTransferingSrcCount())
pOldFont = dc->SelectObject(&m_fontBold);
else
pOldFont = dc->SelectObject(GetFont());
}
else if (content->type == UNAVAILABLE_SOURCE || content->type == AVAILABLE_SOURCE){
if (((const CUpDownClient*)content->value)->GetDownloadState() == DS_DOWNLOADING)
pOldFont = dc->SelectObject(&m_fontBold);
else
pOldFont = dc->SelectObject(GetFont());
}
else
pOldFont = dc->SelectObject(GetFont());
}
else
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 iTreeOffset = dc->GetTextExtent(_T(" "), 1 ).cx*2;
CHeaderCtrl *pHeaderCtrl = GetHeaderCtrl();
int iCount = pHeaderCtrl->GetItemCount();
cur_rec.right = cur_rec.left;
cur_rec.right -= FILE_ITEM_MARGIN_X;
cur_rec.left += FILE_ITEM_MARGIN_X;
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 + iTreeOffset;
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 - iTreeOffset;
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 + iTreeOffset;
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 - iTreeOffset;
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();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -