diff --git a/src/main/java/com/replaymod/recording/gui/GuiSavingReplay.java b/src/main/java/com/replaymod/recording/gui/GuiSavingReplay.java index a704a388..faf4412a 100644 --- a/src/main/java/com/replaymod/recording/gui/GuiSavingReplay.java +++ b/src/main/java/com/replaymod/recording/gui/GuiSavingReplay.java @@ -116,7 +116,7 @@ public class GuiSavingReplay { private GuiPanel createTooltip(Path path, ReplayMetaData metaData) { GuiTooltip tooltip = new GuiTooltip(); - GuiReplayViewer.GuiReplayEntry entry = new GuiReplayViewer.GuiReplayEntry(path.toFile(), metaData, null); + GuiReplayViewer.GuiReplayEntry entry = new GuiReplayViewer.GuiReplayEntry(path.toFile(), metaData, null, new ArrayList<>()); return new GuiPanel().setLayout(new CustomLayout() { @Override protected void layout(GuiPanel container, int width, int height) { diff --git a/src/main/java/com/replaymod/render/ReplayModRender.java b/src/main/java/com/replaymod/render/ReplayModRender.java index 22d5159a..a9f26c92 100644 --- a/src/main/java/com/replaymod/render/ReplayModRender.java +++ b/src/main/java/com/replaymod/render/ReplayModRender.java @@ -1,11 +1,5 @@ package com.replaymod.render; -import com.google.common.base.Optional; -import com.google.gson.GsonBuilder; -import com.google.gson.TypeAdapter; -import com.google.gson.reflect.TypeToken; -import com.google.gson.stream.JsonReader; -import com.google.gson.stream.JsonWriter; import com.replaymod.core.Module; import com.replaymod.core.ReplayMod; import com.replaymod.core.utils.Utils; @@ -13,11 +7,7 @@ import com.replaymod.render.utils.RenderJob; import com.replaymod.replay.ReplayHandler; import com.replaymod.replay.events.ReplayClosedCallback; import com.replaymod.replay.events.ReplayOpenedCallback; -import com.replaymod.replaystudio.pathing.PathingRegistry; -import com.replaymod.replaystudio.pathing.path.Timeline; -import com.replaymod.replaystudio.pathing.serialize.TimelineSerialization; import com.replaymod.replaystudio.replay.ReplayFile; -import com.replaymod.simplepathing.SPTimeline; import de.johni0702.minecraft.gui.container.VanillaGuiScreen; import de.johni0702.minecraft.gui.utils.EventRegistrations; import net.minecraft.util.crash.CrashReport; @@ -28,14 +18,8 @@ import org.apache.logging.log4j.Logger; import java.io.File; import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.io.OutputStreamWriter; -import java.nio.charset.StandardCharsets; import java.nio.file.Path; import java.util.ArrayList; -import java.util.Collections; import java.util.List; public class ReplayModRender extends EventRegistrations implements Module { @@ -87,7 +71,7 @@ public class ReplayModRender extends EventRegistrations implements Module { private void onReplayOpened(ReplayHandler replayHandler) { replayFile = replayHandler.getReplayFile(); try { - renderQueue.addAll(doLoadRenderQueue(replayFile)); + renderQueue.addAll(RenderJob.readQueue(replayFile)); } catch (IOException e) { throw new CrashException(CrashReport.create(e, "Reading timeline")); } @@ -99,37 +83,9 @@ public class ReplayModRender extends EventRegistrations implements Module { replayFile = null; } - private static List doLoadRenderQueue(ReplayFile replayFile) throws IOException { - synchronized (replayFile) { - Optional optIn = replayFile.get("renderQueue.json"); - if (!optIn.isPresent()) { - return new ArrayList<>(); - } - try (InputStream in = optIn.get(); - InputStreamReader reader = new InputStreamReader(in, StandardCharsets.UTF_8)) { - return new GsonBuilder() - .registerTypeAdapter(Timeline.class, new TimelineTypeAdapter()) - .create() - .fromJson(reader, new TypeToken>(){}.getType()); - } - } - } - - private static void doSaveRenderQueue(ReplayFile replayFile, List renderQueue) throws IOException { - synchronized (replayFile) { - try (OutputStream out = replayFile.write("renderQueue.json"); - OutputStreamWriter writer = new OutputStreamWriter(out, StandardCharsets.UTF_8)) { - new GsonBuilder() - .registerTypeAdapter(Timeline.class, new TimelineTypeAdapter()) - .create() - .toJson(renderQueue, writer); - } - } - } - public void saveRenderQueue() { try { - doSaveRenderQueue(replayFile, renderQueue); + RenderJob.writeQueue(replayFile, renderQueue); } catch (IOException e) { e.printStackTrace(); VanillaGuiScreen screen = VanillaGuiScreen.setup(getCore().getMinecraft().currentScreen); @@ -137,32 +93,4 @@ public class ReplayModRender extends EventRegistrations implements Module { Utils.error(LOGGER, screen, report, () -> {}); } } - - private static class TimelineTypeAdapter extends TypeAdapter { - - private final TimelineSerialization serialization; - - public TimelineTypeAdapter(TimelineSerialization serialization) { - this.serialization = serialization; - } - - public TimelineTypeAdapter(PathingRegistry registry) { - this(new TimelineSerialization(registry, null)); - } - - public TimelineTypeAdapter() { - // TODO need to somehow get rid of the reliance on simplepathing - this(new SPTimeline()); - } - - @Override - public void write(JsonWriter out, Timeline value) throws IOException { - out.value(serialization.serialize(Collections.singletonMap("", value))); - } - - @Override - public Timeline read(JsonReader in) throws IOException { - return serialization.deserialize(in.nextString()).get(""); - } - } } diff --git a/src/main/java/com/replaymod/render/utils/RenderJob.java b/src/main/java/com/replaymod/render/utils/RenderJob.java index ef8b45ca..5203d254 100644 --- a/src/main/java/com/replaymod/render/utils/RenderJob.java +++ b/src/main/java/com/replaymod/render/utils/RenderJob.java @@ -1,8 +1,27 @@ package com.replaymod.render.utils; +import com.google.common.base.Optional; +import com.google.gson.GsonBuilder; +import com.google.gson.TypeAdapter; +import com.google.gson.reflect.TypeToken; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; import com.replaymod.render.RenderSettings; +import com.replaymod.replaystudio.pathing.PathingRegistry; import com.replaymod.replaystudio.pathing.path.Timeline; +import com.replaymod.replaystudio.pathing.serialize.TimelineSerialization; +import com.replaymod.replaystudio.replay.ReplayFile; +import com.replaymod.simplepathing.SPTimeline; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import java.util.Objects; public class RenderJob { @@ -53,4 +72,60 @@ public class RenderJob { ", settings=" + settings + '}'; } + + public static List readQueue(ReplayFile replayFile) throws IOException { + synchronized (replayFile) { + Optional optIn = replayFile.get("renderQueue.json"); + if (!optIn.isPresent()) { + return new ArrayList<>(); + } + try (InputStream in = optIn.get(); + InputStreamReader reader = new InputStreamReader(in, StandardCharsets.UTF_8)) { + return new GsonBuilder() + .registerTypeAdapter(Timeline.class, new TimelineTypeAdapter()) + .create() + .fromJson(reader, new TypeToken>(){}.getType()); + } + } + } + + public static void writeQueue(ReplayFile replayFile, List renderQueue) throws IOException { + synchronized (replayFile) { + try (OutputStream out = replayFile.write("renderQueue.json"); + OutputStreamWriter writer = new OutputStreamWriter(out, StandardCharsets.UTF_8)) { + new GsonBuilder() + .registerTypeAdapter(Timeline.class, new TimelineTypeAdapter()) + .create() + .toJson(renderQueue, writer); + } + } + } + + private static class TimelineTypeAdapter extends TypeAdapter { + + private final TimelineSerialization serialization; + + public TimelineTypeAdapter(TimelineSerialization serialization) { + this.serialization = serialization; + } + + public TimelineTypeAdapter(PathingRegistry registry) { + this(new TimelineSerialization(registry, null)); + } + + public TimelineTypeAdapter() { + // TODO need to somehow get rid of the reliance on simplepathing + this(new SPTimeline()); + } + + @Override + public void write(JsonWriter out, Timeline value) throws IOException { + out.value(serialization.serialize(Collections.singletonMap("", value))); + } + + @Override + public Timeline read(JsonReader in) throws IOException { + return serialization.deserialize(in.nextString()).get(""); + } + } } diff --git a/src/main/java/com/replaymod/replay/gui/screen/GuiReplayViewer.java b/src/main/java/com/replaymod/replay/gui/screen/GuiReplayViewer.java index 162469ab..f45ada93 100644 --- a/src/main/java/com/replaymod/replay/gui/screen/GuiReplayViewer.java +++ b/src/main/java/com/replaymod/replay/gui/screen/GuiReplayViewer.java @@ -4,6 +4,7 @@ import com.google.common.base.Supplier; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.SettableFuture; +import com.replaymod.render.utils.RenderJob; import de.johni0702.minecraft.gui.GuiRenderer; import de.johni0702.minecraft.gui.RenderInfo; import de.johni0702.minecraft.gui.versions.Image; @@ -369,9 +370,10 @@ public class GuiReplayViewer extends GuiScreen { } }).orElse(null); final ReplayMetaData metaData = replayFile.getMetaData(); + List renderQueue = RenderJob.readQueue(replayFile); if (metaData != null) { - results.consume(() -> new GuiReplayEntry(file, metaData, thumb) { + results.consume(() -> new GuiReplayEntry(file, metaData, thumb, renderQueue) { @Override public ReadableDimension calcMinSize() { if (isFiltered(this)) { @@ -483,12 +485,17 @@ public class GuiReplayViewer extends GuiScreen { return new Dimension(dimension.getWidth() + 2, dimension.getHeight() + 2); } }); + public final GuiImage renderQueueIcon = new GuiImage() + .setSize(10, 10) + .setTexture(ReplayMod.TEXTURE, 40, 0, 20, 20); private final long dateMillis; private final boolean incompatible; + private final List renderQueue; - public GuiReplayEntry(File file, ReplayMetaData metaData, Image thumbImage) { + public GuiReplayEntry(File file, ReplayMetaData metaData, Image thumbImage, List renderQueue) { this.file = file; + this.renderQueue = renderQueue; name.setText(Formatting.UNDERLINE + Utils.fileNameToReplayName(file.getName())); if (StringUtils.isEmpty(metaData.getServerName()) @@ -512,6 +519,12 @@ public class GuiReplayViewer extends GuiScreen { duration.setText(Utils.convertSecondsToShortString(metaData.getDuration() / 1000)); addElements(null, durationPanel); + if (!renderQueue.isEmpty()) { + renderQueueIcon.setTooltip(new GuiTooltip() + .setText(renderQueue.stream().map(RenderJob::getName).toArray(String[]::new))); + addElements(null, renderQueueIcon); + } + setLayout(new CustomLayout() { @Override protected void layout(GuiReplayEntry container, int width, int height) { @@ -521,6 +534,10 @@ public class GuiReplayViewer extends GuiScreen { pos(infoPanel, width(thumbnail) + 5, 0); pos(version, width - width(version), 0); + + if (renderQueueIcon.getContainer() != null) { + pos(renderQueueIcon, width(thumbnail) - width(renderQueueIcon), 0); + } } @Override