diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Profile.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Profile.java index 7a93df564..8325e50db 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Profile.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Profile.java @@ -18,6 +18,7 @@ package org.jackhuang.hmcl.setting; import com.google.gson.*; +import javafx.application.Platform; import javafx.beans.InvalidationListener; import javafx.beans.Observable; import javafx.beans.property.*; @@ -120,14 +121,20 @@ public final class Profile implements Observable { } public Profile(String name, File initialGameDir, VersionSetting global) { + this(name, initialGameDir, global, null, false); + } + + public Profile(String name, File initialGameDir, VersionSetting global, String selectedVersion, boolean useRelativePath) { this.name = new ImmediateStringProperty(this, "name", name); gameDir = new ImmediateObjectProperty<>(this, "gameDir", initialGameDir); repository = new HMCLGameRepository(this, initialGameDir); modManager = new ModManager(repository); this.global.set(global == null ? new VersionSetting() : global); + this.selectedVersion.set(selectedVersion); + this.useRelativePath.set(useRelativePath); gameDir.addListener((a, b, newValue) -> repository.changeDirectory(newValue)); - selectedVersion.addListener(o -> checkSelectedVersion()); + this.selectedVersion.addListener(o -> checkSelectedVersion()); helper.add(EventBus.EVENT_BUS.channel(RefreshedVersionsEvent.class).registerWeak(event -> checkSelectedVersion())); addPropertyChangedListener(onInvalidating(this::invalidate)); @@ -224,7 +231,7 @@ public final class Profile implements Observable { } protected void invalidate() { - observableHelper.invalidate(); + Platform.runLater(observableHelper::invalidate); } public static final class Serializer implements JsonSerializer, JsonDeserializer { @@ -253,10 +260,11 @@ public final class Profile implements Observable { JsonObject obj = (JsonObject) json; String gameDir = Optional.ofNullable(obj.get("gameDir")).map(JsonElement::getAsString).orElse(""); - Profile profile = new Profile("Default", new File(gameDir), context.deserialize(obj.get("global"), VersionSetting.class)); - profile.setSelectedVersion(Optional.ofNullable(obj.get("selectedMinecraftVersion")).map(JsonElement::getAsString).orElse("")); - profile.setUseRelativePath(Optional.ofNullable(obj.get("useRelativePath")).map(JsonElement::getAsBoolean).orElse(false)); - return profile; + return new Profile("Default", + new File(gameDir), + context.deserialize(obj.get("global"), VersionSetting.class), + Optional.ofNullable(obj.get("selectedMinecraftVersion")).map(JsonElement::getAsString).orElse(""), + Optional.ofNullable(obj.get("useRelativePath")).map(JsonElement::getAsBoolean).orElse(false)); } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Profiles.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Profiles.java index fbc412985..43d1b3058 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Profiles.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Profiles.java @@ -25,6 +25,7 @@ import javafx.beans.property.SimpleObjectProperty; import javafx.collections.ObservableList; import org.jackhuang.hmcl.Launcher; +import java.io.File; import java.util.HashSet; import static javafx.collections.FXCollections.observableArrayList; @@ -82,11 +83,8 @@ public final class Profiles { private static void checkProfiles() { if (profiles.isEmpty()) { - Profile current = new Profile(Profiles.DEFAULT_PROFILE); - current.setUseRelativePath(true); - + Profile current = new Profile(Profiles.DEFAULT_PROFILE, new File(".minecraft"), new VersionSetting(), null, true); Profile home = new Profile(Profiles.HOME_PROFILE, Launcher.MINECRAFT_DIRECTORY); - profiles.addAll(current, home); } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/GameAdvancedListItem.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/GameAdvancedListItem.java index 976e1931e..6048e42d9 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/GameAdvancedListItem.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/GameAdvancedListItem.java @@ -54,7 +54,8 @@ public class GameAdvancedListItem extends AdvancedListItem { if (profile != null) profile.selectedVersionProperty().removeListener(listener); profile = newProfile; - profile.selectedVersionProperty().addListener(listener); + if (profile != null) + profile.selectedVersionProperty().addListener(listener); loadVersion(); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/DefaultGameRepository.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/DefaultGameRepository.java index eaa0d428d..988c0e453 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/DefaultGameRepository.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/DefaultGameRepository.java @@ -57,7 +57,7 @@ public class DefaultGameRepository implements GameRepository { @Override public boolean hasVersion(String id) { - return versions.containsKey(id); + return id != null && versions.containsKey(id); } @Override