diff --git a/build.gradle b/build.gradle index fb6727a..577dea6 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ import java.nio.file.Paths plugins { - id 'fabric-loom' version '1.7-SNAPSHOT' + id 'fabric-loom' version '1.15-SNAPSHOT' id 'maven-publish' } @@ -63,8 +63,6 @@ java { if (JavaVersion.current() < javaVersion) { toolchain.languageVersion = JavaLanguageVersion.of(targetJavaVersion) } - libsDirName = Paths.get(libsDirName).resolve("${project.compatible_mc_version}").toString() - archivesBaseName = project.archives_base_name version = version.concat("-${project.mod_loader}-mc${project.compatible_mc_version}") withSourcesJar() } diff --git a/gradle.properties b/gradle.properties index c902f43..1668961 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,5 @@ org.gradle.jvmargs=-Xmx1G +org.gradle.parallel=true # Mod Properties mod_version=1.3.4 @@ -6,15 +7,15 @@ maven_group=io.github.lgatodu47 archives_base_name=screenshot_viewer # Project properties -compatible_mc_version=1.21.4 +compatible_mc_version=1.21.11 mod_loader=fabric # Fabric Properties -minecraft_version=1.21.4 -yarn_mappings=1.21.4+build.8 -loader_version=0.16.10 +minecraft_version=1.21.11 +yarn_mappings=1.21.11+build.4 +loader_version=0.18.4 # Dependencies -fabric_version=0.118.0+1.21.4 -modmenu_version=13.0.2 -catconfigmc_version=1.21.4-0.2.1 +fabric_version=0.141.2+1.21.11 +modmenu_version=17.0.0-beta.2 +catconfigmc_version=1.21.11-0.2.1 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 19cfad9..ac57dd1 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/src/main/java/io/github/lgatodu47/screenshot_viewer/ScreenshotViewer.java b/src/main/java/io/github/lgatodu47/screenshot_viewer/ScreenshotViewer.java index 0ed6d9f..96d928b 100644 --- a/src/main/java/io/github/lgatodu47/screenshot_viewer/ScreenshotViewer.java +++ b/src/main/java/io/github/lgatodu47/screenshot_viewer/ScreenshotViewer.java @@ -51,7 +51,7 @@ public void onInitializeClient() { } private void initKeyBindings() { - openScreenshotsScreenKey = KeyBindingHelper.registerKeyBinding(new KeyBinding(ScreenshotViewerTexts.translation("key", "open_screenshots_screen"), InputUtil.UNKNOWN_KEY.getCode(), KeyBinding.MISC_CATEGORY)); + openScreenshotsScreenKey = KeyBindingHelper.registerKeyBinding(new KeyBinding(ScreenshotViewerTexts.translation("key", "open_screenshots_screen"), InputUtil.UNKNOWN_KEY.getCode(), KeyBinding.Category.MISC)); } private static final Identifier DELAYED_PHASE = Identifier.of(MODID, "delayed"); diff --git a/src/main/java/io/github/lgatodu47/screenshot_viewer/ScreenshotViewerMacOsUtils.java b/src/main/java/io/github/lgatodu47/screenshot_viewer/ScreenshotViewerMacOsUtils.java index a83799a..bd8678b 100644 --- a/src/main/java/io/github/lgatodu47/screenshot_viewer/ScreenshotViewerMacOsUtils.java +++ b/src/main/java/io/github/lgatodu47/screenshot_viewer/ScreenshotViewerMacOsUtils.java @@ -3,7 +3,7 @@ import ca.weblite.objc.Client; import ca.weblite.objc.Proxy; import com.mojang.logging.LogUtils; -import net.minecraft.client.MinecraftClient; +import net.minecraft.util.Util; public class ScreenshotViewerMacOsUtils { // Code taken from ScreenshotToClipboard: https://github.com/comp500/ScreenshotToClipboard @@ -31,7 +31,7 @@ of this software and associated documentation files (the "Software"), to deal SOFTWARE. */ public static void doCopyMacOS(String path) { - if (!MinecraftClient.IS_SYSTEM_MAC) { + if (Util.getOperatingSystem() != Util.OperatingSystem.OSX) { return; } diff --git a/src/main/java/io/github/lgatodu47/screenshot_viewer/ScreenshotViewerUtils.java b/src/main/java/io/github/lgatodu47/screenshot_viewer/ScreenshotViewerUtils.java index 6a4a83f..861f378 100644 --- a/src/main/java/io/github/lgatodu47/screenshot_viewer/ScreenshotViewerUtils.java +++ b/src/main/java/io/github/lgatodu47/screenshot_viewer/ScreenshotViewerUtils.java @@ -1,10 +1,7 @@ package io.github.lgatodu47.screenshot_viewer; -import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.logging.LogUtils; import io.github.lgatodu47.screenshot_viewer.screen.ScreenshotViewerTexts; -import net.fabricmc.loader.api.FabricLoader; -import net.fabricmc.loader.api.MappingResolver; import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawContext; @@ -15,7 +12,7 @@ import net.minecraft.client.gui.tooltip.TooltipComponent; import net.minecraft.client.gui.tooltip.TooltipPositioner; import net.minecraft.client.gui.widget.ClickableWidget; -import net.minecraft.client.render.*; +import net.minecraft.client.gl.RenderPipelines; import net.minecraft.client.toast.SystemToast; import net.minecraft.text.OrderedText; import net.minecraft.text.Text; @@ -24,7 +21,6 @@ import net.minecraft.util.math.ColorHelper; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.joml.Matrix4f; import org.slf4j.Logger; import javax.imageio.ImageIO; @@ -35,7 +31,6 @@ import java.awt.datatransfer.UnsupportedFlavorException; import java.awt.image.BufferedImage; import java.io.File; -import java.lang.reflect.Method; import java.util.Arrays; import java.util.List; import java.util.concurrent.CompletableFuture; @@ -64,26 +59,12 @@ public static List getScreenshotFiles(File screenshotsFolder) { return Arrays.stream(files).filter(file -> file.isFile() && (file.getName().endsWith(".png") || file.getName().endsWith(".jpg") || file.getName().endsWith(".jpeg"))).collect(Collectors.toList()); } - public static void drawTexture(DrawContext context, int x, int y, int width, int height, int u, int v, int regionWidth, int regionHeight, int textureWidth, int textureHeight) { - int x2 = x + width; - int y2 = y + height; - float u1 = u / (float) textureWidth; - float u2 = (u + (float) regionWidth) / (float) textureWidth; - float v1 = v / (float) textureHeight; - float v2 = (v + (float) regionHeight) / (float) textureHeight; - - Matrix4f matrix4f = context.getMatrices().peek().getPositionMatrix(); - BufferBuilder bufferBuilder = Tessellator.getInstance().begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_TEXTURE); - bufferBuilder.vertex(matrix4f, x, y, 0).texture(u1, v1); - bufferBuilder.vertex(matrix4f, x, y2, 0).texture(u1, v2); - bufferBuilder.vertex(matrix4f, x2, y2, 0).texture(u2, v2); - bufferBuilder.vertex(matrix4f, x2, y, 0).texture(u2, v1); - BufferRenderer.drawWithGlobalProgram(bufferBuilder.end()); + public static void drawTexture(DrawContext context, Identifier texture, int x, int y, int width, int height, int u, int v, int regionWidth, int regionHeight, int textureWidth, int textureHeight) { + context.drawTexture(RenderPipelines.GUI_TEXTURED, texture, x, y, (float)u, (float)v, width, height, regionWidth, regionHeight, textureWidth, textureHeight); } - @Nullable private static Clipboard tryGetAWTClipboard() { - if(MinecraftClient.IS_SYSTEM_MAC) { + if(Util.getOperatingSystem() == Util.OperatingSystem.OSX) { return null; } try { @@ -95,7 +76,7 @@ private static Clipboard tryGetAWTClipboard() { } public static void copyImageToClipboard(File screenshotFile) { - if(MinecraftClient.IS_SYSTEM_MAC) { + if(Util.getOperatingSystem() == Util.OperatingSystem.OSX) { ScreenshotViewerMacOsUtils.doCopyMacOS(screenshotFile.getAbsolutePath()); return; } @@ -126,60 +107,12 @@ public static List toColoredComponents(MinecraftClient client, return Tooltip.wrapLines(client, text).stream().map(ColoredTooltipComponent::new).collect(Collectors.toList()); } - private static Method DRAW_TOOLTIP; - private static boolean errorLogged; - - public static void renderTooltip(DrawContext context, TextRenderer textRenderer, List tooltipComponents, int posX, int posY) { - if(DRAW_TOOLTIP == null) { - try { - MappingResolver mappingResolver = FabricLoader.getInstance().getMappingResolver(); - String methodName = mappingResolver.mapMethodName("intermediary", "net.minecraft.class_332", "method_51435", "(Lnet/minecraft/class_327;Ljava/util/List;IILnet/minecraft/class_8000;Lnet/minecraft/class_2960;)V"); - DRAW_TOOLTIP = DrawContext.class.getDeclaredMethod(methodName, TextRenderer.class, List.class, int.class, int.class, TooltipPositioner.class, Identifier.class); - } catch (NoSuchMethodException e) { - if(!errorLogged) { - LOGGER.error("Failed to render Screenshot Viewer tooltip", e); - errorLogged = true; - } - return; - } - DRAW_TOOLTIP.setAccessible(true); - } - try { - DRAW_TOOLTIP.invoke(context, textRenderer, tooltipComponents, posX, posY, HoveredTooltipPositioner.INSTANCE, null); - } catch (Exception e) { - if(!errorLogged) { - LOGGER.error("Failed to render Screenshot Viewer tooltip", e); - errorLogged = true; - } - } + public static void renderTooltip(DrawContext context, TextRenderer textRenderer, List text, int posX, int posY) { + context.drawTooltip(textRenderer, text, HoveredTooltipPositioner.INSTANCE, posX, posY, false); } - private static Method RENDER_WIDGET; - private static boolean errorLogged1; - public static void renderWidget(ClickableWidget widget, DrawContext context, int mouseX, int mouseY, float delta) { - if(RENDER_WIDGET == null) { - try { - MappingResolver mappingResolver = FabricLoader.getInstance().getMappingResolver(); - String methodName = mappingResolver.mapMethodName("intermediary", "net.minecraft.class_339", "method_48579", "(Lnet/minecraft/class_332;IIF)V"); - RENDER_WIDGET = ClickableWidget.class.getDeclaredMethod(methodName, DrawContext.class, int.class, int.class, float.class); - } catch (NoSuchMethodException e) { - if(!errorLogged1) { - LOGGER.error("Failed to render widget", e); - errorLogged1 = true; - } - return; - } - RENDER_WIDGET.setAccessible(true); - } - try { - RENDER_WIDGET.invoke(widget, context, mouseX, mouseY, delta); - } catch (Exception e) { - if(!errorLogged1) { - LOGGER.error("Failed to render widget", e); - errorLogged1 = true; - } - } + widget.render(context, mouseX, mouseY, delta); } public static void forEachDrawable(Screen screen, Consumer renderer) { @@ -208,15 +141,8 @@ public int getHeight(TextRenderer textRenderer) { } @Override - public void drawText(TextRenderer textRenderer, int x, int y, Matrix4f matrix, VertexConsumerProvider.Immediate vertexConsumers) { - float[] colors = RenderSystem.getShaderColor(); - if(colors.length != 4) { - colors = new float[]{0, 0, 0, 0}; - } - // game tweaks the alpha value for some reason (see TextRenderer#tweakTransparency) - int alpha = Math.max((int) (colors[3] * 255), 5); - int textColor = ColorHelper.getArgb(alpha, (int) (colors[0] * 255), (int) (colors[1] * 255), (int) (colors[2] * 255)); - textRenderer.draw(this.text, x, y, textColor, true, matrix, vertexConsumers, TextRenderer.TextLayerType.NORMAL, 0, 0xF000F0); + public void drawText(DrawContext context, TextRenderer textRenderer, int x, int y) { + context.drawText(textRenderer, this.text, x, y, -1, true); } } diff --git a/src/main/java/io/github/lgatodu47/screenshot_viewer/config/ColorOption.java b/src/main/java/io/github/lgatodu47/screenshot_viewer/config/ColorOption.java index 131f8c4..d2c4347 100644 --- a/src/main/java/io/github/lgatodu47/screenshot_viewer/config/ColorOption.java +++ b/src/main/java/io/github/lgatodu47/screenshot_viewer/config/ColorOption.java @@ -10,9 +10,9 @@ import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.widget.ClickableWidget; import net.minecraft.client.gui.widget.TextFieldWidget; +import net.minecraft.client.input.KeyInput; import net.minecraft.text.Text; import net.minecraft.text.TextColor; import org.jetbrains.annotations.NotNull; @@ -79,8 +79,8 @@ public ColorTextField(TextRenderer renderer, int x, int y, int width, int height } @Override - public boolean keyPressed(int keyCode, int scanCode, int modifiers) { - if (isActive() && Screen.isPaste(keyCode)) { + public boolean keyPressed(KeyInput input) { + if (isActive() && input.isPaste()) { String clipboard = MinecraftClient.getInstance().keyboard.getClipboard(); if(clipboard.startsWith("#") && clipboard.length() < 8) { clipboard = clipboard.substring(1); @@ -88,7 +88,7 @@ public boolean keyPressed(int keyCode, int scanCode, int modifiers) { this.write(clipboard); return true; } - return super.keyPressed(keyCode, scanCode, modifiers); + return super.keyPressed(input); } @Override diff --git a/src/main/java/io/github/lgatodu47/screenshot_viewer/config/FileOption.java b/src/main/java/io/github/lgatodu47/screenshot_viewer/config/FileOption.java index 1a622cc..4b408c5 100644 --- a/src/main/java/io/github/lgatodu47/screenshot_viewer/config/FileOption.java +++ b/src/main/java/io/github/lgatodu47/screenshot_viewer/config/FileOption.java @@ -9,6 +9,8 @@ import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.widget.ClickableWidget; import net.minecraft.client.gui.widget.TextFieldWidget; +import net.minecraft.client.gui.Click; +import net.minecraft.client.input.KeyInput; import net.minecraft.text.OrderedText; import net.minecraft.text.Style; import net.minecraft.text.Text; @@ -56,6 +58,7 @@ public static ClickableWidget createDirectoryWidget(ConfigAccess config, ConfigO Supplier defaultValue = () -> Objects.requireNonNull(option.defaultValue()); widget.setText(config.get(option).orElseGet(defaultValue).getAbsolutePath()); AtomicBoolean corrected = new AtomicBoolean(false); + widget.addFormatter((text, firstCharacterIndex) -> OrderedText.styledForwardsVisitedString(text, corrected.get() ? Style.EMPTY.withColor(Formatting.RED) : Style.EMPTY)); widget.setAcceptChangesListener(() -> { File target = new File(widget.getText()); if(target.exists() && target.isAbsolute() && target.isDirectory() && target.canRead()) { @@ -66,7 +69,6 @@ public static ClickableWidget createDirectoryWidget(ConfigAccess config, ConfigO widget.setText(defaultValue.get().getAbsolutePath()); corrected.set(true); }); - widget.setRenderTextProvider((text, i) -> OrderedText.styledForwardsVisitedString(text, corrected.get() ? Style.EMPTY.withColor(Formatting.RED) : Style.EMPTY)); return widget; } @@ -108,8 +110,8 @@ public void renderButton(DrawContext context, int mouseX, int mouseY, float delt }*/ @Override - public boolean mouseClicked(double mouseX, double mouseY, int button) { - boolean res = super.mouseClicked(mouseX, mouseY, button); + public boolean mouseClicked(Click click, boolean doubled) { + boolean res = super.mouseClicked(click, doubled); if(res && acceptChangesListener != null) { acceptChangesListener.run(); } @@ -117,15 +119,15 @@ public boolean mouseClicked(double mouseX, double mouseY, int button) { } @Override - public boolean keyPressed(int keyCode, int scanCode, int modifiers) { + public boolean keyPressed(KeyInput input) { if(!isActive()) { return false; } - if(keyCode == GLFW.GLFW_KEY_ENTER && acceptChangesListener != null) { + if(input.key() == GLFW.GLFW_KEY_ENTER && acceptChangesListener != null) { acceptChangesListener.run(); return true; } - return super.keyPressed(keyCode, scanCode, modifiers); + return super.keyPressed(input); } @Override diff --git a/src/main/java/io/github/lgatodu47/screenshot_viewer/mixin/ScreenMixin.java b/src/main/java/io/github/lgatodu47/screenshot_viewer/mixin/ScreenMixin.java index 19c660c..19036e0 100644 --- a/src/main/java/io/github/lgatodu47/screenshot_viewer/mixin/ScreenMixin.java +++ b/src/main/java/io/github/lgatodu47/screenshot_viewer/mixin/ScreenMixin.java @@ -3,37 +3,40 @@ import io.github.lgatodu47.screenshot_viewer.ScreenshotViewer; import io.github.lgatodu47.screenshot_viewer.config.ScreenshotViewerOptions; import io.github.lgatodu47.screenshot_viewer.screen.manage_screenshots.ManageScreenshotsScreen; -import io.github.lgatodu47.screenshot_viewer.screen.ScreenshotClickEvent; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.screen.Screen; import net.minecraft.text.ClickEvent; -import net.minecraft.text.Style; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.io.File; @Mixin(Screen.class) public abstract class ScreenMixin { - @Shadow @Nullable protected MinecraftClient client; - - @Shadow public abstract boolean handleTextClick(@Nullable Style style); + @Inject(method = "handleClickEvent", at = @At("HEAD"), cancellable = true) + private static void screenshot_viewer$inject_handleClickEvent(ClickEvent clickEvent, MinecraftClient client, @Nullable Screen screenAfterRun, CallbackInfo ci) { + if (!ScreenshotViewer.getInstance().getConfig().getOrFallback(ScreenshotViewerOptions.REDIRECT_SCREENSHOT_CHAT_LINKS, false)) { + return; + } + if (!(clickEvent instanceof ClickEvent.OpenFile openFile)) { + return; + } - @Inject(method = "handleTextClick", at = @At("HEAD"), cancellable = true) - private void screenshot_viewer$inject_handleTextClick(Style style, CallbackInfoReturnable cir) { - if(style == null || Screen.hasShiftDown()) { + File file = openFile.file(); + if (!file.isFile()) { return; } - if(style.getClickEvent() instanceof ScreenshotClickEvent event) { - if(ScreenshotViewer.getInstance().getConfig().getOrFallback(ScreenshotViewerOptions.REDIRECT_SCREENSHOT_CHAT_LINKS, false)) { - //noinspection DataFlowIssue - this.client.setScreen(new ManageScreenshotsScreen((Screen) (Object) this, event.getScreenshotFile())); - cir.setReturnValue(true); - return; - } - cir.setReturnValue(this.handleTextClick(style.withClickEvent(new ClickEvent(ClickEvent.Action.OPEN_FILE, event.getScreenshotFile().getAbsolutePath())))); + + String name = file.getName().toLowerCase(); + if (!name.endsWith(".png") && !name.endsWith(".jpg") && !name.endsWith(".jpeg") && + !name.endsWith(".bmp") && !name.endsWith(".tga") && !name.endsWith(".tiff")) { + return; } + + client.setScreen(new ManageScreenshotsScreen(screenAfterRun, file)); + ci.cancel(); } } diff --git a/src/main/java/io/github/lgatodu47/screenshot_viewer/mixin/ScreenshotRecorderMixin.java b/src/main/java/io/github/lgatodu47/screenshot_viewer/mixin/ScreenshotRecorderMixin.java index 8416508..90849ce 100644 --- a/src/main/java/io/github/lgatodu47/screenshot_viewer/mixin/ScreenshotRecorderMixin.java +++ b/src/main/java/io/github/lgatodu47/screenshot_viewer/mixin/ScreenshotRecorderMixin.java @@ -2,43 +2,33 @@ import io.github.lgatodu47.screenshot_viewer.ScreenshotViewer; import io.github.lgatodu47.screenshot_viewer.config.ScreenshotViewerOptions; -import io.github.lgatodu47.screenshot_viewer.screen.ScreenshotClickEvent; import io.github.lgatodu47.screenshot_viewer.screen.ScreenshotViewerTexts; -import net.fabricmc.loader.api.FabricLoader; -import net.minecraft.client.texture.NativeImage; import net.minecraft.client.util.ScreenshotRecorder; +import net.minecraft.client.gl.Framebuffer; import net.minecraft.text.HoverEvent; import net.minecraft.text.MutableText; 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.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.LocalCapture; +import org.spongepowered.asm.mixin.injection.ModifyVariable; import java.io.File; import java.util.function.Consumer; @Mixin(ScreenshotRecorder.class) public class ScreenshotRecorderMixin { - @Inject(method = "method_1661", at = @At(value = "INVOKE", target = "Ljava/util/function/Consumer;accept(Ljava/lang/Object;)V", ordinal = 0, shift = At.Shift.BEFORE), locals = LocalCapture.CAPTURE_FAILSOFT) - private static void screenshot_viewer$inject_saveScreenshotInner$lambda(NativeImage nativeImage, File file, Consumer messageReceiver, CallbackInfo ci, Text text) { - if(!(text instanceof MutableText mutable) || text.getStyle().getClickEvent() == null) { - if(FabricLoader.getInstance().isDevelopmentEnvironment()) { - throw new RuntimeException("Minecraft codebase probably changed, code won't work"); + @ModifyVariable( + method = "saveScreenshot(Ljava/io/File;Ljava/lang/String;Lnet/minecraft/client/gl/Framebuffer;ILjava/util/function/Consumer;)V", + at = @org.spongepowered.asm.mixin.injection.At("HEAD"), + argsOnly = true, + index = 4 + ) + private static Consumer screenshot_viewer$wrapMessageReceiver(Consumer messageReceiver, File gameDirectory, String fileName, Framebuffer framebuffer, int downscaleFactor) { + return message -> { + if (ScreenshotViewer.getInstance().getConfig().getOrFallback(ScreenshotViewerOptions.REDIRECT_SCREENSHOT_CHAT_LINKS, false) + && message instanceof MutableText mutable) { + mutable.styled(style -> style.withHoverEvent(new HoverEvent.ShowText(ScreenshotViewerTexts.REDIRECT_TO_SCREENSHOT_MANAGER))); } - return; - } - mutable.styled(style -> style - .withClickEvent(new ScreenshotClickEvent(new File(text.getStyle().getClickEvent().getValue()))) - .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, ScreenshotViewerTexts.REDIRECT_TO_SCREENSHOT_MANAGER) { - @Nullable - @Override - public T getValue(Action action) { - return ScreenshotViewer.getInstance().getConfig().getOrFallback(ScreenshotViewerOptions.REDIRECT_SCREENSHOT_CHAT_LINKS, false) ? super.getValue(action) : null; - } - }) - ); + messageReceiver.accept(message); + }; } } diff --git a/src/main/java/io/github/lgatodu47/screenshot_viewer/screen/ConfigureButtonPlacementScreen.java b/src/main/java/io/github/lgatodu47/screenshot_viewer/screen/ConfigureButtonPlacementScreen.java index c6e9410..9b51da0 100644 --- a/src/main/java/io/github/lgatodu47/screenshot_viewer/screen/ConfigureButtonPlacementScreen.java +++ b/src/main/java/io/github/lgatodu47/screenshot_viewer/screen/ConfigureButtonPlacementScreen.java @@ -1,20 +1,19 @@ package io.github.lgatodu47.screenshot_viewer.screen; -import com.mojang.blaze3d.systems.RenderSystem; import io.github.lgatodu47.catconfig.ConfigAccess; import io.github.lgatodu47.catconfig.ConfigOption; +import io.github.lgatodu47.screenshot_viewer.ScreenshotViewer; import io.github.lgatodu47.screenshot_viewer.ScreenshotViewerUtils; import io.github.lgatodu47.screenshot_viewer.config.WidgetPositionOption; import net.fabricmc.fabric.api.client.screen.v1.Screens; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gl.ShaderProgramKeys; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.widget.ClickableWidget; import net.minecraft.client.texture.NativeImageBackedTexture; import net.minecraft.client.util.ScreenshotRecorder; -import net.minecraft.client.util.math.MatrixStack; import net.minecraft.text.Text; +import net.minecraft.util.Identifier; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.lwjgl.glfw.GLFW; @@ -23,6 +22,8 @@ import java.util.concurrent.CompletableFuture; import java.util.function.Predicate; import java.util.function.Supplier; +import net.minecraft.client.gui.Click; +import net.minecraft.client.input.KeyInput; public class ConfigureButtonPlacementScreen extends Screen { private final Screen parent; @@ -31,7 +32,7 @@ public class ConfigureButtonPlacementScreen extends Screen { private final Screen configuringScreen; private final WidgetRemover remover; @Nullable - private CompletableFuture screenImageTexture; + private CompletableFuture screenImageTexture; @Nullable private ClickableWidget elementToPlace; @@ -50,20 +51,17 @@ protected void init() { // first screen initialization if(configuringScreen.getTextRenderer() == null) { - configuringScreen.init(client, width, height); + configuringScreen.init(width, height); this.elementToPlace = remover.removeWidget(configuringScreen); } } @Override - public void resize(MinecraftClient client, int width, int height) { - super.resize(client, width, height); - this.configuringScreen.resize(client, width, height); + public void resize(int width, int height) { + super.resize(width, height); + this.configuringScreen.resize(width, height); this.elementToPlace = remover.removeWidget(configuringScreen); - if(screenImageTexture != null) { - this.screenImageTexture.thenAcceptAsync(NativeImageBackedTexture::close, this.client); - this.screenImageTexture = null; - } + disposeScreenImageTexture(); } @Override @@ -80,12 +78,19 @@ public void render(DrawContext context, int mouseX, int mouseY, float delta) { } protected void initScreenImageTexture(DrawContext context) { - screenImageTexture = CompletableFuture.supplyAsync(() -> { + if (this.client != null) { + CompletableFuture future = new CompletableFuture<>(); + this.screenImageTexture = future; configuringScreen.render(context, 0, 0, 0); // calling render prevents a bug where parts of the previous screen could appear. configuringScreen.render(context, 0, 0, 0); - return new NativeImageBackedTexture(ScreenshotRecorder.takeScreenshot(client.getFramebuffer())); - }, this.client); + ScreenshotRecorder.takeScreenshot(this.client.getFramebuffer(), image -> { + int hash = java.util.Objects.hash(width, height, System.nanoTime()); + Identifier textureId = Identifier.of(ScreenshotViewer.MODID, "dynamic/" + Integer.toHexString(hash)); + this.client.getTextureManager().registerTexture(textureId, new NativeImageBackedTexture(textureId::toString, image)); + future.complete(textureId); + }); + } } protected void renderRegularScreen(DrawContext context) { @@ -93,24 +98,10 @@ protected void renderRegularScreen(DrawContext context) { return; } - MatrixStack stack = context.getMatrices(); - NativeImageBackedTexture texture; + Identifier texture; if((texture = screenImageTexture.getNow(null)) != null) { - RenderSystem.setShader(ShaderProgramKeys.POSITION_TEX); - RenderSystem.setShaderColor(1, 1, 1, 1); - RenderSystem.setShaderTexture(0, texture.getGlId()); - RenderSystem.enableBlend(); - RenderSystem.enableDepthTest(); - RenderSystem.depthFunc(515); - - stack.translate(0, 0, -5); - ScreenshotViewerUtils.drawTexture(context, 0, 0, width, height, 0, 0, width, height, width, height); - stack.translate(0, 0, 2); + ScreenshotViewerUtils.drawTexture(context, texture, 0, 0, width, height, 0, 0, width, height, width, height); context.fillGradient(0, 0, width, height, -1072689136, -804253680); - stack.translate(0, 0, 3); - - RenderSystem.disableDepthTest(); - RenderSystem.disableBlend(); } } @@ -123,48 +114,54 @@ protected void renderTipTexts(DrawContext context) { } @Override - public boolean mouseClicked(double mouseX, double mouseY, int button) { - if(elementToPlace != null && button == GLFW.GLFW_MOUSE_BUTTON_RIGHT) { - elementToPlace.setPosition((int) mouseX - elementToPlace.getWidth() / 2, (int) mouseY - elementToPlace.getHeight() / 2); + public boolean mouseClicked(Click click, boolean doubled) { + if(elementToPlace != null && click.button() == GLFW.GLFW_MOUSE_BUTTON_RIGHT) { + elementToPlace.setPosition((int) click.x() - elementToPlace.getWidth() / 2, (int) click.y() - elementToPlace.getHeight() / 2); return true; } - return super.mouseClicked(mouseX, mouseY, button); + return super.mouseClicked(click, doubled); } @Override - public boolean mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) { - if(elementToPlace != null && button == GLFW.GLFW_MOUSE_BUTTON_RIGHT) { - elementToPlace.setPosition((int) mouseX - elementToPlace.getWidth() / 2, (int) mouseY - elementToPlace.getHeight() / 2); + public boolean mouseDragged(Click click, double offsetX, double offsetY) { + if(elementToPlace != null && click.button() == GLFW.GLFW_MOUSE_BUTTON_RIGHT) { + elementToPlace.setPosition((int) click.x() - elementToPlace.getWidth() / 2, (int) click.y() - elementToPlace.getHeight() / 2); return true; } - return super.mouseDragged(mouseX, mouseY, button, deltaX, deltaY); + return super.mouseDragged(click, offsetX, offsetY); } @Override - public boolean keyPressed(int keyCode, int scanCode, int modifiers) { + public boolean keyPressed(KeyInput input) { if(elementToPlace != null) { - if(keyCode == GLFW.GLFW_KEY_ENTER) { + if(input.key() == GLFW.GLFW_KEY_ENTER) { this.config.put(option, new WidgetPositionOption.WidgetPosition(this.elementToPlace.getX(), this.elementToPlace.getY())); ClickableWidget.playClickSound(client.getSoundManager()); - } else if(keyCode == GLFW.GLFW_KEY_R) { + } else if(input.key() == GLFW.GLFW_KEY_R) { this.config.put(option, null); ClickableWidget.playClickSound(client.getSoundManager()); } close(); return true; } - return super.keyPressed(keyCode, scanCode, modifiers); + return super.keyPressed(input); } @Override public void close() { super.close(); - if(screenImageTexture != null) { - this.screenImageTexture.thenAcceptAsync(NativeImageBackedTexture::close, this.client); - } + disposeScreenImageTexture(); this.client.setScreen(parent); } + private void disposeScreenImageTexture() { + CompletableFuture future = this.screenImageTexture; + this.screenImageTexture = null; + if (future != null && this.client != null) { + future.thenAcceptAsync(this.client.getTextureManager()::destroyTexture, this.client); + } + } + @FunctionalInterface public interface WidgetRemover { @Nullable @@ -201,4 +198,4 @@ static WidgetRemover ofPredicate(@NotNull Predicate widgetPredi }; } } -} \ No newline at end of file +} diff --git a/src/main/java/io/github/lgatodu47/screenshot_viewer/screen/IconButtonWidget.java b/src/main/java/io/github/lgatodu47/screenshot_viewer/screen/IconButtonWidget.java index 04aa5d2..8d666db 100644 --- a/src/main/java/io/github/lgatodu47/screenshot_viewer/screen/IconButtonWidget.java +++ b/src/main/java/io/github/lgatodu47/screenshot_viewer/screen/IconButtonWidget.java @@ -1,21 +1,18 @@ package io.github.lgatodu47.screenshot_viewer.screen; -import com.mojang.blaze3d.systems.RenderSystem; import io.github.lgatodu47.screenshot_viewer.screen.manage_screenshots.ManageScreenshotsScreen; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.ButtonTextures; import net.minecraft.client.gui.widget.ButtonWidget; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.text.Text; import net.minecraft.util.Identifier; -import net.minecraft.util.math.ColorHelper; import org.jetbrains.annotations.Nullable; +import net.minecraft.client.gl.RenderPipelines; public class IconButtonWidget extends ButtonWidget { @Nullable private final Identifier iconTexture; - public IconButtonWidget(int x, int y, int width, int height, Text message, @Nullable Identifier iconTexture, PressAction pressAction) { + public IconButtonWidget(int x, int y, int width, int height, net.minecraft.text.Text message, @Nullable Identifier iconTexture, PressAction pressAction) { super(x, y, width, height, message, pressAction, DEFAULT_NARRATION_SUPPLIER); this.iconTexture = iconTexture; } @@ -30,13 +27,11 @@ public ButtonTextures getBackgroundTexture() { } @Override - protected void renderWidget(DrawContext context, int mouseX, int mouseY, float delta) { - RenderSystem.enableBlend(); - RenderSystem.enableDepthTest(); - context.drawGuiTexture(RenderLayer::getGuiTextured, getBackgroundTexture().get(this.active, isSelected()), getX(), getY(), getWidth(), getHeight(), ColorHelper.getWhite(this.alpha)); + protected void drawIcon(DrawContext context, int mouseX, int mouseY, float deltaTicks) { + context.drawGuiTexture(RenderPipelines.GUI_TEXTURED, getBackgroundTexture().get(this.active, isSelected()), getX(), getY(), getWidth(), getHeight()); Identifier icon = getIconTexture(); if(icon != null) { - context.drawGuiTexture(RenderLayer::getGuiTextured, icon, getX(), getY(), getWidth(), getHeight()); + context.drawGuiTexture(RenderPipelines.GUI_TEXTURED, icon, getX(), getY(), getWidth(), getHeight()); } } } diff --git a/src/main/java/io/github/lgatodu47/screenshot_viewer/screen/ScreenshotClickEvent.java b/src/main/java/io/github/lgatodu47/screenshot_viewer/screen/ScreenshotClickEvent.java deleted file mode 100644 index 20bec3c..0000000 --- a/src/main/java/io/github/lgatodu47/screenshot_viewer/screen/ScreenshotClickEvent.java +++ /dev/null @@ -1,39 +0,0 @@ -package io.github.lgatodu47.screenshot_viewer.screen; - -import io.github.lgatodu47.screenshot_viewer.ScreenshotViewer; -import net.minecraft.text.ClickEvent; - -import java.io.File; -import java.util.Objects; - -public class ScreenshotClickEvent extends ClickEvent { - private final File screenshotFile; - - public ScreenshotClickEvent(File screenshotFile) { - super(Action.OPEN_URL, ScreenshotViewer.MODID + ":screenshot_click_event"); - this.screenshotFile = screenshotFile; - } - - public File getScreenshotFile() { - return screenshotFile; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - if (!super.equals(o)) return false; - ScreenshotClickEvent that = (ScreenshotClickEvent) o; - return Objects.equals(screenshotFile, that.screenshotFile); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), screenshotFile); - } - - @Override - public String toString() { - return "ScreenshotClickEvent{screenshotFile=" + screenshotFile + '}'; - } -} diff --git a/src/main/java/io/github/lgatodu47/screenshot_viewer/screen/manage_screenshots/EnlargedScreenshotScreen.java b/src/main/java/io/github/lgatodu47/screenshot_viewer/screen/manage_screenshots/EnlargedScreenshotScreen.java index 318ec3a..685fdec 100644 --- a/src/main/java/io/github/lgatodu47/screenshot_viewer/screen/manage_screenshots/EnlargedScreenshotScreen.java +++ b/src/main/java/io/github/lgatodu47/screenshot_viewer/screen/manage_screenshots/EnlargedScreenshotScreen.java @@ -1,11 +1,9 @@ package io.github.lgatodu47.screenshot_viewer.screen.manage_screenshots; -import com.mojang.blaze3d.systems.RenderSystem; import io.github.lgatodu47.screenshot_viewer.ScreenshotViewerUtils; import io.github.lgatodu47.screenshot_viewer.screen.ScreenshotViewerTexts; import io.github.lgatodu47.screenshot_viewer.screen.manage_screenshots.ManageScreenshotsScreen.ExtendedButtonWidget; import io.github.lgatodu47.screenshot_viewer.screen.manage_screenshots.ManageScreenshotsScreen.ExtendedTexturedButtonWidget; -import net.minecraft.client.gl.ShaderProgramKeys; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.Drawable; import net.minecraft.client.gui.screen.Screen; @@ -15,6 +13,8 @@ import net.minecraft.screen.ScreenTexts; import net.minecraft.text.Text; import net.minecraft.util.Identifier; +import net.minecraft.client.gui.Click; +import net.minecraft.client.input.KeyInput; import org.jetbrains.annotations.Nullable; import org.lwjgl.glfw.GLFW; @@ -143,21 +143,14 @@ public void renderImage(DrawContext context) { NativeImage image = showing.image(); if (image != null) { - RenderSystem.setShader(ShaderProgramKeys.POSITION_TEX); - RenderSystem.setShaderColor(1.0f, 1.0f, 1.0f, 1.0f); - RenderSystem.setShaderTexture(0, showing.imageId()); - RenderSystem.enableDepthTest(); - RenderSystem.depthFunc(515); - RenderSystem.enableBlend(); float imgRatio = (float) image.getWidth() / image.getHeight(); int texHeight = height - spacing * 3 - 20; int texWidth = (int) (texHeight * imgRatio); - context.getMatrices().translate(0, 0, 1); - ScreenshotViewerUtils.drawTexture(context, (width - texWidth) / 2, spacing, texWidth, texHeight, 0, 0, image.getWidth(), image.getHeight(), image.getWidth(), image.getHeight()); - context.getMatrices().translate(0, 0, -1); - RenderSystem.disableDepthTest(); - RenderSystem.disableBlend(); + Identifier texture = showing.textureId(); + if (texture != null) { + ScreenshotViewerUtils.drawTexture(context, texture, (width - texWidth) / 2, spacing, texWidth, texHeight, 0, 0, image.getWidth(), image.getHeight(), image.getWidth(), image.getHeight()); + } } } } @@ -174,29 +167,29 @@ public boolean mouseScrolled(double mouseX, double mouseY, double horizontalAmou } @Override - public boolean keyPressed(int keyCode, int scanCode, int modifiers) { - if (keyCode == InputUtil.GLFW_KEY_LEFT) { + public boolean keyPressed(KeyInput input) { + if (input.key() == InputUtil.GLFW_KEY_LEFT) { previousScreenshot(); return true; } - if (keyCode == InputUtil.GLFW_KEY_RIGHT) { + if (input.key() == InputUtil.GLFW_KEY_RIGHT) { nextScreenshot(); return true; } - if(showing != null && keyCode == InputUtil.GLFW_KEY_C && (modifiers & GLFW.GLFW_MOD_CONTROL) != 0) { + if(showing != null && input.key() == InputUtil.GLFW_KEY_C && (input.modifiers() & GLFW.GLFW_MOD_CONTROL) != 0) { showing.copyScreenshot(); return true; } - return super.keyPressed(keyCode, scanCode, modifiers); + return super.keyPressed(input); } @Override - public boolean mouseClicked(double mouseX, double mouseY, int button) { - if(showing != null && button == GLFW.GLFW_MOUSE_BUTTON_RIGHT) { - this.properties.showProperties(mouseX, mouseY, showing); + public boolean mouseClicked(Click click, boolean doubled) { + if(showing != null && click.button() == GLFW.GLFW_MOUSE_BUTTON_RIGHT) { + this.properties.showProperties(click.x(), click.y(), showing); return true; } - return super.mouseClicked(mouseX, mouseY, button); + return super.mouseClicked(click, doubled); } @Override diff --git a/src/main/java/io/github/lgatodu47/screenshot_viewer/screen/manage_screenshots/ManageScreenshotsScreen.java b/src/main/java/io/github/lgatodu47/screenshot_viewer/screen/manage_screenshots/ManageScreenshotsScreen.java index 84eaad9..9553807 100644 --- a/src/main/java/io/github/lgatodu47/screenshot_viewer/screen/manage_screenshots/ManageScreenshotsScreen.java +++ b/src/main/java/io/github/lgatodu47/screenshot_viewer/screen/manage_screenshots/ManageScreenshotsScreen.java @@ -16,10 +16,9 @@ import net.minecraft.client.gui.screen.ButtonTextures; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.tooltip.HoveredTooltipPositioner; -import net.minecraft.client.gui.tooltip.Tooltip; import net.minecraft.client.gui.tooltip.TooltipPositioner; import net.minecraft.client.gui.widget.ButtonWidget; -import net.minecraft.client.util.math.MatrixStack; +import org.joml.Matrix3x2fStack; import net.minecraft.screen.ScreenTexts; import net.minecraft.text.Text; import net.minecraft.util.Formatting; @@ -28,6 +27,9 @@ import org.jetbrains.annotations.Nullable; import org.lwjgl.glfw.GLFW; import org.slf4j.Logger; +import net.minecraft.client.gui.Click; +import net.minecraft.client.input.KeyInput; +import net.minecraft.client.input.CharInput; import java.io.File; import java.util.List; @@ -99,7 +101,7 @@ protected void init() { final int spacing = 8; final int btnHeight = 20; - this.enlargedScreenshot.init(client, width, height); + this.enlargedScreenshot.init(width, height); //Main content int contentWidth = width - 24; @@ -132,7 +134,7 @@ protected void init() { } }, null, ScreenshotViewerTexts.ORDER) { @Override - protected @Nullable Text getTooltipText() { + protected @Nullable net.minecraft.text.Text getTooltipText() { return list == null ? null : list.isInvertedOrder() ? ScreenshotViewerTexts.DESCENDING_ORDER : ScreenshotViewerTexts.ASCENDING_ORDER; } @@ -169,10 +171,10 @@ protected void init() { close(); }) { @Override - public Text getMessage() { + public net.minecraft.text.Text getMessage() { List toDelete = list.deletionList(); if(fastDelete && !toDelete.isEmpty()) { - return Text.translatable("screen." + ScreenshotViewer.MODID + ".screenshot_manager.delete_n_screenshots", toDelete.size()).formatted(Formatting.RED); + return net.minecraft.text.Text.translatable("screen." + ScreenshotViewer.MODID + ".screenshot_manager.delete_n_screenshots", toDelete.size()).formatted(Formatting.RED); } return super.getMessage(); } @@ -201,12 +203,12 @@ public Identifier getIconTexture() { } @Override - public void resize(MinecraftClient client, int width, int height) { - super.resize(client, width, height); + public void resize(int width, int height) { + super.resize(width, height); // Adapts the size of the enlarged screenshot and the dialog screen when resized - this.enlargedScreenshot.resize(client, width, height); + this.enlargedScreenshot.resize(width, height); if(dialogScreen != null) { - this.dialogScreen.resize(client, width, height); + this.dialogScreen.resize(width, height); } // Hides the screenshot properties menu this.screenshotProperties.hide(); @@ -216,14 +218,13 @@ public void resize(MinecraftClient client, int width, int height) { @Override public void render(DrawContext context, int mouseX, int mouseY, float delta) { - renderBackground(context, mouseX, mouseY, delta); if(list != null) { list.render(context, mouseX, mouseY, delta, !(enlargedScreenshot.renders() || screenshotProperties.renders()) && dialogScreen == null); } context.drawCenteredTextWithShadow(textRenderer, title,width / 2, 8, 0xFFFFFF); renderActionText(context); ScreenshotViewerUtils.forEachDrawable(this, drawable -> drawable.render(context, mouseX, mouseY, delta)); - MatrixStack matrices = context.getMatrices(); + Matrix3x2fStack matrices = context.getMatrices(); if(enlargedScreenshot.renders()) { float animationTime = 1; @@ -233,16 +234,13 @@ public void render(DrawContext context, int mouseX, int mouseY, float delta) { } } - matrices.push(); - matrices.translate(0, 0, 1); enlargedScreenshot.renderBackground(context, mouseX, mouseY, delta); - matrices.push(); - matrices.translate((enlargedScreenshot.width / 2f) * (1 - animationTime), (enlargedScreenshot.height / 2f) * (1 - animationTime), 0); - matrices.scale(animationTime, animationTime, animationTime); + matrices.pushMatrix(); + matrices.translate((enlargedScreenshot.width / 2f) * (1 - animationTime), (enlargedScreenshot.height / 2f) * (1 - animationTime)); + matrices.scale(animationTime, animationTime); enlargedScreenshot.renderImage(context); - matrices.pop(); + matrices.popMatrix(); enlargedScreenshot.render(context, mouseX, mouseY, delta, !screenshotProperties.renders() && dialogScreen == null); - matrices.pop(); } else { if(screenshotScaleAnimation > 0) { screenshotScaleAnimation = 0; @@ -257,15 +255,9 @@ public void render(DrawContext context, int mouseX, int mouseY, float delta) { } } if(dialogScreen != null) { - matrices.push(); - matrices.translate(0, 0, 5); dialogScreen.render(context, mouseX, mouseY, delta); - matrices.pop(); } else { - matrices.push(); - matrices.translate(0, 0, 2); screenshotProperties.render(context, mouseX, mouseY, delta); - matrices.pop(); } } @@ -296,7 +288,7 @@ void setDialogScreen(Screen screen) { } this.dialogScreen = screen; if(dialogScreen != null) { - this.dialogScreen.init(client, width, height); + this.dialogScreen.init(width, height); } } @@ -305,58 +297,58 @@ void setDialogScreen(Screen screen) { private boolean isCtrlDown; @Override - public boolean keyPressed(int keyCode, int scanCode, int modifiers) { + public boolean keyPressed(KeyInput input) { if(dialogScreen != null) { - return dialogScreen.keyPressed(keyCode, scanCode, modifiers); + return dialogScreen.keyPressed(input); } if(screenshotProperties.renders()) { - return screenshotProperties.keyPressed(keyCode, scanCode, modifiers); + return screenshotProperties.keyPressed(input); } if(enlargedScreenshot.renders()) { - return enlargedScreenshot.keyPressed(keyCode, scanCode, modifiers); + return enlargedScreenshot.keyPressed(input); } - isCtrlDown = keyCode == GLFW.GLFW_KEY_LEFT_CONTROL || keyCode == GLFW.GLFW_KEY_RIGHT_CONTROL; - if(keyCode == GLFW.GLFW_KEY_F5) { + isCtrlDown = input.key() == GLFW.GLFW_KEY_LEFT_CONTROL || input.key() == GLFW.GLFW_KEY_RIGHT_CONTROL; + if (input.key() == GLFW.GLFW_KEY_F5) { list.init(); return true; } if(list != null) { - if(list.keyPressed(keyCode, scanCode, modifiers)) { + if(list.keyPressed(input)) { return true; } } - return super.keyPressed(keyCode, scanCode, modifiers); + return super.keyPressed(input); } @Override - public boolean keyReleased(int keyCode, int scanCode, int modifiers) { + public boolean keyReleased(KeyInput input) { if(dialogScreen != null) { - return dialogScreen.keyReleased(keyCode, scanCode, modifiers); + return dialogScreen.keyReleased(input); } if(screenshotProperties.renders()) { - return screenshotProperties.keyReleased(keyCode, scanCode, modifiers); + return screenshotProperties.keyReleased(input); } if(enlargedScreenshot.renders()) { - return enlargedScreenshot.keyReleased(keyCode, scanCode, modifiers); + return enlargedScreenshot.keyReleased(input); } if(isCtrlDown) { isCtrlDown = false; } - return super.keyReleased(keyCode, scanCode, modifiers); + return super.keyReleased(input); } @Override - public boolean charTyped(char chr, int modifiers) { + public boolean charTyped(CharInput input) { if(dialogScreen != null) { - return dialogScreen.charTyped(chr, modifiers); + return dialogScreen.charTyped(input); } if(screenshotProperties.renders()) { - return screenshotProperties.charTyped(chr, modifiers); + return screenshotProperties.charTyped(input); } if(enlargedScreenshot.renders()) { - return enlargedScreenshot.charTyped(chr, modifiers); + return enlargedScreenshot.charTyped(input); } - return super.charTyped(chr, modifiers); + return super.charTyped(input); } @Override @@ -382,48 +374,48 @@ public boolean mouseScrolled(double mouseX, double mouseY, double horizontalMove } @Override - public boolean mouseClicked(double mouseX, double mouseY, int button) { + public boolean mouseClicked(Click click, boolean doubled) { if(dialogScreen != null) { - return dialogScreen.mouseClicked(mouseX, mouseY, button); + return dialogScreen.mouseClicked(click, doubled); } if(screenshotProperties.renders()) { - return screenshotProperties.mouseClicked(mouseX, mouseY, button); + return screenshotProperties.mouseClicked(click, doubled); } if(enlargedScreenshot.renders()) { - return enlargedScreenshot.mouseClicked(mouseX, mouseY, button); + return enlargedScreenshot.mouseClicked(click, doubled); } - return OldParentElementMethods.super.mouseClicked(mouseX, mouseY, button); + return OldParentElementMethods.super.mouseClicked(click, doubled); } @Override - public boolean mouseReleased(double mouseX, double mouseY, int button) { + public boolean mouseReleased(Click click) { if(dialogScreen != null) { - return dialogScreen.mouseReleased(mouseX, mouseY, button); + return dialogScreen.mouseReleased(click); } if(screenshotProperties.renders()) { - return screenshotProperties.mouseReleased(mouseX, mouseY, button); + return screenshotProperties.mouseReleased(click); } if(enlargedScreenshot.renders()) { - return enlargedScreenshot.mouseReleased(mouseX, mouseY, button); + return enlargedScreenshot.mouseReleased(click); } if(list != null) { - return list.mouseReleased(mouseX, mouseY, button); + return list.mouseReleased(click); } - return super.mouseReleased(mouseX, mouseY, button); + return super.mouseReleased(click); } @Override - public boolean mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) { + public boolean mouseDragged(Click click, double offsetX, double offsetY) { if(dialogScreen != null) { - return dialogScreen.mouseDragged(mouseX, mouseY, button, deltaX, deltaY); + return dialogScreen.mouseDragged(click, offsetX, offsetY); } if(screenshotProperties.renders()) { - return screenshotProperties.mouseDragged(mouseX, mouseY, button, deltaX, deltaY); + return screenshotProperties.mouseDragged(click, offsetX, offsetY); } if(enlargedScreenshot.renders()) { - return enlargedScreenshot.mouseDragged(mouseX, mouseY, button, deltaX, deltaY); + return enlargedScreenshot.mouseDragged(click, offsetX, offsetY); } - return super.mouseDragged(mouseX, mouseY, button, deltaX, deltaY); + return super.mouseDragged(click, offsetX, offsetY); } @Override @@ -460,8 +452,8 @@ public void configUpdated() { this.enlargeAnimation = CONFIG.getOrFallback(ScreenshotViewerOptions.ENABLE_SCREENSHOT_ENLARGEMENT_ANIMATION, true); } - public static class ExtendedButtonWidget extends ButtonWidget implements CustomHoverState { - public ExtendedButtonWidget(int x, int y, int width, int height, Text message, PressAction onPress) { + public static class ExtendedButtonWidget extends ButtonWidget.Text implements CustomHoverState { + public ExtendedButtonWidget(int x, int y, int width, int height, net.minecraft.text.Text message, PressAction onPress) { super(x, y, width, height, message, onPress, Supplier::get); } @@ -472,7 +464,6 @@ public void render(DrawContext context, int mouseX, int mouseY, float delta) { } this.renderWidget(context, mouseX, mouseY, delta); } - @Override public boolean isSelected() { return isHovered(); @@ -486,15 +477,12 @@ public void updateHoveredState(int mouseX, int mouseY) { public static class ExtendedTexturedButtonWidget extends IconButtonWidget implements CustomHoverState { @Nullable - private final Text tooltip; + private final net.minecraft.text.Text tooltip; private boolean offsetTooltip; - public ExtendedTexturedButtonWidget(int x, int y, int width, int height, @Nullable Identifier texture, PressAction pressAction, @Nullable Text tooltip, Text text) { + public ExtendedTexturedButtonWidget(int x, int y, int width, int height, @Nullable Identifier texture, PressAction pressAction, @Nullable net.minecraft.text.Text tooltip, net.minecraft.text.Text text) { super(x, y, width, height, text, texture, pressAction); this.tooltip = tooltip; - if(tooltip != null) { - setTooltip(Tooltip.of(tooltip)); - } } public ExtendedTexturedButtonWidget offsetTooltip() { @@ -508,23 +496,18 @@ public void render(DrawContext context, int mouseX, int mouseY, float delta) { return; } this.renderWidget(context, mouseX, mouseY, delta); - applyTooltip(); + applyTooltip(context, mouseX, mouseY); } - private void applyTooltip() { - Text tooltipText = getTooltipText(); - if (tooltipText != null) { - if (isHovered()) { - Screen screen = MinecraftClient.getInstance().currentScreen; - if (screen != null) { - screen.setTooltip(Tooltip.of(tooltipText), getTooltipPositioner(), isFocused()); - } - } + private void applyTooltip(DrawContext context, int mouseX, int mouseY) { + net.minecraft.text.Text tooltipText = getTooltipText(); + if (tooltipText != null && isHovered()) { + context.drawTooltip(MinecraftClient.getInstance().textRenderer, List.of(tooltipText.asOrderedText()), getTooltipPositioner(), mouseX, mouseY, isFocused()); } } @Nullable - protected Text getTooltipText() { + protected net.minecraft.text.Text getTooltipText() { return tooltip; } diff --git a/src/main/java/io/github/lgatodu47/screenshot_viewer/screen/manage_screenshots/OldParentElementMethods.java b/src/main/java/io/github/lgatodu47/screenshot_viewer/screen/manage_screenshots/OldParentElementMethods.java index 83d0008..85cd5e8 100644 --- a/src/main/java/io/github/lgatodu47/screenshot_viewer/screen/manage_screenshots/OldParentElementMethods.java +++ b/src/main/java/io/github/lgatodu47/screenshot_viewer/screen/manage_screenshots/OldParentElementMethods.java @@ -1,5 +1,6 @@ package io.github.lgatodu47.screenshot_viewer.screen.manage_screenshots; +import net.minecraft.client.gui.Click; import net.minecraft.client.gui.Element; import net.minecraft.client.gui.ParentElement; @@ -7,7 +8,7 @@ public interface OldParentElementMethods extends ParentElement { @Override - default boolean mouseClicked(double mouseX, double mouseY, int button) { + default boolean mouseClicked(Click click, boolean doubled) { Iterator iter = this.children().iterator(); Element element; @@ -17,10 +18,10 @@ default boolean mouseClicked(double mouseX, double mouseY, int button) { } element = iter.next(); - } while(!element.mouseClicked(mouseX, mouseY, button)); + } while(!element.mouseClicked(click, doubled)); setFocused(element); - if (button == 0) { + if (!doubled) { setDragging(true); } diff --git a/src/main/java/io/github/lgatodu47/screenshot_viewer/screen/manage_screenshots/RenameScreenshotScreen.java b/src/main/java/io/github/lgatodu47/screenshot_viewer/screen/manage_screenshots/RenameScreenshotScreen.java index 905c302..33d3eaa 100644 --- a/src/main/java/io/github/lgatodu47/screenshot_viewer/screen/manage_screenshots/RenameScreenshotScreen.java +++ b/src/main/java/io/github/lgatodu47/screenshot_viewer/screen/manage_screenshots/RenameScreenshotScreen.java @@ -6,6 +6,7 @@ import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.client.gui.widget.TextFieldWidget; +import net.minecraft.client.input.KeyInput; import net.minecraft.client.util.InputUtil; import net.minecraft.screen.ScreenTexts; @@ -50,12 +51,12 @@ public void render(DrawContext context, int mouseX, int mouseY, float delta) { } @Override - public boolean keyPressed(int keyCode, int scanCode, int modifiers) { - if (keyCode == InputUtil.GLFW_KEY_ENTER && doneBtn != null && doneBtn.active) { - doneBtn.onPress(); + public boolean keyPressed(KeyInput input) { + if (input.key() == InputUtil.GLFW_KEY_ENTER && doneBtn != null && doneBtn.active) { + doneBtn.onPress(input); return true; } - return super.keyPressed(keyCode, scanCode, modifiers); + return super.keyPressed(input); } @Override diff --git a/src/main/java/io/github/lgatodu47/screenshot_viewer/screen/manage_screenshots/ScreenshotImageHolder.java b/src/main/java/io/github/lgatodu47/screenshot_viewer/screen/manage_screenshots/ScreenshotImageHolder.java index 8c920f4..5c685c3 100644 --- a/src/main/java/io/github/lgatodu47/screenshot_viewer/screen/manage_screenshots/ScreenshotImageHolder.java +++ b/src/main/java/io/github/lgatodu47/screenshot_viewer/screen/manage_screenshots/ScreenshotImageHolder.java @@ -1,6 +1,7 @@ package io.github.lgatodu47.screenshot_viewer.screen.manage_screenshots; import net.minecraft.client.texture.NativeImage; +import net.minecraft.util.Identifier; import org.jetbrains.annotations.Nullable; import java.io.File; @@ -18,7 +19,8 @@ public interface ScreenshotImageHolder { int indexInList(); - int imageId(); + @Nullable + Identifier textureId(); @Nullable NativeImage image(); diff --git a/src/main/java/io/github/lgatodu47/screenshot_viewer/screen/manage_screenshots/ScreenshotList.java b/src/main/java/io/github/lgatodu47/screenshot_viewer/screen/manage_screenshots/ScreenshotList.java index 1e94bee..8dc5019 100644 --- a/src/main/java/io/github/lgatodu47/screenshot_viewer/screen/manage_screenshots/ScreenshotList.java +++ b/src/main/java/io/github/lgatodu47/screenshot_viewer/screen/manage_screenshots/ScreenshotList.java @@ -11,6 +11,7 @@ import net.minecraft.util.math.ColorHelper; import net.minecraft.util.math.MathHelper; import org.lwjgl.glfw.GLFW; +import net.minecraft.client.input.KeyInput; import java.io.File; import java.util.*; @@ -319,26 +320,26 @@ public boolean mouseScrolled(double mouseX, double mouseY, double horizontalAmou private boolean scrollbarClicked; @Override - public boolean mouseClicked(double mouseX, double mouseY, int button) { + public boolean mouseClicked(Click click, boolean doubled) { scrollbarClicked = false; - if(canScroll() && scrollbar.mouseClicked(mouseX, mouseY, button, scrollY)) { + if(canScroll() && scrollbar.mouseClicked(click.x(), click.y(), click.button(), scrollY)) { scrollbarClicked = true; return true; } - return OldParentElementMethods.super.mouseClicked(mouseX, mouseY, button); + return OldParentElementMethods.super.mouseClicked(click, doubled); } @Override - public boolean mouseReleased(double mouseX, double mouseY, int button) { + public boolean mouseReleased(Click click) { scrollbarClicked = false; - return super.mouseReleased(mouseX, mouseY, button); + return super.mouseReleased(click); } @Override - public boolean mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) { + public boolean mouseDragged(Click click, double offsetX, double offsetY) { if(scrollbarClicked && canScroll()) { final int totalHeightOfTheChildrens = getTotalHeightOfChildren(); - int scrollDelta = scrollbar.getScrollOffsetDelta(deltaY, totalHeightOfTheChildrens); + int scrollDelta = scrollbar.getScrollOffsetDelta(offsetY, totalHeightOfTheChildrens); if (scrollY > 0 && scrollDelta > 0) { scrollY = Math.max(0, scrollY - scrollDelta); } @@ -350,12 +351,12 @@ public boolean mouseDragged(double mouseX, double mouseY, int button, double del scrollY = Math.min(leftOver, scrollY - scrollDelta); } } - return super.mouseDragged(mouseX, mouseY, button, deltaX, deltaY); + return super.mouseDragged(click, offsetX, offsetY); } @Override - public boolean keyPressed(int keyCode, int scanCode, int modifiers) { - return screenshotWidgets.stream().anyMatch(widget -> widget.keyPressed(keyCode, scanCode, modifiers)); + public boolean keyPressed(KeyInput input) { + return screenshotWidgets.stream().anyMatch(widget -> widget.keyPressed(input)); } /// Random implementation methods /// diff --git a/src/main/java/io/github/lgatodu47/screenshot_viewer/screen/manage_screenshots/ScreenshotPropertiesMenu.java b/src/main/java/io/github/lgatodu47/screenshot_viewer/screen/manage_screenshots/ScreenshotPropertiesMenu.java index 0e943b4..b82ccba 100644 --- a/src/main/java/io/github/lgatodu47/screenshot_viewer/screen/manage_screenshots/ScreenshotPropertiesMenu.java +++ b/src/main/java/io/github/lgatodu47/screenshot_viewer/screen/manage_screenshots/ScreenshotPropertiesMenu.java @@ -1,6 +1,5 @@ package io.github.lgatodu47.screenshot_viewer.screen.manage_screenshots; -import com.mojang.blaze3d.systems.RenderSystem; import io.github.lgatodu47.screenshot_viewer.ScreenshotViewer; import io.github.lgatodu47.screenshot_viewer.config.ScreenshotViewerOptions; import io.github.lgatodu47.screenshot_viewer.screen.IconButtonWidget; @@ -13,13 +12,15 @@ import net.minecraft.client.gui.Element; import net.minecraft.client.gui.screen.ButtonTextures; import net.minecraft.client.gui.widget.ClickableWidget; -import net.minecraft.client.render.RenderLayer; import net.minecraft.client.util.InputUtil; -import net.minecraft.client.util.math.MatrixStack; import net.minecraft.text.Text; +import net.minecraft.screen.ScreenTexts; import net.minecraft.util.Identifier; import net.minecraft.util.math.ColorHelper; import org.jetbrains.annotations.Nullable; +import net.minecraft.client.gui.Click; +import net.minecraft.client.input.KeyInput; +import net.minecraft.client.gl.RenderPipelines; import java.util.ArrayList; import java.util.List; @@ -100,44 +101,26 @@ boolean renders() { @Override public void render(DrawContext context, int mouseX, int mouseY, float delta) { if (shouldRender) { - MatrixStack matrices = context.getMatrices(); - matrices.push(); - matrices.translate(0, 0, 1); final int spacing = 2; //corners - context.drawTexture(RenderLayer::getGuiTextured, BACKGROUND_TEXTURE, x, y, 0, 0, - 2, 2, 8, 8); - context.drawTexture(RenderLayer::getGuiTextured, BACKGROUND_TEXTURE, x+width-2, y, 6, 0, - 2, 2, 8, 8); - context.drawTexture(RenderLayer::getGuiTextured, BACKGROUND_TEXTURE, x, y+height-2, 0, 6, - 2, 2, 8, 8); - context.drawTexture(RenderLayer::getGuiTextured, BACKGROUND_TEXTURE, x+width-2, y+height-2, 6, 6, - 2, 2, 8, 8); + context.drawTexture(RenderPipelines.GUI_TEXTURED, BACKGROUND_TEXTURE, x, y, 2, 2, 0, 0, 2, 2, 8, 8); + context.drawTexture(RenderPipelines.GUI_TEXTURED, BACKGROUND_TEXTURE, x+width-2, y, 2, 2, 6, 0, 2, 2, 8, 8); + context.drawTexture(RenderPipelines.GUI_TEXTURED, BACKGROUND_TEXTURE, x, y+height-2, 2, 2, 0, 6, 2, 2, 8, 8); + context.drawTexture(RenderPipelines.GUI_TEXTURED, BACKGROUND_TEXTURE, x+width-2, y+height-2, 2, 2, 6, 6, 2, 2, 8, 8); //sides - context.drawTexture(RenderLayer::getGuiTextured, BACKGROUND_TEXTURE, x+2, y, (float) (width * 3) /2, 0, - width-4, 2, width*4, 8); - context.drawTexture(RenderLayer::getGuiTextured, BACKGROUND_TEXTURE, x, y+2, 0, (float) (height * 3) /2, - 2, height-4, 8, height*4); - context.drawTexture(RenderLayer::getGuiTextured, BACKGROUND_TEXTURE, x+2, y+height-2, (float) (width * 3) /2, 6, - width-4, 2, width*4, 8); - context.drawTexture(RenderLayer::getGuiTextured, BACKGROUND_TEXTURE, x+width-2, y+2, 6, (float) (height * 3) /2, - 2, height-4, 8, height*4); + context.drawTexture(RenderPipelines.GUI_TEXTURED, BACKGROUND_TEXTURE, x+2, y, width-4, 2, 3, 0, 2, 2, 8, 8); + context.drawTexture(RenderPipelines.GUI_TEXTURED, BACKGROUND_TEXTURE, x, y+2, 2, height-4, 0, 3, 2, 2, 8, 8); + context.drawTexture(RenderPipelines.GUI_TEXTURED, BACKGROUND_TEXTURE, x+2, y+height-2, width-4, 2, 3, 6, 2, 2, 8, 8); + context.drawTexture(RenderPipelines.GUI_TEXTURED, BACKGROUND_TEXTURE, x+width-2, y+2, 2, height-4, 6, 3, 2, 2, 8, 8); //center - context.drawTexture(RenderLayer::getGuiTextured, BACKGROUND_TEXTURE, x+2, y+2, - (float) (width * 3) /2, (float) (height * 3) /2, - width-4, height-4, - width*4, height*4); + context.drawTexture(RenderPipelines.GUI_TEXTURED, BACKGROUND_TEXTURE, x+2, y+2, width-4, height-4, 3, 3, 2, 2, 8, 8); context.drawTextWithShadow(mcSupplier.get().textRenderer, targetScreenshot.getScreenshotFile().getName(), x + spacing, y + spacing, 0xFFFFFFFF); for (ClickableWidget widget : buttons) { widget.render(context, mouseX, mouseY, delta); - matrices.push(); - matrices.translate(0, 0, 1); context.drawTextWithShadow(mcSupplier.get().textRenderer, widget.getMessage(), widget.getX() + BUTTON_SIZE + spacing, (int) (widget.getY() + (widget.getHeight() - 9) / 2.f + spacing), 0xFFFFFFFF); - matrices.pop(); } - matrices.pop(); } } @@ -147,21 +130,21 @@ public List children() { } @Override - public boolean mouseClicked(double mouseX, double mouseY, int button) { - if (mouseX < x || mouseY < y || mouseX > x + width || mouseY > y + height) { + public boolean mouseClicked(Click click, boolean doubled) { + if (click.x() < x || click.y() < y || click.x() > x + width || click.y() > y + height) { hide(); return false; } - return super.mouseClicked(mouseX, mouseY, button); + return super.mouseClicked(click, doubled); } @Override - public boolean keyPressed(int keyCode, int scanCode, int modifiers) { - if (keyCode == InputUtil.GLFW_KEY_ESCAPE) { + public boolean keyPressed(KeyInput input) { + if (input.key() == InputUtil.GLFW_KEY_ESCAPE) { hide(); return true; } - return super.keyPressed(keyCode, scanCode, modifiers); + return super.keyPressed(input); } private static final class Button extends IconButtonWidget { @@ -178,7 +161,7 @@ private static final class Button extends IconButtonWidget { private boolean renderWide = ManageScreenshotsScreen.CONFIG.getOrFallback(ScreenshotViewerOptions.RENDER_WIDE_PROPERTIES_BUTTON, true); - public Button(Identifier texture, Text title, PressAction pressAction) { + public Button(Identifier texture, net.minecraft.text.Text title, PressAction pressAction) { super(0, 0, BUTTON_SIZE, BUTTON_SIZE, title, texture, pressAction); } @@ -190,20 +173,16 @@ public void setDimensionsAndPosition(int width, int height, int x, int y) { } @Override - protected void renderWidget(DrawContext context, int mouseX, int mouseY, float delta) { - RenderSystem.enableBlend(); - RenderSystem.enableDepthTest(); - Identifier backgroundTexture = getBackgroundTexture().get(this.active, isSelected()); - if (renderWide) { - context.drawTexture(RenderLayer::getGuiTextured, backgroundTexture, getX(), getY(), 0, 0, 1, getHeight(), BUTTON_SIZE, BUTTON_SIZE, ColorHelper.getWhite(this.alpha)); - context.drawTexture(RenderLayer::getGuiTextured, backgroundTexture, getX() + 1, getY(), 1, 0, getWidth() - 2, getHeight(), BUTTON_SIZE - 2, BUTTON_SIZE, BUTTON_SIZE, BUTTON_SIZE, ColorHelper.getWhite(this.alpha)); - context.drawTexture(RenderLayer::getGuiTextured, backgroundTexture, getX() + getWidth() - 1, getY(), 18, 0, 1, getHeight(), BUTTON_SIZE, BUTTON_SIZE, ColorHelper.getWhite(this.alpha)); - } else { - context.drawGuiTexture(RenderLayer::getGuiTextured, backgroundTexture, getX(), getY(), BUTTON_SIZE, getHeight(), ColorHelper.getWhite(this.alpha)); - } + public net.minecraft.text.Text getMessage() { + return renderWide ? super.getMessage() : ScreenTexts.EMPTY; + } + + @Override + protected void drawIcon(DrawContext context, int mouseX, int mouseY, float deltaTicks) { + this.drawButton(context); Identifier icon = getIconTexture(); - if(icon != null) { - context.drawGuiTexture(RenderLayer::getGuiTextured, icon, getX(), getY(), BUTTON_SIZE, getHeight(), ColorHelper.getWhite(this.alpha)); + if (icon != null) { + context.drawGuiTexture(RenderPipelines.GUI_TEXTURED, icon, getX(), getY(), BUTTON_SIZE, getHeight(), ColorHelper.getWhite(this.alpha)); } } diff --git a/src/main/java/io/github/lgatodu47/screenshot_viewer/screen/manage_screenshots/ScreenshotWidget.java b/src/main/java/io/github/lgatodu47/screenshot_viewer/screen/manage_screenshots/ScreenshotWidget.java index f3ebf32..feeb8a2 100644 --- a/src/main/java/io/github/lgatodu47/screenshot_viewer/screen/manage_screenshots/ScreenshotWidget.java +++ b/src/main/java/io/github/lgatodu47/screenshot_viewer/screen/manage_screenshots/ScreenshotWidget.java @@ -1,6 +1,5 @@ package io.github.lgatodu47.screenshot_viewer.screen.manage_screenshots; -import com.mojang.blaze3d.systems.RenderSystem; import io.github.lgatodu47.screenshot_viewer.ScreenshotViewer; import io.github.lgatodu47.screenshot_viewer.ScreenshotViewerUtils; import io.github.lgatodu47.screenshot_viewer.config.ScreenshotViewerOptions; @@ -8,22 +7,25 @@ import io.github.lgatodu47.screenshot_viewer.screen.ScreenshotViewerTexts; import it.unimi.dsi.fastutil.booleans.BooleanConsumer; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gl.ShaderProgramKeys; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder; -import net.minecraft.client.gui.tooltip.TooltipComponent; +import net.minecraft.client.gui.tooltip.Tooltip; import net.minecraft.client.gui.widget.ClickableWidget; import net.minecraft.client.texture.NativeImage; import net.minecraft.client.texture.NativeImageBackedTexture; import net.minecraft.client.util.InputUtil; -import net.minecraft.client.util.math.MatrixStack; +import org.joml.Matrix3x2fStack; import net.minecraft.text.Text; import net.minecraft.text.TextColor; +import net.minecraft.text.OrderedText; import net.minecraft.util.Formatting; +import net.minecraft.util.Identifier; import net.minecraft.util.Util; import net.minecraft.util.math.ColorHelper; import org.jetbrains.annotations.Nullable; import org.lwjgl.glfw.GLFW; +import net.minecraft.client.gui.Click; +import net.minecraft.client.input.KeyInput; import java.io.*; import java.nio.file.Files; @@ -42,7 +44,7 @@ final class ScreenshotWidget extends ClickableWidget implements AutoCloseable, S private float backgroundOpacityPercentage; private int textColor; private boolean renderTextShadow, promptOnDelete; - private List hintTooltip; + private List hintTooltip; private final ImageLoader screenshotImage = new ImageLoader("screenshot"); private final ImageLoader thumbnailImage = new ImageLoader("thumbnail"); @@ -86,7 +88,7 @@ void onConfigUpdate() { this.textColor = CONFIG.get(ScreenshotViewerOptions.SCREENSHOT_ELEMENT_TEXT_COLOR).map(TextColor::getRgb).orElse(0xFFFFFF); this.renderTextShadow = CONFIG.getOrFallback(ScreenshotViewerOptions.RENDER_SCREENSHOT_ELEMENT_FONT_SHADOW, true); this.promptOnDelete = CONFIG.getOrFallback(ScreenshotViewerOptions.PROMPT_WHEN_DELETING_SCREENSHOT, true); - this.hintTooltip = CONFIG.getOrFallback(ScreenshotViewerOptions.DISPLAY_HINT_TOOLTIP, false) ? ScreenshotViewerUtils.toColoredComponents(client, ScreenshotViewerTexts.translatable("tooltip", "menu_hint").formatted(Formatting.GRAY)) : List.of(); + this.hintTooltip = CONFIG.getOrFallback(ScreenshotViewerOptions.DISPLAY_HINT_TOOLTIP, false) ? Tooltip.wrapLines(client, ScreenshotViewerTexts.translatable("tooltip", "menu_hint").formatted(Formatting.GRAY)) : List.of(); } void updateHoverState(int mouseX, int mouseY, int viewportY, int viewportBottom, boolean updateHoverState) { @@ -108,62 +110,57 @@ void render(DrawContext context, int mouseX, int mouseY, float partialTick, int renderBackground(context, viewportY, viewportBottom); final int spacing = 2; - NativeImageBackedTexture image = thumbnailTexture(); - if (image != null && image.getImage() != null) { - RenderSystem.setShader(ShaderProgramKeys.POSITION_TEX); - RenderSystem.setShaderColor(1, 1, 1, 1); - RenderSystem.setShaderTexture(0, image.getGlId()); - RenderSystem.enableBlend(); - RenderSystem.enableDepthTest(); - RenderSystem.depthFunc(515); + NativeImage image = thumbnailImage.image(); + if (image == null) { + image = screenshotImage.image(); + } + if (image != null) { int renderY = Math.max(getY() + spacing, viewportY); int imgHeight = (int) (height / (VisibilityState.HIDDEN.equals(textVisibility) ? 1 : 1.08) - spacing * 3); int topOffset = Math.max(0, viewportY - getY() - spacing); int bottomOffset = Math.max(0, getY() + spacing + imgHeight - viewportBottom); - int topV = topOffset * image.getImage().getHeight() / imgHeight; - int bottomV = bottomOffset * image.getImage().getHeight() / imgHeight; - - context.getMatrices().translate(0, 0, 1); - ScreenshotViewerUtils.drawTexture( - context, - getX() + spacing, - renderY, - width - spacing * 2, - imgHeight - topOffset - bottomOffset, - 0, - topV, - image.getImage().getWidth(), - image.getImage().getHeight() - topV - bottomV, - image.getImage().getWidth(), - image.getImage().getHeight() - ); + int topV = topOffset * image.getHeight() / imgHeight; + int bottomV = bottomOffset * image.getHeight() / imgHeight; + + Identifier texture = thumbnailTextureId(); + if (texture != null) { + ScreenshotViewerUtils.drawTexture( + context, + texture, + getX() + spacing, + renderY, + width - spacing * 2, + imgHeight - topOffset - bottomOffset, + 0, + topV, + image.getWidth(), + image.getHeight() - topV - bottomV, + image.getWidth(), + image.getHeight() + ); + } if(mainScreen.isFastDeleteToggled() && selectedForDeletion) { context.fill(getX() + spacing, renderY, getX() + width - spacing, renderY + imgHeight - topOffset - bottomOffset, 0x50FF0000); } - context.getMatrices().translate(0, 0, -1); - RenderSystem.disableDepthTest(); - RenderSystem.disableBlend(); } if(VisibilityState.VISIBLE.equals(textVisibility) || VisibilityState.SHOW_ON_HOVER.equals(textVisibility) && hovered) { float scaleFactor = (float) (client.getWindow().getScaledHeight() / 96) / ctx.screenshotsPerRow(); int textY = getY() + (int) (height / 1.08) - spacing; if (textY > viewportY && (float) textY + scaleFactor * (client.textRenderer.fontHeight) < viewportBottom) { - MatrixStack matrices = context.getMatrices(); - matrices.push(); - matrices.translate(getX() + width / 2f, textY, 0); - matrices.scale(scaleFactor, scaleFactor, scaleFactor); + Matrix3x2fStack matrices = context.getMatrices(); + matrices.pushMatrix(); + matrices.translate(getX() + width / 2f, (float)textY); + matrices.scale(scaleFactor, scaleFactor); Text message = getMessage(); float centerX = (float) (-client.textRenderer.getWidth(getMessage()) / 2); context.drawText(client.textRenderer, message, (int) centerX, 0, textColor, renderTextShadow); - matrices.pop(); + matrices.popMatrix(); } } if(!mainScreen.isFastDeleteToggled() && !hintTooltip.isEmpty() && hoverTime > 20) { - RenderSystem.setShaderColor(1, 1, 1, Math.min(hoverTime - 20, 10) / 10 * 0.7f); ScreenshotViewerUtils.renderTooltip(context, client.textRenderer, hintTooltip, mouseX, mouseY); - RenderSystem.setShaderColor(1, 1, 1, 1); } } @@ -202,12 +199,12 @@ private void updateScreenshotFile(File screenshotFile) { } @Nullable - public NativeImageBackedTexture thumbnailTexture() { + private Identifier thumbnailTextureId() { if(!thumbnailImage.file.isDone()) { - return screenshotImage.texture(); + return screenshotImage.textureId(); } - NativeImageBackedTexture texture = thumbnailImage.texture(); - return texture == null ? screenshotImage.texture() : texture; + Identifier texture = thumbnailImage.textureId(); + return texture == null ? screenshotImage.textureId() : texture; } /// ScreenshotImageHolder implementations /// @@ -263,9 +260,8 @@ public int indexInList() { } @Override - public int imageId() { - NativeImageBackedTexture texture = screenshotImage.texture(); - return texture != null ? texture.getGlId() : 0; + public @Nullable Identifier textureId() { + return screenshotImage.textureId(); } @Nullable @@ -277,12 +273,12 @@ public NativeImage image() { /// Common Widget implementations /// @Override - public boolean keyPressed(int keyCode, int scanCode, int modifiers) { - if(hovered && keyCode == InputUtil.GLFW_KEY_C && (modifiers & GLFW.GLFW_MOD_CONTROL) != 0) { + public boolean keyPressed(KeyInput input) { + if(hovered && input.key() == InputUtil.GLFW_KEY_C && (input.modifiers() & GLFW.GLFW_MOD_CONTROL) != 0) { this.copyScreenshot(); return true; } - return super.keyPressed(keyCode, scanCode, modifiers); + return super.keyPressed(input); } @Override @@ -291,14 +287,14 @@ public Text getMessage() { } @Override - public boolean mouseClicked(double mouseX, double mouseY, int button) { + public boolean mouseClicked(Click click, boolean doubled) { if (isHovered()) { playDownSound(this.client.getSoundManager()); - if (button == GLFW.GLFW_MOUSE_BUTTON_LEFT) { + if (click.button() == GLFW.GLFW_MOUSE_BUTTON_LEFT) { onClick(); } - if (button == GLFW.GLFW_MOUSE_BUTTON_RIGHT) { - onRightClick(mouseX, mouseY); + if (click.button() == GLFW.GLFW_MOUSE_BUTTON_RIGHT) { + onRightClick(click.x(), click.y()); } return true; } @@ -333,7 +329,7 @@ class ImageLoader implements AutoCloseable { private CompletableFuture file = new CompletableFuture<>(); private CompletableFuture image; @Nullable - private NativeImageBackedTexture texture; + private Identifier textureId; ImageLoader(String imageType) { this.imageType = imageType; @@ -349,8 +345,9 @@ public void setImage(CompletableFuture file) { this.file.cancel(true); } this.file = file; - if (texture != null) { - texture.close(); + if (textureId != null) { + client.getTextureManager().destroyTexture(textureId); + textureId = null; } else if (image != null) { image.thenAcceptAsync(image -> { if (image != null) { @@ -358,7 +355,6 @@ public void setImage(CompletableFuture file) { } }, client); } - texture = null; image = getImage(); } @@ -386,16 +382,20 @@ private CompletableFuture getImage() { } @Nullable - public NativeImageBackedTexture texture() { - if (texture != null) { - return texture; + public Identifier textureId() { + if (textureId != null) { + return textureId; } if (image == null) { image = getImage(); } NativeImage nativeImage; if (image.isDone() && (nativeImage = image.join()) != null) { - return texture = new NativeImageBackedTexture(nativeImage); + File f = file.getNow(null); + int hash = f != null ? java.util.Objects.hash(f.getAbsolutePath(), f.lastModified(), f.length()) : System.identityHashCode(nativeImage); + textureId = Identifier.of(ScreenshotViewer.MODID, "dynamic/" + imageType.toLowerCase() + "/" + Integer.toHexString(hash)); + client.getTextureManager().registerTexture(textureId, new NativeImageBackedTexture(textureId::toString, nativeImage)); + return textureId; } return null; } @@ -410,8 +410,9 @@ public NativeImage image() { @Override public void close() { - if (texture != null) { - texture.close(); // Also closes the image + if (textureId != null) { + client.getTextureManager().destroyTexture(textureId); + textureId = null; } else if(image != null) { image.thenAcceptAsync(image -> { if (image != null) { @@ -420,7 +421,6 @@ public void close() { }, client); } image = null; - texture = null; } } } diff --git a/src/main/resources/assets/screenshot_viewer/lang/zh_cn.json b/src/main/resources/assets/screenshot_viewer/lang/zh_cn.json index 6f4bb6f..7bbfa93 100644 --- a/src/main/resources/assets/screenshot_viewer/lang/zh_cn.json +++ b/src/main/resources/assets/screenshot_viewer/lang/zh_cn.json @@ -1,44 +1,78 @@ { - "screen.screenshot_viewer.manage_screenshots": "管理屏幕截图...", + "screen.screenshot_viewer.manage_screenshots": "管理截图...", "screen.screenshot_viewer.screenshot_manager.zoom": "缩放模式 (按住 CTRL)", - "screen.screenshot_viewer.screenshot_manager.no_screenshots": "你似乎还没有截过图!", - "screen.screenshot_viewer.button.refresh": "刷新屏幕截图", + "screen.screenshot_viewer.screenshot_manager.fast_delete": "快捷删除模式", + "screen.screenshot_viewer.screenshot_manager.no_screenshots": "你似乎还没有在游戏中截过图!", + "screen.screenshot_viewer.screenshot_manager.delete_n_screenshots": "删除 %d 张截图", + "screen.screenshot_viewer.button.refresh": "刷新截图 (F5)", "screen.screenshot_viewer.button.config": "配置...", "screen.screenshot_viewer.button.order": "排序方式", "screen.screenshot_viewer.button.order.ascending": "升序排列", "screen.screenshot_viewer.button.order.descending": "降序排列", - "screen.screenshot_viewer.button.screenshot_folder": "打开屏幕截图文件夹", + "screen.screenshot_viewer.button.screenshot_folder": "打开截图文件夹", + "screen.screenshot_viewer.button.fast_delete": "快捷删除", "screen.screenshot_viewer.button.delete_screenshot": "删除", - "screen.screenshot_viewer.button.open_file": "打开文件", - "screen.screenshot_viewer.button.rename_file": "重命名屏幕截图", + "screen.screenshot_viewer.button.open_file": "打开", + "screen.screenshot_viewer.button.rename_file": "重命名", "screen.screenshot_viewer.button.close_properties_menu": "关闭", - "screen.screenshot_viewer.button.copy_screenshot": "复制图片", + "screen.screenshot_viewer.button.copy_screenshot": "复制", "screen.screenshot_viewer.delete_prompt": "删除 '%s'", - "screen.screenshot_viewer.delete_prompt.message": "你确定要删除此屏幕截图吗?", - "screen.screenshot_viewer.rename_screenshot": "为屏幕截图设置新名称:", - "screen.screenshot_viewer.field.screenshot_name": "设置新屏幕截图名称", - - "screen.screenshot_viewer.config": "屏幕截图浏览器配置", - "config.screenshot_viewer.show_button_in_game_pause_menu": "在暂停页面显示按钮", - "config.screenshot_viewer.show_button_in_game_pause_menu.desc": "在暂停页面显示一个直接查看屏幕截图的按钮.", - "config.screenshot_viewer.show_button_on_title_screen": "在标题页面显示按钮", - "config.screenshot_viewer.show_button_on_title_screen.desc": "在标题页面显示一个直接查看屏幕截图的按钮.", - "config.screenshot_viewer.enable_screenshot_enlargement_animation": "启用屏幕截图放大动画", - "config.screenshot_viewer.enable_screenshot_enlargement_animation.desc": "设置是否在查看屏幕截图播放放大动画.", + "screen.screenshot_viewer.delete_prompt.message": "确定删除此截图?", + "screen.screenshot_viewer.delete_n_screenshots.message": "确定要删除这些截图吗? (无法找回)", + "screen.screenshot_viewer.rename_screenshot": "为截图文件设置新名称:", + "screen.screenshot_viewer.field.screenshot_name": "新名称", + "screen.screenshot_viewer.button_placement.edit": "编辑位置", + "screen.screenshot_viewer.button_placement.movement": "右键点击将小部件移动到鼠标位置", + "screen.screenshot_viewer.button_placement.confirm": "按「ENTER」键确认, 「ESCAPE」键取消, 「R」键重置。", + "tooltip.screenshot_viewer.redirect_to_screenshot_manager": "在截图管理器中打开截图...", + "tooltip.screenshot_viewer.menu_hint": "点击右键进行管理 \n按 Ctrl-C 复制到剪贴板", + "screen.screenshot_viewer.config": "截图管理器配置", + "config.screenshot_viewer.show_button_in_game_pause_menu": "在游戏暂停菜单中显示按钮", + "config.screenshot_viewer.show_button_in_game_pause_menu.desc": "在暂停菜单显示一个打开截图管理界面的按钮", + "config.screenshot_viewer.pause_menu_button_position": "暂停菜单按钮位置", + "config.screenshot_viewer.pause_menu_button_position.desc": "暂停菜单中截图管理按钮的位置", + "config.screenshot_viewer.show_button_on_title_screen": "在启动页面显示按钮", + "config.screenshot_viewer.show_button_on_title_screen.desc": "在游戏启动页面显示一个打开截图管理界面的按钮", + "config.screenshot_viewer.title_screen_button_position": "标题画面按钮位置", + "config.screenshot_viewer.title_screen_button_position.desc": "标题画面中截图管理按钮的位置", + "config.screenshot_viewer.enable_screenshot_enlargement_animation": "启用放大截图过渡动画", + "config.screenshot_viewer.enable_screenshot_enlargement_animation.desc": "点击放大截图时, 是否显示过渡动画", "config.screenshot_viewer.prompt_when_deleting_screenshot": "在删除截图时显示提示", - "config.screenshot_viewer.prompt_when_deleting_screenshot.desc": "在尝试删除截图文件时通过确认页面显示警告.", - "config.screenshot_viewer.initial_screenshot_amount_per_row": "每行默认屏幕截图数量", - "config.screenshot_viewer.initial_screenshot_amount_per_row.desc": "设置打开屏幕截图浏览页面时默认每行显示的屏幕截图数量(值应为 2 ~ 8).", - "config.screenshot_viewer.screen_scroll_speed": "滑动速度", - "config.screenshot_viewer.screen_scroll_speed.desc": "设置页面的滑动速度(值应为 1 ~ 50).", - "config.screenshot_viewer.screenshot_element_background_opacity": "屏幕截图组件背景透明度", - "config.screenshot_viewer.screenshot_element_background_opacity.desc": "设置屏幕截图悬浮显示时背景的透明度(值应为 0 ~ 100).", - "config.screenshot_viewer.render_screenshot_element_font_shadow": "渲染屏幕截图组件字体阴影", - "config.screenshot_viewer.render_screenshot_element_font_shadow.desc": "设置是否在屏幕截图组件文字下方渲染阴影.", - "config.screenshot_viewer.screenshot_element_text_color": "屏幕截图组件字体颜色", - "config.screenshot_viewer.screenshot_element_text_color.desc": "设置屏幕截图组件的颜色.", - "config.screenshot_viewer.default_list_order": "默认屏幕截图排序方式", - "config.screenshot_viewer.default_list_order.desc": "设置打开浏览页面时屏幕截图的默认排序方式.", - - "key.screenshot_viewer.open_screenshots_screen": "打开屏幕截图浏览器" -} + "config.screenshot_viewer.prompt_when_deleting_screenshot.desc": "在尝试删除截图文件时显示确认删除对话框", + "config.screenshot_viewer.initial_screenshot_amount_per_row": "每行默认截图数量", + "config.screenshot_viewer.initial_screenshot_amount_per_row.desc": "打开截图管理页面时, 每行默认显示的截图数量 (范围 2 ~ 8)", + "config.screenshot_viewer.screen_scroll_speed": "滚动速度", + "config.screenshot_viewer.screen_scroll_speed.desc": "截图管理页面中翻页滚动的速度(范围 1 ~ 50)", + "config.screenshot_viewer.screenshot_element_background_opacity": "截图组件背景透明度", + "config.screenshot_viewer.screenshot_element_background_opacity.desc": "鼠标悬停在截图组件上时的背景透明度(范围 0 ~ 100)", + "config.screenshot_viewer.render_screenshot_element_font_shadow": "渲染截图组件字体阴影", + "config.screenshot_viewer.render_screenshot_element_font_shadow.desc": "设置是否在截图组件中的文字下方渲染阴影", + "config.screenshot_viewer.screenshot_element_text_color": "截图组件字体颜色", + "config.screenshot_viewer.screenshot_element_text_color.desc": "设置截图描述组件中的文字颜色", + "config.screenshot_viewer.default_list_order": "默认截图排序方式", + "config.screenshot_viewer.default_list_order.desc": "设置打开管理页面时, 截图的默认排序方式", + "config.screenshot_viewer.pause_menu_button_offset": "暂停菜单按钮偏移", + "config.screenshot_viewer.pause_menu_button_offset.desc": "暂停菜单中, 截图管理按钮的位置偏移 (大于等于 0, 单位为像素)", + "config.screenshot_viewer.screenshots_folder": "截图目录", + "config.screenshot_viewer.screenshots_folder.desc": "截图文件的存储路径, 该路径下的图片将被显示在截图管理器中", + "config.screenshot_viewer.redirect_screenshot_chat_links": "点击截图消息预览截图", + "config.screenshot_viewer.redirect_screenshot_chat_links.desc": "启用该选项后, 可以在截图成功时通过鼠标点击聊天中的截图消息快速预览和管理截图", + "config.screenshot_viewer.screenshot_element_text_visibility": "截图名称可见性", + "config.screenshot_viewer.screenshot_element_text_visibility.desc": "截图名称的可见性设置", + "config.screenshot_viewer.invert_zoom_direction": "反转缩放方向", + "config.screenshot_viewer.invert_zoom_direction.desc": "启用该选项将反转截图管理页面的缩放方向", + "config.screenshot_viewer.display_hint_tooltip": "悬停截图时显示模组使用方法", + "config.screenshot_viewer.display_hint_tooltip.desc": "鼠标长时间悬停在截图上时, 是否允许出现显示模组使用方法提示。", + "config.screenshot_viewer.render_wide_properties_button": "显示右键按钮描述文本", + "config.screenshot_viewer.render_wide_properties_button.desc": "截图右键按钮是显示图标+文本还是仅显示图标", + "config.screenshot_viewer.thumbnail_folder": "缩略图文件夹", + "config.screenshot_viewer.thumbnail_folder.desc": "截图缩略图文件的保存路径", + "config.screenshot_viewer.compression_ratio": "压缩比", + "config.screenshot_viewer.compression_ratio.desc": "控制截图缩略图的压缩比, 如果设置为 none, 则不生成任何缩略图。", + "config_category.screenshot_viewer.ingame": "截图管理器 Hooks", + "config_category.screenshot_viewer.ingui": "截图管理器自定义选项", + "config_category.screenshot_viewer.screenshot_thumbnails": "截图缩略图", + "toast.screenshot_viewer.copy_success": "截图复制成功!", + "toast.screenshot_viewer.copy_fail": "截图复制失败: %s", + "key.screenshot_viewer.open_screenshots_screen": "打开截图管理器" +} \ No newline at end of file