feat(game): more version icon choices.
This commit is contained in:
@@ -24,12 +24,15 @@ import com.google.gson.reflect.TypeToken;
|
|||||||
import javafx.scene.image.Image;
|
import javafx.scene.image.Image;
|
||||||
import org.jackhuang.hmcl.Metadata;
|
import org.jackhuang.hmcl.Metadata;
|
||||||
import org.jackhuang.hmcl.download.LibraryAnalyzer;
|
import org.jackhuang.hmcl.download.LibraryAnalyzer;
|
||||||
|
import org.jackhuang.hmcl.event.Event;
|
||||||
|
import org.jackhuang.hmcl.event.EventManager;
|
||||||
import org.jackhuang.hmcl.mod.Modpack;
|
import org.jackhuang.hmcl.mod.Modpack;
|
||||||
import org.jackhuang.hmcl.mod.ModpackConfiguration;
|
import org.jackhuang.hmcl.mod.ModpackConfiguration;
|
||||||
import org.jackhuang.hmcl.mod.mcbbs.McbbsModpackLocalInstallTask;
|
import org.jackhuang.hmcl.mod.mcbbs.McbbsModpackLocalInstallTask;
|
||||||
import org.jackhuang.hmcl.mod.mcbbs.McbbsModpackManifest;
|
import org.jackhuang.hmcl.mod.mcbbs.McbbsModpackManifest;
|
||||||
import org.jackhuang.hmcl.setting.Profile;
|
import org.jackhuang.hmcl.setting.Profile;
|
||||||
import org.jackhuang.hmcl.setting.ProxyManager;
|
import org.jackhuang.hmcl.setting.ProxyManager;
|
||||||
|
import org.jackhuang.hmcl.setting.VersionIconType;
|
||||||
import org.jackhuang.hmcl.setting.VersionSetting;
|
import org.jackhuang.hmcl.setting.VersionSetting;
|
||||||
import org.jackhuang.hmcl.util.Lang;
|
import org.jackhuang.hmcl.util.Lang;
|
||||||
import org.jackhuang.hmcl.util.StringUtils;
|
import org.jackhuang.hmcl.util.StringUtils;
|
||||||
@@ -38,6 +41,7 @@ import org.jackhuang.hmcl.util.io.FileUtils;
|
|||||||
import org.jackhuang.hmcl.util.platform.JavaVersion;
|
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.VersionNumber;
|
import org.jackhuang.hmcl.util.versioning.VersionNumber;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@@ -58,6 +62,8 @@ public class HMCLGameRepository extends DefaultGameRepository {
|
|||||||
private final Map<String, VersionSetting> localVersionSettings = new HashMap<>();
|
private final Map<String, VersionSetting> localVersionSettings = new HashMap<>();
|
||||||
private final Set<String> beingModpackVersions = new HashSet<>();
|
private final Set<String> beingModpackVersions = new HashSet<>();
|
||||||
|
|
||||||
|
public final EventManager<Event> onVersionIconChanged = new EventManager<>();
|
||||||
|
|
||||||
public HMCLGameRepository(Profile profile, File baseDirectory) {
|
public HMCLGameRepository(Profile profile, File baseDirectory) {
|
||||||
super(baseDirectory);
|
super(baseDirectory);
|
||||||
this.profile = profile;
|
this.profile = profile;
|
||||||
@@ -231,6 +237,7 @@ public class HMCLGameRepository extends DefaultGameRepository {
|
|||||||
*
|
*
|
||||||
* @return corresponding version setting, null if the version has no its own version setting.
|
* @return corresponding version setting, null if the version has no its own version setting.
|
||||||
*/
|
*/
|
||||||
|
@Nullable
|
||||||
public VersionSetting getLocalVersionSetting(String id) {
|
public VersionSetting getLocalVersionSetting(String id) {
|
||||||
if (!localVersionSettings.containsKey(id))
|
if (!localVersionSettings.containsKey(id))
|
||||||
loadLocalVersionSetting(id);
|
loadLocalVersionSetting(id);
|
||||||
@@ -240,6 +247,15 @@ public class HMCLGameRepository extends DefaultGameRepository {
|
|||||||
return setting;
|
return setting;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public VersionSetting getLocalVersionSettingOrCreate(String id) {
|
||||||
|
VersionSetting vs = getLocalVersionSetting(id);
|
||||||
|
if (vs == null) {
|
||||||
|
vs = createLocalVersionSetting(id);
|
||||||
|
}
|
||||||
|
return vs;
|
||||||
|
}
|
||||||
|
|
||||||
public VersionSetting getVersionSetting(String id) {
|
public VersionSetting getVersionSetting(String id) {
|
||||||
VersionSetting vs = getLocalVersionSetting(id);
|
VersionSetting vs = getLocalVersionSetting(id);
|
||||||
if (vs == null || vs.isUsesGlobal()) {
|
if (vs == null || vs.isUsesGlobal()) {
|
||||||
@@ -258,14 +274,21 @@ public class HMCLGameRepository extends DefaultGameRepository {
|
|||||||
if (id == null || !isLoaded())
|
if (id == null || !isLoaded())
|
||||||
return newImage("/assets/img/grass.png");
|
return newImage("/assets/img/grass.png");
|
||||||
|
|
||||||
Version version = getVersion(id).resolve(this);
|
VersionSetting vs = getLocalVersionSettingOrCreate(id);
|
||||||
File iconFile = getVersionIconFile(id);
|
VersionIconType iconType = Optional.ofNullable(vs).map(VersionSetting::getVersionIcon).orElse(VersionIconType.DEFAULT);
|
||||||
if (iconFile.exists())
|
|
||||||
return new Image("file:" + iconFile.getAbsolutePath());
|
if (iconType == VersionIconType.DEFAULT) {
|
||||||
else if (LibraryAnalyzer.isModded(this, version))
|
Version version = getVersion(id).resolve(this);
|
||||||
return newImage("/assets/img/furnace.png");
|
File iconFile = getVersionIconFile(id);
|
||||||
else
|
if (iconFile.exists())
|
||||||
return newImage("/assets/img/grass.png");
|
return new Image("file:" + iconFile.getAbsolutePath());
|
||||||
|
else if (LibraryAnalyzer.isModded(this, version))
|
||||||
|
return newImage("/assets/img/furnace.png");
|
||||||
|
else
|
||||||
|
return newImage("/assets/img/grass.png");
|
||||||
|
} else {
|
||||||
|
return newImage(iconType.getResourceUrl());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean saveVersionSetting(String id) {
|
public boolean saveVersionSetting(String id) {
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
/*
|
||||||
|
* Hello Minecraft! Launcher
|
||||||
|
* Copyright (C) 2021 huangyuhui <huanghongxun2008@126.com> and contributors
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package org.jackhuang.hmcl.setting;
|
||||||
|
|
||||||
|
public enum VersionIconType {
|
||||||
|
DEFAULT("/assets/img/grass.png"),
|
||||||
|
|
||||||
|
GRASS("/assets/img/grass.png"),
|
||||||
|
CHEST("/assets/img/chest.png"),
|
||||||
|
CHICKEN("/assets/img/chicken.png"),
|
||||||
|
COMMAND("/assets/img/command.png"),
|
||||||
|
CRAFT_TABLE("/assets/img/craft_table.png"),
|
||||||
|
FABRIC("/assets/img/fabric.png"),
|
||||||
|
FORGE("/assets/img/forge.png"),
|
||||||
|
FURNACE("/assets/img/furnace.png");
|
||||||
|
|
||||||
|
// Please append new items at last
|
||||||
|
|
||||||
|
private final String resourceUrl;
|
||||||
|
|
||||||
|
VersionIconType(String resourceUrl) {
|
||||||
|
this.resourceUrl = resourceUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getResourceUrl() {
|
||||||
|
return resourceUrl;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Hello Minecraft! Launcher
|
* Hello Minecraft! Launcher
|
||||||
* Copyright (C) 2020 huangyuhui <huanghongxun2008@126.com> and contributors
|
* Copyright (C) 2021 huangyuhui <huanghongxun2008@126.com> and contributors
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -568,6 +568,20 @@ public final class VersionSetting implements Cloneable {
|
|||||||
this.useNativeOpenAL.set(useNativeOpenAL);
|
this.useNativeOpenAL.set(useNativeOpenAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private final ObjectProperty<VersionIconType> versionIcon = new SimpleObjectProperty<>(this, "versionIcon", VersionIconType.DEFAULT);
|
||||||
|
|
||||||
|
public VersionIconType getVersionIcon() {
|
||||||
|
return versionIcon.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
public ObjectProperty<VersionIconType> versionIconProperty() {
|
||||||
|
return versionIcon;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setVersionIcon(VersionIconType versionIcon) {
|
||||||
|
this.versionIcon.set(versionIcon);
|
||||||
|
}
|
||||||
|
|
||||||
// launcher settings
|
// launcher settings
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -670,6 +684,7 @@ public final class VersionSetting implements Cloneable {
|
|||||||
defaultJavaPathProperty.addListener(listener);
|
defaultJavaPathProperty.addListener(listener);
|
||||||
nativesDirProperty.addListener(listener);
|
nativesDirProperty.addListener(listener);
|
||||||
nativesDirTypeProperty.addListener(listener);
|
nativesDirTypeProperty.addListener(listener);
|
||||||
|
versionIcon.addListener(listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -703,6 +718,7 @@ public final class VersionSetting implements Cloneable {
|
|||||||
versionSetting.setUseNativeOpenAL(isUseNativeOpenAL());
|
versionSetting.setUseNativeOpenAL(isUseNativeOpenAL());
|
||||||
versionSetting.setLauncherVisibility(getLauncherVisibility());
|
versionSetting.setLauncherVisibility(getLauncherVisibility());
|
||||||
versionSetting.setNativesDir(getNativesDir());
|
versionSetting.setNativesDir(getNativesDir());
|
||||||
|
versionSetting.setVersionIcon(getVersionIcon());
|
||||||
return versionSetting;
|
return versionSetting;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -741,6 +757,7 @@ public final class VersionSetting implements Cloneable {
|
|||||||
obj.addProperty("defaultJavaPath", src.getDefaultJavaPath());
|
obj.addProperty("defaultJavaPath", src.getDefaultJavaPath());
|
||||||
obj.addProperty("nativesDir", src.getNativesDir());
|
obj.addProperty("nativesDir", src.getNativesDir());
|
||||||
obj.addProperty("nativesDirType", src.getNativesDirType().ordinal());
|
obj.addProperty("nativesDirType", src.getNativesDirType().ordinal());
|
||||||
|
obj.addProperty("versionIcon", src.getVersionIcon().ordinal());
|
||||||
|
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
@@ -784,6 +801,7 @@ public final class VersionSetting implements Cloneable {
|
|||||||
vs.setGameDirType(GameDirectoryType.values()[Optional.ofNullable(obj.get("gameDirType")).map(JsonElement::getAsInt).orElse(GameDirectoryType.ROOT_FOLDER.ordinal())]);
|
vs.setGameDirType(GameDirectoryType.values()[Optional.ofNullable(obj.get("gameDirType")).map(JsonElement::getAsInt).orElse(GameDirectoryType.ROOT_FOLDER.ordinal())]);
|
||||||
vs.setDefaultJavaPath(Optional.ofNullable(obj.get("defaultJavaPath")).map(JsonElement::getAsString).orElse(null));
|
vs.setDefaultJavaPath(Optional.ofNullable(obj.get("defaultJavaPath")).map(JsonElement::getAsString).orElse(null));
|
||||||
vs.setNativesDirType(NativesDirectoryType.values()[Optional.ofNullable(obj.get("nativesDirType")).map(JsonElement::getAsInt).orElse(0)]);
|
vs.setNativesDirType(NativesDirectoryType.values()[Optional.ofNullable(obj.get("nativesDirType")).map(JsonElement::getAsInt).orElse(0)]);
|
||||||
|
vs.setVersionIcon(VersionIconType.values()[Optional.ofNullable(obj.get("versionIcon")).map(JsonElement::getAsInt).orElse(0)]);
|
||||||
|
|
||||||
return vs;
|
return vs;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,17 +20,25 @@ package org.jackhuang.hmcl.ui.versions;
|
|||||||
import javafx.scene.Node;
|
import javafx.scene.Node;
|
||||||
import javafx.scene.control.Tooltip;
|
import javafx.scene.control.Tooltip;
|
||||||
import javafx.scene.image.ImageView;
|
import javafx.scene.image.ImageView;
|
||||||
|
import org.jackhuang.hmcl.event.Event;
|
||||||
|
import org.jackhuang.hmcl.setting.Profile;
|
||||||
import org.jackhuang.hmcl.setting.Profiles;
|
import org.jackhuang.hmcl.setting.Profiles;
|
||||||
import org.jackhuang.hmcl.ui.FXUtils;
|
import org.jackhuang.hmcl.ui.FXUtils;
|
||||||
|
import org.jackhuang.hmcl.ui.WeakListenerHolder;
|
||||||
import org.jackhuang.hmcl.ui.construct.AdvancedListItem;
|
import org.jackhuang.hmcl.ui.construct.AdvancedListItem;
|
||||||
import org.jackhuang.hmcl.util.Pair;
|
import org.jackhuang.hmcl.util.Pair;
|
||||||
|
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
import static org.jackhuang.hmcl.ui.FXUtils.newImage;
|
import static org.jackhuang.hmcl.ui.FXUtils.newImage;
|
||||||
import static org.jackhuang.hmcl.util.i18n.I18n.i18n;
|
import static org.jackhuang.hmcl.util.i18n.I18n.i18n;
|
||||||
|
|
||||||
public class GameAdvancedListItem extends AdvancedListItem {
|
public class GameAdvancedListItem extends AdvancedListItem {
|
||||||
private final Tooltip tooltip;
|
private final Tooltip tooltip;
|
||||||
private final ImageView imageView;
|
private final ImageView imageView;
|
||||||
|
private final WeakListenerHolder holder = new WeakListenerHolder();
|
||||||
|
private Profile profile;
|
||||||
|
private Consumer<Event> onVersionIconChangedListener;
|
||||||
|
|
||||||
public GameAdvancedListItem() {
|
public GameAdvancedListItem() {
|
||||||
tooltip = new Tooltip();
|
tooltip = new Tooltip();
|
||||||
@@ -39,23 +47,31 @@ public class GameAdvancedListItem extends AdvancedListItem {
|
|||||||
setLeftGraphic(view.getKey());
|
setLeftGraphic(view.getKey());
|
||||||
imageView = view.getValue();
|
imageView = view.getValue();
|
||||||
|
|
||||||
FXUtils.onChangeAndOperate(Profiles.selectedVersionProperty(), version -> {
|
holder.add(FXUtils.onWeakChangeAndOperate(Profiles.selectedVersionProperty(), this::loadVersion));
|
||||||
if (version != null && Profiles.getSelectedProfile() != null &&
|
|
||||||
Profiles.getSelectedProfile().getRepository().hasVersion(version)) {
|
|
||||||
FXUtils.installFastTooltip(this, tooltip);
|
|
||||||
setTitle(version);
|
|
||||||
setSubtitle(null);
|
|
||||||
imageView.setImage(Profiles.getSelectedProfile().getRepository().getVersionIconImage(version));
|
|
||||||
tooltip.setText(version);
|
|
||||||
} else {
|
|
||||||
Tooltip.uninstall(this,tooltip);
|
|
||||||
setTitle(i18n("version.empty"));
|
|
||||||
setSubtitle(i18n("version.empty.add"));
|
|
||||||
imageView.setImage(newImage("/assets/img/grass.png"));
|
|
||||||
tooltip.setText("");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
setActionButtonVisible(false);
|
setActionButtonVisible(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void loadVersion(String version) {
|
||||||
|
if (Profiles.getSelectedProfile() != profile) {
|
||||||
|
profile = Profiles.getSelectedProfile();
|
||||||
|
onVersionIconChangedListener = profile.getRepository().onVersionIconChanged.registerWeak(event -> {
|
||||||
|
this.loadVersion(Profiles.getSelectedVersion());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (version != null && Profiles.getSelectedProfile() != null &&
|
||||||
|
Profiles.getSelectedProfile().getRepository().hasVersion(version)) {
|
||||||
|
FXUtils.installFastTooltip(this, tooltip);
|
||||||
|
setTitle(version);
|
||||||
|
setSubtitle(null);
|
||||||
|
imageView.setImage(Profiles.getSelectedProfile().getRepository().getVersionIconImage(version));
|
||||||
|
tooltip.setText(version);
|
||||||
|
} else {
|
||||||
|
Tooltip.uninstall(this,tooltip);
|
||||||
|
setTitle(i18n("version.empty"));
|
||||||
|
setSubtitle(i18n("version.empty.add"));
|
||||||
|
imageView.setImage(newImage("/assets/img/grass.png"));
|
||||||
|
tooltip.setText("");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,126 @@
|
|||||||
|
/*
|
||||||
|
* Hello Minecraft! Launcher
|
||||||
|
* Copyright (C) 2021 huangyuhui <huanghongxun2008@126.com> and contributors
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package org.jackhuang.hmcl.ui.versions;
|
||||||
|
|
||||||
|
import javafx.scene.Node;
|
||||||
|
import javafx.scene.image.Image;
|
||||||
|
import javafx.scene.image.ImageView;
|
||||||
|
import javafx.scene.layout.FlowPane;
|
||||||
|
import javafx.stage.FileChooser;
|
||||||
|
import org.jackhuang.hmcl.event.Event;
|
||||||
|
import org.jackhuang.hmcl.setting.Profile;
|
||||||
|
import org.jackhuang.hmcl.setting.Theme;
|
||||||
|
import org.jackhuang.hmcl.setting.VersionIconType;
|
||||||
|
import org.jackhuang.hmcl.setting.VersionSetting;
|
||||||
|
import org.jackhuang.hmcl.ui.Controllers;
|
||||||
|
import org.jackhuang.hmcl.ui.FXUtils;
|
||||||
|
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;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
|
||||||
|
import static org.jackhuang.hmcl.util.i18n.I18n.i18n;
|
||||||
|
|
||||||
|
public class VersionIconDialog extends DialogPane {
|
||||||
|
private final Profile profile;
|
||||||
|
private final String versionId;
|
||||||
|
private final Runnable onFinish;
|
||||||
|
private final VersionSetting vs;
|
||||||
|
|
||||||
|
public VersionIconDialog(Profile profile, String versionId, Runnable onFinish) {
|
||||||
|
this.profile = profile;
|
||||||
|
this.versionId = versionId;
|
||||||
|
this.onFinish = onFinish;
|
||||||
|
this.vs = profile.getRepository().getLocalVersionSettingOrCreate(versionId);
|
||||||
|
|
||||||
|
setTitle(i18n("settings.icon"));
|
||||||
|
FlowPane pane = new FlowPane();
|
||||||
|
setBody(pane);
|
||||||
|
|
||||||
|
pane.getChildren().setAll(
|
||||||
|
createCustomIcon(),
|
||||||
|
createIcon(VersionIconType.GRASS),
|
||||||
|
createIcon(VersionIconType.CHEST),
|
||||||
|
createIcon(VersionIconType.CHICKEN),
|
||||||
|
createIcon(VersionIconType.COMMAND),
|
||||||
|
createIcon(VersionIconType.CRAFT_TABLE),
|
||||||
|
createIcon(VersionIconType.FABRIC),
|
||||||
|
createIcon(VersionIconType.FORGE),
|
||||||
|
createIcon(VersionIconType.FURNACE)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void exploreIcon() {
|
||||||
|
FileChooser chooser = new FileChooser();
|
||||||
|
chooser.getExtensionFilters().add(new FileChooser.ExtensionFilter(i18n("extension.png"), "*.png"));
|
||||||
|
File selectedFile = chooser.showOpenDialog(Controllers.getStage());
|
||||||
|
if (selectedFile != null) {
|
||||||
|
File iconFile = profile.getRepository().getVersionIconFile(versionId);
|
||||||
|
try {
|
||||||
|
FileUtils.copyFile(selectedFile, iconFile);
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Node createCustomIcon() {
|
||||||
|
Node shape = SVG.plusCircleOutline(Theme.blackFillBinding(), 32, 32);
|
||||||
|
shape.setMouseTransparent(true);
|
||||||
|
RipplerContainer container = new RipplerContainer(shape);
|
||||||
|
FXUtils.setLimitWidth(container, 36);
|
||||||
|
FXUtils.setLimitHeight(container, 36);
|
||||||
|
container.setOnMouseClicked(e -> {
|
||||||
|
exploreIcon();
|
||||||
|
});
|
||||||
|
return container;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Node createIcon(VersionIconType type) {
|
||||||
|
ImageView imageView = new ImageView(new Image(type.getResourceUrl(), 32, 32, true, true));
|
||||||
|
imageView.setMouseTransparent(true);
|
||||||
|
RipplerContainer container = new RipplerContainer(imageView);
|
||||||
|
FXUtils.setLimitWidth(container, 36);
|
||||||
|
FXUtils.setLimitHeight(container, 36);
|
||||||
|
container.setOnMouseClicked(e -> {
|
||||||
|
if (vs != null) {
|
||||||
|
vs.setVersionIcon(type);
|
||||||
|
onAccept();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return container;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onAccept() {
|
||||||
|
profile.getRepository().onVersionIconChanged.fireEvent(new Event(this));
|
||||||
|
onFinish.run();
|
||||||
|
super.onAccept();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -32,10 +32,7 @@ import javafx.scene.layout.*;
|
|||||||
import javafx.scene.text.Text;
|
import javafx.scene.text.Text;
|
||||||
import javafx.stage.FileChooser;
|
import javafx.stage.FileChooser;
|
||||||
import org.jackhuang.hmcl.game.*;
|
import org.jackhuang.hmcl.game.*;
|
||||||
import org.jackhuang.hmcl.setting.LauncherVisibility;
|
import org.jackhuang.hmcl.setting.*;
|
||||||
import org.jackhuang.hmcl.setting.Profile;
|
|
||||||
import org.jackhuang.hmcl.setting.Profiles;
|
|
||||||
import org.jackhuang.hmcl.setting.VersionSetting;
|
|
||||||
import org.jackhuang.hmcl.task.Schedulers;
|
import org.jackhuang.hmcl.task.Schedulers;
|
||||||
import org.jackhuang.hmcl.task.Task;
|
import org.jackhuang.hmcl.task.Task;
|
||||||
import org.jackhuang.hmcl.ui.Controllers;
|
import org.jackhuang.hmcl.ui.Controllers;
|
||||||
@@ -44,9 +41,7 @@ import org.jackhuang.hmcl.ui.WeakListenerHolder;
|
|||||||
import org.jackhuang.hmcl.ui.construct.*;
|
import org.jackhuang.hmcl.ui.construct.*;
|
||||||
import org.jackhuang.hmcl.ui.decorator.DecoratorPage;
|
import org.jackhuang.hmcl.ui.decorator.DecoratorPage;
|
||||||
import org.jackhuang.hmcl.util.Lang;
|
import org.jackhuang.hmcl.util.Lang;
|
||||||
import org.jackhuang.hmcl.util.Logging;
|
|
||||||
import org.jackhuang.hmcl.util.Pair;
|
import org.jackhuang.hmcl.util.Pair;
|
||||||
import org.jackhuang.hmcl.util.io.FileUtils;
|
|
||||||
import org.jackhuang.hmcl.util.javafx.BindingMapping;
|
import org.jackhuang.hmcl.util.javafx.BindingMapping;
|
||||||
import org.jackhuang.hmcl.util.javafx.SafeStringConverter;
|
import org.jackhuang.hmcl.util.javafx.SafeStringConverter;
|
||||||
import org.jackhuang.hmcl.util.platform.Architecture;
|
import org.jackhuang.hmcl.util.platform.Architecture;
|
||||||
@@ -55,17 +50,14 @@ import org.jackhuang.hmcl.util.platform.OperatingSystem;
|
|||||||
import org.jackhuang.hmcl.util.versioning.VersionNumber;
|
import org.jackhuang.hmcl.util.versioning.VersionNumber;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
|
||||||
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;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
import java.util.logging.Level;
|
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import static org.jackhuang.hmcl.ui.FXUtils.newImage;
|
|
||||||
import static org.jackhuang.hmcl.ui.FXUtils.stringConverter;
|
import static org.jackhuang.hmcl.ui.FXUtils.stringConverter;
|
||||||
import static org.jackhuang.hmcl.util.Pair.pair;
|
import static org.jackhuang.hmcl.util.Pair.pair;
|
||||||
import static org.jackhuang.hmcl.util.i18n.I18n.i18n;
|
import static org.jackhuang.hmcl.util.i18n.I18n.i18n;
|
||||||
@@ -775,18 +767,7 @@ public final class VersionSettingsPage extends StackPane implements DecoratorPag
|
|||||||
if (versionId == null)
|
if (versionId == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
FileChooser chooser = new FileChooser();
|
Controllers.dialog(new VersionIconDialog(profile, versionId, this::loadIcon));
|
||||||
chooser.getExtensionFilters().add(new FileChooser.ExtensionFilter(i18n("extension.png"), "*.png"));
|
|
||||||
File selectedFile = chooser.showOpenDialog(Controllers.getStage());
|
|
||||||
if (selectedFile != null) {
|
|
||||||
File iconFile = profile.getRepository().getVersionIconFile(versionId);
|
|
||||||
try {
|
|
||||||
FileUtils.copyFile(selectedFile, iconFile);
|
|
||||||
loadIcon();
|
|
||||||
} catch (IOException e) {
|
|
||||||
Logging.LOG.log(Level.SEVERE, "Failed to copy icon file from " + selectedFile + " to " + iconFile, e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onDeleteIcon() {
|
private void onDeleteIcon() {
|
||||||
@@ -796,6 +777,10 @@ public final class VersionSettingsPage extends StackPane implements DecoratorPag
|
|||||||
File iconFile = profile.getRepository().getVersionIconFile(versionId);
|
File iconFile = profile.getRepository().getVersionIconFile(versionId);
|
||||||
if (iconFile.exists())
|
if (iconFile.exists())
|
||||||
iconFile.delete();
|
iconFile.delete();
|
||||||
|
VersionSetting localVersionSetting = profile.getRepository().getLocalVersionSettingOrCreate(versionId);
|
||||||
|
if (localVersionSetting != null) {
|
||||||
|
localVersionSetting.setVersionIcon(VersionIconType.DEFAULT);
|
||||||
|
}
|
||||||
loadIcon();
|
loadIcon();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -804,11 +789,7 @@ public final class VersionSettingsPage extends StackPane implements DecoratorPag
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
File iconFile = profile.getRepository().getVersionIconFile(versionId);
|
iconPickerItem.setImage(profile.getRepository().getVersionIconImage(versionId));
|
||||||
if (iconFile.exists())
|
|
||||||
iconPickerItem.setImage(new Image("file:" + iconFile.getAbsolutePath()));
|
|
||||||
else
|
|
||||||
iconPickerItem.setImage(newImage("/assets/img/grass.png"));
|
|
||||||
FXUtils.limitSize(iconPickerItem.getImageView(), 32, 32);
|
FXUtils.limitSize(iconPickerItem.getImageView(), 32, 32);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user