mirror of
https://github.com/HMCL-dev/HMCL.git
synced 2025-09-13 05:46:59 -04:00
Move operations on version to new class
This commit is contained in:
parent
ec2b9b19be
commit
ec295664d9
@ -26,9 +26,7 @@ import javafx.scene.Node;
|
|||||||
import javafx.scene.control.ScrollPane;
|
import javafx.scene.control.ScrollPane;
|
||||||
import javafx.scene.image.Image;
|
import javafx.scene.image.Image;
|
||||||
import javafx.scene.input.MouseButton;
|
import javafx.scene.input.MouseButton;
|
||||||
import javafx.scene.layout.Region;
|
|
||||||
import javafx.scene.layout.StackPane;
|
import javafx.scene.layout.StackPane;
|
||||||
import javafx.stage.FileChooser;
|
|
||||||
|
|
||||||
import org.jackhuang.hmcl.download.LibraryAnalyzer;
|
import org.jackhuang.hmcl.download.LibraryAnalyzer;
|
||||||
import org.jackhuang.hmcl.event.EventBus;
|
import org.jackhuang.hmcl.event.EventBus;
|
||||||
@ -36,27 +34,19 @@ import org.jackhuang.hmcl.event.ProfileChangedEvent;
|
|||||||
import org.jackhuang.hmcl.event.RefreshedVersionsEvent;
|
import org.jackhuang.hmcl.event.RefreshedVersionsEvent;
|
||||||
import org.jackhuang.hmcl.event.RefreshingVersionsEvent;
|
import org.jackhuang.hmcl.event.RefreshingVersionsEvent;
|
||||||
import org.jackhuang.hmcl.game.*;
|
import org.jackhuang.hmcl.game.*;
|
||||||
import org.jackhuang.hmcl.mod.MismatchedModpackTypeException;
|
|
||||||
import org.jackhuang.hmcl.mod.UnsupportedModpackException;
|
|
||||||
import org.jackhuang.hmcl.setting.Accounts;
|
|
||||||
import org.jackhuang.hmcl.setting.Profile;
|
import org.jackhuang.hmcl.setting.Profile;
|
||||||
import org.jackhuang.hmcl.setting.Settings;
|
import org.jackhuang.hmcl.setting.Settings;
|
||||||
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.task.TaskExecutor;
|
|
||||||
import org.jackhuang.hmcl.ui.construct.DialogCloseEvent;
|
|
||||||
import org.jackhuang.hmcl.ui.construct.MessageBox;
|
|
||||||
import org.jackhuang.hmcl.ui.download.DownloadWizardProvider;
|
import org.jackhuang.hmcl.ui.download.DownloadWizardProvider;
|
||||||
|
import org.jackhuang.hmcl.ui.versions.Versions;
|
||||||
import org.jackhuang.hmcl.ui.wizard.DecoratorPage;
|
import org.jackhuang.hmcl.ui.wizard.DecoratorPage;
|
||||||
import org.jackhuang.hmcl.util.Lang;
|
import org.jackhuang.hmcl.util.Lang;
|
||||||
import org.jackhuang.hmcl.util.OperatingSystem;
|
|
||||||
import org.jackhuang.hmcl.util.VersionNumber;
|
import org.jackhuang.hmcl.util.VersionNumber;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.Callable;
|
import java.util.concurrent.Callable;
|
||||||
import java.util.concurrent.atomic.AtomicReference;
|
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import static org.jackhuang.hmcl.util.StringUtils.removePrefix;
|
import static org.jackhuang.hmcl.util.StringUtils.removePrefix;
|
||||||
@ -106,7 +96,7 @@ public final class MainPage extends StackPane implements DecoratorPage {
|
|||||||
FXUtils.installTooltip(btnRefresh, i18n("button.refresh"));
|
FXUtils.installTooltip(btnRefresh, i18n("button.refresh"));
|
||||||
}
|
}
|
||||||
|
|
||||||
private String modifyVersion(String gameVersion, String version) {
|
private static String modifyVersion(String gameVersion, String version) {
|
||||||
return removeSuffix(removePrefix(removeSuffix(removePrefix(version.replace(gameVersion, "").trim(), "-"), "-"), "_"), "_");
|
return removeSuffix(removePrefix(removeSuffix(removePrefix(version.replace(gameVersion, "").trim(), "-"), "-"), "_"), "_");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -128,56 +118,13 @@ public final class MainPage extends StackPane implements DecoratorPage {
|
|||||||
item.setLibraries(libraries.toString());
|
item.setLibraries(libraries.toString());
|
||||||
});
|
});
|
||||||
item.setVersionName(id);
|
item.setVersionName(id);
|
||||||
item.setOnLaunchButtonClicked(e -> {
|
item.setOnLaunchButtonClicked(e -> Versions.launch(profile, id));
|
||||||
if (Accounts.getSelectedAccount() == null)
|
item.setOnScriptButtonClicked(e -> Versions.generateLaunchScript(profile, id));
|
||||||
Controllers.getLeftPaneController().checkAccount();
|
|
||||||
else
|
|
||||||
LauncherHelper.INSTANCE.launch(profile, Accounts.getSelectedAccount(), id, null);
|
|
||||||
});
|
|
||||||
item.setOnScriptButtonClicked(e -> {
|
|
||||||
if (Accounts.getSelectedAccount() == null)
|
|
||||||
Controllers.dialog(i18n("login.empty_username"));
|
|
||||||
else {
|
|
||||||
FileChooser chooser = new FileChooser();
|
|
||||||
if (repository.getRunDirectory(id).isDirectory())
|
|
||||||
chooser.setInitialDirectory(repository.getRunDirectory(id));
|
|
||||||
chooser.setTitle(i18n("version.launch_script.save"));
|
|
||||||
chooser.getExtensionFilters().add(OperatingSystem.CURRENT_OS == OperatingSystem.WINDOWS
|
|
||||||
? new FileChooser.ExtensionFilter(i18n("extension.bat"), "*.bat")
|
|
||||||
: new FileChooser.ExtensionFilter(i18n("extension.sh"), "*.sh"));
|
|
||||||
File file = chooser.showSaveDialog(Controllers.getStage());
|
|
||||||
if (file != null)
|
|
||||||
LauncherHelper.INSTANCE.launch(profile, Accounts.getSelectedAccount(), id, file);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
item.setOnSettingsButtonClicked(e -> {
|
item.setOnSettingsButtonClicked(e -> {
|
||||||
Controllers.getDecorator().showPage(Controllers.getVersionPage());
|
Controllers.getDecorator().showPage(Controllers.getVersionPage());
|
||||||
Controllers.getVersionPage().load(id, profile);
|
Controllers.getVersionPage().load(id, profile);
|
||||||
});
|
});
|
||||||
item.setOnUpdateButtonClicked(event -> {
|
item.setOnUpdateButtonClicked(event -> Versions.updateVersion(profile, id));
|
||||||
FileChooser chooser = new FileChooser();
|
|
||||||
chooser.setTitle(i18n("modpack.choose"));
|
|
||||||
chooser.getExtensionFilters().add(new FileChooser.ExtensionFilter(i18n("modpack"), "*.zip"));
|
|
||||||
File selectedFile = chooser.showOpenDialog(Controllers.getStage());
|
|
||||||
if (selectedFile != null) {
|
|
||||||
AtomicReference<Region> region = new AtomicReference<>();
|
|
||||||
try {
|
|
||||||
TaskExecutor executor = ModpackHelper.getUpdateTask(profile, selectedFile, id, ModpackHelper.readModpackConfiguration(repository.getModpackConfiguration(id)))
|
|
||||||
.then(Task.of(Schedulers.javafx(), () -> region.get().fireEvent(new DialogCloseEvent()))).executor();
|
|
||||||
region.set(Controllers.taskDialog(executor, i18n("modpack.update"), ""));
|
|
||||||
executor.start();
|
|
||||||
} catch (UnsupportedModpackException e) {
|
|
||||||
region.get().fireEvent(new DialogCloseEvent());
|
|
||||||
Controllers.dialog(i18n("modpack.unsupported"), i18n("message.error"), MessageBox.ERROR_MESSAGE);
|
|
||||||
} catch (MismatchedModpackTypeException e) {
|
|
||||||
region.get().fireEvent(new DialogCloseEvent());
|
|
||||||
Controllers.dialog(i18n("modpack.mismatched_type"), i18n("message.error"), MessageBox.ERROR_MESSAGE);
|
|
||||||
} catch (IOException e) {
|
|
||||||
region.get().fireEvent(new DialogCloseEvent());
|
|
||||||
Controllers.dialog(i18n("modpack.invalid"), i18n("message.error"), MessageBox.ERROR_MESSAGE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
item.setOnMouseClicked(event -> {
|
item.setOnMouseClicked(event -> {
|
||||||
if (event.getButton() == MouseButton.SECONDARY) {
|
if (event.getButton() == MouseButton.SECONDARY) {
|
||||||
JFXListView<String> versionList = new JFXListView<>();
|
JFXListView<String> versionList = new JFXListView<>();
|
||||||
@ -194,16 +141,16 @@ public final class MainPage extends StackPane implements DecoratorPage {
|
|||||||
versionPopup.hide();
|
versionPopup.hide();
|
||||||
switch (versionList.getSelectionModel().getSelectedIndex()) {
|
switch (versionList.getSelectionModel().getSelectedIndex()) {
|
||||||
case 0:
|
case 0:
|
||||||
VersionPage.renameVersion(profile, id);
|
Versions.renameVersion(profile, id);
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
VersionPage.deleteVersion(profile, id);
|
Versions.deleteVersion(profile, id);
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
VersionPage.exportVersion(profile, id);
|
Versions.exportVersion(profile, id);
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
FXUtils.openFolder(repository.getRunDirectory(id));
|
Versions.openFolder(profile, id);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@ -211,10 +158,7 @@ public final class MainPage extends StackPane implements DecoratorPage {
|
|||||||
});
|
});
|
||||||
versionPopup.show(item, JFXPopup.PopupVPosition.TOP, JFXPopup.PopupHPosition.LEFT, event.getX(), event.getY());
|
versionPopup.show(item, JFXPopup.PopupVPosition.TOP, JFXPopup.PopupHPosition.LEFT, event.getX(), event.getY());
|
||||||
} else if (event.getButton() == MouseButton.PRIMARY && event.getClickCount() == 2) {
|
} else if (event.getButton() == MouseButton.PRIMARY && event.getClickCount() == 2) {
|
||||||
if (Accounts.getSelectedAccount() == null)
|
Versions.launch(profile, id);
|
||||||
Controllers.dialog(i18n("login.empty_username"));
|
|
||||||
else
|
|
||||||
LauncherHelper.INSTANCE.launch(profile, Accounts.getSelectedAccount(), id, null);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
File iconFile = repository.getVersionIcon(id);
|
File iconFile = repository.getVersionIcon(id);
|
||||||
|
133
HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/Versions.java
Normal file
133
HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/Versions.java
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
/*
|
||||||
|
* Hello Minecraft! Launcher.
|
||||||
|
* Copyright (C) 2017 huangyuhui <huanghongxun2008@126.com>
|
||||||
|
*
|
||||||
|
* 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 {http://www.gnu.org/licenses/}.
|
||||||
|
*/
|
||||||
|
package org.jackhuang.hmcl.ui.versions;
|
||||||
|
|
||||||
|
import javafx.scene.layout.Region;
|
||||||
|
import javafx.stage.FileChooser;
|
||||||
|
import org.jackhuang.hmcl.game.GameRepository;
|
||||||
|
import org.jackhuang.hmcl.game.LauncherHelper;
|
||||||
|
import org.jackhuang.hmcl.game.ModpackHelper;
|
||||||
|
import org.jackhuang.hmcl.mod.MismatchedModpackTypeException;
|
||||||
|
import org.jackhuang.hmcl.mod.UnsupportedModpackException;
|
||||||
|
import org.jackhuang.hmcl.setting.Accounts;
|
||||||
|
import org.jackhuang.hmcl.setting.EnumGameDirectory;
|
||||||
|
import org.jackhuang.hmcl.setting.Profile;
|
||||||
|
import org.jackhuang.hmcl.task.Schedulers;
|
||||||
|
import org.jackhuang.hmcl.task.Task;
|
||||||
|
import org.jackhuang.hmcl.task.TaskExecutor;
|
||||||
|
import org.jackhuang.hmcl.ui.Controllers;
|
||||||
|
import org.jackhuang.hmcl.ui.FXUtils;
|
||||||
|
import org.jackhuang.hmcl.ui.construct.DialogCloseEvent;
|
||||||
|
import org.jackhuang.hmcl.ui.construct.MessageBox;
|
||||||
|
import org.jackhuang.hmcl.ui.export.ExportWizardProvider;
|
||||||
|
import org.jackhuang.hmcl.util.FileUtils;
|
||||||
|
import org.jackhuang.hmcl.util.OperatingSystem;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
|
|
||||||
|
import static org.jackhuang.hmcl.util.i18n.I18n.i18n;
|
||||||
|
|
||||||
|
public class Versions {
|
||||||
|
|
||||||
|
public static void deleteVersion(Profile profile, String version) {
|
||||||
|
boolean isIndependent = profile.getVersionSetting(version).getGameDirType() == EnumGameDirectory.VERSION_FOLDER;
|
||||||
|
boolean isMovingToTrashSupported = FileUtils.isMovingToTrashSupported();
|
||||||
|
String message = isIndependent ? i18n("version.manage.remove.confirm.independent", version) :
|
||||||
|
isMovingToTrashSupported ? i18n("version.manage.remove.confirm.trash", version, version + "_removed") :
|
||||||
|
i18n("version.manage.remove.confirm", version);
|
||||||
|
Controllers.confirmDialog(message, 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(i18n("version.manage.rename.message"), (res, resolve, reject) -> {
|
||||||
|
if (profile.getRepository().renameVersion(version, res)) {
|
||||||
|
profile.getRepository().refreshVersionsAsync().start();
|
||||||
|
Controllers.navigate(null);
|
||||||
|
resolve.run();
|
||||||
|
} else {
|
||||||
|
reject.accept(i18n("version.manage.rename.fail"));
|
||||||
|
}
|
||||||
|
}).setInitialText(version);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void exportVersion(Profile profile, String version) {
|
||||||
|
Controllers.getDecorator().startWizard(new ExportWizardProvider(profile, version), i18n("modpack.wizard"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void openFolder(Profile profile, String version) {
|
||||||
|
FXUtils.openFolder(profile.getRepository().getRunDirectory(version));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void updateVersion(Profile profile, String version) {
|
||||||
|
FileChooser chooser = new FileChooser();
|
||||||
|
chooser.setTitle(i18n("modpack.choose"));
|
||||||
|
chooser.getExtensionFilters().add(new FileChooser.ExtensionFilter(i18n("modpack"), "*.zip"));
|
||||||
|
File selectedFile = chooser.showOpenDialog(Controllers.getStage());
|
||||||
|
if (selectedFile != null) {
|
||||||
|
AtomicReference<Region> region = new AtomicReference<>();
|
||||||
|
try {
|
||||||
|
TaskExecutor executor = ModpackHelper.getUpdateTask(profile, selectedFile, version, ModpackHelper.readModpackConfiguration(profile.getRepository().getModpackConfiguration(version)))
|
||||||
|
.then(Task.of(Schedulers.javafx(), () -> region.get().fireEvent(new DialogCloseEvent()))).executor();
|
||||||
|
region.set(Controllers.taskDialog(executor, i18n("modpack.update"), ""));
|
||||||
|
executor.start();
|
||||||
|
} catch (UnsupportedModpackException e) {
|
||||||
|
region.get().fireEvent(new DialogCloseEvent());
|
||||||
|
Controllers.dialog(i18n("modpack.unsupported"), i18n("message.error"), MessageBox.ERROR_MESSAGE);
|
||||||
|
} catch (MismatchedModpackTypeException e) {
|
||||||
|
region.get().fireEvent(new DialogCloseEvent());
|
||||||
|
Controllers.dialog(i18n("modpack.mismatched_type"), i18n("message.error"), MessageBox.ERROR_MESSAGE);
|
||||||
|
} catch (IOException e) {
|
||||||
|
region.get().fireEvent(new DialogCloseEvent());
|
||||||
|
Controllers.dialog(i18n("modpack.invalid"), i18n("message.error"), MessageBox.ERROR_MESSAGE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void generateLaunchScript(Profile profile, String id) {
|
||||||
|
GameRepository repository = profile.getRepository();
|
||||||
|
|
||||||
|
if (Accounts.getSelectedAccount() == null)
|
||||||
|
Controllers.dialog(i18n("login.empty_username"));
|
||||||
|
else {
|
||||||
|
FileChooser chooser = new FileChooser();
|
||||||
|
if (repository.getRunDirectory(id).isDirectory())
|
||||||
|
chooser.setInitialDirectory(repository.getRunDirectory(id));
|
||||||
|
chooser.setTitle(i18n("version.launch_script.save"));
|
||||||
|
chooser.getExtensionFilters().add(OperatingSystem.CURRENT_OS == OperatingSystem.WINDOWS
|
||||||
|
? new FileChooser.ExtensionFilter(i18n("extension.bat"), "*.bat")
|
||||||
|
: new FileChooser.ExtensionFilter(i18n("extension.sh"), "*.sh"));
|
||||||
|
File file = chooser.showSaveDialog(Controllers.getStage());
|
||||||
|
if (file != null)
|
||||||
|
LauncherHelper.INSTANCE.launch(profile, Accounts.getSelectedAccount(), id, file);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void launch(Profile profile, String id) {
|
||||||
|
if (Accounts.getSelectedAccount() == null)
|
||||||
|
Controllers.getLeftPaneController().checkAccount();
|
||||||
|
else
|
||||||
|
LauncherHelper.INSTANCE.launch(profile, Accounts.getSelectedAccount(), id, null);
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user