支持更多格式的版本图标 (#2942)

This commit is contained in:
Glavo 2024-03-21 20:01:21 +08:00 committed by GitHub
parent 1187ae4f04
commit 127938fa38
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 52 additions and 15 deletions

View File

@ -259,8 +259,50 @@ public class HMCLGameRepository extends DefaultGameRepository {
return vs; return vs;
} }
public File getVersionIconFile(String id) { public Optional<File> getVersionIconFile(String id) {
return new File(getVersionRoot(id), "icon.png"); 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) { public Image getVersionIconImage(String id) {
@ -272,9 +314,9 @@ public class HMCLGameRepository extends DefaultGameRepository {
if (iconType == VersionIconType.DEFAULT) { if (iconType == VersionIconType.DEFAULT) {
Version version = getVersion(id).resolve(this); Version version = getVersion(id).resolve(this);
File iconFile = getVersionIconFile(id); Optional<File> iconFile = getVersionIconFile(id);
if (iconFile.exists()) { if (iconFile.isPresent()) {
try (InputStream inputStream = new FileInputStream(iconFile)) { try (InputStream inputStream = new FileInputStream(iconFile.get())) {
return new Image(inputStream); return new Image(inputStream);
} catch (IOException e) { } catch (IOException e) {
LOG.log(Level.WARNING, "Failed to load version icon of " + id, e); LOG.log(Level.WARNING, "Failed to load version icon of " + id, e);

View File

@ -32,7 +32,6 @@ import org.jackhuang.hmcl.ui.SVG;
import org.jackhuang.hmcl.ui.construct.DialogPane; import org.jackhuang.hmcl.ui.construct.DialogPane;
import org.jackhuang.hmcl.ui.construct.RipplerContainer; import org.jackhuang.hmcl.ui.construct.RipplerContainer;
import org.jackhuang.hmcl.util.Logging; import org.jackhuang.hmcl.util.Logging;
import org.jackhuang.hmcl.util.io.FileUtils;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
@ -74,20 +73,19 @@ public class VersionIconDialog extends DialogPane {
private void exploreIcon() { private void exploreIcon() {
FileChooser chooser = new FileChooser(); 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()); File selectedFile = chooser.showOpenDialog(Controllers.getStage());
if (selectedFile != null) { if (selectedFile != null) {
File iconFile = profile.getRepository().getVersionIconFile(versionId);
try { try {
FileUtils.copyFile(selectedFile, iconFile); profile.getRepository().setVersionIconFile(versionId, selectedFile);
if (vs != null) { if (vs != null) {
vs.setVersionIcon(VersionIconType.DEFAULT); vs.setVersionIcon(VersionIconType.DEFAULT);
} }
onAccept(); onAccept();
} catch (IOException e) { } catch (IOException | IllegalArgumentException e) {
Logging.LOG.log(Level.SEVERE, "Failed to copy icon file from " + selectedFile + " to " + iconFile, e); Logging.LOG.log(Level.SEVERE, "Failed to set icon file: " + selectedFile, e);
} }
} }
} }

View File

@ -48,7 +48,6 @@ import org.jackhuang.hmcl.util.platform.JavaVersion;
import org.jackhuang.hmcl.util.platform.OperatingSystem; import org.jackhuang.hmcl.util.platform.OperatingSystem;
import org.jackhuang.hmcl.util.versioning.GameVersionNumber; import org.jackhuang.hmcl.util.versioning.GameVersionNumber;
import java.io.File;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.util.Arrays; import java.util.Arrays;
@ -642,9 +641,7 @@ public final class VersionSettingsPage extends StackPane implements DecoratorPag
if (versionId == null) if (versionId == null)
return; return;
File iconFile = profile.getRepository().getVersionIconFile(versionId); profile.getRepository().deleteIconFile(versionId);
if (iconFile.exists())
iconFile.delete();
VersionSetting localVersionSetting = profile.getRepository().getLocalVersionSettingOrCreate(versionId); VersionSetting localVersionSetting = profile.getRepository().getLocalVersionSettingOrCreate(versionId);
if (localVersionSetting != null) { if (localVersionSetting != null) {
localVersionSetting.setVersionIcon(VersionIconType.DEFAULT); localVersionSetting.setVersionIcon(VersionIconType.DEFAULT);