From b323ef14c226cf9a7ba32ce6a720608ff1aa77ed Mon Sep 17 00:00:00 2001 From: CallMeEchoCodes Date: Wed, 9 Jul 2025 19:17:32 +1000 Subject: [PATCH 1/9] feat: 1.21.5 --- build.gradle.kts | 5 -- gradle.properties | 5 +- gradle/libs.versions.toml | 8 +-- .../REMOVETHISAFTER1point21point5.java | 36 ----------- .../dev/spiritstudios/snapper/Snapper.java | 4 +- .../snapper/SnapperKeybindings.java | 4 +- .../gui/overlay/ExternalDialogOverlay.java | 1 - .../gui/screen/PanoramaViewerScreen.java | 39 ++++++++---- .../snapper/gui/screen/ScreenshotScreen.java | 25 ++++---- .../gui/widget/ScreenshotListWidget.java | 60 ++++++++++--------- .../mixin/ScreenshotRecorderMixin.java | 29 +++++---- .../snapper/util/ScreenshotActions.java | 8 +-- .../snapper/util/ScreenshotImage.java | 25 +++++++- src/main/resources/fabric.mod.json | 3 - 14 files changed, 123 insertions(+), 129 deletions(-) delete mode 100644 src/client/java/dev/spiritstudios/snapper/REMOVETHISAFTER1point21point5.java diff --git a/build.gradle.kts b/build.gradle.kts index 3a2525a..f7127ed 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -31,7 +31,6 @@ loom { repositories { mavenCentral() maven("https://maven.spiritstudios.dev/releases/") - maven("https://maven.bawnorton.com/releases") maven("https://moehreag.duckdns.org/maven/releases") { content { includeGroup("io.github.axolotlclient.AxolotlClient") @@ -51,10 +50,6 @@ dependencies { modImplementation(libs.bundles.specter) implementation(libs.objc.bridge) - - include("com.github.bawnorton.mixinsquared:mixinsquared-fabric:0.3.3") - implementation("com.github.bawnorton.mixinsquared:mixinsquared-fabric:0.3.3") - annotationProcessor("com.github.bawnorton.mixinsquared:mixinsquared-fabric:0.3.3") } tasks.processResources { diff --git a/gradle.properties b/gradle.properties index 99b2004..0f7e21a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,4 @@ org.gradle.parallel=true mod.version = 1.1 mod.group = dev.spiritstudios -mod.id = snapper - -deps.minecraft=1.21.4 -deps.loader=0.16.5 +mod.id = snapper \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 813474a..f711e7d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,13 +2,13 @@ fabric_loom = "1.11-SNAPSHOT" minotaur = "2.+" -minecraft = "1.21.4" -yarn = "1.21.4+build.3" +minecraft = "1.21.5" +yarn = "1.21.5+build.1" fabric_loader = "0.16.14" -fabric_api = "0.119.3+1.21.4" +fabric_api = "0.128.1+1.21.5" -specter = "1.1.3" +specter = "1.1.7" objc_bridge = "1.0.0" [plugins] diff --git a/src/client/java/dev/spiritstudios/snapper/REMOVETHISAFTER1point21point5.java b/src/client/java/dev/spiritstudios/snapper/REMOVETHISAFTER1point21point5.java deleted file mode 100644 index 5269912..0000000 --- a/src/client/java/dev/spiritstudios/snapper/REMOVETHISAFTER1point21point5.java +++ /dev/null @@ -1,36 +0,0 @@ -package dev.spiritstudios.snapper; - -import com.bawnorton.mixinsquared.adjuster.tools.AdjustableAnnotationNode; -import com.bawnorton.mixinsquared.adjuster.tools.AdjustableInjectNode; -import com.bawnorton.mixinsquared.api.MixinAnnotationAdjuster; -import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; -import org.objectweb.asm.tree.MethodNode; -import org.spongepowered.asm.mixin.injection.Inject; - -import java.util.List; - -@Deprecated -// fixes a bug in specter -// specter is already on 1.21.5 and i really dont want to make a new version of specter- -// for an old version of mc. so you get this -// REMOVE THIS WHENEVER WE UPDATE TO 1.21.5 -public final class REMOVETHISAFTER1point21point5 implements MixinAnnotationAdjuster { - @Override - public AdjustableAnnotationNode adjust(List targetClassNames, String mixinClassName, MethodNode method, AdjustableAnnotationNode annotation) { - if (!mixinClassName.equals("dev.spiritstudios.specter.mixin.serialization.TranslatableTextContentMixin")) - return annotation; - if (!annotation.is(Inject.class)) return annotation; - - AdjustableInjectNode inject = annotation.as(AdjustableInjectNode.class); - - if (!inject.getMethod().contains("visit(Lnet/minecraft/text/StringVisitable$StyledVisitor;Lnet/minecraft/text/Style;)Ljava/util/Optional;") || !inject.getMethod().contains("visit(Lnet/minecraft/text/StringVisitable$Visitor;)Ljava/util/Optional;")) return annotation; - - return inject.withAt(at -> { - at.getFirst() - .withValue(ignored -> "INVOKE") - .withTarget(ignored -> "Ljava/util/List;iterator()Ljava/util/Iterator;"); - - return at; - }); - } -} diff --git a/src/client/java/dev/spiritstudios/snapper/Snapper.java b/src/client/java/dev/spiritstudios/snapper/Snapper.java index 60fe948..f465850 100644 --- a/src/client/java/dev/spiritstudios/snapper/Snapper.java +++ b/src/client/java/dev/spiritstudios/snapper/Snapper.java @@ -5,8 +5,8 @@ import dev.spiritstudios.snapper.util.WindowsActions; import dev.spiritstudios.snapper.util.config.DirectoryConfigUtil; import dev.spiritstudios.snapper.util.uploading.ScreenshotUploading; -import dev.spiritstudios.specter.api.config.ConfigScreenWidgets; -import dev.spiritstudios.specter.api.config.ModMenuHelper; +import dev.spiritstudios.specter.api.config.client.ConfigScreenWidgets; +import dev.spiritstudios.specter.api.config.client.ModMenuHelper; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents; import net.fabricmc.loader.api.FabricLoader; diff --git a/src/client/java/dev/spiritstudios/snapper/SnapperKeybindings.java b/src/client/java/dev/spiritstudios/snapper/SnapperKeybindings.java index 295dcd3..1f6b16c 100644 --- a/src/client/java/dev/spiritstudios/snapper/SnapperKeybindings.java +++ b/src/client/java/dev/spiritstudios/snapper/SnapperKeybindings.java @@ -4,7 +4,7 @@ import dev.spiritstudios.snapper.gui.screen.ScreenshotViewerScreen; import dev.spiritstudios.snapper.util.ScreenshotActions; import dev.spiritstudios.snapper.util.ScreenshotImage; -import dev.spiritstudios.specter.api.core.util.ClientKeybindEvents; +import dev.spiritstudios.specter.api.core.client.event.ClientKeybindEvents; import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; import net.minecraft.client.MinecraftClient; import net.minecraft.client.option.KeyBinding; @@ -61,7 +61,7 @@ private static void takePanorama(MinecraftClient client) { } private static void openRecentScreenshot(MinecraftClient client) { - List screenshots = ScreenshotActions.getScreenshots(client); + List screenshots = ScreenshotActions.getScreenshots(); if (screenshots.isEmpty()) { if (client.player != null) client.player.sendMessage(Text.translatable("text.snapper.screenshot_not_exists"), true); diff --git a/src/client/java/dev/spiritstudios/snapper/gui/overlay/ExternalDialogOverlay.java b/src/client/java/dev/spiritstudios/snapper/gui/overlay/ExternalDialogOverlay.java index fcf7c9b..f4f07fd 100644 --- a/src/client/java/dev/spiritstudios/snapper/gui/overlay/ExternalDialogOverlay.java +++ b/src/client/java/dev/spiritstudios/snapper/gui/overlay/ExternalDialogOverlay.java @@ -27,7 +27,6 @@ public void render(DrawContext context, int mouseX, int mouseY, float delta) { } this.client.gameRenderer.renderBlur(); - this.client.getFramebuffer().beginWrite(false); context.drawTexture( RenderLayer::getGuiTextured, diff --git a/src/client/java/dev/spiritstudios/snapper/gui/screen/PanoramaViewerScreen.java b/src/client/java/dev/spiritstudios/snapper/gui/screen/PanoramaViewerScreen.java index feb6cb8..18bc5e4 100644 --- a/src/client/java/dev/spiritstudios/snapper/gui/screen/PanoramaViewerScreen.java +++ b/src/client/java/dev/spiritstudios/snapper/gui/screen/PanoramaViewerScreen.java @@ -4,6 +4,7 @@ import dev.spiritstudios.snapper.util.SafeFiles; import dev.spiritstudios.snapper.util.ScreenshotImage; import dev.spiritstudios.snapper.util.SnapperUtil; +import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.CubeMapRenderer; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.RotatingCubeMapRenderer; @@ -18,6 +19,7 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; +import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.stream.Stream; @@ -30,10 +32,31 @@ public class PanoramaViewerScreen extends Screen { private final String title; private final Screen parent; + private final List images = new ArrayList<>(); + protected PanoramaViewerScreen(String title, Screen parent) { super(Text.translatable("menu.snapper.viewer_menu")); this.title = title; this.parent = parent; + this.client = MinecraftClient.getInstance(); + assert this.client != null; + + List panorama = this.getImagePaths(); + if (panorama == null) { + Snapper.LOGGER.error("No panorama found"); + close(); + return; + } + + for (Path path : panorama) { + ScreenshotImage.createPanoramaFace(this.client.getTextureManager(), path) + .ifPresent(screenshotImage -> { + images.add(screenshotImage); + screenshotImage + .load() + .thenAccept(ignored -> screenshotImage.enableFiltering()); + }); + } } @Nullable @@ -61,6 +84,10 @@ private List getImagePaths() { public void close() { Objects.requireNonNull(this.client); + for (ScreenshotImage image : images) { + image.close(); + } + client.setScreen(this.parent); } @@ -83,18 +110,6 @@ protected void init() { ScreenTexts.DONE, button -> this.close() ).dimensions(width / 2 + 4, height - 32, 150, 20).build()); - - List panorama = this.getImagePaths(); - if (panorama == null) { - Snapper.LOGGER.error("No panorama found"); - close(); - return; - } - - for (Path path : panorama) { - ScreenshotImage.createPanoramaFace(this.client.getTextureManager(), path) - .ifPresent(ScreenshotImage::enableFiltering); - } } @Override diff --git a/src/client/java/dev/spiritstudios/snapper/gui/screen/ScreenshotScreen.java b/src/client/java/dev/spiritstudios/snapper/gui/screen/ScreenshotScreen.java index 9c02b51..5d717d8 100644 --- a/src/client/java/dev/spiritstudios/snapper/gui/screen/ScreenshotScreen.java +++ b/src/client/java/dev/spiritstudios/snapper/gui/screen/ScreenshotScreen.java @@ -6,12 +6,15 @@ import dev.spiritstudios.snapper.util.ScreenshotActions; import dev.spiritstudios.snapper.util.SnapperUtil; import dev.spiritstudios.snapper.util.uploading.ScreenshotUploading; -import dev.spiritstudios.specter.api.config.RootConfigScreen; -import net.minecraft.client.MinecraftClient; +import dev.spiritstudios.specter.api.config.client.RootConfigScreen; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.tooltip.Tooltip; -import net.minecraft.client.gui.widget.*; +import net.minecraft.client.gui.widget.AxisGridWidget; +import net.minecraft.client.gui.widget.ButtonWidget; +import net.minecraft.client.gui.widget.DirectionalLayoutWidget; +import net.minecraft.client.gui.widget.SimplePositioningWidget; +import net.minecraft.client.gui.widget.TextIconButtonWidget; import net.minecraft.client.util.InputUtil; import net.minecraft.screen.ScreenTexts; import net.minecraft.text.Text; @@ -77,7 +80,7 @@ protected void init() { Text.translatable("button.snapper.open"), button -> { if (selectedScreenshot != null) - Util.getOperatingSystem().open(selectedScreenshot.path); + Util.getOperatingSystem().open(selectedScreenshot.icon.getPath()); } ).width(secondRowButtonWidth).build()); @@ -92,7 +95,7 @@ protected void init() { Text.translatable("button.snapper.delete"), button -> { if (selectedScreenshot != null) - ScreenshotActions.deleteScreenshot(selectedScreenshot.path, this); + ScreenshotActions.deleteScreenshot(selectedScreenshot.icon.getPath(), this); } ).width(firstRowButtonWidth).build()); @@ -100,7 +103,7 @@ protected void init() { Text.translatable("button.snapper.rename"), button -> { if (this.selectedScreenshot != null) - client.setScreen(new RenameScreenshotScreen(this.selectedScreenshot.path, this)); + client.setScreen(new RenameScreenshotScreen(this.selectedScreenshot.icon.getPath(), this)); } ).width(firstRowButtonWidth).build()); @@ -108,7 +111,7 @@ protected void init() { Text.translatable("button.snapper.copy"), button -> { if (selectedScreenshot != null) - Snapper.getPlatformHelper().copyScreenshot(selectedScreenshot.path); + Snapper.getPlatformHelper().copyScreenshot(selectedScreenshot.icon.getPath()); } ).width(firstRowButtonWidth).build()); @@ -118,7 +121,7 @@ protected void init() { if (selectedScreenshot != null) this.client.setScreen(new ScreenshotViewerScreen( selectedScreenshot.icon, - selectedScreenshot.path, + selectedScreenshot.icon.getPath(), selectedScreenshot.screenParent )); } @@ -128,7 +131,7 @@ protected void init() { if (selectedScreenshot == null) return; button.active = false; - ScreenshotUploading.upload(selectedScreenshot.path) + ScreenshotUploading.upload(selectedScreenshot.icon.getPath()) .thenRun(() -> button.active = true); }).width(firstRowButtonWidth).build()); @@ -241,12 +244,12 @@ public boolean keyPressed(int keyCode, int scanCode, int modifiers) { if (selectedScreenshot == null) return false; if ((modifiers & GLFW.GLFW_MOD_CONTROL) != 0 && keyCode == InputUtil.GLFW_KEY_C) { - Snapper.getPlatformHelper().copyScreenshot(selectedScreenshot.path); + Snapper.getPlatformHelper().copyScreenshot(selectedScreenshot.icon.getPath()); return true; } if (keyCode == GLFW.GLFW_KEY_ENTER) { - client.setScreen(new ScreenshotViewerScreen(selectedScreenshot.icon, selectedScreenshot.path, this)); + client.setScreen(new ScreenshotViewerScreen(selectedScreenshot.icon, selectedScreenshot.icon.getPath(), this)); } return false; diff --git a/src/client/java/dev/spiritstudios/snapper/gui/widget/ScreenshotListWidget.java b/src/client/java/dev/spiritstudios/snapper/gui/widget/ScreenshotListWidget.java index e25748c..e79b6fe 100644 --- a/src/client/java/dev/spiritstudios/snapper/gui/widget/ScreenshotListWidget.java +++ b/src/client/java/dev/spiritstudios/snapper/gui/widget/ScreenshotListWidget.java @@ -1,6 +1,5 @@ package dev.spiritstudios.snapper.gui.widget; -import com.mojang.blaze3d.systems.RenderSystem; import dev.spiritstudios.snapper.Snapper; import dev.spiritstudios.snapper.SnapperConfig; import dev.spiritstudios.snapper.gui.screen.ScreenshotScreen; @@ -19,8 +18,6 @@ import net.minecraft.client.gui.widget.AlwaysSelectedEntryListWidget; import net.minecraft.client.input.KeyCodes; import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.sound.PositionedSoundInstance; -import net.minecraft.sound.SoundEvents; import net.minecraft.text.Text; import net.minecraft.util.Colors; import net.minecraft.util.Identifier; @@ -38,11 +35,11 @@ import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.time.format.FormatStyle; +import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.function.Predicate; -import java.util.stream.Collectors; public class ScreenshotListWidget extends AlwaysSelectedEntryListWidget { private static final Identifier VIEW_SPRITE = Snapper.id("screenshots/view"); @@ -74,7 +71,6 @@ public ScreenshotListWidget( this.loadFuture.thenAccept(entries -> { this.clearEntries(); - entries.sort(Comparator.comparingLong(ScreenshotEntry::lastModified).reversed()); entries.forEach(this::addEntry); if (entries.isEmpty()) { @@ -105,11 +101,23 @@ public boolean keyPressed(int keyCode, int scanCode, int modifiers) { public CompletableFuture> load(MinecraftClient client) { return CompletableFuture.supplyAsync(() -> { - List screenshots = ScreenshotActions.getScreenshots(client); - return screenshots.parallelStream() - .map(file -> new ScreenshotEntry(file, client, parent, screenshots)) - .collect(Collectors.toList()); - }); + List screenshots = ScreenshotActions.getScreenshots(); + + return screenshots.parallelStream() + .flatMap(path -> ScreenshotImage.createScreenshot(client.getTextureManager(), path).stream()) + .peek(screenshotImage -> screenshotImage.load() + .exceptionally(throwable -> { + Snapper.LOGGER.error("An error occurred while loading the screenshot list", throwable); + return null; + })) + .map(image -> new ScreenshotEntry(image, client, parent, screenshots)) + .sorted(Comparator.comparingLong(ScreenshotEntry::lastModified).reversed()) + .toList(); + }) + .exceptionally(throwable -> { + Snapper.LOGGER.error("An error occurred while loading the screenshot list", throwable); + return Collections.emptyList(); + }); } private void setEntrySelected(@Nullable ScreenshotEntry entry) { @@ -177,7 +185,7 @@ protected void drawSelectionHighlight(DrawContext context, int y, int entryWidth @Override public int getMaxScrollY() { int totalRows = (getEntryCount() / getColumnCount()) + (getEntryCount() % getColumnCount() > 0 ? 1 : 0); - return showGrid ? totalRows * itemHeight : super.getMaxScrollY(); + return showGrid ? totalRows * itemHeight - this.height + 4 : super.getMaxScrollY(); } public void toggleGrid() { @@ -301,7 +309,7 @@ public void render(DrawContext context, int index, int y, int x, int entryWidth, EMPTY_LIST_TEXT, (this.client.currentScreen.width - this.client.textRenderer.getWidth(EMPTY_LIST_TEXT)) / 2, y + entryHeight / 2, - 0xFFFFFF, + 0xFFFFFFFF, false ); @@ -310,7 +318,7 @@ public void render(DrawContext context, int index, int y, int x, int entryWidth, EMPTY_CUSTOM_LIST_TEXT, (this.client.currentScreen.width - this.client.textRenderer.getWidth(EMPTY_CUSTOM_LIST_TEXT)) / 2, y + entryHeight / 2 + 10, - 0xFFFFFF, + 0xFFFFFFFF, false ); } @@ -325,22 +333,19 @@ public class ScreenshotEntry extends Entry implements AutoCloseable { private final MinecraftClient client; public final ScreenshotImage icon; public final String iconFileName; - public Path path; public final Screen screenParent; private long time; private boolean showGrid; private final List screenshots; private boolean clickthroughHovered = false; - public ScreenshotEntry(Path iconPath, MinecraftClient client, Screen parent, List screenshots) { + public ScreenshotEntry(ScreenshotImage icon, MinecraftClient client, Screen parent, List screenshots) { this.showGrid = ScreenshotListWidget.this.showGrid; this.client = client; this.screenParent = parent; - this.icon = ScreenshotImage.createScreenshot(this.client.getTextureManager(), iconPath) - .orElse(null); - this.path = iconPath; - this.iconFileName = iconPath.getFileName().toString(); - this.lastModified = SafeFiles.getLastModifiedTime(iconPath).orElse(FileTime.fromMillis(0L)); + this.icon = icon; + this.iconFileName = icon.getPath().getFileName().toString(); + this.lastModified = SafeFiles.getLastModifiedTime(icon.getPath()).orElse(FileTime.fromMillis(0L)); this.screenshots = screenshots; } @@ -363,7 +368,7 @@ public void renderList(DrawContext context, int index, int y, int x, int entryWi long creationTime = 0; try { - creationTime = Files.readAttributes(path, BasicFileAttributes.class).creationTime().toMillis(); + creationTime = Files.readAttributes(icon.getPath(), BasicFileAttributes.class).creationTime().toMillis(); } catch (IOException e) { client.setScreen(new ScreenshotScreen(screenParent)); } @@ -390,7 +395,7 @@ public void renderList(DrawContext context, int index, int y, int x, int entryWi false ); - if (this.icon != null) { + if (icon.loaded()) { context.drawTexture( RenderLayer::getGuiTextured, this.icon.getTextureId(), @@ -406,7 +411,7 @@ public void renderList(DrawContext context, int index, int y, int x, int entryWi context.fill(x, y, x + 32, y + 32, 0xA0909090); context.drawGuiTexture( RenderLayer::getGuiTextured, - mouseX - x < 32 && this.icon != null ? + mouseX - x < 32 && this.icon.loaded() ? ScreenshotListWidget.VIEW_HIGHLIGHTED_SPRITE : ScreenshotListWidget.VIEW_SPRITE, x, y, @@ -421,7 +426,7 @@ public void renderGrid(DrawContext context, int index, int y, int x, int entryWi clickthroughHovered = SnapperUtil.inBoundingBox(centreX - 16, centreY - 16, 32, 32, mouseX, mouseY); - if (this.icon != null) { + if (this.icon.loaded()) { context.drawTexture( RenderLayer::getGuiTextured, this.icon.getTextureId(), @@ -450,7 +455,7 @@ public void renderMetadata(DrawContext context, int index, int y, int x, int ent String creationString = "undefined"; long creationTime = 0; try { - creationTime = Files.readAttributes(path, BasicFileAttributes.class).creationTime().toMillis(); + creationTime = Files.readAttributes(icon.getPath(), BasicFileAttributes.class).creationTime().toMillis(); } catch (IOException e) { client.setScreen(new ScreenshotScreen(screenParent)); } @@ -470,8 +475,7 @@ public void renderMetadata(DrawContext context, int index, int y, int x, int ent context.drawGuiTexture( RenderLayer::getGuiTextured, - clickthroughHovered && - this.icon != null ? + clickthroughHovered && icon.loaded() ? ScreenshotListWidget.VIEW_HIGHLIGHTED_SPRITE : ScreenshotListWidget.VIEW_SPRITE, centreX - 16, centreY - 16, @@ -559,7 +563,7 @@ public boolean mouseClicked(double mouseX, double mouseY, int button) { public boolean click() { if (this.icon == null) return false; playClickSound(this.client.getSoundManager()); - this.client.setScreen(new ScreenshotViewerScreen(this.icon, this.path, this.screenParent, this.screenshots)); + this.client.setScreen(new ScreenshotViewerScreen(this.icon, icon.getPath(), this.screenParent, this.screenshots)); return true; } diff --git a/src/client/java/dev/spiritstudios/snapper/mixin/ScreenshotRecorderMixin.java b/src/client/java/dev/spiritstudios/snapper/mixin/ScreenshotRecorderMixin.java index bea7c0d..3cb9996 100644 --- a/src/client/java/dev/spiritstudios/snapper/mixin/ScreenshotRecorderMixin.java +++ b/src/client/java/dev/spiritstudios/snapper/mixin/ScreenshotRecorderMixin.java @@ -1,14 +1,17 @@ package dev.spiritstudios.snapper.mixin; +import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import dev.spiritstudios.snapper.Snapper; import dev.spiritstudios.snapper.SnapperConfig; +import net.minecraft.client.gl.Framebuffer; import net.minecraft.client.texture.NativeImage; import net.minecraft.client.util.ScreenshotRecorder; import net.minecraft.text.Text; +import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.ModifyArg; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.io.File; @@ -25,7 +28,7 @@ public abstract class ScreenshotRecorderMixin { */ @SuppressWarnings("ResultOfMethodCallIgnored") @Inject( - method = "method_1661", + method = "method_22691", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/texture/NativeImage;writeTo(Ljava/io/File;)V") ) private static void lookBeforeYouLeap(NativeImage nativeImage, File screenshotFile, Consumer messageReceiver, CallbackInfo ci) throws IOException { @@ -34,22 +37,24 @@ private static void lookBeforeYouLeap(NativeImage nativeImage, File screenshotFi } @Inject( - method = "method_1661", + method = "method_22691", at = @At(value = "INVOKE", target = "Lnet/minecraft/text/Text;literal(Ljava/lang/String;)Lnet/minecraft/text/MutableText;", shift = At.Shift.AFTER) ) - private static void saveWrittenFileToClipboard(NativeImage nativeImage, File screenshotFile, Consumer messageReceiver, CallbackInfo ci) throws IOException { + private static void saveWrittenFileToClipboard(NativeImage nativeImage, File screenshotFile, Consumer messageReceiver, CallbackInfo ci) { if (!screenshotFile.getAbsolutePath().contains("/panorama/") && SnapperConfig.INSTANCE.copyTakenScreenshot.get()) { Snapper.getPlatformHelper().copyScreenshot(screenshotFile.toPath()); } } - @ModifyArg(method = "saveScreenshot(Ljava/io/File;Ljava/lang/String;Lnet/minecraft/client/gl/Framebuffer;Ljava/util/function/Consumer;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/ScreenshotRecorder;saveScreenshotInner(Ljava/io/File;Ljava/lang/String;Lnet/minecraft/client/gl/Framebuffer;Ljava/util/function/Consumer;)V", ordinal = 0)) - private static File getConfiguredGameDirectory(File gameDirectory) { - Path customScreenshotFolder = SnapperConfig.INSTANCE.customScreenshotFolder.get(); - - if (SnapperConfig.INSTANCE.useCustomScreenshotFolder.get() && Files.exists(customScreenshotFolder)) { - return customScreenshotFolder.toFile(); - } - return gameDirectory; + @WrapMethod(method = "saveScreenshot(Ljava/io/File;Ljava/lang/String;Lnet/minecraft/client/gl/Framebuffer;Ljava/util/function/Consumer;)V") + private static void getConfiguredGameDirectory(File gameDirectory, @Nullable String fileName, Framebuffer framebuffer, Consumer messageReceiver, Operation original) { + original.call( + SnapperConfig.INSTANCE.useCustomScreenshotFolder.get() && Files.exists(SnapperConfig.INSTANCE.customScreenshotFolder.get()) ? + SnapperConfig.INSTANCE.customScreenshotFolder.get().toFile() : + gameDirectory, + fileName, + framebuffer, + messageReceiver + ); } } diff --git a/src/client/java/dev/spiritstudios/snapper/util/ScreenshotActions.java b/src/client/java/dev/spiritstudios/snapper/util/ScreenshotActions.java index 23f7f70..e72b4c3 100644 --- a/src/client/java/dev/spiritstudios/snapper/util/ScreenshotActions.java +++ b/src/client/java/dev/spiritstudios/snapper/util/ScreenshotActions.java @@ -59,12 +59,8 @@ public static void renameScreenshot(Path screenshot, String newName) { } } - public static List getScreenshots(MinecraftClient client) { - Path customScreenshotDirectory = SnapperConfig.INSTANCE.customScreenshotFolder.get().resolve("screenshots"); - Path defaultScreenshotDirectory = Path.of(client.runDirectory.getPath(), "screenshots"); - Path screenshotDir = SnapperConfig.INSTANCE.useCustomScreenshotFolder.get() ? customScreenshotDirectory : defaultScreenshotDirectory; - - try (Stream stream = Files.list(screenshotDir)){ + public static List getScreenshots() { + try (Stream stream = Files.list(SnapperUtil.getConfiguredScreenshotDirectory())) { return stream.filter(file -> { if (Files.isDirectory(file)) return false; String fileType; diff --git a/src/client/java/dev/spiritstudios/snapper/util/ScreenshotImage.java b/src/client/java/dev/spiritstudios/snapper/util/ScreenshotImage.java index ab825a3..0b1efcf 100644 --- a/src/client/java/dev/spiritstudios/snapper/util/ScreenshotImage.java +++ b/src/client/java/dev/spiritstudios/snapper/util/ScreenshotImage.java @@ -1,5 +1,6 @@ package dev.spiritstudios.snapper.util; +import net.minecraft.client.MinecraftClient; import net.minecraft.client.texture.NativeImage; import net.minecraft.client.texture.NativeImageBackedTexture; import net.minecraft.client.texture.TextureManager; @@ -11,13 +12,16 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.Optional; +import java.util.concurrent.CompletableFuture; public class ScreenshotImage implements AutoCloseable { private static final Identifier UNKNOWN_SERVER_ID = Identifier.ofVanilla("textures/misc/unknown_server.png"); private final TextureManager textureManager; private final Identifier id; - private final NativeImageBackedTexture texture; + private final Path path; + private final NativeImage image; + private NativeImageBackedTexture texture; private boolean closed; @@ -28,11 +32,18 @@ private ScreenshotImage(TextureManager textureManager, Identifier id, Path path) if (!Files.isRegularFile(path)) throw new IllegalArgumentException("Passed path for invalid file to new ScreenshotImage()"); + this.path = path; + try (InputStream stream = Files.newInputStream(path)) { - this.texture = new NativeImageBackedTexture(NativeImage.read(stream)); + this.image = NativeImage.read(stream); } + } - this.textureManager.registerTexture(this.id, this.texture); + public CompletableFuture load() { + return MinecraftClient.getInstance().submit(() -> { + this.texture = new NativeImageBackedTexture(this.id::toString, this.image); + this.textureManager.registerTexture(this.id, this.texture); + }); } public static Optional createScreenshot(TextureManager textureManager, Path path) { @@ -92,6 +103,14 @@ public Identifier getTextureId() { return this.texture != null ? this.id : UNKNOWN_SERVER_ID; } + public boolean loaded() { + return texture != null; + } + + public Path getPath() { + return path; + } + public void close() { this.destroy(); this.closed = true; diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 37ca23b..07c52b5 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -20,9 +20,6 @@ "entrypoints": { "client": [ "dev.spiritstudios.snapper.Snapper" - ], - "mixinsquared-adjuster": [ - "dev.spiritstudios.snapper.REMOVETHISAFTER1point21point5" ] }, "accessWidener": "snapper.accesswidener", From 43aaf9b6330de164132dd606e73cedec98ab28f6 Mon Sep 17 00:00:00 2001 From: CallMeEchoCodes Date: Wed, 9 Jul 2025 19:27:36 +1000 Subject: [PATCH 2/9] fix: fix overlay text glowing --- .../snapper/gui/overlay/ExternalDialogOverlay.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/client/java/dev/spiritstudios/snapper/gui/overlay/ExternalDialogOverlay.java b/src/client/java/dev/spiritstudios/snapper/gui/overlay/ExternalDialogOverlay.java index f4f07fd..f132097 100644 --- a/src/client/java/dev/spiritstudios/snapper/gui/overlay/ExternalDialogOverlay.java +++ b/src/client/java/dev/spiritstudios/snapper/gui/overlay/ExternalDialogOverlay.java @@ -23,13 +23,12 @@ public boolean pausesGame() { public void render(DrawContext context, int mouseX, int mouseY, float delta) { if (this.client.currentScreen != null) { this.client.currentScreen.render(context, mouseX, mouseY, delta); - context.draw(); } this.client.gameRenderer.renderBlur(); context.drawTexture( - RenderLayer::getGuiTextured, + RenderLayer::getGuiTexturedOverlay, this.client.world == null ? MENU_BACKGROUND_TEXTURE : INWORLD_MENU_BACKGROUND_TEXTURE, 0, 0, 0, 0, From 2400329157502e06ee37091777f198d5de2a10e0 Mon Sep 17 00:00:00 2001 From: CallMeEchoCodes Date: Wed, 9 Jul 2025 19:42:40 +1000 Subject: [PATCH 3/9] fix: some jank with scrolling --- .../spiritstudios/snapper/gui/widget/ScreenshotListWidget.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/java/dev/spiritstudios/snapper/gui/widget/ScreenshotListWidget.java b/src/client/java/dev/spiritstudios/snapper/gui/widget/ScreenshotListWidget.java index e79b6fe..9630b0d 100644 --- a/src/client/java/dev/spiritstudios/snapper/gui/widget/ScreenshotListWidget.java +++ b/src/client/java/dev/spiritstudios/snapper/gui/widget/ScreenshotListWidget.java @@ -185,7 +185,7 @@ protected void drawSelectionHighlight(DrawContext context, int y, int entryWidth @Override public int getMaxScrollY() { int totalRows = (getEntryCount() / getColumnCount()) + (getEntryCount() % getColumnCount() > 0 ? 1 : 0); - return showGrid ? totalRows * itemHeight - this.height + 4 : super.getMaxScrollY(); + return showGrid ? Math.max(0, totalRows * itemHeight - this.height + 4) : super.getMaxScrollY(); } public void toggleGrid() { From 1b036e333fe639f3532950144e699fced5e74580 Mon Sep 17 00:00:00 2001 From: CallMeEchoCodes Date: Wed, 9 Jul 2025 19:57:49 +1000 Subject: [PATCH 4/9] fix: dejank file dialog logic --- .../snapper/gui/widget/FolderSelectWidget.java | 15 ++++++--------- .../snapper/util/config/DirectoryConfigUtil.java | 15 +++++++++------ 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/client/java/dev/spiritstudios/snapper/gui/widget/FolderSelectWidget.java b/src/client/java/dev/spiritstudios/snapper/gui/widget/FolderSelectWidget.java index 7c0ae53..8e3f154 100644 --- a/src/client/java/dev/spiritstudios/snapper/gui/widget/FolderSelectWidget.java +++ b/src/client/java/dev/spiritstudios/snapper/gui/widget/FolderSelectWidget.java @@ -6,6 +6,7 @@ import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.ParentElement; +import net.minecraft.client.gui.screen.Overlay; import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder; import net.minecraft.client.gui.tooltip.Tooltip; import net.minecraft.client.gui.widget.*; @@ -66,15 +67,11 @@ public FolderSelectWidget(int x, int y, int width, int height, Value value Text.translatable("config.snapper.snapper.customScreenshotFolder.select"), button -> { ExternalDialogOverlay overlay = new ExternalDialogOverlay(); - CompletableFuture assureRender = CompletableFuture.supplyAsync(() -> { - client.setOverlay(overlay); - LOGGER.debug("Opening folder select dialog & overlay"); // THIS SOMEHOW FIXES A BUG; DON'T QUESTION IT - return true; - }); - assureRender.thenAccept(e -> { - Optional folderValue = DirectoryConfigUtil.openFolderSelect(Text.translatable("prompt.snapper.folder_select").getString().replaceAll("[^a-zA-Z0-9 .,]", "")); - valueFromSelectDialog(folderValue.orElse(null)); - overlay.close(); + client.setOverlay(overlay); + + DirectoryConfigUtil.openFolderSelect(Text.translatable("prompt.snapper.folder_select").getString().replaceAll("[^a-zA-Z0-9 .,]", "")).thenAccept(path -> { + valueFromSelectDialog(path.orElse(null)); + client.submit(overlay::close).join(); }); }, true diff --git a/src/client/java/dev/spiritstudios/snapper/util/config/DirectoryConfigUtil.java b/src/client/java/dev/spiritstudios/snapper/util/config/DirectoryConfigUtil.java index 6fbb60a..4d89c25 100644 --- a/src/client/java/dev/spiritstudios/snapper/util/config/DirectoryConfigUtil.java +++ b/src/client/java/dev/spiritstudios/snapper/util/config/DirectoryConfigUtil.java @@ -13,6 +13,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.Optional; +import java.util.concurrent.CompletableFuture; import java.util.function.BiFunction; public class DirectoryConfigUtil { @@ -35,13 +36,15 @@ public class DirectoryConfigUtil { path -> escapePath(path.toString()) ); - public static Optional openFolderSelect(String title) { - String selectedPath = TinyFileDialogs.tinyfd_selectFolderDialog(title, SystemProperties.getUserHome()); - if (Strings.isNullOrEmpty(selectedPath)) { - return Optional.empty(); - } + public static CompletableFuture> openFolderSelect(String title) { + return CompletableFuture.supplyAsync(() -> TinyFileDialogs.tinyfd_selectFolderDialog(title, SystemProperties.getUserHome())) + .thenApply(selectedPath -> { + if (Strings.isNullOrEmpty(selectedPath)) { + return Optional.empty(); + } - return Optional.of(Path.of(selectedPath)); + return Optional.of(Path.of(selectedPath)); + }); } public static final BiFunction, String, ? extends ClickableWidget> PATH_WIDGET_FACTORY = (configValue, id) -> { From b94ba8e224840be6089e2d22ed0f714322b8e0a1 Mon Sep 17 00:00:00 2001 From: worldwidepixel <58098422+worldwidepixel@users.noreply.github.com> Date: Wed, 9 Jul 2025 03:01:16 -0700 Subject: [PATCH 5/9] tweak: Make the version number different for beta testing purposes --- gradle.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index 0f7e21a..73dd6a5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ org.gradle.jvmargs=-Xmx2G org.gradle.parallel=true -mod.version = 1.1 +mod.version = 1.1_215-rc1 mod.group = dev.spiritstudios -mod.id = snapper \ No newline at end of file +mod.id = snapper From a545560db66a24976ca85cf87d088a8a8552ce74 Mon Sep 17 00:00:00 2001 From: worldwidepixel Date: Mon, 11 Aug 2025 19:03:46 -0700 Subject: [PATCH 6/9] fix: #38 by ensuring properly loaded screenshots before opening viewer --- src/client/java/dev/spiritstudios/snapper/SnapperConfig.java | 2 +- .../snapper/gui/screen/ScreenshotViewerScreen.java | 4 ++-- .../spiritstudios/snapper/mixin/ScreenshotRecorderMixin.java | 1 - 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/client/java/dev/spiritstudios/snapper/SnapperConfig.java b/src/client/java/dev/spiritstudios/snapper/SnapperConfig.java index d54a4e5..0da123b 100644 --- a/src/client/java/dev/spiritstudios/snapper/SnapperConfig.java +++ b/src/client/java/dev/spiritstudios/snapper/SnapperConfig.java @@ -29,7 +29,7 @@ public final class SnapperConfig extends Config { .comment("Whether to show Snapper button in game menu.") .build(); - public final Value viewMode = enumValue(ScreenshotViewerScreen.ViewMode.LIST, ScreenshotViewerScreen.ViewMode.class) + public final Value viewMode = enumValue(ScreenshotViewerScreen.ViewMode.GRID, ScreenshotViewerScreen.ViewMode.class) .comment("Whether to show screenshot menu with grid or list.") .build(); diff --git a/src/client/java/dev/spiritstudios/snapper/gui/screen/ScreenshotViewerScreen.java b/src/client/java/dev/spiritstudios/snapper/gui/screen/ScreenshotViewerScreen.java index c506922..26449b0 100644 --- a/src/client/java/dev/spiritstudios/snapper/gui/screen/ScreenshotViewerScreen.java +++ b/src/client/java/dev/spiritstudios/snapper/gui/screen/ScreenshotViewerScreen.java @@ -1,6 +1,5 @@ package dev.spiritstudios.snapper.gui.screen; -import com.mojang.blaze3d.systems.RenderSystem; import dev.spiritstudios.snapper.Snapper; import dev.spiritstudios.snapper.util.ScreenshotActions; import dev.spiritstudios.snapper.util.ScreenshotImage; @@ -75,6 +74,8 @@ public ScreenshotViewerScreen(ScreenshotImage icon, Path iconPath, Screen parent this.screenshots = screenshots; this.screenshotIndex = this.screenshots != null ? this.screenshots.indexOf(this.screenshot) : -1; + + icon.load(); } public enum ViewMode { @@ -307,7 +308,6 @@ public boolean keyPressed(int keyCode, int scanCode, int modifiers) { }; if (imagePath == null) return super.keyPressed(keyCode, scanCode, modifiers); - ScreenshotImage.createScreenshot(client.getTextureManager(), imagePath) .ifPresent(image -> client.setScreen(new ScreenshotViewerScreen( image, imagePath, diff --git a/src/client/java/dev/spiritstudios/snapper/mixin/ScreenshotRecorderMixin.java b/src/client/java/dev/spiritstudios/snapper/mixin/ScreenshotRecorderMixin.java index 3cb9996..ba2b545 100644 --- a/src/client/java/dev/spiritstudios/snapper/mixin/ScreenshotRecorderMixin.java +++ b/src/client/java/dev/spiritstudios/snapper/mixin/ScreenshotRecorderMixin.java @@ -17,7 +17,6 @@ import java.io.File; import java.io.IOException; import java.nio.file.Files; -import java.nio.file.Path; import java.util.function.Consumer; @Mixin(ScreenshotRecorder.class) From 53eb288b87ce28fc7e17f168db55fae2ec1dee31 Mon Sep 17 00:00:00 2001 From: worldwidepixel Date: Tue, 12 Aug 2025 00:04:23 -0700 Subject: [PATCH 7/9] fix: fix #39 with :sparkles: math --- gradle.properties | 2 +- .../snapper/gui/widget/ScreenshotListWidget.java | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index 73dd6a5..9291c18 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ org.gradle.jvmargs=-Xmx2G org.gradle.parallel=true -mod.version = 1.1_215-rc1 +mod.version = 1.1_215-rc2 mod.group = dev.spiritstudios mod.id = snapper diff --git a/src/client/java/dev/spiritstudios/snapper/gui/widget/ScreenshotListWidget.java b/src/client/java/dev/spiritstudios/snapper/gui/widget/ScreenshotListWidget.java index 9630b0d..cf02563 100644 --- a/src/client/java/dev/spiritstudios/snapper/gui/widget/ScreenshotListWidget.java +++ b/src/client/java/dev/spiritstudios/snapper/gui/widget/ScreenshotListWidget.java @@ -188,6 +188,13 @@ public int getMaxScrollY() { return showGrid ? Math.max(0, totalRows * itemHeight - this.height + 4) : super.getMaxScrollY(); } + @Override + protected int getContentsHeightWithPadding() { + if (!this.showGrid) return super.getContentsHeightWithPadding(); + int totalRows = (getEntryCount() / getColumnCount()) + (getEntryCount() % getColumnCount() > 0 ? 1 : 0); + return totalRows * this.itemHeight + this.headerHeight + 4; + } + public void toggleGrid() { this.showGrid = !this.showGrid; ((EntryListWidgetAccessor) this).setItemHeight(this.showGrid ? this.gridItemHeight : this.listItemHeight); @@ -396,6 +403,7 @@ public void renderList(DrawContext context, int index, int y, int x, int entryWi ); if (icon.loaded()) { + //noinspection SuspiciousNameCombination context.drawTexture( RenderLayer::getGuiTextured, this.icon.getTextureId(), @@ -485,7 +493,7 @@ public void renderMetadata(DrawContext context, int index, int y, int x, int ent context.drawText( this.client.textRenderer, - fileName, + truncateFileName(fileName, entryWidth, 24), x + 5, y + 6, 0xFFFFFF, From a33560fb5402606b38ce044f1fd98e0d92b9d0a2 Mon Sep 17 00:00:00 2001 From: worldwidepixel Date: Tue, 12 Aug 2025 01:07:28 -0700 Subject: [PATCH 8/9] fix: Make viewer backgrounds work again --- .../gui/screen/ScreenshotViewerScreen.java | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/client/java/dev/spiritstudios/snapper/gui/screen/ScreenshotViewerScreen.java b/src/client/java/dev/spiritstudios/snapper/gui/screen/ScreenshotViewerScreen.java index 26449b0..f79b11a 100644 --- a/src/client/java/dev/spiritstudios/snapper/gui/screen/ScreenshotViewerScreen.java +++ b/src/client/java/dev/spiritstudios/snapper/gui/screen/ScreenshotViewerScreen.java @@ -36,7 +36,7 @@ public class ScreenshotViewerScreen extends Screen { private static final Identifier MENU_DECOR_BACKGROUND_TEXTURE = Identifier.ofVanilla("textures/gui/menu_list_background.png"); private static final Identifier INWORLD_MENU_DECOR_BACKGROUND_TEXTURE = Identifier.ofVanilla("textures/gui/inworld_menu_list_background.png"); private final MinecraftClient client = MinecraftClient.getInstance(); - private final ScreenshotImage icon; + private final ScreenshotImage image; private final String title; private final int imageWidth; private final int imageHeight; @@ -64,7 +64,7 @@ public ScreenshotViewerScreen(ScreenshotImage icon, Path iconPath, Screen parent this.client.setScreen(parent); } - this.icon = icon; + this.image = icon; this.title = iconPath.getFileName().toString(); this.imageWidth = image != null ? image.getWidth() : 0; @@ -197,7 +197,7 @@ public void render(DrawContext context, int mouseX, int mouseY, float delta) { context.drawTexture( RenderLayer::getGuiTextured, - this.icon.getTextureId(), + this.image.getTextureId(), (this.width / 2) - (finalWidth / 2), this.height - 68 - finalHeight, 0, 0, finalWidth, finalHeight, @@ -261,10 +261,14 @@ private void drawMenuBackground(DrawContext context) { this.client.world == null ? MENU_DECOR_BACKGROUND_TEXTURE : INWORLD_MENU_DECOR_BACKGROUND_TEXTURE, - width, height - 68 - 48, - 0, 0, - 32, 32, - 0, 48 + 0, + 48, + 0, + 0, + width, + height - 68 - 48, + 32, + 32 ); } From ba2a4a7df534a048f8fb4d39b44b59c7c87369ed Mon Sep 17 00:00:00 2001 From: worldwidepixel Date: Tue, 12 Aug 2025 02:10:20 -0700 Subject: [PATCH 9/9] fix: double-load significant error crashes --- .../spiritstudios/snapper/SnapperKeybindings.java | 13 ++++++++----- .../gui/screen/ScreenshotViewerScreen.java | 15 ++++++++------- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/client/java/dev/spiritstudios/snapper/SnapperKeybindings.java b/src/client/java/dev/spiritstudios/snapper/SnapperKeybindings.java index 1f6b16c..e5de6a6 100644 --- a/src/client/java/dev/spiritstudios/snapper/SnapperKeybindings.java +++ b/src/client/java/dev/spiritstudios/snapper/SnapperKeybindings.java @@ -71,11 +71,14 @@ private static void openRecentScreenshot(MinecraftClient client) { Path latestPath = screenshots.getFirst(); ScreenshotImage.createScreenshot(client.getTextureManager(), latestPath) .ifPresentOrElse( - image -> client.setScreen(new ScreenshotViewerScreen( - image, - latestPath, - client.currentScreen - )), + image -> { + client.setScreen(new ScreenshotViewerScreen( + image, + latestPath, + client.currentScreen + )); + image.load(); + }, () -> { if (client.player != null) client.player.sendMessage(Text.translatable("text.snapper.screenshot_open_failure"), true); diff --git a/src/client/java/dev/spiritstudios/snapper/gui/screen/ScreenshotViewerScreen.java b/src/client/java/dev/spiritstudios/snapper/gui/screen/ScreenshotViewerScreen.java index f79b11a..f13fdaa 100644 --- a/src/client/java/dev/spiritstudios/snapper/gui/screen/ScreenshotViewerScreen.java +++ b/src/client/java/dev/spiritstudios/snapper/gui/screen/ScreenshotViewerScreen.java @@ -74,8 +74,6 @@ public ScreenshotViewerScreen(ScreenshotImage icon, Path iconPath, Screen parent this.screenshots = screenshots; this.screenshotIndex = this.screenshots != null ? this.screenshots.indexOf(this.screenshot) : -1; - - icon.load(); } public enum ViewMode { @@ -313,11 +311,14 @@ public boolean keyPressed(int keyCode, int scanCode, int modifiers) { if (imagePath == null) return super.keyPressed(keyCode, scanCode, modifiers); ScreenshotImage.createScreenshot(client.getTextureManager(), imagePath) - .ifPresent(image -> client.setScreen(new ScreenshotViewerScreen( - image, imagePath, - this.parent, - this.screenshots - ))); + .ifPresent(image -> { + client.setScreen(new ScreenshotViewerScreen( + image, imagePath, + this.parent, + this.screenshots + )); + image.load(); + }); return super.keyPressed(keyCode, scanCode, modifiers); }