Skip to content

Commit 10f1ff1

Browse files
committed
Release Notes: Handle C-Pad scrolling with floats
Previously it was very obvious when you moved from the the area that counted as 1px to 2px, this just feels a bit better if you try to scroll slowly
1 parent 3573e9c commit 10f1ff1

File tree

3 files changed

+27
-21
lines changed

3 files changed

+27
-21
lines changed

include/screens/mainScreen.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,8 @@ class MainScreen : public Screen {
5757
ascending = false, updateFilter = false, screenshotFetch = false, canDisplay = false, isAND = true;
5858

5959
int storeMode = 0, marks = 0, markIndex = 0, sPage = 0, lMode = 0, sSelection = 0,
60-
lastMode = 0, smallDelay = 0, sPos = 0, screenshotIndex = 0, sSize = 0, zoom = 0, scrollOffset = 0, scrollDelta = 0, queueIndex = 0;
60+
lastMode = 0, smallDelay = 0, sPos = 0, screenshotIndex = 0, sSize = 0, zoom = 0, queueIndex = 0;
61+
float scrollOffset = 0.0f, scrollDelta = 0.0f;
6162

6263
SortType sorttype = SortType::LAST_UPDATED;
6364

include/store/storeUtils.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,8 @@ namespace StoreUtils {
9595
size_t FindSplitPoint(const std::string &str, const std::vector<std::string> splitters);
9696
void ProcessReleaseNotes(std::string ReleaseNotes);
9797

98-
void DrawReleaseNotes(const int &scrollOffset, const std::unique_ptr<StoreEntry> &entry);
99-
void ReleaseNotesLogic(int &scrollOffset, int &scrollDelta, int &storeMode);
98+
void DrawReleaseNotes(const float &scrollOffset, const std::unique_ptr<StoreEntry> &entry);
99+
void ReleaseNotesLogic(float &scrollOffset, float &scrollDelta, int &storeMode);
100100

101101
bool compareTitleDescending(const std::unique_ptr<StoreEntry> &a, const std::unique_ptr<StoreEntry> &b);
102102
bool compareTitleAscending(const std::unique_ptr<StoreEntry> &a, const std::unique_ptr<StoreEntry> &b);

source/menu/releaseNotes.cpp

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ void StoreUtils::ProcessReleaseNotes(std::string releaseNotes) {
7878
} while (splitPos != std::string::npos);
7979
}
8080

81-
void StoreUtils::DrawReleaseNotes(const int &scrollOffset, const std::unique_ptr<StoreEntry> &entry) {
81+
void StoreUtils::DrawReleaseNotes(const float &scrollOffset, const std::unique_ptr<StoreEntry> &entry) {
8282
if (entry && StoreUtils::store) {
8383
Gui::ScreenDraw(Bottom);
8484
Gui::Draw_Rect(0, 26, 320, 214, UIThemes->BGColor());
@@ -106,33 +106,38 @@ void StoreUtils::DrawReleaseNotes(const int &scrollOffset, const std::unique_ptr
106106
/*
107107
As the name says: Release notes logic.
108108
109-
int &scrollOffset: The scroll offset for the Release Notes text.
110-
int &scrollDelta: The scroll delta for the Release Notes text.
109+
float &scrollOffset: The scroll offset for the Release Notes text.
110+
float &scrollDelta: The scroll delta for the Release Notes text.
111111
int &storeMode: The store mode to properly return back.
112112
*/
113-
void StoreUtils::ReleaseNotesLogic(int &scrollOffset, int &scrollDelta, int &storeMode) {
113+
void StoreUtils::ReleaseNotesLogic(float &scrollOffset, float &scrollDelta, int &storeMode) {
114114
int linesPerScreen = ((240.0f - 25.0f) / Gui::GetStringHeight(0.5f, "", font));
115115
scrollOffset += scrollDelta;
116-
if (scrollDelta != 0) {
117-
scrollDelta > 0 ? scrollDelta-- : scrollDelta++;
116+
if (scrollDelta > 0) {
117+
scrollDelta = std::max(scrollDelta - 1.0f, 0.0f);
118+
} else if (scrollDelta < 0) {
119+
scrollDelta = std::min(scrollDelta + 1.0f, 0.0f);
118120
}
119121

120122
if ((int)wrappedNotes.size() > linesPerScreen) {
121123
//D-Pad
122-
if (hHeld & KEY_DDOWN && scrollDelta < 10) scrollDelta += 2;
123-
if (hHeld & KEY_DUP && scrollDelta > -10) scrollDelta -= 2;
124-
if (hHeld & KEY_DRIGHT && scrollDelta < 20) scrollDelta += 5;
125-
if (hHeld & KEY_DLEFT && scrollDelta > -20) scrollDelta -= 5;
124+
if (hHeld & KEY_DDOWN && scrollDelta < 10.0f) scrollDelta += 2.0f;
125+
if (hHeld & KEY_DUP && scrollDelta > -10.0f) scrollDelta -= 2.0f;
126+
if (hHeld & KEY_DRIGHT && scrollDelta < 20.0f) scrollDelta += 5.0f;
127+
if (hHeld & KEY_DLEFT && scrollDelta > -20.0f) scrollDelta -= 5.0f;
126128

127129
//Circle Pad
128130
circlePosition circlePad;
129131
hidCircleRead(std::addressof(circlePad));
130-
if (scrollDelta < 10 && scrollDelta > -10) scrollDelta -= circlePad.dy / 60;
132+
float deltaCircle = -circlePad.dy / 60.0f;
133+
if (deltaCircle >= 0.5f || deltaCircle <= -0.5f) {
134+
if (scrollDelta < 10.0f && scrollDelta > -10.0f) scrollDelta += deltaCircle;
135+
}
131136

132137
//Touch
133138
if (hDown & KEY_TOUCH && touch.py > 25) {
134139
touches[1] = touch;
135-
scrollDelta = 0;
140+
scrollDelta = 0.0f;
136141
}
137142
if (hHeld & KEY_TOUCH) {
138143
if (touch.py > 25) {
@@ -148,20 +153,20 @@ void StoreUtils::ReleaseNotesLogic(int &scrollOffset, int &scrollDelta, int &sto
148153
}
149154

150155
/* Ensure it doesn't scroll off screen. */
151-
if (scrollOffset < 0) {
152-
scrollOffset = 0;
153-
scrollDelta = 0;
156+
if (scrollOffset < 0.0f) {
157+
scrollOffset = 0.0f;
158+
scrollDelta = 0.0f;
154159
}
155160
int maxScroll = wrappedNotes.size() * Gui::GetStringHeight(0.5f, "", font) - (240.0f - 25.0f);
156161
if (scrollOffset > maxScroll && ((int)wrappedNotes.size() > linesPerScreen)) {
157162
scrollOffset = maxScroll;
158-
scrollDelta = 0;
163+
scrollDelta = 0.0f;
159164
}
160165

161166
if (hDown & KEY_B || (hDown & KEY_TOUCH && touching(touch, back))) {
162167
if (config->changelog()) config->changelog(false);
163-
scrollOffset = 0;
164-
scrollDelta = 0;
168+
scrollOffset = 0.0f;
169+
scrollDelta = 0.0f;
165170
storeMode = 0;
166171
}
167172
}

0 commit comments

Comments
 (0)