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); }
void CGUIFixedListContainer::ValidateOffset() { if (!m_layout) return; // ensure our fixed cursor position is valid if (m_fixedCursor >= m_itemsPerPage) m_fixedCursor = m_itemsPerPage - 1; if (m_fixedCursor < 0) m_fixedCursor = 0; // compute our minimum and maximum cursor positions int minCursor, maxCursor; GetCursorRange(minCursor, maxCursor); // assure our cursor is between these limits SetCursor(std::max(GetCursor(), minCursor)); SetCursor(std::min(GetCursor(), maxCursor)); int minOffset, maxOffset; GetOffsetRange(minOffset, maxOffset); // and finally ensure our offset is valid // don't validate offset if we are scrolling in case the tween image exceed <0, 1> range if (GetOffset() > maxOffset || (!m_scroller.IsScrolling() && m_scroller.GetValue() > maxOffset * m_layout->Size(m_orientation))) { SetOffset(std::max(-minCursor, maxOffset)); m_scroller.SetValue(GetOffset() * m_layout->Size(m_orientation)); } if (GetOffset() < minOffset || (!m_scroller.IsScrolling() && m_scroller.GetValue() < minOffset * m_layout->Size(m_orientation))) { SetOffset(minOffset); m_scroller.SetValue(GetOffset() * m_layout->Size(m_orientation)); } }
void CGUIListContainer::ValidateOffset() { if (!m_layout) return; // first thing is we check the range of our offset // don't validate offset if we are scrolling in case the tween image exceed <0, 1> range int minOffset, maxOffset; GetOffsetRange(minOffset, maxOffset); if (GetOffset() > maxOffset || (!m_scroller.IsScrolling() && m_scroller.GetValue() > maxOffset * m_layout->Size(m_orientation))) { SetOffset(std::max(0, maxOffset)); m_scroller.SetValue(GetOffset() * m_layout->Size(m_orientation)); } if (GetOffset() < 0 || (!m_scroller.IsScrolling() && m_scroller.GetValue() < 0)) { SetOffset(0); m_scroller.SetValue(0); } }