bool CGUIPanelContainer::MoveDown(bool wrapAround) { if (GetCursor() + m_itemsPerRow < m_itemsPerPage * m_itemsPerRow && (GetOffset() + 1 + GetCursor() / m_itemsPerRow) * m_itemsPerRow < (int)m_items.size()) { // move to last item if necessary if ((GetOffset() + 1)*m_itemsPerRow + GetCursor() >= (int)m_items.size()) SetCursor((int)m_items.size() - 1 - GetOffset()*m_itemsPerRow); else SetCursor(GetCursor() + m_itemsPerRow); } else if ((GetOffset() + 1 + GetCursor() / m_itemsPerRow) * m_itemsPerRow < (int)m_items.size()) { // we scroll to the next row, and move to last item if necessary if ((GetOffset() + 1)*m_itemsPerRow + GetCursor() >= (int)m_items.size()) SetCursor((int)m_items.size() - 1 - (GetOffset() + 1)*m_itemsPerRow); ScrollToOffset(GetOffset() + 1); } else if (wrapAround) { // move first item in list SetCursor(GetCursor() % m_itemsPerRow); ScrollToOffset(0); SetContainerMoving(1); } else return false; return true; }
void CGUIFixedListContainer::SelectItem(int item) { // Check that GetOffset() is valid ValidateOffset(); // only select an item if it's in a valid range if (item >= 0 && item < (int)m_items.size()) { // Select the item requested - we first set the cursor position // which may be different at either end of the list, then the offset int minCursor, maxCursor; GetCursorRange(minCursor, maxCursor); int cursor; if ((int)m_items.size() - 1 - item <= maxCursor - m_fixedCursor) cursor = std::max(m_fixedCursor, maxCursor + item - (int)m_items.size() + 1); else if (item <= m_fixedCursor - minCursor) cursor = std::min(m_fixedCursor, minCursor + item); else cursor = m_fixedCursor; if (cursor != GetCursor()) SetContainerMoving(cursor - GetCursor()); SetCursor(cursor); ScrollToOffset(item - GetCursor()); } }
void CGUIBaseContainer::ScrollToOffset(int offset) { int minOffset, maxOffset; if(GetOffsetRange(minOffset, maxOffset)) offset = std::max(minOffset, std::min(offset, maxOffset)); float size = (m_layout) ? m_layout->Size(m_orientation) : 10.0f; int range = ScrollCorrectionRange(); if (offset * size < m_scroller.GetValue() && m_scroller.GetValue() - offset * size > size * range) { // scrolling up, and we're jumping more than 0.5 of a screen m_scroller.SetValue((offset + range) * size); } if (offset * size > m_scroller.GetValue() && offset * size - m_scroller.GetValue() > size * range) { // scrolling down, and we're jumping more than 0.5 of a screen m_scroller.SetValue((offset - range) * size); } m_scroller.ScrollTo(offset * size); m_lastScrollStartTimer.StartZero(); if (!m_wasReset) { SetContainerMoving(offset - GetOffset()); if (m_scroller.IsScrolling()) m_scrollTimer.Start(); else m_scrollTimer.Stop(); } SetOffset(offset); }
bool CGUIListContainer::MoveUp(bool wrapAround) { if (GetCursor() > 0) { SetCursor(GetCursor() - 1); } else if (GetCursor() == 0 && GetOffset()) { ScrollToOffset(GetOffset() - 1); } else if (wrapAround) { if (m_items.size() > 0) { // move 2 last item in list, and set our container moving up int offset = m_items.size() - m_itemsPerPage; if (offset < 0) offset = 0; SetCursor(m_items.size() - offset - 1); ScrollToOffset(offset); SetContainerMoving(-1); } } else return false; return true; }
void CGUIListContainer::SetCursor(int cursor) { if (cursor > m_itemsPerPage - 1) cursor = m_itemsPerPage - 1; if (cursor < 0) cursor = 0; if (!m_wasReset) SetContainerMoving(cursor - GetCursor()); CGUIBaseContainer::SetCursor(cursor); }
void CGUIPanelContainer::SetCursor(int cursor) { // +1 to ensure we're OK if we have a half item if (cursor > (m_itemsPerPage + 1)*m_itemsPerRow - 1) cursor = (m_itemsPerPage + 1)*m_itemsPerRow - 1; if (cursor < 0) cursor = 0; if (!m_wasReset) SetContainerMoving(cursor - GetCursor()); CGUIBaseContainer::SetCursor(cursor); }
bool CGUIFixedListContainer::MoveUp(bool wrapAround) { int item = GetSelectedItem(); if (item > 0) SelectItem(item - 1); else if (wrapAround) { SelectItem((int)m_items.size() - 1); SetContainerMoving(-1); } else return false; return true; }
bool CGUIFixedListContainer::MoveDown(bool wrapAround) { int item = GetSelectedItem(); if (item < (int)m_items.size() - 1) SelectItem(item + 1); else if (wrapAround) { // move first item in list SelectItem(0); SetContainerMoving(1); } else return false; return true; }
bool CGUIPanelContainer::MoveUp(bool wrapAround) { if (GetCursor() >= m_itemsPerRow) SetCursor(GetCursor() - m_itemsPerRow); else if (GetOffset() > 0) ScrollToOffset(GetOffset() - 1); else if (wrapAround) { // move last item in list in this column SetCursor((GetCursor() % m_itemsPerRow) + (m_itemsPerPage - 1) * m_itemsPerRow); int offset = std::max((int)GetRows() - m_itemsPerPage, 0); // should check here whether cursor is actually allowed here, and reduce accordingly if (offset * m_itemsPerRow + GetCursor() >= (int)m_items.size()) SetCursor((int)m_items.size() - offset * m_itemsPerRow - 1); ScrollToOffset(offset); SetContainerMoving(-1); } else return false; return true; }
bool CGUIListContainer::MoveDown(bool wrapAround) { if (GetOffset() + GetCursor() + 1 < (int)m_items.size()) { if (GetCursor() + 1 < m_itemsPerPage) { SetCursor(GetCursor() + 1); } else { ScrollToOffset(GetOffset() + 1); } } else if(wrapAround) { // move first item in list, and set our container moving in the "down" direction SetCursor(0); ScrollToOffset(0); SetContainerMoving(1); } else return false; return true; }