From 19d2e8b52a64dcd0c43ae55420f751d05de98fe0 Mon Sep 17 00:00:00 2001 From: worldwidepixel <58098422+worldwidepixel@users.noreply.github.com> Date: Sun, 15 Sep 2024 20:06:20 -0700 Subject: [PATCH] feat: Copy screenshot when taken (and config!) --- .../java/dev/spiritstudios/snapper/Snapper.java | 6 +++--- .../dev/spiritstudios/snapper/SnapperConfig.java | 15 +++++++++++++++ .../snapper/gui/ScreenshotScreen.java | 12 ++++++++++++ .../snapper/gui/widget/ScreenshotListWidget.java | 1 - .../snapper/mixin/KeyboardMixin.java | 3 +++ .../snapper/mixin/ScreenshotRecorderMixin.java | 4 +++- .../resources/assets/snapper/lang/en_us.json | 5 ++++- .../gui/sprites/screenshots/settings.png | Bin 0 -> 227 bytes 8 files changed, 40 insertions(+), 6 deletions(-) create mode 100644 src/client/java/dev/spiritstudios/snapper/SnapperConfig.java create mode 100644 src/client/resources/assets/snapper/textures/gui/sprites/screenshots/settings.png diff --git a/src/client/java/dev/spiritstudios/snapper/Snapper.java b/src/client/java/dev/spiritstudios/snapper/Snapper.java index aaba5cb..02c95e6 100644 --- a/src/client/java/dev/spiritstudios/snapper/Snapper.java +++ b/src/client/java/dev/spiritstudios/snapper/Snapper.java @@ -3,11 +3,11 @@ import dev.spiritstudios.snapper.gui.ScreenshotScreen; import dev.spiritstudios.snapper.gui.ScreenshotViewerScreen; import dev.spiritstudios.snapper.util.*; +import dev.spiritstudios.specter.api.ModMenuHelper; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; import net.fabricmc.loader.api.FabricLoader; -import net.minecraft.client.MinecraftClient; import net.minecraft.client.option.KeyBinding; import net.minecraft.text.Text; import net.minecraft.util.Util; @@ -16,8 +16,6 @@ import org.slf4j.LoggerFactory; import java.io.File; -import java.io.IOException; -import java.nio.file.Files; import java.util.*; public class Snapper implements ClientModInitializer { @@ -49,6 +47,8 @@ public class Snapper implements ClientModInitializer { @Override public void onInitializeClient() { + ModMenuHelper.addConfig(Snapper.MODID, SnapperConfig.INSTANCE.getId()); + ClientTickEvents.END_CLIENT_TICK.register(client -> { while (SCREENSHOT_MENU_KEY.wasPressed()) client.setScreen(new ScreenshotScreen(null)); while (PANORAMA_KEY.wasPressed()) { diff --git a/src/client/java/dev/spiritstudios/snapper/SnapperConfig.java b/src/client/java/dev/spiritstudios/snapper/SnapperConfig.java new file mode 100644 index 0000000..8605a25 --- /dev/null +++ b/src/client/java/dev/spiritstudios/snapper/SnapperConfig.java @@ -0,0 +1,15 @@ +package dev.spiritstudios.snapper; + +import dev.spiritstudios.specter.api.config.Config; +import net.minecraft.util.Identifier; + +public class SnapperConfig extends Config { + public static final SnapperConfig INSTANCE = create(SnapperConfig.class); + + @Override + public Identifier getId() { return Identifier.of(Snapper.MODID, "snapper"); } + + public Value copyTakenScreenshot = booleanValue(false) + .comment("Whether to copy screenshots to clipboard when taken.") + .build(); +} \ No newline at end of file diff --git a/src/client/java/dev/spiritstudios/snapper/gui/ScreenshotScreen.java b/src/client/java/dev/spiritstudios/snapper/gui/ScreenshotScreen.java index b854914..efc7d1d 100644 --- a/src/client/java/dev/spiritstudios/snapper/gui/ScreenshotScreen.java +++ b/src/client/java/dev/spiritstudios/snapper/gui/ScreenshotScreen.java @@ -1,8 +1,10 @@ package dev.spiritstudios.snapper.gui; import dev.spiritstudios.snapper.Snapper; +import dev.spiritstudios.snapper.SnapperConfig; import dev.spiritstudios.snapper.gui.widget.ScreenshotListWidget; import dev.spiritstudios.snapper.util.ScreenshotActions; +import dev.spiritstudios.specter.impl.config.gui.ConfigScreen; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.Screen; @@ -22,6 +24,7 @@ public class ScreenshotScreen extends Screen { private static final Identifier PANORAMA_BUTTON_ICON = Identifier.of(MODID, "screenshots/panorama"); + private static final Identifier SETTINGS_ICON = Identifier.of(MODID, "screenshots/settings"); private final Screen parent; ScreenshotListWidget screenshotList; private ButtonWidget deleteButton; @@ -116,6 +119,15 @@ protected void init() { verticalButtonLayout.refreshPositions(); SimplePositioningWidget.setPos(verticalButtonLayout, 0, this.height - 66, this.width, 64); + TextIconButtonWidget settings_button = addDrawableChild( + TextIconButtonWidget.builder( + Text.translatable("config.snapper.snapper.title"), + button -> this.client.setScreen(new ConfigScreen(SnapperConfig.INSTANCE, this)), + true + ).width(20).texture(SETTINGS_ICON, 15, 15).build() + ); + settings_button.setPosition(width / 2 - 178, height - 32); + TextIconButtonWidget panorama_button = addDrawableChild( TextIconButtonWidget.builder( Text.translatable("button.snapper.screenshots"), 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 809dfd0..edc7454 100644 --- a/src/client/java/dev/spiritstudios/snapper/gui/widget/ScreenshotListWidget.java +++ b/src/client/java/dev/spiritstudios/snapper/gui/widget/ScreenshotListWidget.java @@ -34,7 +34,6 @@ import java.util.ArrayList; import java.util.Comparator; import java.util.List; -import java.util.Objects; import java.util.concurrent.CompletableFuture; import static dev.spiritstudios.snapper.Snapper.MODID; diff --git a/src/client/java/dev/spiritstudios/snapper/mixin/KeyboardMixin.java b/src/client/java/dev/spiritstudios/snapper/mixin/KeyboardMixin.java index 313491a..66c3541 100644 --- a/src/client/java/dev/spiritstudios/snapper/mixin/KeyboardMixin.java +++ b/src/client/java/dev/spiritstudios/snapper/mixin/KeyboardMixin.java @@ -1,6 +1,7 @@ package dev.spiritstudios.snapper.mixin; import dev.spiritstudios.snapper.Snapper; +import dev.spiritstudios.snapper.SnapperConfig; import net.minecraft.client.Keyboard; import net.minecraft.client.MinecraftClient; import net.minecraft.text.MutableText; @@ -21,6 +22,8 @@ public class KeyboardMixin { @Overwrite private void method_1464(Text text) { MutableText message = Text.translatable("text.snapper.screenshot_instructions", text, Snapper.RECENT_SCREENSHOT_KEY.getBoundKeyLocalizedText()); + MutableText message_copy = Text.translatable("text.snapper.screenshot_instructions_copy", text, Snapper.RECENT_SCREENSHOT_KEY.getBoundKeyLocalizedText()); + if (SnapperConfig.INSTANCE.copyTakenScreenshot.get()) { this.client.inGameHud.setOverlayMessage(message_copy, false); return;} this.client.inGameHud.setOverlayMessage(message, false); } } diff --git a/src/client/java/dev/spiritstudios/snapper/mixin/ScreenshotRecorderMixin.java b/src/client/java/dev/spiritstudios/snapper/mixin/ScreenshotRecorderMixin.java index 437e45d..5f37715 100644 --- a/src/client/java/dev/spiritstudios/snapper/mixin/ScreenshotRecorderMixin.java +++ b/src/client/java/dev/spiritstudios/snapper/mixin/ScreenshotRecorderMixin.java @@ -1,5 +1,7 @@ package dev.spiritstudios.snapper.mixin; +import dev.spiritstudios.snapper.Snapper; +import dev.spiritstudios.snapper.SnapperConfig; import dev.spiritstudios.snapper.mixinsupport.ImageTransferable; import net.minecraft.client.texture.NativeImage; import net.minecraft.client.util.ScreenshotRecorder; @@ -36,7 +38,7 @@ private static void lookBeforeYouLeap(NativeImage nativeImage, File screenshotFi 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 { - if (!screenshotFile.getAbsolutePath().contains("/panorama/")) { + if (!screenshotFile.getAbsolutePath().contains("/panorama/") && SnapperConfig.INSTANCE.copyTakenScreenshot.get()) { Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); clipboard.setContents(new ImageTransferable(ImageIO.read(screenshotFile)), null); } diff --git a/src/client/resources/assets/snapper/lang/en_us.json b/src/client/resources/assets/snapper/lang/en_us.json index c6e8d57..171414e 100644 --- a/src/client/resources/assets/snapper/lang/en_us.json +++ b/src/client/resources/assets/snapper/lang/en_us.json @@ -27,7 +27,10 @@ "text.snapper.rename_invalid": "New name for screenshot invalid", "text.snapper.rename_invalid_png": "Name must end with '.png'", "text.snapper.screenshot_instructions": "%s. View by pressing %s", + "text.snapper.screenshot_instructions_copy": "%s. Automagically copied to clipboard.", "text.snapper.screenshot_failure_open": "Take a screenshot in order to view it", "panorama.snapper.failure": "Couldn't save panorama: %s", - "panorama.snapper.success": "Saved screenshot as %s" + "panorama.snapper.success": "Saved screenshot as %s", + "config.snapper.snapper.title": "Snapper Settings", + "config.snapper.snapper.copyTakenScreenshot": "Copy screenshot to clipboard when taken" } \ No newline at end of file diff --git a/src/client/resources/assets/snapper/textures/gui/sprites/screenshots/settings.png b/src/client/resources/assets/snapper/textures/gui/sprites/screenshots/settings.png new file mode 100644 index 0000000000000000000000000000000000000000..ed7f4ee6817d79037d70b6dfaf4fe59a270fddbc GIT binary patch literal 227 zcmeAS@N?(olHy`uVBq!ia0vp^{2NS%G}c0G|-oKY#vcX=wp@QbpH1ffRE|kYDis{|whp@dDK{a29w(7BevL9RguS zQ4OyKpkRoni(`mHcxW#p-vI><=7s<3x4gZmBUyOr;nm)Mr8as}H#Xev+