From 99718a13163d0374f3125f11d0a0115846369697 Mon Sep 17 00:00:00 2001 From: CrushedPixel Date: Thu, 4 Jun 2015 16:48:58 +0200 Subject: [PATCH] The Replay Viewer now loads its entries asynchronously to prevent Minecraft from freezing whenever the Replay Viewer is opened --- .../gui/elements/GuiLoadingListEntry.java | 5 -- .../replaymod/gui/online/GuiReplayCenter.java | 2 +- .../replaymod/gui/online/GuiUploadFile.java | 6 +- .../gui/replayviewer/GuiReplayViewer.java | 57 ++++++++++++++----- 4 files changed, 48 insertions(+), 22 deletions(-) diff --git a/src/main/java/eu/crushedpixel/replaymod/gui/elements/GuiLoadingListEntry.java b/src/main/java/eu/crushedpixel/replaymod/gui/elements/GuiLoadingListEntry.java index 6cd69bd0..ed6e8148 100755 --- a/src/main/java/eu/crushedpixel/replaymod/gui/elements/GuiLoadingListEntry.java +++ b/src/main/java/eu/crushedpixel/replaymod/gui/elements/GuiLoadingListEntry.java @@ -10,13 +10,8 @@ public class GuiLoadingListEntry implements IGuiListEntry { boolean registered = false; private final Minecraft mc = Minecraft.getMinecraft(); - private GuiReplayListExtended parent; private final String message = I18n.format("replaymod.gui.loading")+"..."; - public GuiLoadingListEntry(GuiReplayListExtended parent) { - this.parent = parent; - } - @Override public void drawEntry(int slotIndex, int x, int y, int listWidth, int slotHeight, int mouseX, int mouseY, boolean isSelected) { try { diff --git a/src/main/java/eu/crushedpixel/replaymod/gui/online/GuiReplayCenter.java b/src/main/java/eu/crushedpixel/replaymod/gui/online/GuiReplayCenter.java index 4ddbd612..4c92bcba 100755 --- a/src/main/java/eu/crushedpixel/replaymod/gui/online/GuiReplayCenter.java +++ b/src/main/java/eu/crushedpixel/replaymod/gui/online/GuiReplayCenter.java @@ -355,7 +355,7 @@ public class GuiReplayCenter extends GuiScreen implements GuiYesNoCallback { private void updateCurrentList(Pagination pagination) { elementSelected(-1); currentList = new ReplayFileList(mc, width, height, 50, height - 60, this); - loadingListEntry = new GuiLoadingListEntry(currentList); + loadingListEntry = new GuiLoadingListEntry(); currentList.addEntry(loadingListEntry); if(pagination.getLoadedPages() < 0) { diff --git a/src/main/java/eu/crushedpixel/replaymod/gui/online/GuiUploadFile.java b/src/main/java/eu/crushedpixel/replaymod/gui/online/GuiUploadFile.java index e3f95447..4a22d0a6 100755 --- a/src/main/java/eu/crushedpixel/replaymod/gui/online/GuiUploadFile.java +++ b/src/main/java/eu/crushedpixel/replaymod/gui/online/GuiUploadFile.java @@ -121,7 +121,11 @@ public class GuiUploadFile extends GuiScreen { @Override public void initGui() { - if(replayFile == null) return; + if(replayFile == null) { + mc.displayGuiScreen(parent); + return; + } + if(!AuthenticationHandler.isAuthenticated()) { mc.displayGuiScreen(new GuiLoginPrompt(parent, this)); return; diff --git a/src/main/java/eu/crushedpixel/replaymod/gui/replayviewer/GuiReplayViewer.java b/src/main/java/eu/crushedpixel/replaymod/gui/replayviewer/GuiReplayViewer.java index 431a57b9..e03b2dfa 100755 --- a/src/main/java/eu/crushedpixel/replaymod/gui/replayviewer/GuiReplayViewer.java +++ b/src/main/java/eu/crushedpixel/replaymod/gui/replayviewer/GuiReplayViewer.java @@ -4,6 +4,7 @@ import com.mojang.realmsclient.util.Pair; import eu.crushedpixel.replaymod.ReplayMod; import eu.crushedpixel.replaymod.api.replay.holders.FileInfo; import eu.crushedpixel.replaymod.gui.GuiReplaySettings; +import eu.crushedpixel.replaymod.gui.elements.GuiLoadingListEntry; import eu.crushedpixel.replaymod.gui.elements.GuiReplayListEntry; import eu.crushedpixel.replaymod.gui.elements.GuiReplayListExtended; import eu.crushedpixel.replaymod.gui.online.GuiUploadFile; @@ -11,7 +12,6 @@ import eu.crushedpixel.replaymod.recording.ReplayMetaData; import eu.crushedpixel.replaymod.registry.ResourceHelper; import eu.crushedpixel.replaymod.replay.ReplayHandler; import eu.crushedpixel.replaymod.utils.ImageUtils; -import eu.crushedpixel.replaymod.utils.MouseUtils; import eu.crushedpixel.replaymod.utils.ReplayFile; import eu.crushedpixel.replaymod.utils.ReplayFileIO; import net.minecraft.client.gui.GuiButton; @@ -23,7 +23,6 @@ import net.minecraft.util.Util; import org.apache.commons.io.FilenameUtils; import org.lwjgl.Sys; import org.lwjgl.input.Keyboard; -import org.lwjgl.util.Point; import javax.imageio.ImageIO; import java.awt.*; @@ -59,7 +58,11 @@ public class GuiReplayViewer extends GuiScreen implements GuiYesNoCallback { } private void reloadFiles() { + GuiLoadingListEntry loadingListEntry = new GuiLoadingListEntry(); + replayGuiList.clearEntries(); + replayGuiList.addEntry(loadingListEntry); + replayFileList = new ArrayList, File>>(); for(File file : ReplayFileIO.getAllReplayFiles()) { @@ -75,20 +78,29 @@ public class GuiReplayViewer extends GuiScreen implements GuiYesNoCallback { ImageIO.write(img, "jpg", tmp); } - replayFileList.add(Pair.of(Pair.of(file, metaData), tmp)); + + final Pair, File> p = Pair.of(Pair.of(file, metaData), tmp); + final int index = getInsertionIndex(p, replayFileList); + + replayFileList.add(index, p); + + final FileInfo fileInfo = new FileInfo(-1, p.first().second(), null, null, + -1, -1, -1, FilenameUtils.getBaseName(p.first().first().getName()), true, -1); + + mc.addScheduledTask(new Runnable() { + @Override + public void run() { + replayGuiList.addEntry(index, new GuiReplayListEntry(replayGuiList, fileInfo, p.second())); + } + }); + replayFile.close(); } catch(Exception e) { e.printStackTrace(); + } finally { + replayGuiList.removeEntry(loadingListEntry); } } - - Collections.sort(replayFileList, new FileAgeComparator()); - - for(Pair, File> p : replayFileList) { - FileInfo fileInfo = new FileInfo(-1, p.first().second(), null, null, - -1, -1, -1, FilenameUtils.getBaseName(p.first().first().getName()), true, -1); - replayGuiList.addEntry(new GuiReplayListEntry(replayGuiList, fileInfo, p.second())); - } } @Override @@ -109,7 +121,13 @@ public class GuiReplayViewer extends GuiScreen implements GuiYesNoCallback { this.replayGuiList.setDimensions(this.width, this.height, 32, this.height - 64); } - reloadFiles(); + new Thread(new Runnable() { + @Override + public void run() { + reloadFiles(); + } + }, "replay-viewer-file-reloader").start(); + this.createButtons(); } @@ -152,7 +170,6 @@ public class GuiReplayViewer extends GuiScreen implements GuiYesNoCallback { if(uploadButton.isMouseOver() && !uploadButton.enabled && loadButton.enabled) { if(currentFileUploaded) { - Point mouse = MouseUtils.getMousePos(); ReplayMod.tooltipRenderer.drawTooltip(mouseX, mouseY, I18n.format("replaymod.gui.viewer.alreadyuploaded"), this, Color.RED.getRGB()); } } @@ -258,17 +275,27 @@ public class GuiReplayViewer extends GuiScreen implements GuiYesNoCallback { } - public class FileAgeComparator implements Comparator, File>> { + private static FileAgeComparator fileAgeComparator = new FileAgeComparator(); + + public static class FileAgeComparator implements Comparator, File>> { @Override public int compare(Pair, File> o1, Pair, File> o2) { try { - return (int) (new Date(o2.first().second().getDate()).compareTo(new Date(o1.first().second().getDate()))); + return new Date(o2.first().second().getDate()).compareTo(new Date(o1.first().second().getDate())); } catch(Exception e) { return 0; } } + } + private int getInsertionIndex(Pair, File> p, List, File>> list) { + List, File>> nl = new ArrayList, File>>(list); + + nl.add(p); + Collections.sort(nl, fileAgeComparator); + + return nl.indexOf(p); } }