void CGUIBaseContainer::UpdateScrollByLetter() { m_letterOffsets.clear(); // for scrolling by letter we have an offset table into our vector. CStdString currentMatch; for (unsigned int i = 0; i < m_items.size(); i++) { CGUIListItemPtr item = m_items[i]; if (currentMatch != item->GetSortLabel().Left(1)) { currentMatch = item->GetSortLabel().Left(1); m_letterOffsets.push_back(make_pair((int)i, currentMatch)); } } }
void CGUIBaseContainer::OnJumpLetter(char letter) { if (m_matchTimer.GetElapsedMilliseconds() < letter_match_timeout) m_match.push_back(letter); else m_match.Format("%c", letter); m_matchTimer.StartZero(); // we can't jump through letters if we have none if (0 == m_letterOffsets.size()) return; // find the current letter we're focused on int offset = CorrectOffset(m_offset, m_cursor); for (unsigned int i = (offset + 1) % m_items.size(); i != offset; i = (i+1) % m_items.size()) { CGUIListItemPtr item = m_items[i]; if (0 == strnicmp(item->GetSortLabel().c_str(), m_match.c_str(), m_match.size())) { SelectItem(i); return; } } // no match found - repeat with a single letter if (m_match.size() > 1) { m_match.clear(); OnJumpLetter(letter); } }
void CGUIBaseContainer::UpdateScrollByLetter() { m_letterOffsets.clear(); // for scrolling by letter we have an offset table into our vector. CStdString currentMatch; for (unsigned int i = 0; i < m_items.size(); i++) { CGUIListItemPtr item = m_items[i]; // The letter offset jumping is only for ASCII characters at present, and // our checks are all done in uppercase CStdString nextLetter; g_charsetConverter.wToUTF8(item->GetSortLabel().Left(1).ToUpper(), nextLetter); if (currentMatch != nextLetter) { currentMatch = nextLetter; m_letterOffsets.push_back(make_pair((int)i, currentMatch)); } } }