📄 publichubsfrm.cpp
字号:
w[0] = sr.right - tmp;
w[1] = w[0] + (tmp-16)/2;
w[2] = w[0] + (tmp-16);
ctrlStatus.SetParts(3, w);
}
int const comboH = 140;
// listview
CRect rc = rect;
rc.top += 2;
rc.bottom -=(56);
ctrlHubs.MoveWindow(rc);
// filter box
rc = rect;
rc.top = rc.bottom - 52;
rc.bottom = rc.top + 46;
rc.right -= 100;
rc.right -= ((rc.right - rc.left) / 2) + 1;
ctrlFilterDesc.MoveWindow(rc);
// filter edit
rc.top += 16;
rc.bottom -= 8;
rc.left += 8;
rc.right -= ((rc.right - rc.left - 4) / 3);
ctrlFilter.MoveWindow(rc);
//filter sel
rc.bottom += comboH;
rc.right += ((rc.right - rc.left - 12) / 2) ;
rc.left += ((rc.right - rc.left + 8) / 3) * 2;
ctrlFilterSel.MoveWindow(rc);
// lists box
rc = rect;
rc.top = rc.bottom - 52;
rc.bottom = rc.top + 46;
rc.right -= 100;
rc.left += ((rc.right - rc.left) / 2) + 1;
ctrlLists.MoveWindow(rc);
// lists dropdown
rc.top += 16;
rc.bottom -= 8 - comboH;
rc.right -= 8 + 100;
rc.left += 8;
ctrlPubLists.MoveWindow(rc);
// configure button
rc.left = rc.right + 4;
rc.bottom -= comboH;
rc.right += 100;
ctrlConfigure.MoveWindow(rc);
// refresh button
rc = rect;
rc.bottom -= 2 + 8 + 4;
rc.top = rc.bottom - 22;
rc.left = rc.right - 96;
rc.right -= 2;
ctrlRefresh.MoveWindow(rc);
}
bool PublicHubsFrame::checkNick() {
if(SETTING(NICK).empty()) {
MessageBox(CTSTRING(ENTER_NICK), _T(APPNAME) _T(" ") _T(VERSIONSTRING), MB_ICONSTOP | MB_OK);
return false;
}
return true;
}
void PublicHubsFrame::updateList() {
ctrlHubs.DeleteAllItems();
users = 0;
visibleHubs = 0;
ctrlHubs.SetRedraw(FALSE);
double size = -1;
FilterModes mode = FilterModes::NONE;
int sel = ctrlFilterSel.GetCurSel();
bool doSizeCompare = parseFilter(mode, size);
for(HubEntry::List::const_iterator i = hubs.begin(); i != hubs.end(); ++i) {
if(matchFilter(*i, sel, doSizeCompare, mode, size)) {
TStringList l;
l.resize(COLUMN_LAST);
l[COLUMN_NAME] = Text::toT(i->getName());
l[COLUMN_DESCRIPTION] = Text::toT(i->getDescription());
l[COLUMN_USERS] = Text::toT(Util::toString(i->getUsers()));
l[COLUMN_SERVER] = Text::toT(i->getServer());
l[COLUMN_COUNTRY] = Text::toT(i->getCountry());
l[COLUMN_SHARED] = Text::toT(Util::formatBytes(i->getShared()));
l[COLUMN_MINSHARE] = Text::toT(Util::formatBytes(i->getMinShare()));
l[COLUMN_MINSLOTS] = Text::toT(Util::toString(i->getMinSlots()));
l[COLUMN_MAXHUBS] = Text::toT(Util::toString(i->getMaxHubs()));
l[COLUMN_MAXUSERS] = Text::toT(Util::toString(i->getMaxUsers()));
l[COLUMN_RELIABILITY] = Text::toT(Util::toString(i->getReliability()));
l[COLUMN_RATING] = Text::toT(i->getRating());
ctrlHubs.insert(ctrlHubs.GetItemCount(), l);
visibleHubs++;
users += i->getUsers();
}
}
ctrlHubs.SetRedraw(TRUE);
ctrlHubs.resort();
updateStatus();
}
void PublicHubsFrame::updateStatus() {
ctrlStatus.SetText(1, Text::toT(STRING(HUBS) + ": " + Util::toString(visibleHubs)).c_str());
ctrlStatus.SetText(2, Text::toT(STRING(USERS) + ": " + Util::toString(users)).c_str());
}
LRESULT PublicHubsFrame::onSpeaker(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) {
if(wParam == FINISHED) {
hubs = FavoriteManager::getInstance()->getPublicHubs();
updateList();
tstring* x = (tstring*)lParam;
ctrlStatus.SetText(0, (TSTRING(HUB_LIST_DOWNLOADED) + _T(" (") + (*x) + _T(")")).c_str());
delete x;
} else if(wParam == STARTING) {
tstring* x = (tstring*)lParam;
ctrlStatus.SetText(0, (TSTRING(DOWNLOADING_HUB_LIST) + _T(" (") + (*x) + _T(")")).c_str());
delete x;
} else if(wParam == FAILED) {
tstring* x = (tstring*)lParam;
ctrlStatus.SetText(0, (TSTRING(DOWNLOAD_FAILED) + (*x) ).c_str());
delete x;
}
return 0;
}
LRESULT PublicHubsFrame::onFilterChar(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) {
if(wParam == VK_RETURN) {
AutoArray<TCHAR> str(ctrlFilter.GetWindowTextLength()+1);
ctrlFilter.GetWindowText(str, ctrlFilter.GetWindowTextLength()+1);
filter = Text::fromT(tstring(str, ctrlFilter.GetWindowTextLength()));
updateList();
} else {
bHandled = FALSE;
}
return 0;
}
LRESULT PublicHubsFrame::onContextMenu(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled) {
if(reinterpret_cast<HWND>(wParam) == ctrlHubs && ctrlHubs.GetSelectedCount() == 1) {
POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
if(pt.x == -1 && pt.y == -1) {
WinUtil::getContextMenuPos(ctrlHubs, pt);
}
hubsMenu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, m_hWnd);
return TRUE;
}
bHandled = FALSE;
return FALSE;
}
LRESULT PublicHubsFrame::onCopyHub(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
if(ctrlHubs.GetSelectedCount() == 1) {
TCHAR buf[256];
int i = ctrlHubs.GetNextItem(-1, LVNI_SELECTED);
ctrlHubs.GetItemText(i, COLUMN_SERVER, buf, 256);
WinUtil::setClipboard(buf);
}
return 0;
}
void PublicHubsFrame::updateDropDown() {
ctrlPubLists.ResetContent();
StringList lists(FavoriteManager::getInstance()->getHubLists());
for(StringList::iterator idx = lists.begin(); idx != lists.end(); ++idx) {
ctrlPubLists.AddString(Text::toT(*idx).c_str());
}
ctrlPubLists.SetCurSel(FavoriteManager::getInstance()->getSelectedHubList());
}
bool PublicHubsFrame::parseFilter(FilterModes& mode, double& size) {
string::size_type start = (string::size_type)string::npos;
string::size_type end = (string::size_type)string::npos;
int64_t multiplier = 1;
if(filter.compare(0, 2, ">=") == 0) {
mode = FilterModes::GREATER_EQUAL;
start = 2;
} else if(filter.compare(0, 2, "<=") == 0) {
mode = FilterModes::LESS_EQUAL;
start = 2;
} else if(filter.compare(0, 2, "==") == 0) {
mode = FilterModes::EQUAL;
start = 2;
} else if(filter.compare(0, 2, "!=") == 0) {
mode = FilterModes::NOT_EQUAL;
start = 2;
} else if(filter[0] == _T('<')) {
mode = FilterModes::LESS;
start = 1;
} else if(filter[0] == _T('>')) {
mode = FilterModes::GREATER;
start = 1;
} else if(filter[0] == _T('=')) {
mode = FilterModes::EQUAL;
start = 1;
}
if(start == string::npos)
return false;
if(filter.length() <= start)
return false;
if((end = Util::findSubString(filter, "TiB")) != tstring::npos) {
multiplier = 1024LL * 1024LL * 1024LL * 1024LL;
} else if((end = Util::findSubString(filter, "GiB")) != tstring::npos) {
multiplier = 1024*1024*1024;
} else if((end = Util::findSubString(filter, "MiB")) != tstring::npos) {
multiplier = 1024*1024;
} else if((end = Util::findSubString(filter, "KiB")) != tstring::npos) {
multiplier = 1024;
} else if((end = Util::findSubString(filter, "TB")) != tstring::npos) {
multiplier = 1000LL * 1000LL * 1000LL * 1000LL;
} else if((end = Util::findSubString(filter, "GB")) != tstring::npos) {
multiplier = 1000*1000*1000;
} else if((end = Util::findSubString(filter, "MB")) != tstring::npos) {
multiplier = 1000*1000;
} else if((end = Util::findSubString(filter, "kB")) != tstring::npos) {
multiplier = 1000;
} else if((end = Util::findSubString(filter, "B")) != tstring::npos) {
multiplier = 1;
}
if(end == string::npos) {
end = filter.length();
}
string tmpSize = filter.substr(start, end-start);
size = Util::toDouble(tmpSize) * multiplier;
return true;
}
bool PublicHubsFrame::matchFilter(const HubEntry& entry, const int& sel, bool doSizeCompare, const FilterModes& mode, const double& size) {
if(filter.empty())
return true;
double entrySize = 0;
string entryString = "";
switch(sel) {
case COLUMN_NAME: entryString = entry.getName(); doSizeCompare = false; break;
case COLUMN_DESCRIPTION: entryString = entry.getDescription(); doSizeCompare = false; break;
case COLUMN_USERS: entrySize = entry.getUsers(); break;
case COLUMN_SERVER: entryString = entry.getServer(); doSizeCompare = false; break;
case COLUMN_COUNTRY: entryString = entry.getCountry(); doSizeCompare = false; break;
case COLUMN_SHARED: entrySize = (double)entry.getShared(); break;
case COLUMN_MINSHARE: entrySize = (double)entry.getMinShare(); break;
case COLUMN_MINSLOTS: entrySize = entry.getMinSlots(); break;
case COLUMN_MAXHUBS: entrySize = entry.getMaxHubs(); break;
case COLUMN_MAXUSERS: entrySize = entry.getMaxUsers(); break;
case COLUMN_RELIABILITY: entrySize = entry.getReliability(); break;
case COLUMN_RATING: entryString = entry.getRating(); doSizeCompare = false; break;
default: break;
}
bool insert = false;
if(doSizeCompare) {
switch(mode) {
case FilterModes::EQUAL: insert = (size == entrySize); break;
case FilterModes::GREATER_EQUAL: insert = (size <= entrySize); break;
case FilterModes::LESS_EQUAL: insert = (size >= entrySize); break;
case FilterModes::GREATER: insert = (size < entrySize); break;
case FilterModes::LESS: insert = (size > entrySize); break;
case FilterModes::NOT_EQUAL: insert = (size != entrySize); break;
}
} else {
if(sel >= COLUMN_LAST) {
if( Util::findSubString(entry.getName(), filter) != string::npos ||
Util::findSubString(entry.getDescription(), filter) != string::npos ||
Util::findSubString(entry.getServer(), filter) != string::npos ||
Util::findSubString(entry.getCountry(), filter) != string::npos ||
Util::findSubString(entry.getRating(), filter) != string::npos ) {
insert = true;
}
}
if(Util::findSubString(entryString, filter) != string::npos)
insert = true;
}
return insert;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -