diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionPage.java index 7ea91bacb8..0184026260 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionPage.java @@ -21,6 +21,8 @@ import javafx.application.Platform; import javafx.beans.binding.Bindings; import javafx.beans.property.*; +import javafx.event.Event; +import javafx.event.EventType; import javafx.scene.Node; import javafx.scene.layout.Priority; import javafx.scene.layout.VBox; @@ -61,6 +63,13 @@ public class VersionPage extends DecoratorAnimatedPage implements DecoratorPage private String preferredVersionName = null; + public static class WorkingDirChangedEvent extends Event { + public static final EventType EVENT_TYPE = new EventType<>(Event.ANY, "WORKING_DIR_CHANGED"); + public WorkingDirChangedEvent() { + super(EVENT_TYPE); + } + } + public VersionPage() { versionSettingsTab.setNodeSupplier(loadVersionFor(() -> new VersionSettingsPage(false))); installerListTab.setNodeSupplier(loadVersionFor(InstallerListPage::new)); @@ -74,6 +83,21 @@ public VersionPage() { addEventHandler(Navigator.NavigationEvent.NAVIGATED, this::onNavigated); + addEventHandler(WorkingDirChangedEvent.EVENT_TYPE, event -> { + if (this.version.get() != null) { + if (installerListTab.isInitialized()) + installerListTab.getNode().loadVersion(getProfile(), getVersion()); + if (modListTab.isInitialized()) + modListTab.getNode().loadVersion(getProfile(), getVersion()); + if (resourcePackTab.isInitialized()) + resourcePackTab.getNode().loadVersion(getProfile(), getVersion()); + if (worldListTab.isInitialized()) + worldListTab.getNode().loadVersion(getProfile(), getVersion()); + if (schematicsTab.isInitialized()) + schematicsTab.getNode().loadVersion(getProfile(), getVersion()); + } + }); + listenerHolder.add(EventBus.EVENT_BUS.channel(RefreshedVersionsEvent.class).registerWeak(event -> checkSelectedVersion(), EventPriority.HIGHEST)); } 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 b5fe559312..ad6ab14187 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 @@ -34,8 +34,12 @@ import javafx.scene.text.Text; import javafx.stage.FileChooser; import javafx.stage.Screen; -import org.jackhuang.hmcl.game.*; +import org.jackhuang.hmcl.game.GameDirectoryType; +import org.jackhuang.hmcl.game.HMCLGameRepository; +import org.jackhuang.hmcl.game.ProcessPriority; +import org.jackhuang.hmcl.game.Version; import org.jackhuang.hmcl.java.JavaManager; +import org.jackhuang.hmcl.java.JavaRuntime; import org.jackhuang.hmcl.setting.*; import org.jackhuang.hmcl.ui.Controllers; import org.jackhuang.hmcl.ui.FXUtils; @@ -48,7 +52,6 @@ import org.jackhuang.hmcl.util.javafx.PropertyUtils; import org.jackhuang.hmcl.util.javafx.SafeStringConverter; import org.jackhuang.hmcl.util.platform.Architecture; -import org.jackhuang.hmcl.java.JavaRuntime; import org.jackhuang.hmcl.util.platform.OperatingSystem; import org.jackhuang.hmcl.util.platform.SystemInfo; import org.jackhuang.hmcl.util.platform.hardware.PhysicalMemoryStatus; @@ -99,6 +102,10 @@ public final class VersionSettingsPage extends StackPane implements DecoratorPag private final InvalidationListener usesGlobalListener; private final ChangeListener specificSettingsListener; private final InvalidationListener javaListener = any -> initJavaSubtitle(); + + private final ChangeListener gameDirTypeListener = (ob, o, n) -> fireWorkingDirChanged(); + private final ChangeListener gameDirListener = (ob, o, n) -> fireWorkingDirChanged(); + private boolean updatingJavaSetting = false; private boolean updatingSelectedJava = false; @@ -455,13 +462,20 @@ public VersionSettingsPage(boolean globalSetting) { else profile.getRepository().globalizeVersionSetting(versionId); - Platform.runLater(() -> loadVersion(profile, versionId)); + FXUtils.runInFX(() -> { + loadVersion(profile, versionId); + fireWorkingDirChanged(); + }); }; addEventHandler(Navigator.NavigationEvent.NAVIGATED, this::onDecoratorPageNavigating); componentList.disableProperty().bind(enableSpecificSettings.not()); } + + private void fireWorkingDirChanged() { + FXUtils.runInFX(() -> fireEvent(new VersionPage.WorkingDirChangedEvent())); + } @Override public void loadVersion(Profile profile, String versionId) { @@ -513,6 +527,9 @@ public void loadVersion(Profile profile, String versionId) { lastVersionSetting.defaultJavaPathPropertyProperty().removeListener(javaListener); lastVersionSetting.javaVersionProperty().removeListener(javaListener); + lastVersionSetting.gameDirTypeProperty().removeListener(gameDirTypeListener); + lastVersionSetting.gameDirProperty().removeListener(gameDirListener); + gameDirItem.selectedDataProperty().unbindBidirectional(lastVersionSetting.gameDirTypeProperty()); gameDirSublist.subtitleProperty().unbind(); @@ -589,6 +606,9 @@ public void loadVersion(Profile profile, String versionId) { gameDirSublist.subtitleProperty().bind(Bindings.createStringBinding(() -> profile.getRepository().getRunDirectory(versionId).toAbsolutePath().normalize().toString(), versionSetting.gameDirProperty(), versionSetting.gameDirTypeProperty())); + versionSetting.gameDirTypeProperty().addListener(gameDirTypeListener); + versionSetting.gameDirProperty().addListener(gameDirListener); + lastVersionSetting = versionSetting; initJavaSubtitle();