Improvements in search query switching in the downloads menu.

Submitting new queries will now actually cancel the old query and immediately use the result of the new query.  The old behavior was very inconsistent about this.

Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
This commit is contained in:
Jeffrey Han
2015-08-08 21:57:43 -05:00
parent 8173b9b4c2
commit fee85c6a73

View File

@@ -139,9 +139,6 @@ public class DownloadsMenu extends BasicGameState {
/** Page direction for last query. */ /** Page direction for last query. */
private Page lastQueryDir = Page.RESET; private Page lastQueryDir = Page.RESET;
/** Number of active requests. */
private int activeRequests = 0;
/** Previous and next page buttons. */ /** Previous and next page buttons. */
private MenuButton prevPage, nextPage; private MenuButton prevPage, nextPage;
@@ -157,6 +154,92 @@ public class DownloadsMenu extends BasicGameState {
/** The bar notification to send upon entering the state. */ /** The bar notification to send upon entering the state. */
private String barNotificationOnLoad; private String barNotificationOnLoad;
/** Search query, executed in {@code queryThread}. */
private SearchQuery searchQuery;
/** Search query helper class. */
private class SearchQuery implements Runnable {
/** The search query. */
private String query;
/** The download server. */
private DownloadServer server;
/** Whether the query was interrupted. */
private boolean interrupted = false;
/** Whether the query has completed execution. */
private boolean complete = false;
/**
* Constructor.
* @param query the search query
* @param server the download server
*/
public SearchQuery(String query, DownloadServer server) {
this.query = query;
this.server = server;
}
/** Interrupt the query and prevent the results from being processed, if not already complete. */
public void interrupt() { interrupted = true; }
/** Returns whether the query has completed execution. */
public boolean isComplete() { return complete; }
@Override
public void run() {
// check page direction
Page lastPageDir = pageDir;
pageDir = Page.RESET;
int lastPageSize = (resultList != null) ? resultList.length : 0;
int newPage = page;
if (lastPageDir == Page.RESET)
newPage = 1;
else if (lastPageDir == Page.NEXT)
newPage++;
else if (lastPageDir == Page.PREVIOUS)
newPage--;
try {
DownloadNode[] nodes = server.resultList(query, newPage, rankedOnly);
if (!interrupted) {
// update page total
page = newPage;
if (nodes != null) {
if (lastPageDir == Page.NEXT)
pageResultTotal += nodes.length;
else if (lastPageDir == Page.PREVIOUS)
pageResultTotal -= lastPageSize;
else if (lastPageDir == Page.RESET)
pageResultTotal = nodes.length;
} else
pageResultTotal = 0;
resultList = nodes;
totalResults = server.totalResults();
focusResult = -1;
startResult = 0;
if (nodes == null)
searchResultString = "An error has occurred.";
else {
if (query.isEmpty())
searchResultString = "Type to search!";
else if (totalResults == 0 || resultList.length == 0)
searchResultString = "No results found.";
else
searchResultString = String.format("%d result%s found!",
totalResults, (totalResults == 1) ? "" : "s");
}
}
} catch (IOException e) {
if (!interrupted)
searchResultString = "Could not establish connection to server.";
} finally {
complete = true;
}
}
}
// game-related variables // game-related variables
private GameContainer container; private GameContainer container;
private StateBasedGame game; private StateBasedGame game;
@@ -381,72 +464,22 @@ public class DownloadsMenu extends BasicGameState {
searchTimer = 0; searchTimer = 0;
searchTimerReset = false; searchTimerReset = false;
final String query = search.getText().trim().toLowerCase(); String query = search.getText().trim().toLowerCase();
final DownloadServer server = SERVERS[serverIndex]; DownloadServer server = SERVERS[serverIndex];
if ((lastQuery == null || !query.equals(lastQuery)) && if ((lastQuery == null || !query.equals(lastQuery)) &&
(query.length() == 0 || query.length() >= server.minQueryLength())) { (query.length() == 0 || query.length() >= server.minQueryLength())) {
lastQuery = query; lastQuery = query;
lastQueryDir = pageDir; lastQueryDir = pageDir;
if (queryThread != null && queryThread.isAlive()) if (queryThread != null && queryThread.isAlive()) {
queryThread.interrupt(); queryThread.interrupt();
if (searchQuery != null)
searchQuery.interrupt();
}
// execute query // execute query
queryThread = new Thread() { searchQuery = new SearchQuery(query, server);
@Override queryThread = new Thread(searchQuery);
public void run() {
activeRequests++;
// check page direction
Page lastPageDir = pageDir;
pageDir = Page.RESET;
int lastPageSize = (resultList != null) ? resultList.length : 0;
int newPage = page;
if (lastPageDir == Page.RESET)
newPage = 1;
else if (lastPageDir == Page.NEXT)
newPage++;
else if (lastPageDir == Page.PREVIOUS)
newPage--;
try {
DownloadNode[] nodes = server.resultList(query, newPage, rankedOnly);
if (activeRequests - 1 == 0) {
// update page total
page = newPage;
if (nodes != null) {
if (lastPageDir == Page.NEXT)
pageResultTotal += nodes.length;
else if (lastPageDir == Page.PREVIOUS)
pageResultTotal -= lastPageSize;
else if (lastPageDir == Page.RESET)
pageResultTotal = nodes.length;
} else
pageResultTotal = 0;
resultList = nodes;
totalResults = server.totalResults();
focusResult = -1;
startResult = 0;
if (nodes == null)
searchResultString = "An error has occurred.";
else {
if (query.isEmpty())
searchResultString = "Type to search!";
else if (totalResults == 0 || resultList.length == 0)
searchResultString = "No results found.";
else
searchResultString = String.format("%d result%s found!",
totalResults, (totalResults == 1) ? "" : "s");
}
}
} catch (IOException e) {
searchResultString = "Could not establish connection to server.";
} finally {
activeRequests--;
queryThread = null;
}
}
};
queryThread.start(); queryThread.start();
} }
} }
@@ -579,23 +612,27 @@ public class DownloadsMenu extends BasicGameState {
// pages // pages
if (nodes.length > 0) { if (nodes.length > 0) {
if (page > 1 && prevPage.contains(x, y)) { if (page > 1 && prevPage.contains(x, y)) {
if (lastQueryDir == Page.PREVIOUS && queryThread != null && queryThread.isAlive()) if (lastQueryDir == Page.PREVIOUS && searchQuery != null && !searchQuery.isComplete())
; // don't send consecutive requests ; // don't send consecutive requests
else { else {
SoundController.playSound(SoundEffect.MENUCLICK); SoundController.playSound(SoundEffect.MENUCLICK);
pageDir = Page.PREVIOUS; pageDir = Page.PREVIOUS;
lastQuery = null; lastQuery = null;
if (searchQuery != null)
searchQuery.interrupt();
resetSearchTimer(); resetSearchTimer();
} }
return; return;
} }
if (pageResultTotal < totalResults && nextPage.contains(x, y)) { if (pageResultTotal < totalResults && nextPage.contains(x, y)) {
if (lastQueryDir == Page.NEXT && queryThread != null && queryThread.isAlive()) if (lastQueryDir == Page.NEXT && searchQuery != null && !searchQuery.isComplete())
; // don't send consecutive requests ; // don't send consecutive requests
else { else {
SoundController.playSound(SoundEffect.MENUCLICK); SoundController.playSound(SoundEffect.MENUCLICK);
pageDir = Page.NEXT; pageDir = Page.NEXT;
lastQuery = null; lastQuery = null;
if (searchQuery != null)
searchQuery.interrupt();
resetSearchTimer(); resetSearchTimer();
return; return;
} }
@@ -648,6 +685,8 @@ public class DownloadsMenu extends BasicGameState {
search.setText(""); search.setText("");
lastQuery = null; lastQuery = null;
pageDir = Page.RESET; pageDir = Page.RESET;
if (searchQuery != null)
searchQuery.interrupt();
resetSearchTimer(); resetSearchTimer();
return; return;
} }
@@ -656,6 +695,8 @@ public class DownloadsMenu extends BasicGameState {
rankedOnly = !rankedOnly; rankedOnly = !rankedOnly;
lastQuery = null; lastQuery = null;
pageDir = Page.RESET; pageDir = Page.RESET;
if (searchQuery != null)
searchQuery.interrupt();
resetSearchTimer(); resetSearchTimer();
return; return;
} }
@@ -672,6 +713,8 @@ public class DownloadsMenu extends BasicGameState {
serverIndex = (serverIndex + 1) % SERVERS.length; serverIndex = (serverIndex + 1) % SERVERS.length;
lastQuery = null; lastQuery = null;
pageDir = Page.RESET; pageDir = Page.RESET;
if (searchQuery != null)
searchQuery.interrupt();
resetSearchTimer(); resetSearchTimer();
return; return;
} }
@@ -775,6 +818,8 @@ public class DownloadsMenu extends BasicGameState {
SoundController.playSound(SoundEffect.MENUCLICK); SoundController.playSound(SoundEffect.MENUCLICK);
lastQuery = null; lastQuery = null;
pageDir = Page.CURRENT; pageDir = Page.CURRENT;
if (searchQuery != null)
searchQuery.interrupt();
resetSearchTimer(); resetSearchTimer();
break; break;
case Input.KEY_F7: case Input.KEY_F7: