diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java index 1d73873b4..41b502af7 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java @@ -259,8 +259,50 @@ public class HMCLGameRepository extends DefaultGameRepository { return vs; } - public File getVersionIconFile(String id) { - return new File(getVersionRoot(id), "icon.png"); + public Optional getVersionIconFile(String id) { + File root = getVersionRoot(id); + + File iconFile = new File(root, "icon.png"); + if (iconFile.exists()) { + return Optional.of(iconFile); + } + + iconFile = new File(root, "icon.jpg"); + if (iconFile.exists()) { + return Optional.of(iconFile); + } + + iconFile = new File(root, "icon.bmp"); + if (iconFile.exists()) { + return Optional.of(iconFile); + } + + iconFile = new File(root, "icon.gif"); + if (iconFile.exists()) { + return Optional.of(iconFile); + } + + return Optional.empty(); + } + + public void setVersionIconFile(String id, File iconFile) throws IOException { + String ext = FileUtils.getExtension(iconFile).toLowerCase(Locale.ROOT); + if (!ext.equals("png") && !ext.equals("jpg") && !ext.equals("bmp") && !ext.equals("gif")) { + throw new IllegalArgumentException("Unsupported icon file: " + ext); + } + + deleteIconFile(id); + + FileUtils.copyFile(iconFile, new File(getVersionRoot(id), "icon." + ext)); + } + + public void deleteIconFile(String id) { + File root = getVersionRoot(id); + + new File(root, "icon.png").delete(); + new File(root, "icon.jpg").delete(); + new File(root, "icon.bmp").delete(); + new File(root, "icon.gif").delete(); } public Image getVersionIconImage(String id) { @@ -272,9 +314,9 @@ public class HMCLGameRepository extends DefaultGameRepository { if (iconType == VersionIconType.DEFAULT) { Version version = getVersion(id).resolve(this); - File iconFile = getVersionIconFile(id); - if (iconFile.exists()) { - try (InputStream inputStream = new FileInputStream(iconFile)) { + Optional iconFile = getVersionIconFile(id); + if (iconFile.isPresent()) { + try (InputStream inputStream = new FileInputStream(iconFile.get())) { return new Image(inputStream); } catch (IOException e) { LOG.log(Level.WARNING, "Failed to load version icon of " + id, e); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionIconDialog.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionIconDialog.java index 1ebe3f53c..4b02955db 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionIconDialog.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionIconDialog.java @@ -32,7 +32,6 @@ import org.jackhuang.hmcl.ui.SVG; import org.jackhuang.hmcl.ui.construct.DialogPane; import org.jackhuang.hmcl.ui.construct.RipplerContainer; import org.jackhuang.hmcl.util.Logging; -import org.jackhuang.hmcl.util.io.FileUtils; import java.io.File; import java.io.IOException; @@ -74,20 +73,19 @@ public class VersionIconDialog extends DialogPane { private void exploreIcon() { FileChooser chooser = new FileChooser(); - chooser.getExtensionFilters().add(new FileChooser.ExtensionFilter(i18n("extension.png"), "*.png")); + chooser.getExtensionFilters().add(new FileChooser.ExtensionFilter(i18n("extension.png"), "*.png", "*.jpg", "*.bmp", "*.gif")); File selectedFile = chooser.showOpenDialog(Controllers.getStage()); if (selectedFile != null) { - File iconFile = profile.getRepository().getVersionIconFile(versionId); try { - FileUtils.copyFile(selectedFile, iconFile); + profile.getRepository().setVersionIconFile(versionId, selectedFile); if (vs != null) { vs.setVersionIcon(VersionIconType.DEFAULT); } onAccept(); - } catch (IOException e) { - Logging.LOG.log(Level.SEVERE, "Failed to copy icon file from " + selectedFile + " to " + iconFile, e); + } catch (IOException | IllegalArgumentException e) { + Logging.LOG.log(Level.SEVERE, "Failed to set icon file: " + selectedFile, e); } } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionSettingsPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionSettingsPage.java index 15c451a4f..92fc0fed4 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionSettingsPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionSettingsPage.java @@ -48,7 +48,6 @@ import org.jackhuang.hmcl.util.platform.JavaVersion; import org.jackhuang.hmcl.util.platform.OperatingSystem; import org.jackhuang.hmcl.util.versioning.GameVersionNumber; -import java.io.File; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Arrays; @@ -642,9 +641,7 @@ public final class VersionSettingsPage extends StackPane implements DecoratorPag if (versionId == null) return; - File iconFile = profile.getRepository().getVersionIconFile(versionId); - if (iconFile.exists()) - iconFile.delete(); + profile.getRepository().deleteIconFile(versionId); VersionSetting localVersionSetting = profile.getRepository().getLocalVersionSettingOrCreate(versionId); if (localVersionSetting != null) { localVersionSetting.setVersionIcon(VersionIconType.DEFAULT);