Files
ReplayModCinematic/src/main/java/eu/crushedpixel/replaymod/gui/online/GuiReplayCenter.java
johni0702 f925d56ca2 Split mod into core, recording, replay, render[todo], paths[todo] and extras[wip] modules
Move everything to com.replaymod package
Add KeyBindingRegistry and SettingsRegistry
Recreate settings GUI with new GUI API and dynamically from SettingsRegistry
Use ReplayFile from ReplayStudio
ReplayHandler is now object oriented
Add GuiOverlay, GuiSlider and GuiTexturedButton to GUI API
Rewrite both overlays to use new GUI API
Fix size capping in vertical and horizontal layout
Allow CustomLayouts to have parents
Fix tooltip rendering when close to screen border
Allow changing of columns in GridLayout
2015-10-03 17:36:04 +02:00

580 lines
24 KiB
Java
Executable File

package eu.crushedpixel.replaymod.gui.online;
import com.replaymod.core.ReplayMod;
import eu.crushedpixel.replaymod.api.replay.SearchQuery;
import eu.crushedpixel.replaymod.api.replay.holders.Category;
import eu.crushedpixel.replaymod.api.replay.holders.FileInfo;
import eu.crushedpixel.replaymod.api.replay.holders.MinecraftVersion;
import eu.crushedpixel.replaymod.api.replay.holders.Rating;
import eu.crushedpixel.replaymod.api.replay.pagination.DownloadedFilePagination;
import eu.crushedpixel.replaymod.api.replay.pagination.FavoritedFilePagination;
import eu.crushedpixel.replaymod.api.replay.pagination.Pagination;
import eu.crushedpixel.replaymod.api.replay.pagination.SearchPagination;
import eu.crushedpixel.replaymod.gui.GuiConstants;
import eu.crushedpixel.replaymod.gui.elements.*;
import eu.crushedpixel.replaymod.holders.GuiEntryListStringEntry;
import net.minecraft.client.gui.*;
import net.minecraft.client.resources.I18n;
import org.lwjgl.input.Keyboard;
import java.awt.*;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
public class GuiReplayCenter extends GuiScreen implements GuiYesNoCallback {
private static final SearchQuery recentFileSearchQuery = new SearchQuery(false, null, null, null, null, null,
null, null, null, null);
private static final SearchQuery bestFileSearchQuery = new SearchQuery(true, null, null, null, null, null,
null, null, null, null);
private static final int LOGOUT_CALLBACK_ID = 1;
private ReplayFileList currentList;
private GuiButton loadButton, favButton, likeButton, dislikeButton;
private List<GuiButton> replayButtonBar, bottomBar, topBar;
private GuiToggleButton searchGametypeToggle, searchSortToggle;
private GuiDropdown<GuiEntryListStringEntry> searchCategoryDropdown, searchVersionDropdown;
private GuiAdvancedTextField searchNameInput, searchServerInput;
private GuiButton searchActionButton;
private Queue<GuiListExtended.IGuiListEntry> loadedReplaysQueue = new ConcurrentLinkedQueue<GuiListExtended.IGuiListEntry>();
private boolean showSearchFields = false;
public static GuiYesNo getYesNoGui(GuiYesNoCallback p_152129_0_, int p_152129_2_) {
String s1 = I18n.format("replaymod.gui.center.logoutcallback");
return new GuiYesNo(p_152129_0_, s1, "", I18n.format("replaymod.gui.logout"),
I18n.format("replaymod.gui.cancel"), p_152129_2_);
}
private boolean initialized = false;
@Override
public void initGui() {
Keyboard.enableRepeatEvents(true);
if(!initialized) {
if(!ReplayMod.apiClient.isLoggedIn()) {
mc.displayGuiScreen(new GuiLoginPrompt(new GuiMainMenu(), this, true).toMinecraft());
}
//Top Button Bar
topBar = new ArrayList<GuiButton>();
GuiButton recentButton = new GuiButton(GuiConstants.CENTER_RECENT_BUTTON, 20, 30, I18n.format("replaymod.gui.center.top.recent"));
topBar.add(recentButton);
GuiButton bestButton = new GuiButton(GuiConstants.CENTER_BEST_BUTTON, 20, 30, I18n.format("replaymod.gui.center.top.best"));
topBar.add(bestButton);
GuiButton downloadedReplayButton = new GuiButton(GuiConstants.CENTER_DOWNLOADED_REPLAYS_BUTTON, 20, 30, I18n.format("replaymod.gui.center.top.downloaded"));
downloadedReplayButton.enabled = ReplayMod.apiClient.isLoggedIn();
topBar.add(downloadedReplayButton);
GuiButton favoritedReplayButton = new GuiButton(GuiConstants.CENTER_FAVORITED_REPLAYS_BUTTON, 20, 30, I18n.format("replaymod.gui.center.top.favorited"));
favoritedReplayButton.enabled = ReplayMod.apiClient.isLoggedIn();
topBar.add(favoritedReplayButton);
GuiButton searchButton = new GuiButton(GuiConstants.CENTER_SEARCH_BUTTON, 20, 30, I18n.format("replaymod.gui.center.top.search"));
topBar.add(searchButton);
//Replay specific actions (load, rate, etc)
replayButtonBar = new ArrayList<GuiButton>();
loadButton = new GuiButton(GuiConstants.CENTER_LOAD_REPLAY_BUTTON, 20, 30, I18n.format("replaymod.gui.download"));
replayButtonBar.add(loadButton);
favButton = new GuiButton(GuiConstants.CENTER_FAV_REPLAY_BUTTON, 20, 30, I18n.format("replaymod.gui.center.favorite"));
replayButtonBar.add(favButton);
likeButton = new GuiButton(GuiConstants.CENTER_LIKE_REPLAY_BUTTON, 20, 30, I18n.format("replaymod.gui.like"));
replayButtonBar.add(likeButton);
dislikeButton = new GuiButton(GuiConstants.CENTER_DISLIKE_REPLAY_BUTTON, 20, 30, I18n.format("replaymod.gui.dislike"));
replayButtonBar.add(dislikeButton);
//Bottom Button Bar (dat alliteration)
bottomBar = new ArrayList<GuiButton>();
GuiButton logoutButton = new GuiButton(GuiConstants.CENTER_LOGOUT_BUTTON, 20, 20, I18n.format("replaymod.gui.logout"));
bottomBar.add(logoutButton);
GuiButton managerButton = new GuiButton(GuiConstants.CENTER_MANAGER_BUTTON, 20, 20, I18n.format("replaymod.gui.replayviewer"));
bottomBar.add(managerButton);
GuiButton exitButton = new GuiButton(GuiConstants.CENTER_BACK_BUTTON, 20, 20, I18n.format("replaymod.gui.mainmenu"));
bottomBar.add(exitButton);
showOnlineRecent();
disableTopBarButton(GuiConstants.CENTER_RECENT_BUTTON);
//Search GUI
searchActionButton = new GuiButton(GuiConstants.CENTER_SEARCH_ACTION_BUTTON, 20, 20, I18n.format("replaymod.gui.center.top.search"));
searchGametypeToggle = new GuiToggleButton(GuiConstants.CENTER_SEARCH_GAMETYPE_TOGGLE, 0, 0, I18n.format("replaymod.gui.center.search.gametype")+": ",
new String[]{I18n.format("options.particles.all"), I18n.format("menu.singleplayer"), I18n.format("menu.multiplayer")});
searchSortToggle = new GuiToggleButton(GuiConstants.CENTER_SEARCH_ORDER_TOGGLE, 0, 0, I18n.format("replaymod.gui.center.search.order")+": ",
new String[]{I18n.format("replaymod.gui.center.search.order.best"), I18n.format("replaymod.gui.center.search.order.recent")});
searchCategoryDropdown = new GuiDropdown<GuiEntryListStringEntry>(fontRendererObj, 0, 0, 0, Category.values().length+1);
searchVersionDropdown = new GuiDropdown<GuiEntryListStringEntry>(fontRendererObj, 0, 0, 0, 5);
searchNameInput = new GuiAdvancedTextField(fontRendererObj, 0, 0, 50, 20);
searchServerInput = new GuiAdvancedTextField(fontRendererObj, 0, 0, 50, 20);
searchNameInput.hint = I18n.format("replaymod.gui.center.search.name");
searchServerInput.hint = I18n.format("replaymod.gui.center.search.server");
searchCategoryDropdown.addElement(new GuiEntryListStringEntry(I18n.format("replaymod.gui.center.search.category")));
for(Category c : Category.values()) {
searchCategoryDropdown.addElement(new GuiEntryListStringEntry(c.toNiceString()));
}
searchVersionDropdown.addElement(new GuiEntryListStringEntry(I18n.format("replaymod.gui.center.search.version")));
for(MinecraftVersion v : MinecraftVersion.values()) {
searchVersionDropdown.addElement(new GuiEntryListStringEntry(v.toNiceName()));
}
}
int wd = this.width - 40;
int sw = wd/3 + 4;
searchNameInput.xPosition = searchServerInput.xPosition = searchActionButton.xPosition = 20;
searchCategoryDropdown.xPosition = searchVersionDropdown.xPosition = 20 + sw;
searchGametypeToggle.xPosition = searchSortToggle.xPosition = 20 + 2*sw;
searchNameInput.width = searchCategoryDropdown.width = searchGametypeToggle.width = searchActionButton.width =
searchServerInput.width = searchVersionDropdown.width = searchSortToggle.width = sw-7;
searchNameInput.yPosition = searchCategoryDropdown.yPosition = searchGametypeToggle.yPosition = 70;
searchServerInput.yPosition = searchVersionDropdown.yPosition = searchSortToggle.yPosition = 100;
searchActionButton.yPosition = 130;
if(showSearchFields) {
showSearchFields();
}
if(currentList != null) {
currentList.setDimensions(this.width, this.height, 50, this.height - 60);
}
@SuppressWarnings("unchecked")
List<GuiButton> buttonList = this.buttonList;
int i = 0;
for(GuiButton b : topBar) {
int w = this.width - 30;
int w2 = w / topBar.size();
int x = 15 + (w2 * i);
b.xPosition = x + 2;
b.yPosition = 20;
b.width = w2 - 4;
buttonList.add(b);
i++;
}
i = 0;
for(GuiButton b : replayButtonBar) {
int w = this.width - 30;
int w2 = w / replayButtonBar.size();
int x = 15 + (w2 * i);
b.xPosition = x + 2;
b.yPosition = height - 55;
b.width = w2 - 4;
b.enabled = false;
buttonList.add(b);
i++;
}
i = 0;
for(GuiButton b : bottomBar) {
int w = this.width - 30;
int w2 = w / bottomBar.size();
int x = 15 + (w2 * i);
b.xPosition = x + 2;
b.yPosition = height - 30;
b.width = w2 - 4;
buttonList.add(b);
i++;
}
initialized = true;
}
public void elementSelected(int index) {
if(index < 0) {
for(GuiButton b : replayButtonBar) {
b.enabled = false;
}
return;
}
GuiReplayListEntry entry = (GuiReplayListEntry)currentList.getListEntry(index);
FileInfo info = entry.getFileInfo();
if(info != null) {
boolean downloaded = ReplayMod.downloadedFileHandler.getFileForID(info.getId()) != null;
loadButton.displayString = downloaded ? I18n.format("replaymod.gui.load") : I18n.format("replaymod.gui.download");
loadButton.enabled = true;
boolean favorited = ReplayMod.favoritedFileHandler.isFavorited(info.getId());
favButton.displayString = favorited ? I18n.format("replaymod.gui.center.unfavorite") : I18n.format("replaymod.gui.center.favorite");
//if not downloaded, disable favorising
favButton.enabled = favorited || downloaded;
likeButton.enabled = dislikeButton.enabled = downloaded;
Rating.RatingType rating = ReplayMod.ratedFileHandler.getRating(info.getId());
likeButton.displayString = I18n.format("replaymod.gui.like");
dislikeButton.displayString = I18n.format("replaymod.gui.dislike");
if(rating == Rating.RatingType.LIKE) {
likeButton.displayString = I18n.format("replaymod.gui.removelike");
} else if(rating == Rating.RatingType.DISLIKE) {
dislikeButton.displayString = I18n.format("replaymod.gui.removedislike");
}
} else {
for(GuiButton b : replayButtonBar) {
b.enabled = false;
}
}
}
private void disableTopBarButton(int id) {
for(GuiButton b : topBar) {
b.enabled = b.id != id;
}
}
@Override
protected void actionPerformed(GuiButton button) throws java.io.IOException {
if(!button.enabled) return;
if(button.id == GuiConstants.CENTER_BACK_BUTTON) {
mc.displayGuiScreen(new GuiMainMenu());
} else if(button.id == GuiConstants.CENTER_LOGOUT_BUTTON) {
mc.displayGuiScreen(getYesNoGui(this, LOGOUT_CALLBACK_ID));
} else if(button.id == GuiConstants.CENTER_MANAGER_BUTTON) {
// TODO
// mc.displayGuiScreen(new GuiReplayViewer(mod));
} else if(button.id == GuiConstants.CENTER_RECENT_BUTTON) {
disableTopBarButton(button.id);
showOnlineRecent();
} else if(button.id == GuiConstants.CENTER_BEST_BUTTON) {
disableTopBarButton(button.id);
showOnlineBest();
} else if(button.id == GuiConstants.CENTER_DOWNLOADED_REPLAYS_BUTTON) {
disableTopBarButton(button.id);
showDownloadedFiles();
} else if(button.id == GuiConstants.CENTER_FAVORITED_REPLAYS_BUTTON) {
disableTopBarButton(button.id);
showFavoritedFiles();
} else if(button.id == GuiConstants.CENTER_SEARCH_BUTTON) {
disableTopBarButton(button.id);
showReplaySearch();
} else if(button.id == GuiConstants.CENTER_LOAD_REPLAY_BUTTON) {
GuiReplayListEntry entry = (GuiReplayListEntry)currentList.getListEntry(currentList.selected);
FileInfo info = entry.getFileInfo();
if(info != null) {
File f = ReplayMod.downloadedFileHandler.getFileForID(info.getId());
if(f == null) {
new GuiReplayDownloading(info).display();
} else {
mc.displayGuiScreen(new GuiReplayInstanceChooser(info, f));
}
}
} else if(button.id == GuiConstants.CENTER_FAV_REPLAY_BUTTON) {
GuiReplayListEntry entry = (GuiReplayListEntry)currentList.getListEntry(currentList.selected);
FileInfo info = entry.getFileInfo();
if(info != null) {
boolean favorited = ReplayMod.favoritedFileHandler.isFavorited(info.getId());
try {
if(favorited) ReplayMod.favoritedFileHandler.removeFromFavorites(info.getId());
else ReplayMod.favoritedFileHandler.addToFavorites(info.getId());
} catch(Exception e) {
e.printStackTrace();
}
elementSelected(currentList.selected);
}
} else if(button.id == GuiConstants.CENTER_LIKE_REPLAY_BUTTON) {
GuiReplayListEntry entry = (GuiReplayListEntry)currentList.getListEntry(currentList.selected);
FileInfo info = entry.getFileInfo();
if(info != null) {
try {
if(ReplayMod.ratedFileHandler.getRating(info.getId()) == Rating.RatingType.LIKE) {
ReplayMod.ratedFileHandler.rateFile(info.getId(), Rating.RatingType.NEUTRAL);
} else {
ReplayMod.ratedFileHandler.rateFile(info.getId(), Rating.RatingType.LIKE);
}
} catch(Exception e) {
e.printStackTrace();
}
elementSelected(currentList.selected);
}
} else if(button.id == GuiConstants.CENTER_DISLIKE_REPLAY_BUTTON) {
GuiReplayListEntry entry = (GuiReplayListEntry)currentList.getListEntry(currentList.selected);
FileInfo info = entry.getFileInfo();
if(info != null) {
try {
if(ReplayMod.ratedFileHandler.getRating(info.getId()) == Rating.RatingType.DISLIKE) {
ReplayMod.ratedFileHandler.rateFile(info.getId(), Rating.RatingType.NEUTRAL);
} else {
ReplayMod.ratedFileHandler.rateFile(info.getId(), Rating.RatingType.DISLIKE);
}
} catch(Exception e) {
e.printStackTrace();
}
elementSelected(currentList.selected);
}
}
//the search action button
else if(button.id == GuiConstants.CENTER_SEARCH_ACTION_BUTTON) {
SearchQuery searchQuery = new SearchQuery();
Boolean gameType = null;
if(searchGametypeToggle.getValue() > 0) {
gameType = searchGametypeToggle.getValue() == 1;
}
searchQuery.singleplayer = gameType;
Integer category = null;
if(searchCategoryDropdown.getSelectionIndex() > 0) {
category = searchCategoryDropdown.getSelectionIndex()-1;
}
searchQuery.category = category;
String mcversion = null;
if(searchVersionDropdown.getSelectionIndex() > 0) {
mcversion = MinecraftVersion.values()[searchVersionDropdown.getSelectionIndex()-1].getApiName();
}
searchQuery.version = mcversion;
if(searchNameInput.getText().trim().length() > 0) {
searchQuery.name = searchNameInput.getText().trim();
}
if(searchServerInput.getText().trim().length() > 0) {
searchQuery.server = searchServerInput.getText().trim();
}
searchQuery.order = searchSortToggle.getValue() == 0;
SearchPagination searchPagination = new SearchPagination(searchQuery);
showReplaySearch(searchPagination);
}
}
@Override
public void confirmClicked(boolean result, int id) {
if(id == LOGOUT_CALLBACK_ID) {
if(result) {
mc.addScheduledTask(new Runnable() {
@Override
public void run() {
ReplayMod.apiClient.logout();
mc.displayGuiScreen(new GuiMainMenu());
}
});
} else {
mc.displayGuiScreen(this);
elementSelected(currentList.selected);
initGui();
}
}
}
@Override
public void drawScreen(int mouseX, int mouseY, float partialTicks) {
this.drawDefaultBackground();
if(currentList != null) {
currentList.drawScreen(mouseX, mouseY, partialTicks);
}
super.drawScreen(mouseX, mouseY, partialTicks);
if(((favButton.isMouseOver() && !favButton.enabled) || (likeButton.isMouseOver() && !likeButton.enabled)
|| (dislikeButton.isMouseOver() && !dislikeButton.enabled )) && (currentList != null && currentList.selected != -1)) {
ReplayMod.tooltipRenderer.drawTooltip(mouseX, mouseY, I18n.format("replaymod.gui.center.downloadrequired"), this, Color.RED);
}
this.drawCenteredString(fontRendererObj, I18n.format("replaymod.gui.replaycenter"), this.width / 2, 5, Color.WHITE.getRGB());
//search fields
if(showSearchFields) {
this.drawString(fontRendererObj, I18n.format("replaymod.gui.center.search.filters"), searchActionButton.xPosition, 50, Color.WHITE.getRGB());
searchActionButton.drawButton(mc, mouseX, mouseY);
searchGametypeToggle.drawButton(mc, mouseX, mouseY);
searchSortToggle.drawButton(mc, mouseX, mouseY);
searchVersionDropdown.drawTextBox();
searchCategoryDropdown.drawTextBox();
searchNameInput.drawTextBox();
searchServerInput.drawTextBox();
}
}
@Override
public void handleMouseInput() throws IOException {
super.handleMouseInput();
if(currentList != null) {
this.currentList.handleMouseInput();
}
}
@Override
protected void mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOException {
super.mouseClicked(mouseX, mouseY, mouseButton);
if(currentList != null) {
this.currentList.mouseClicked(mouseX, mouseY, mouseButton);
}
if(showSearchFields) {
if(!searchCategoryDropdown.mouseClickedResult(mouseX, mouseY))
searchVersionDropdown.mouseClicked(mouseX, mouseY, mouseButton);
searchNameInput.mouseClicked(mouseX, mouseY, mouseButton);
searchServerInput.mouseClicked(mouseX, mouseY, mouseButton);
}
}
@Override
public void updateScreen() {
if(showSearchFields) {
searchNameInput.updateCursorCounter();
searchServerInput.updateCursorCounter();
}
while (!loadedReplaysQueue.isEmpty()) {
GuiListExtended.IGuiListEntry entry = loadedReplaysQueue.poll();
if (entry instanceof GuiLoadingListEntry) {
currentList.removeEntry(entry);
} else {
currentList.addEntry(currentList.getEntries().size() - 1, entry);
}
}
}
@Override
protected void keyTyped(char typedChar, int keyCode) throws IOException {
if(showSearchFields) {
searchNameInput.textboxKeyTyped(typedChar, keyCode);
searchServerInput.textboxKeyTyped(typedChar, keyCode);
}
super.keyTyped(typedChar, keyCode);
}
@Override
protected void mouseReleased(int mouseX, int mouseY, int state) {
super.mouseReleased(mouseX, mouseY, state);
if(currentList != null) {
this.currentList.mouseReleased(mouseX, mouseY, state);
}
}
@Override
public void onGuiClosed() {
Keyboard.enableRepeatEvents(false);
}
private Thread currentListLoader;
private void cancelCurrentListLoader() {
if(currentListLoader != null && currentListLoader.isAlive()) {
currentListLoader.interrupt();
try {
currentListLoader.join();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
loadedReplaysQueue.clear();
}
public void show(final Pagination pagination) {
cancelCurrentListLoader();
hideSearchFields();
elementSelected(-1);
currentList = new ReplayFileList(mc, width, height, 50, height - 60, this);
final GuiLoadingListEntry loadingListEntry = new GuiLoadingListEntry();
currentList.addEntry(loadingListEntry);
currentListLoader = new Thread(new Runnable() {
@Override
public void run() {
if(pagination.getLoadedPages() < 0) {
pagination.fetchPage();
}
for(FileInfo i : pagination.getFiles()) {
if(Thread.interrupted()) break;
try {
File tmp = null;
if(i.hasThumbnail()) {
tmp = File.createTempFile("thumb_online_" + i.getId(), "jpg");
ReplayMod.apiClient.downloadThumbnail(i.getId(), tmp);
}
final GuiReplayListEntry entry = new GuiReplayListEntry(currentList, i, tmp);
loadedReplaysQueue.offer(entry);
} catch(Exception e) {
e.printStackTrace();
}
}
loadedReplaysQueue.add(loadingListEntry);
}
}, "replaymod-list-loader");
currentListLoader.start();
}
public void showOnlineRecent() {
show(new SearchPagination(recentFileSearchQuery));
}
public void showOnlineBest() {
show(new SearchPagination(bestFileSearchQuery));
}
public void showDownloadedFiles() {
show(new DownloadedFilePagination());
}
public void showFavoritedFiles() {
show(new FavoritedFilePagination());
}
public void showReplaySearch() {
cancelCurrentListLoader();
currentList = null;
showSearchFields();
}
public void showReplaySearch(final SearchPagination searchPagination) {
disableTopBarButton(-1);
show(searchPagination);
}
@SuppressWarnings("unchecked")
private void showSearchFields() {
showSearchFields = true;
buttonList.add(searchActionButton);
buttonList.add(searchGametypeToggle);
buttonList.add(searchSortToggle);
}
private void hideSearchFields() {
showSearchFields = false;
buttonList.remove(searchActionButton);
buttonList.remove(searchGametypeToggle);
buttonList.remove(searchSortToggle);
}
}