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:
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user