Skip to content

Commit b4fddc6

Browse files
chore: sweep sweep
1 parent 0f0a134 commit b4fddc6

File tree

11 files changed

+145
-153
lines changed

11 files changed

+145
-153
lines changed

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ dependencies {
3636

3737
modImplementation("net.fabricmc.fabric-api:fabric-api:${deps.fabricApi}")
3838

39-
implementation ("ca.weblite:java-objc-bridge:1.0.0")
39+
implementation("ca.weblite:java-objc-bridge:1.0.0")
4040
}
4141

4242
tasks.processResources {

src/client/java/dev/spiritstudios/snapper/Snapper.java

Lines changed: 12 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@
22

33
import dev.spiritstudios.snapper.gui.ScreenshotScreen;
44
import dev.spiritstudios.snapper.gui.ScreenshotViewerScreen;
5-
import dev.spiritstudios.snapper.util.ScreenshotImage;
5+
import dev.spiritstudios.snapper.util.*;
66
import net.fabricmc.api.ClientModInitializer;
77
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
88
import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper;
99
import net.fabricmc.loader.api.FabricLoader;
1010
import net.minecraft.client.MinecraftClient;
1111
import net.minecraft.client.option.KeyBinding;
1212
import net.minecraft.text.Text;
13+
import net.minecraft.util.Util;
1314
import org.lwjgl.glfw.GLFW;
1415
import org.slf4j.Logger;
1516
import org.slf4j.LoggerFactory;
@@ -20,7 +21,6 @@
2021
import java.util.*;
2122

2223
public class Snapper implements ClientModInitializer {
23-
private final MinecraftClient client = MinecraftClient.getInstance();
2424
public static final String MODID = "snapper";
2525
public static final Logger LOGGER = LoggerFactory.getLogger(MODID);
2626
public static final boolean IS_IRIS_INSTALLED = FabricLoader.getInstance().isModLoaded("iris");
@@ -61,37 +61,22 @@ public void onInitializeClient() {
6161
client.player.sendMessage(Text.translatable("text.snapper.panorama_success", SCREENSHOT_MENU_KEY.getBoundKeyLocalizedText()), true);
6262
}
6363
while (RECENT_SCREENSHOT_KEY.wasPressed()) {
64+
File latestScreenshot = ScreenshotActions.getScreenshots(client).getFirst();
65+
6466
client.setScreen(new ScreenshotViewerScreen(
65-
ScreenshotImage.of(getLatestScreenshot()),
66-
getLatestScreenshot(),
67+
ScreenshotImage.of(latestScreenshot, client.getTextureManager()),
68+
latestScreenshot,
6769
null
6870
));
6971
}
7072
});
7173
}
7274

73-
private File getLatestScreenshot() {
74-
File screenshotDir = new File(client.runDirectory, "screenshots");
75-
76-
File[] files = screenshotDir.listFiles();
77-
List<File> screenshots = new ArrayList<>(List.of(files == null ? new File[0] : files));
78-
79-
screenshots.removeIf(file -> {
80-
if (Files.isDirectory(file.toPath())) return true;
81-
String fileType;
82-
83-
try {
84-
fileType = Files.probeContentType(file.toPath());
85-
} catch (IOException e) {
86-
Snapper.LOGGER.error("Couldn't load screenshot list", e);
87-
return true;
88-
}
89-
90-
return !Objects.equals(fileType, "image/png");
91-
});
92-
93-
screenshots.sort(Comparator.comparingLong(File::lastModified).reversed());
94-
95-
return screenshots.getFirst();
75+
public static PlatformHelper getPlatformHelper() {
76+
return switch (Util.getOperatingSystem()) {
77+
case WINDOWS -> new WindowsActions();
78+
case OSX -> new MacActions();
79+
default -> new WindowsActions();
80+
};
9681
}
9782
}

src/client/java/dev/spiritstudios/snapper/gui/PanoramaViewerScreen.java

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import dev.spiritstudios.snapper.Snapper;
44
import dev.spiritstudios.snapper.util.ScreenshotImage;
5-
import net.minecraft.client.MinecraftClient;
65
import net.minecraft.client.gui.CubeMapRenderer;
76
import net.minecraft.client.gui.DrawContext;
87
import net.minecraft.client.gui.Element;
@@ -32,14 +31,13 @@ public class PanoramaViewerScreen extends Screen {
3231
protected static final CubeMapRenderer FALLBACK_PANORAMA_RENDERER = new CubeMapRenderer(Identifier.ofVanilla("textures/gui/title/background/panorama"));
3332
protected static final RotatingCubeMapRenderer PANORAMA_RENDERER_CUBE = new RotatingCubeMapRenderer(PANORAMA_RENDERER);
3433
protected static final RotatingCubeMapRenderer FALLBACK_PANORAMA_RENDERER_CUBE = new RotatingCubeMapRenderer(FALLBACK_PANORAMA_RENDERER);
35-
private static final MinecraftClient client = MinecraftClient.getInstance();
3634

3735
private final String title;
36+
private final Screen parent;
3837
private boolean doBackgroundFade = true;
3938
private long backgroundFadeStart;
4039
private boolean loaded;
4140
private float backgroundAlpha;
42-
private final Screen parent;
4341

4442
protected PanoramaViewerScreen(String title, Screen parent) {
4543
super(Text.translatable("menu.snapper.viewermenu"));
@@ -50,13 +48,13 @@ protected PanoramaViewerScreen(String title, Screen parent) {
5048

5149
private void load() {
5250
List<File> panorama = this.loadPanorama();
53-
if (panorama == null) return;
51+
if (panorama == null || client == null) return;
5452

5553
panorama.parallelStream().map(face -> {
56-
ScreenshotImage icon = ScreenshotImage.forPanoramaFace(client.getTextureManager(), face.getName());
54+
ScreenshotImage icon = ScreenshotImage.forPanoramaFace(this.client.getTextureManager(), face.getName());
5755
this.loadIcon(icon, face.getName(), Path.of(face.getPath()));
5856
return icon;
59-
}).toList().forEach(ScreenshotImage::joinLoad);
57+
}).forEach(ScreenshotImage::joinLoad);
6058

6159
this.loaded = true;
6260
}
@@ -76,12 +74,16 @@ private void loadIcon(ScreenshotImage icon, String fileName, Path filePath) {
7674

7775
@Nullable
7876
private List<File> loadPanorama() {
79-
File panoramaDir = new File(client.runDirectory, "screenshots/panorama");
77+
if (client == null) return null;
78+
79+
File panoramaDir = new File(this.client.runDirectory, "screenshots/panorama");
8080
List<File> panoramaFaces;
8181
if (!Files.exists(panoramaDir.toPath())) return null;
8282

8383
File[] faceFiles = panoramaDir.listFiles();
84-
panoramaFaces = new ArrayList<>(List.of(faceFiles == null ? new File[0] : faceFiles));
84+
if (faceFiles == null) return new ArrayList<>();
85+
panoramaFaces = new ArrayList<>(List.of(faceFiles));
86+
8587
panoramaFaces.removeIf(file -> {
8688
if (Files.isDirectory(file.toPath())) return true;
8789
String fileType;
@@ -101,12 +103,15 @@ private List<File> loadPanorama() {
101103

102104
@Override
103105
public void close() {
106+
if (client == null) return;
104107
client.setScreen(this.parent);
105108
}
106109

107110
@SuppressWarnings("ResultOfMethodCallIgnored")
108111
@Override
109112
protected void init() {
113+
if (client == null) return;
114+
110115
File panoramaDirectory = new File(client.runDirectory, "screenshots/panorama");
111116
addDrawableChild(ButtonWidget.builder(Text.translatable("button.snapper.folder"), button -> {
112117
if (!panoramaDirectory.exists()) new File(String.valueOf(panoramaDirectory)).mkdirs();

src/client/java/dev/spiritstudios/snapper/gui/ScreenshotScreen.java

Lines changed: 22 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
import org.lwjgl.glfw.GLFW;
1818

1919
import java.io.File;
20-
import java.io.IOException;
2120

2221
import static dev.spiritstudios.snapper.Snapper.MODID;
2322

@@ -59,38 +58,43 @@ protected void init() {
5958
.build()
6059
);
6160

62-
ButtonWidget doneButton = addDrawableChild(ButtonWidget.builder(ScreenTexts.DONE, button -> this.close())
63-
.width(100)
64-
.build()
61+
ButtonWidget doneButton = addDrawableChild(
62+
ButtonWidget.builder(ScreenTexts.DONE, button -> this.close())
63+
.width(100)
64+
.build()
6565
);
6666

67-
this.deleteButton = addDrawableChild(ButtonWidget.builder(Text.translatable("button.snapper.delete"), button -> {
67+
this.deleteButton = addDrawableChild(
68+
ButtonWidget.builder(Text.translatable("button.snapper.delete"), button -> {
6869
if (selectedScreenshot != null)
6970
ScreenshotActions.deleteScreenshot(selectedScreenshot.screenshot, this);
7071
})
7172
.width(74)
7273
.build()
7374
);
7475

75-
this.openButton = addDrawableChild(ButtonWidget.builder(Text.translatable("button.snapper.open"), button -> {
76+
this.openButton = addDrawableChild(
77+
ButtonWidget.builder(Text.translatable("button.snapper.open"), button -> {
7678
if (selectedScreenshot != null)
7779
Util.getOperatingSystem().open(selectedScreenshot.screenshot);
7880
})
7981
.width(74)
8082
.build()
8183
);
8284

83-
this.renameButton = addDrawableChild(ButtonWidget.builder(Text.translatable("button.snapper.rename"), button -> {
85+
this.renameButton = addDrawableChild(
86+
ButtonWidget.builder(Text.translatable("button.snapper.rename"), button -> {
8487
if (this.selectedScreenshot != null)
8588
client.setScreen(new RenameScreenshotScreen(this.selectedScreenshot.screenshot, this));
8689
})
8790
.width(74)
8891
.build()
8992
);
9093

91-
this.copyButton = addDrawableChild(ButtonWidget.builder(Text.translatable("button.snapper.copy"), button -> {
94+
this.copyButton = addDrawableChild(
95+
ButtonWidget.builder(Text.translatable("button.snapper.copy"), button -> {
9296
if (selectedScreenshot != null)
93-
ScreenshotActions.copyScreenshot(selectedScreenshot.screenshot);
97+
Snapper.getPlatformHelper().copyScreenshot(selectedScreenshot.screenshot);
9498
})
9599
.width(74)
96100
.build()
@@ -126,28 +130,20 @@ protected void init() {
126130
}
127131

128132
public void imageSelected(@Nullable ScreenshotListWidget.ScreenshotEntry screenshot) {
129-
if (screenshot == null) {
130-
this.copyButton.active = false;
131-
this.deleteButton.active = false;
132-
this.openButton.active = false;
133-
this.renameButton.active = false;
134-
this.viewButton.active = false;
135-
this.selectedScreenshot = null;
136-
} else {
137-
this.copyButton.active = true;
138-
this.deleteButton.active = true;
139-
this.openButton.active = true;
140-
this.renameButton.active = true;
141-
this.viewButton.active = true;
142-
this.selectedScreenshot = screenshot;
143-
}
133+
boolean hasScreenshot = screenshot != null;
134+
this.copyButton.active = hasScreenshot;
135+
this.deleteButton.active = hasScreenshot;
136+
this.openButton.active = hasScreenshot;
137+
this.renameButton.active = hasScreenshot;
138+
this.viewButton.active = hasScreenshot;
139+
this.selectedScreenshot = screenshot;
144140
}
145141

146142
@Override
147143
public boolean keyPressed(int keyCode, int scanCode, int modifiers) {
148-
long handle = MinecraftClient.getInstance().getWindow().getHandle();
149144
if (super.keyPressed(keyCode, scanCode, modifiers)) return true;
150145

146+
long handle = MinecraftClient.getInstance().getWindow().getHandle();
151147
if (keyCode == GLFW.GLFW_KEY_F5) {
152148
if (client == null) return false;
153149

@@ -157,7 +153,7 @@ public boolean keyPressed(int keyCode, int scanCode, int modifiers) {
157153

158154
if ((InputUtil.isKeyPressed(handle, GLFW.GLFW_KEY_LEFT_CONTROL) || InputUtil.isKeyPressed(handle, GLFW.GLFW_KEY_RIGHT_CONTROL)) && InputUtil.isKeyPressed(handle, InputUtil.GLFW_KEY_C)) {
159155
if (selectedScreenshot != null) {
160-
ScreenshotActions.copyScreenshot(selectedScreenshot.screenshot);
156+
Snapper.getPlatformHelper().copyScreenshot(selectedScreenshot.screenshot);
161157
return true;
162158
}
163159
}

src/client/java/dev/spiritstudios/snapper/gui/ScreenshotViewerScreen.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ protected void init() {
115115

116116
// COPY SCREENSHOT
117117

118-
ButtonWidget copyButton = addDrawableChild(ButtonWidget.builder(Text.translatable("button.snapper.copy"), button -> ScreenshotActions.copyScreenshot(this.screenshot))
118+
ButtonWidget copyButton = addDrawableChild(ButtonWidget.builder(Text.translatable("button.snapper.copy"), button -> Snapper.getPlatformHelper().copyScreenshot(this.screenshot))
119119
.width(100)
120120
.build()
121121
);

src/client/java/dev/spiritstudios/snapper/gui/widget/ScreenshotListWidget.java

Lines changed: 2 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import dev.spiritstudios.snapper.Snapper;
55
import dev.spiritstudios.snapper.gui.ScreenshotScreen;
66
import dev.spiritstudios.snapper.gui.ScreenshotViewerScreen;
7+
import dev.spiritstudios.snapper.util.ScreenshotActions;
78
import dev.spiritstudios.snapper.util.ScreenshotImage;
89
import net.minecraft.client.MinecraftClient;
910
import net.minecraft.client.gui.DrawContext;
@@ -69,37 +70,12 @@ protected void clearEntries() {
6970

7071
public CompletableFuture<List<ScreenshotEntry>> load(MinecraftClient client) {
7172
return CompletableFuture.supplyAsync(() -> {
72-
List<File> screenshots = this.loadScreenshots();
73+
List<File> screenshots = ScreenshotActions.getScreenshots(client);
7374
List<ScreenshotEntry> entries = new ArrayList<>();
7475
screenshots.parallelStream().forEach(file -> entries.add(new ScreenshotEntry(file, client, parent)));
7576
return entries;
7677
});
7778
}
78-
79-
private List<File> loadScreenshots() {
80-
File screenshotDir = new File(client.runDirectory, "screenshots");
81-
82-
File[] files = screenshotDir.listFiles();
83-
List<File> screenshots = new ArrayList<>(List.of(files == null ? new File[0] : files));
84-
85-
screenshots.removeIf(file -> {
86-
if (Files.isDirectory(file.toPath())) return true;
87-
String fileType;
88-
89-
try {
90-
fileType = Files.probeContentType(file.toPath());
91-
} catch (IOException e) {
92-
Snapper.LOGGER.error("Couldn't load screenshot list", e);
93-
return true;
94-
}
95-
96-
return !Objects.equals(fileType, "image/png");
97-
});
98-
99-
screenshots.sort(Comparator.comparingLong(File::lastModified).reversed());
100-
return screenshots;
101-
}
102-
10379
private void setEntrySelected(@Nullable ScreenshotEntry entry) {
10480
super.setSelected(entry);
10581
ScreenshotScreen parentScreen = (ScreenshotScreen) this.parent;

src/client/java/dev/spiritstudios/snapper/util/ScreenshotActionsMac.java renamed to src/client/java/dev/spiritstudios/snapper/util/MacActions.java

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@
33
import ca.weblite.objc.Client;
44
import ca.weblite.objc.Proxy;
55
import dev.spiritstudios.snapper.Snapper;
6-
import net.minecraft.client.MinecraftClient;
76

8-
public class ScreenshotActionsMac {
7+
import java.io.File;
8+
9+
public class MacActions implements PlatformHelper {
910

1011
/* Screenshot copy logic (ScreenshotActions, ScreenshotActionsMac) heavily inspired by
1112
ScreenshotViewer by LGatodu47. (https://github.com/LGatodu47/ScreenshotViewer).
@@ -61,13 +62,10 @@ of this software and associated documentation files (the "Software"), to deal
6162
SOFTWARE.
6263
*/
6364

64-
public static void copyScreenshotMac(String path) {
65-
if (!MinecraftClient.IS_SYSTEM_MAC) {
66-
return;
67-
}
68-
65+
@Override
66+
public void copyScreenshot(File screenshot) {
6967
Client client = Client.getInstance();
70-
Proxy url = client.sendProxy("NSURL", "fileURLWithPath:", path);
68+
Proxy url = client.sendProxy("NSURL", "fileURLWithPath:", screenshot.getAbsoluteFile());
7169

7270
Proxy image = client.sendProxy("NSImage", "alloc");
7371
image.send("initWithContentsOfURL:", url);
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package dev.spiritstudios.snapper.util;
2+
3+
import java.io.File;
4+
5+
public interface PlatformHelper {
6+
void copyScreenshot(File screenshot);
7+
}

0 commit comments

Comments
 (0)