Kinectic Scrolling
for SongNodes, Scores, Download Results, Download Info
This commit is contained in:
@@ -36,6 +36,7 @@ import itdelatrisu.opsu.downloads.servers.BloodcatServer;
|
||||
import itdelatrisu.opsu.downloads.servers.DownloadServer;
|
||||
import itdelatrisu.opsu.downloads.servers.HexideServer;
|
||||
import itdelatrisu.opsu.downloads.servers.OsuMirrorServer;
|
||||
import itdelatrisu.opsu.ui.KinecticScrolling;
|
||||
import itdelatrisu.opsu.ui.MenuButton;
|
||||
import itdelatrisu.opsu.ui.UI;
|
||||
|
||||
@@ -89,7 +90,7 @@ public class DownloadsMenu extends BasicGameState {
|
||||
private int focusTimer = 0;
|
||||
|
||||
/** Current start result button (topmost entry). */
|
||||
private int startResult = 0;
|
||||
KinecticScrolling startResultPos = new KinecticScrolling();
|
||||
|
||||
/** Total number of results for current query. */
|
||||
private int totalResults = 0;
|
||||
@@ -110,7 +111,7 @@ public class DownloadsMenu extends BasicGameState {
|
||||
private boolean rankedOnly = true;
|
||||
|
||||
/** Current start download index. */
|
||||
private int startDownloadIndex = 0;
|
||||
KinecticScrolling startDownloadIndexPos = new KinecticScrolling();
|
||||
|
||||
/** Query thread. */
|
||||
private Thread queryThread;
|
||||
@@ -272,18 +273,24 @@ public class DownloadsMenu extends BasicGameState {
|
||||
if (nodes != null) {
|
||||
DownloadNode.clipToResultArea(g);
|
||||
int maxResultsShown = DownloadNode.maxResultsShown();
|
||||
for (int i = 0; i < maxResultsShown; i++) {
|
||||
int startResult = (int) (startResultPos.getPosition() / DownloadNode.getButtonOffset());
|
||||
int offset = (int) (-startResultPos.getPosition() + startResult * DownloadNode.getButtonOffset());
|
||||
|
||||
for (int i = 0; i < maxResultsShown + 1; i++) {
|
||||
int index = startResult + i;
|
||||
if(index < 0)
|
||||
continue;
|
||||
if (index >= nodes.length)
|
||||
break;
|
||||
nodes[index].drawResult(g, i, DownloadNode.resultContains(mouseX, mouseY, i),
|
||||
nodes[index].drawResult(g, offset + i * DownloadNode.getButtonOffset(),
|
||||
DownloadNode.resultContains(mouseX, mouseY - offset, i),
|
||||
(index == focusResult), (previewID == nodes[index].getID()));
|
||||
}
|
||||
g.clearClip();
|
||||
|
||||
// scroll bar
|
||||
if (nodes.length > maxResultsShown)
|
||||
DownloadNode.drawResultScrollbar(g, startResult, nodes.length);
|
||||
DownloadNode.drawResultScrollbar(g, startResultPos.getPosition(), nodes.length * DownloadNode.getButtonOffset());
|
||||
|
||||
// pages
|
||||
if (nodes.length > 0) {
|
||||
@@ -311,19 +318,26 @@ public class DownloadsMenu extends BasicGameState {
|
||||
int downloadsSize = DownloadList.get().size();
|
||||
if (downloadsSize > 0) {
|
||||
int maxDownloadsShown = DownloadNode.maxDownloadsShown();
|
||||
for (int i = 0; i < maxDownloadsShown; i++) {
|
||||
int index = startDownloadIndex + i;
|
||||
if (index >= downloadsSize)
|
||||
break;
|
||||
DownloadNode node = DownloadList.get().getNode(index);
|
||||
if (node == null)
|
||||
break;
|
||||
node.drawDownload(g, i, index, DownloadNode.downloadContains(mouseX, mouseY, i));
|
||||
}
|
||||
int startDownloadIndex = (int) (startDownloadIndexPos.getPosition() / DownloadNode.getInfoHeight());
|
||||
int offset = (int) (-startDownloadIndexPos.getPosition() + startDownloadIndex * DownloadNode.getInfoHeight());
|
||||
|
||||
DownloadNode.clipToDownloadArea(g);
|
||||
for (int i = 0; i < maxDownloadsShown + 1; i++) {
|
||||
int index = startDownloadIndex + i;
|
||||
if (index >= downloadsSize)
|
||||
break;
|
||||
DownloadNode node = DownloadList.get().getNode(index);
|
||||
if (node == null)
|
||||
break;
|
||||
node.drawDownload(g, i * DownloadNode.getInfoHeight() + offset, index,
|
||||
DownloadNode.downloadContains(mouseX, mouseY - offset, i));
|
||||
}
|
||||
g.clearClip();
|
||||
|
||||
|
||||
// scroll bar
|
||||
if (downloadsSize > maxDownloadsShown)
|
||||
DownloadNode.drawDownloadScrollbar(g, startDownloadIndex, downloadsSize);
|
||||
DownloadNode.drawDownloadScrollbar(g, startDownloadIndexPos.getPosition(), downloadsSize * DownloadNode.getInfoHeight());
|
||||
}
|
||||
|
||||
// buttons
|
||||
@@ -367,6 +381,13 @@ public class DownloadsMenu extends BasicGameState {
|
||||
rankedButton.hoverUpdate(delta, mouseX, mouseY);
|
||||
serverButton.hoverUpdate(delta, mouseX, mouseY);
|
||||
|
||||
if (DownloadList.get() != null)
|
||||
startDownloadIndexPos.setMinMax(0, DownloadNode.getInfoHeight() * (DownloadList.get().size() - DownloadNode.maxDownloadsShown()));
|
||||
startDownloadIndexPos.update(delta);
|
||||
if (resultList != null)
|
||||
startResultPos.setMinMax(0, DownloadNode.getButtonOffset() * (resultList.length - DownloadNode.maxResultsShown()));
|
||||
startResultPos.update(delta);
|
||||
|
||||
// focus timer
|
||||
if (focusResult != -1 && focusTimer < FOCUS_DELAY)
|
||||
focusTimer += delta;
|
||||
@@ -423,7 +444,7 @@ public class DownloadsMenu extends BasicGameState {
|
||||
resultList = nodes;
|
||||
totalResults = server.totalResults();
|
||||
focusResult = -1;
|
||||
startResult = 0;
|
||||
startResultPos.setPosition(0);
|
||||
if (nodes == null)
|
||||
searchResultString = "An error has occurred.";
|
||||
else {
|
||||
@@ -482,19 +503,23 @@ public class DownloadsMenu extends BasicGameState {
|
||||
DownloadNode[] nodes = resultList;
|
||||
if (nodes != null) {
|
||||
if (DownloadNode.resultAreaContains(x, y)) {
|
||||
startResultPos.pressed();
|
||||
int maxResultsShown = DownloadNode.maxResultsShown();
|
||||
for (int i = 0; i < maxResultsShown; i++) {
|
||||
for (int i = 0; i < maxResultsShown + 1; i++) {
|
||||
int startResult = (int) (startResultPos.getPosition() / DownloadNode.getButtonOffset());
|
||||
int offset = (int) (-startResultPos.getPosition() + startResult * DownloadNode.getButtonOffset());
|
||||
|
||||
int index = startResult + i;
|
||||
if (index >= nodes.length)
|
||||
break;
|
||||
if (DownloadNode.resultContains(x, y, i)) {
|
||||
if (DownloadNode.resultContains(x, y - offset, i)) {
|
||||
final DownloadNode node = nodes[index];
|
||||
|
||||
// check if map is already loaded
|
||||
boolean isLoaded = BeatmapSetList.get().containsBeatmapSetID(node.getID());
|
||||
|
||||
// track preview
|
||||
if (DownloadNode.resultIconContains(x, y, i)) {
|
||||
if (DownloadNode.resultIconContains(x, y - offset, i)) {
|
||||
// set focus
|
||||
if (!isLoaded) {
|
||||
SoundController.playSound(SoundEffect.MENUCLICK);
|
||||
@@ -659,7 +684,7 @@ public class DownloadsMenu extends BasicGameState {
|
||||
if (serverButton.contains(x, y)) {
|
||||
SoundController.playSound(SoundEffect.MENUCLICK);
|
||||
resultList = null;
|
||||
startResult = 0;
|
||||
startResultPos.setPosition(0);
|
||||
focusResult = -1;
|
||||
totalResults = 0;
|
||||
page = 0;
|
||||
@@ -675,12 +700,15 @@ public class DownloadsMenu extends BasicGameState {
|
||||
|
||||
// downloads
|
||||
if (!DownloadList.get().isEmpty() && DownloadNode.downloadAreaContains(x, y)) {
|
||||
startDownloadIndexPos.pressed();
|
||||
int maxDownloadsShown = DownloadNode.maxDownloadsShown();
|
||||
for (int i = 0, n = DownloadList.get().size(); i < maxDownloadsShown; i++) {
|
||||
int startDownloadIndex = (int) (startDownloadIndexPos.getPosition() / DownloadNode.getInfoHeight());
|
||||
int offset = (int) (-startDownloadIndexPos.getPosition() + startDownloadIndex * DownloadNode.getInfoHeight());
|
||||
for (int i = 0, n = DownloadList.get().size(); i < maxDownloadsShown + 1; i++) {
|
||||
int index = startDownloadIndex + i;
|
||||
if (index >= n)
|
||||
break;
|
||||
if (DownloadNode.downloadIconContains(x, y, i)) {
|
||||
if (DownloadNode.downloadIconContains(x, y - offset, i)) {
|
||||
SoundController.playSound(SoundEffect.MENUCLICK);
|
||||
DownloadNode node = DownloadList.get().getNode(index);
|
||||
if (node == null)
|
||||
@@ -704,6 +732,12 @@ public class DownloadsMenu extends BasicGameState {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mouseReleased(int button, int x, int y) {
|
||||
startDownloadIndexPos.release();
|
||||
startResultPos.release();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mouseWheelMoved(int newValue) {
|
||||
// change volume
|
||||
@@ -735,8 +769,8 @@ public class DownloadsMenu extends BasicGameState {
|
||||
int diff = newy - oldy;
|
||||
if (diff == 0)
|
||||
return;
|
||||
int shift = (diff < 0) ? 1 : -1;
|
||||
scrollLists(oldx, oldy, shift);
|
||||
startDownloadIndexPos.dragged(-diff);
|
||||
startResultPos.dragged(-diff);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -805,8 +839,8 @@ public class DownloadsMenu extends BasicGameState {
|
||||
rankedButton.resetHover();
|
||||
serverButton.resetHover();
|
||||
focusResult = -1;
|
||||
startResult = 0;
|
||||
startDownloadIndex = 0;
|
||||
startResultPos.setPosition(0);
|
||||
startDownloadIndexPos.setPosition(0);
|
||||
pageDir = Page.RESET;
|
||||
previewID = -1;
|
||||
if (barNotificationOnLoad != null) {
|
||||
@@ -846,21 +880,12 @@ public class DownloadsMenu extends BasicGameState {
|
||||
private void scrollLists(int cx, int cy, int shift) {
|
||||
// search results
|
||||
if (DownloadNode.resultAreaContains(cx, cy)) {
|
||||
DownloadNode[] nodes = resultList;
|
||||
if (nodes != null && nodes.length >= DownloadNode.maxResultsShown()) {
|
||||
int newStartResult = startResult + shift;
|
||||
if (newStartResult >= 0 && newStartResult + DownloadNode.maxResultsShown() <= nodes.length)
|
||||
startResult = newStartResult;
|
||||
}
|
||||
startResultPos.scrollOffset(shift * DownloadNode.getButtonOffset());
|
||||
}
|
||||
|
||||
// downloads
|
||||
else if (DownloadNode.downloadAreaContains(cx, cy)) {
|
||||
if (DownloadList.get().size() >= DownloadNode.maxDownloadsShown()) {
|
||||
int newStartDownloadIndex = startDownloadIndex + shift;
|
||||
if (newStartDownloadIndex >= 0 && newStartDownloadIndex + DownloadNode.maxDownloadsShown() <= DownloadList.get().size())
|
||||
startDownloadIndex = newStartDownloadIndex;
|
||||
}
|
||||
startDownloadIndexPos.scrollOffset(shift * DownloadNode.getInfoHeight());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user