From 418be689f2e46ad047cda6d36c17077dcddc3adf Mon Sep 17 00:00:00 2001 From: huangyuhui Date: Sat, 27 Jan 2018 14:05:39 +0800 Subject: [PATCH] Cached Minecraft jars --- .../hmcl/game/HMCLGameDownloadTask.java | 4 +- .../hmcl/game/HMCLGameRepository.java | 12 ++++-- .../jackhuang/hmcl/game/LauncherHelper.java | 5 +++ .../MultiMCInstallVersionSettingTask.java | 1 - .../java/org/jackhuang/hmcl/ui/Decorator.java | 8 ++-- .../java/org/jackhuang/hmcl/ui/MainPage.java | 37 ++++++++++++++++ .../org/jackhuang/hmcl/ui/VersionPage.java | 42 ++++++++++++------- .../hmcl/ui/VersionSettingsController.java | 2 + .../hmcl/ui/animation/TransitionHandler.java | 3 ++ .../ui/download/DownloadWizardProvider.java | 10 ++--- .../hmcl/ui/download/ModpackPage.java | 2 +- HMCL/src/main/resources/assets/fxml/main.fxml | 9 ++++ .../resources/assets/fxml/message-dialog.fxml | 2 +- .../hmcl/game/DefaultGameRepository.java | 2 +- .../org/jackhuang/hmcl/task/CoupleTask.java | 7 +++- .../java/org/jackhuang/hmcl/task/Task.java | 22 +++++++++- .../org/jackhuang/hmcl/task/TaskExecutor.java | 3 ++ 17 files changed, 133 insertions(+), 38 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameDownloadTask.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameDownloadTask.java index 7e93a6609..9a7bbc084 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameDownloadTask.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameDownloadTask.java @@ -69,10 +69,10 @@ public class HMCLGameDownloadTask extends Task { dependencies.add(new FileDownloadTask( NetworkUtils.toURL(profile.getDependency().getDownloadProvider().injectURL(version.getDownloadInfo().getUrl())), - jar, + cache, profile.getDependency().getProxy(), version.getDownloadInfo().getSha1() - )); + ).then(Task.of(v -> FileUtils.copyFile(cache, jar)))); } } 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 c4610753f..d2da74db1 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java @@ -22,6 +22,7 @@ import com.google.gson.GsonBuilder; import org.jackhuang.hmcl.event.EventBus; import org.jackhuang.hmcl.event.RefreshedVersionsEvent; import org.jackhuang.hmcl.event.RefreshingVersionsEvent; +import org.jackhuang.hmcl.setting.EnumGameDirectory; import org.jackhuang.hmcl.setting.Profile; import org.jackhuang.hmcl.setting.Settings; import org.jackhuang.hmcl.setting.VersionSetting; @@ -63,7 +64,7 @@ public class HMCLGameRepository extends DefaultGameRepository { @Override public File getRunDirectory(String id) { - if (beingModpackVersions.contains(id)) + if (beingModpackVersions.contains(id) || isModpack(id)) return getVersionRoot(id); else { VersionSetting vs = profile.getVersionSetting(id); @@ -155,7 +156,7 @@ public class HMCLGameRepository extends DefaultGameRepository { if (!hasVersion(id)) return null; if (versionSettings.containsKey(id)) - return versionSettings.get(id); + return getVersionSetting(id); else return initVersionSetting(id, new VersionSetting()); } @@ -176,7 +177,10 @@ public class HMCLGameRepository extends DefaultGameRepository { public VersionSetting getVersionSetting(String id) { if (!versionSettings.containsKey(id)) loadVersionSetting(id); - return versionSettings.get(id); + VersionSetting setting = versionSettings.get(id); + if (setting != null && isModpack(id)) + setting.setGameDirType(EnumGameDirectory.VERSION_FOLDER); + return setting; } public File getVersionIcon(String id) { @@ -195,7 +199,7 @@ public class HMCLGameRepository extends DefaultGameRepository { @Override public File getModpackConfiguration(String version) { - return new File(getRunDirectory(version), "modpack.cfg"); + return new File(getVersionRoot(version), "modpack.cfg"); } public void markVersionAsModpack(String id) { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java index 3a64e82a1..d7422f9e3 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java @@ -115,6 +115,11 @@ public final class LauncherHelper { launchingStepsPane.setProgress(1.0 * finished.get() / executor.getRunningTasks()); }); } + + @Override + public void onTerminate() { + Controllers.closeDialog(); + } }); executor.start(); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/MultiMCInstallVersionSettingTask.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/MultiMCInstallVersionSettingTask.java index 240873f24..a3735cda7 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/MultiMCInstallVersionSettingTask.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/MultiMCInstallVersionSettingTask.java @@ -44,7 +44,6 @@ public final class MultiMCInstallVersionSettingTask extends Task { @Override public void execute() { - profile.getRepository().refreshVersions(); VersionSetting vs = Objects.requireNonNull(profile.specializeVersionSetting(version)); ModpackHelper.toVersionSetting(manifest, vs); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/Decorator.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/Decorator.java index 66763ac96..76b8616d3 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/Decorator.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/Decorator.java @@ -426,11 +426,9 @@ public final class Decorator extends StackPane implements TaskExecutorDialogWiza } public JFXDialog showDialog(Region content) { - if (dialog.getContent() != content) { - dialog.setContent(content); - if (!dialogShown) - dialog.show(); - } + dialog.setContent(content); + if (!dialogShown) + dialog.show(); return dialog; } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/MainPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/MainPage.java index a8324cc07..75eb5f6e4 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/MainPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/MainPage.java @@ -18,7 +18,9 @@ package org.jackhuang.hmcl.ui; import com.jfoenix.controls.JFXButton; +import com.jfoenix.controls.JFXListView; import com.jfoenix.controls.JFXMasonryPane; +import com.jfoenix.controls.JFXPopup; import javafx.application.Platform; import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; @@ -26,6 +28,7 @@ import javafx.fxml.FXML; import javafx.scene.Node; import javafx.scene.control.Tooltip; import javafx.scene.image.Image; +import javafx.scene.input.MouseButton; import javafx.scene.layout.StackPane; import javafx.stage.FileChooser; import org.jackhuang.hmcl.Main; @@ -61,6 +64,9 @@ public final class MainPage extends StackPane implements DecoratorPage { private final StringProperty title = new SimpleStringProperty(this, "title", Main.i18n("main_page")); + private Profile profile; + private String rightClickedVersion; + @FXML private JFXButton btnRefresh; @@ -70,6 +76,11 @@ public final class MainPage extends StackPane implements DecoratorPage { @FXML private JFXMasonryPane masonryPane; + @FXML + private JFXListView versionList; + + private JFXPopup versionPopup; + { FXUtils.loadFXML(this, "/assets/fxml/main.fxml"); @@ -77,6 +88,9 @@ public final class MainPage extends StackPane implements DecoratorPage { EventBus.EVENT_BUS.channel(ProfileLoadingEvent.class).register(this::onProfilesLoading); EventBus.EVENT_BUS.channel(ProfileChangedEvent.class).register(this::onProfileChanged); + versionPopup = new JFXPopup(versionList); + getChildren().remove(versionList); + btnAdd.setOnMouseClicked(e -> Controllers.getDecorator().startWizard(new DownloadWizardProvider(), Main.i18n("install"))); FXUtils.installTooltip(btnAdd, 0, 5000, 0, new Tooltip(Main.i18n("install"))); btnRefresh.setOnMouseClicked(e -> Settings.INSTANCE.getSelectedProfile().getRepository().refreshVersionsAsync().start()); @@ -136,6 +150,13 @@ public final class MainPage extends StackPane implements DecoratorPage { } } }); + item.setOnMouseClicked(event -> { + if (event.getButton() == MouseButton.SECONDARY) { + rightClickedVersion = version; + versionList.getSelectionModel().select(-1); + versionPopup.show(item, JFXPopup.PopupVPosition.TOP, JFXPopup.PopupHPosition.LEFT, event.getX(), event.getY()); + } + }); File iconFile = profile.getRepository().getVersionIcon(version); if (iconFile.exists()) item.setImage(new Image("file:" + iconFile.getAbsolutePath())); @@ -155,6 +176,7 @@ public final class MainPage extends StackPane implements DecoratorPage { } private void loadVersions(Profile profile) { + this.profile = profile; List children = new LinkedList<>(); for (Version version : profile.getRepository().getVersions()) { children.add(buildNode(profile, version.getId(), Lang.nonNull(GameVersion.minecraftVersion(profile.getRepository().getVersionJar(version.getId())), "Unknown"))); @@ -162,6 +184,21 @@ public final class MainPage extends StackPane implements DecoratorPage { FXUtils.resetChildren(masonryPane, children); } + public void onVersionManagement() { + versionPopup.hide(); + switch (versionList.getSelectionModel().getSelectedIndex()) { + case 0: + VersionPage.renameVersion(profile, rightClickedVersion); + break; + case 1: + VersionPage.deleteVersion(profile, rightClickedVersion); + break; + case 2: + VersionPage.exportVersion(profile, rightClickedVersion); + break; + } + } + public String getTitle() { return title.get(); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/VersionPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/VersionPage.java index 633360722..d54b629d2 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/VersionPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/VersionPage.java @@ -36,6 +36,7 @@ import org.jackhuang.hmcl.ui.wizard.DecoratorPage; import org.jackhuang.hmcl.util.FileUtils; import java.io.File; +import java.lang.reflect.Proxy; import java.util.Optional; public final class VersionPage extends StackPane implements DecoratorPage { @@ -112,16 +113,11 @@ public final class VersionPage extends StackPane implements DecoratorPage { } public void onDelete() { - Controllers.confirmDialog(Main.i18n("version.manage.remove.confirm", version), Main.i18n("message.confirm"), () -> { - if (profile.getRepository().removeVersionFromDisk(version)) { - profile.getRepository().refreshVersionsAsync().start(); - Controllers.navigate(null); - } - }, null); + deleteVersion(profile, version); } public void onExport() { - Controllers.getDecorator().startWizard(new ExportWizardProvider(profile, version), Main.i18n("modpack.wizard")); + exportVersion(profile, version); } public void onBrowse() { @@ -157,16 +153,10 @@ public final class VersionPage extends StackPane implements DecoratorPage { public void onManagement() { switch (managementList.getSelectionModel().getSelectedIndex()) { case 0: // rename a version - Optional res = FXUtils.inputDialog("Input", Main.i18n("version.manage.rename.message"), null, version); - if (res.isPresent()) { - if (profile.getRepository().renameVersion(version, res.get())) { - profile.getRepository().refreshVersionsAsync().start(); - Controllers.navigate(null); - } - } + renameVersion(profile, version); break; case 1: // remove a version - onDelete(); + deleteVersion(profile, version); break; case 2: // redownload asset index new GameAssetIndexDownloadTask(profile.getDependency(), profile.getRepository().getVersion(version).resolve(profile.getRepository())).start(); @@ -191,4 +181,26 @@ public final class VersionPage extends StackPane implements DecoratorPage { public void setTitle(String title) { this.title.set(title); } + + public static void deleteVersion(Profile profile, String version) { + Controllers.confirmDialog(Main.i18n("version.manage.remove.confirm", version), Main.i18n("message.confirm"), () -> { + if (profile.getRepository().removeVersionFromDisk(version)) { + profile.getRepository().refreshVersionsAsync().start(); + Controllers.navigate(null); + } + }, null); + } + + public static void renameVersion(Profile profile, String version) { + Controllers.inputDialog(Main.i18n("version.manage.rename.message"), res -> { + if (profile.getRepository().renameVersion(version, res)) { + profile.getRepository().refreshVersionsAsync().start(); + Controllers.navigate(null); + } + }); + } + + public static void exportVersion(Profile profile, String version) { + Controllers.getDecorator().startWizard(new ExportWizardProvider(profile, version), Main.i18n("modpack.wizard")); + } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/VersionSettingsController.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/VersionSettingsController.java index 9c28fb719..274ea83da 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/VersionSettingsController.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/VersionSettingsController.java @@ -126,6 +126,8 @@ public final class VersionSettingsController { this.profile = profile; this.versionId = versionId; + gameDirItem.setDisable(profile.getRepository().isModpack(versionId)); + if (lastVersionSetting != null) { lastVersionSetting.widthProperty().unbind(); lastVersionSetting.heightProperty().unbind(); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/animation/TransitionHandler.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/animation/TransitionHandler.java index edf164eca..f0a1e5d9b 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/animation/TransitionHandler.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/animation/TransitionHandler.java @@ -92,6 +92,9 @@ public final class TransitionHandler implements AnimationHandler { } else previousNode = NULL; + if (previousNode == currentNode) + previousNode = NULL; + currentNode = newView; view.getChildren().setAll(previousNode, currentNode); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/DownloadWizardProvider.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/DownloadWizardProvider.java index bee40d140..86125bb3b 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/DownloadWizardProvider.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/DownloadWizardProvider.java @@ -78,7 +78,7 @@ public final class DownloadWizardProvider implements WizardProvider { profile.getRepository().markVersionAsModpack(name); Task finalizeTask = Task.of(() -> { - profile.getRepository().refreshVersionsAsync().start(); + profile.getRepository().refreshVersions(); VersionSetting vs = profile.specializeVersionSetting(name); profile.getRepository().undoMark(name); if (vs != null) @@ -87,14 +87,14 @@ public final class DownloadWizardProvider implements WizardProvider { if (modpack.getManifest() instanceof CurseManifest) return new CurseInstallTask(profile.getDependency(), selected, ((CurseManifest) modpack.getManifest()), name) - .with(finalizeTask); + .finalized(finalizeTask); else if (modpack.getManifest() instanceof HMCLModpackManifest) return new HMCLModpackInstallTask(profile, selected, modpack, name) - .with(finalizeTask); + .finalized(finalizeTask); else if (modpack.getManifest() instanceof MultiMCInstanceConfiguration) return new MultiMCModpackInstallTask(profile.getDependency(), selected, ((MultiMCInstanceConfiguration) modpack.getManifest()), name) - .with(new MultiMCInstallVersionSettingTask(profile, ((MultiMCInstanceConfiguration) modpack.getManifest()), name)) - .with(finalizeTask); + .finalized(finalizeTask) + .with(new MultiMCInstallVersionSettingTask(profile, ((MultiMCInstanceConfiguration) modpack.getManifest()), name)); else throw new IllegalStateException("Unrecognized modpack: " + modpack); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/ModpackPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/ModpackPage.java index ba7c45c67..83800626e 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/ModpackPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/ModpackPage.java @@ -77,7 +77,7 @@ public final class ModpackPage extends StackPane implements WizardPage { chooser.setTitle(Main.i18n("modpack.choose")); chooser.getExtensionFilters().add(new FileChooser.ExtensionFilter(Main.i18n("modpack"), "*.zip")); File selectedFile = chooser.showOpenDialog(Controllers.getStage()); - if (selectedFile == null) Platform.runLater(controller::onFinish); + if (selectedFile == null) Platform.runLater(() -> Controllers.navigate(null)); else { // TODO: original HMCL modpack support. controller.getSettings().put(MODPACK_FILE, selectedFile); diff --git a/HMCL/src/main/resources/assets/fxml/main.fxml b/HMCL/src/main/resources/assets/fxml/main.fxml index 39dfb9cf0..d62e641a7 100644 --- a/HMCL/src/main/resources/assets/fxml/main.fxml +++ b/HMCL/src/main/resources/assets/fxml/main.fxml @@ -5,6 +5,8 @@ + + + + + diff --git a/HMCL/src/main/resources/assets/fxml/message-dialog.fxml b/HMCL/src/main/resources/assets/fxml/message-dialog.fxml index 9434049bb..a10f2eb54 100644 --- a/HMCL/src/main/resources/assets/fxml/message-dialog.fxml +++ b/HMCL/src/main/resources/assets/fxml/message-dialog.fxml @@ -18,7 +18,7 @@