Fixed a cosmetic navigation issue in SystemView.

This commit is contained in:
Leon Styhre 2020-11-15 11:30:43 +01:00
parent 4fb12a4801
commit a67ee27815
2 changed files with 24 additions and 5 deletions

View file

@ -30,6 +30,7 @@ SystemView::SystemView(
Window* window)
: IList<SystemViewData, SystemData*>
(window, LIST_SCROLL_STYLE_SLOW, LIST_ALWAYS_LOOP),
mPreviousScrollVelocity(0),
mViewNeedsReload(true),
mSystemInfo(window, "SYSTEM INFO", Font::get(FONT_SIZE_SMALL), 0x33333300, ALIGN_CENTER)
{
@ -249,13 +250,10 @@ void SystemView::onCursorChanged(const CursorState& /*state*/)
updateHelpPrompts();
float startPos = mCamOffset;
float posMax = static_cast<float>(mEntries.size());
float target = static_cast<float>(mCursor);
// What's the shortest way to get to our target?
// It's one of these...
// Find the shortest path to the target.
float endPos = target; // Directly.
float dist = fabs(endPos - startPos);
@ -264,8 +262,18 @@ void SystemView::onCursorChanged(const CursorState& /*state*/)
if (fabs(target - posMax - startPos - mScrollVelocity) < dist)
endPos = target - posMax; // Loop around the start (max - 1 -> -1).
// Animate mSystemInfo's opacity (fade out, wait, fade back in).
// This logic is only needed when there are two game systems, to prevent ugly jumps back
// an forth when selecting the same direction rapidly several times in a row.
if (posMax == 2) {
if (mPreviousScrollVelocity == 0)
mPreviousScrollVelocity = mScrollVelocity;
else if (mScrollVelocity < 0 && startPos < endPos)
mPreviousScrollVelocity = -1;
else if (mScrollVelocity > 0 && startPos > endPos)
mPreviousScrollVelocity = 1;
}
// Animate mSystemInfo's opacity (fade out, wait, fade back in).
cancelAnimation(1);
cancelAnimation(2);
@ -279,6 +287,16 @@ void SystemView::onCursorChanged(const CursorState& /*state*/)
Math::lerp(infoStartOpacity, 0.f, t) * 255));
}, static_cast<int>(infoStartOpacity * (goFast ? 10 : 150)));
// To prevent ugly jumps with two systems when quickly repeating the same direction.
if (mPreviousScrollVelocity != 0 && posMax == 2 &&
mScrollVelocity == mPreviousScrollVelocity ) {
if (fabs(endPos - startPos) < 0.5 || fabs(endPos - startPos) > 1.5) {
(mScrollVelocity < 0) ? endPos -= 1 : endPos += 1;
(mCursor == 0) ? mCursor = 1 : mCursor = 0;
return;
}
}
std::pair<unsigned int, unsigned int> gameCount = getSelected()->getDisplayedGameCount();
// Also change the text after we've fully faded out.

View file

@ -93,6 +93,7 @@ private:
float mExtrasCamOffset;
float mExtrasFadeOpacity;
int mPreviousScrollVelocity;
bool mViewNeedsReload;
bool mShowing;
};