This commit is contained in:
huangyuhui 2018-03-05 19:02:13 +08:00
parent 41d313baff
commit db08b61cfa
10 changed files with 104 additions and 36 deletions

View File

@ -100,7 +100,6 @@ public final class LauncherHelper {
} }
} catch (AuthenticationException e) { } catch (AuthenticationException e) {
variables.set("account", DialogController.logIn(account)); variables.set("account", DialogController.logIn(account));
JFXUtilities.runInFX(() -> Controllers.dialog(launchingStepsPane));
} }
})) }))
.then(Task.of(Schedulers.javafx(), () -> emitStatus(LoadingState.LAUNCHING))) .then(Task.of(Schedulers.javafx(), () -> emitStatus(LoadingState.LAUNCHING)))
@ -132,8 +131,10 @@ public final class LauncherHelper {
Controllers.closeDialog(); Controllers.closeDialog();
}); });
} else } else
Platform.runLater(() -> Platform.runLater(() -> {
Controllers.dialog(Launcher.i18n("version.launch_script.success", scriptFile.getAbsolutePath()))); Controllers.closeDialog();
Controllers.dialog(Launcher.i18n("version.launch_script.success", scriptFile.getAbsolutePath()));
});
})) }))
.executor(); .executor();
@ -153,12 +154,11 @@ public final class LauncherHelper {
public void onStop(boolean success, TaskExecutor executor) { public void onStop(boolean success, TaskExecutor executor) {
if (!success) { if (!success) {
Platform.runLater(() -> { Platform.runLater(() -> {
Controllers.closeDialog();
if (executor.getLastException() != null) if (executor.getLastException() != null)
Controllers.dialog(I18nException.getStackTrace(executor.getLastException()), Controllers.dialog(I18nException.getStackTrace(executor.getLastException()),
scriptFile == null ? Launcher.i18n("launch.failed") : Launcher.i18n("version.launch_script.failed"), scriptFile == null ? Launcher.i18n("launch.failed") : Launcher.i18n("version.launch_script.failed"),
MessageBox.ERROR_MESSAGE, Controllers::closeDialog); MessageBox.ERROR_MESSAGE, Controllers::closeDialog);
else
Controllers.closeDialog();
}); });
} }
launchingStepsPane.setExecutor(null); launchingStepsPane.setExecutor(null);
@ -180,28 +180,28 @@ public final class LauncherHelper {
flag = true; flag = true;
} }
if (java.getParsedVersion() < JavaVersion.JAVA_8) { if (!flag && java.getParsedVersion() < JavaVersion.JAVA_8) {
Controllers.dialog(Launcher.i18n("launch.advice.newer_java"), Launcher.i18n("message.error"), MessageBox.ERROR_MESSAGE, onAccept); Controllers.dialog(Launcher.i18n("launch.advice.newer_java"), Launcher.i18n("message.error"), MessageBox.ERROR_MESSAGE, onAccept);
flag = true; flag = true;
} }
if (java.getParsedVersion() >= JavaVersion.JAVA_9 && gameVersion.compareTo(VersionNumber.asVersion("1.12.5")) < 0 && version.getMainClass().contains("launchwrapper")) { if (!flag && java.getParsedVersion() >= JavaVersion.JAVA_9 && gameVersion.compareTo(VersionNumber.asVersion("1.12.5")) < 0 && version.getMainClass().contains("launchwrapper")) {
Controllers.dialog(Launcher.i18n("launch.advice.java9"), Launcher.i18n("message.error"), MessageBox.ERROR_MESSAGE, null); Controllers.dialog(Launcher.i18n("launch.advice.java9"), Launcher.i18n("message.error"), MessageBox.ERROR_MESSAGE, null);
suggest = false; suggest = false;
flag = true; flag = true;
} }
if (java.getPlatform() == org.jackhuang.hmcl.util.Platform.BIT_32 && if (!flag && java.getPlatform() == org.jackhuang.hmcl.util.Platform.BIT_32 &&
org.jackhuang.hmcl.util.Platform.IS_64_BIT) { org.jackhuang.hmcl.util.Platform.IS_64_BIT) {
Controllers.dialog(Launcher.i18n("launch.advice.different_platform"), Launcher.i18n("message.error"), MessageBox.ERROR_MESSAGE, onAccept); Controllers.dialog(Launcher.i18n("launch.advice.different_platform"), Launcher.i18n("message.error"), MessageBox.ERROR_MESSAGE, onAccept);
flag = true; flag = true;
} }
if (java.getPlatform() == org.jackhuang.hmcl.util.Platform.BIT_32 && if (!flag && java.getPlatform() == org.jackhuang.hmcl.util.Platform.BIT_32 &&
setting.getMaxMemory() > 1.5 * 1024) { setting.getMaxMemory() > 1.5 * 1024) {
Controllers.dialog(Launcher.i18n("launch.advice.too_large_memory_for_32bit"), Launcher.i18n("message.error"), MessageBox.ERROR_MESSAGE, onAccept); Controllers.dialog(Launcher.i18n("launch.advice.too_large_memory_for_32bit"), Launcher.i18n("message.error"), MessageBox.ERROR_MESSAGE, onAccept);
flag = true; flag = true;
} }
if (OperatingSystem.TOTAL_MEMORY > 0 && OperatingSystem.TOTAL_MEMORY < setting.getMaxMemory()) { if (!flag && OperatingSystem.TOTAL_MEMORY > 0 && OperatingSystem.TOTAL_MEMORY < setting.getMaxMemory()) {
Controllers.dialog(Launcher.i18n("launch.advice.not_enough_space", OperatingSystem.TOTAL_MEMORY), Launcher.i18n("message.error"), MessageBox.ERROR_MESSAGE, onAccept); Controllers.dialog(Launcher.i18n("launch.advice.not_enough_space", OperatingSystem.TOTAL_MEMORY), Launcher.i18n("message.error"), MessageBox.ERROR_MESSAGE, onAccept);
flag = true; flag = true;
} }
@ -219,10 +219,8 @@ public final class LauncherHelper {
} }
public void emitStatus(LoadingState state) { public void emitStatus(LoadingState state) {
launchingStepsPane.setTitle(state.getLocalizedMessage()); launchingStepsPane.setTitle(state.getLocalizedMessage());
launchingStepsPane.setSubtitle((state.ordinal() + 1) + " / " + LoadingState.values().length); launchingStepsPane.setSubtitle((state.ordinal() + 1) + " / " + LoadingState.values().length);
Controllers.dialog(launchingStepsPane);
} }
private void checkExit(LauncherVisibility v) { private void checkExit(LauncherVisibility v) {

View File

@ -33,6 +33,7 @@ import org.jackhuang.hmcl.ui.construct.MessageBox;
import org.jackhuang.hmcl.ui.construct.MessageDialogPane; import org.jackhuang.hmcl.ui.construct.MessageDialogPane;
import org.jackhuang.hmcl.ui.construct.TaskExecutorDialogPane; import org.jackhuang.hmcl.ui.construct.TaskExecutorDialogPane;
import org.jackhuang.hmcl.util.JavaVersion; import org.jackhuang.hmcl.util.JavaVersion;
import org.jackhuang.hmcl.util.Lang;
import java.util.function.Consumer; import java.util.function.Consumer;
@ -122,7 +123,7 @@ public final class Controllers {
public static JFXDialog dialog(Region content) { public static JFXDialog dialog(Region content) {
// TODO: temp fix // TODO: temp fix
decorator.showDialog(new Region()); decorator.showDialog(Lang.apply(new Region(), region -> region.getProperties().put("controllers", true)));
return decorator.showDialog(content); return decorator.showDialog(content);
} }
@ -150,12 +151,15 @@ public final class Controllers {
dialog(new InputDialogPane(text, decorator.getDialog(), onResult)); dialog(new InputDialogPane(text, decorator.getDialog(), onResult));
} }
public static void taskDialog(TaskExecutor executor, String title, String subtitle) {
taskDialog(executor, title, subtitle, null);
}
public static void taskDialog(TaskExecutor executor, String title, String subtitle, Runnable onCancel) { public static void taskDialog(TaskExecutor executor, String title, String subtitle, Runnable onCancel) {
TaskExecutorDialogPane pane = new TaskExecutorDialogPane(onCancel); TaskExecutorDialogPane pane = new TaskExecutorDialogPane(onCancel);
pane.setTitle(title); pane.setTitle(title);
pane.setSubtitle(subtitle); pane.setSubtitle(subtitle);
pane.setExecutor(executor); pane.setExecutor(executor);
executor.start();
dialog(pane); dialog(pane);
} }

View File

@ -17,6 +17,7 @@
*/ */
package org.jackhuang.hmcl.ui; package org.jackhuang.hmcl.ui;
import com.jfoenix.concurrency.JFXUtilities;
import com.jfoenix.controls.JFXButton; import com.jfoenix.controls.JFXButton;
import com.jfoenix.controls.JFXDialog; import com.jfoenix.controls.JFXDialog;
import com.jfoenix.controls.JFXDrawer; import com.jfoenix.controls.JFXDrawer;
@ -53,6 +54,7 @@ import org.jackhuang.hmcl.ui.animation.AnimationProducer;
import org.jackhuang.hmcl.ui.animation.ContainerAnimations; import org.jackhuang.hmcl.ui.animation.ContainerAnimations;
import org.jackhuang.hmcl.ui.animation.TransitionHandler; import org.jackhuang.hmcl.ui.animation.TransitionHandler;
import org.jackhuang.hmcl.ui.construct.AdvancedListBox; import org.jackhuang.hmcl.ui.construct.AdvancedListBox;
import org.jackhuang.hmcl.ui.construct.StackContainerPane;
import org.jackhuang.hmcl.ui.construct.TaskExecutorDialogWizardDisplayer; import org.jackhuang.hmcl.ui.construct.TaskExecutorDialogWizardDisplayer;
import org.jackhuang.hmcl.ui.wizard.*; import org.jackhuang.hmcl.ui.wizard.*;
import org.jackhuang.hmcl.util.FileUtils; import org.jackhuang.hmcl.util.FileUtils;
@ -82,11 +84,13 @@ public final class Decorator extends StackPane implements TaskExecutorDialogWiza
private final boolean max, min; private final boolean max, min;
private final WizardController wizardController = new WizardController(this); private final WizardController wizardController = new WizardController(this);
private final Queue<Object> cancelQueue = new ConcurrentLinkedQueue<>(); private final Queue<Object> cancelQueue = new ConcurrentLinkedQueue<>();
private final JFXDialog dialog;
private double xOffset, yOffset, newX, newY, initX, initY; private double xOffset, yOffset, newX, newY, initX, initY;
private boolean allowMove, isDragging, dialogShown, maximized; private boolean allowMove, isDragging, maximized;
private BoundingBox originalBox, maximizedBox; private BoundingBox originalBox, maximizedBox;
private final TransitionHandler animationHandler; private final TransitionHandler animationHandler;
private final StackContainerPane dialogPane = new StackContainerPane();
@FXML @FXML
private StackPane contentPlaceHolder; private StackPane contentPlaceHolder;
@ -119,8 +123,6 @@ public final class Decorator extends StackPane implements TaskExecutorDialogWiza
@FXML @FXML
private JFXHamburger titleBurger; private JFXHamburger titleBurger;
@FXML @FXML
private JFXDialog dialog;
@FXML
private JFXButton btnMin; private JFXButton btnMin;
@FXML @FXML
private JFXButton btnMax; private JFXButton btnMax;
@ -165,9 +167,21 @@ public final class Decorator extends StackPane implements TaskExecutorDialogWiza
btnMax.fire(); btnMax.fire();
}); });
dialog = new JFXDialog() {
@Override
public void close() {
dialogPane.pop();
if (dialogPane.getChildren().isEmpty())
Platform.runLater(() -> {
if (dialogPane.getChildren().isEmpty())
super.close();
});
}
};
dialog.setOverlayClose(false);
drawerWrapper.getChildren().add(0, dialog);
dialog.setDialogContainer(drawerWrapper); dialog.setDialogContainer(drawerWrapper);
dialog.setOnDialogClosed(e -> dialogShown = false); dialog.setContent(dialogPane);
dialog.setOnDialogOpened(e -> dialogShown = true);
if (!min) buttonsContainer.getChildren().remove(btnMin); if (!min) buttonsContainer.getChildren().remove(btnMin);
if (!max) buttonsContainer.getChildren().remove(btnMax); if (!max) buttonsContainer.getChildren().remove(btnMax);
@ -531,10 +545,10 @@ public final class Decorator extends StackPane implements TaskExecutorDialogWiza
} }
} }
public JFXDialog showDialog(Region content) { public JFXDialog showDialog(Node node) {
dialog.setContent(content); if (dialogPane.isEmpty())
if (!dialogShown)
dialog.show(); dialog.show();
dialogPane.push(node);
return dialog; return dialog;
} }

View File

@ -20,6 +20,7 @@ package org.jackhuang.hmcl.ui;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.scene.control.ScrollPane; import javafx.scene.control.ScrollPane;
import javafx.scene.layout.VBox; import javafx.scene.layout.VBox;
import org.jackhuang.hmcl.Launcher;
import org.jackhuang.hmcl.download.MaintainTask; import org.jackhuang.hmcl.download.MaintainTask;
import org.jackhuang.hmcl.download.game.VersionJsonSaveTask; import org.jackhuang.hmcl.download.game.VersionJsonSaveTask;
import org.jackhuang.hmcl.game.GameVersion; import org.jackhuang.hmcl.game.GameVersion;
@ -89,7 +90,7 @@ public class InstallerController {
Optional<String> gameVersion = GameVersion.minecraftVersion(profile.getRepository().getVersionJar(version)); Optional<String> gameVersion = GameVersion.minecraftVersion(profile.getRepository().getVersionJar(version));
if (!gameVersion.isPresent()) if (!gameVersion.isPresent())
Controllers.dialog("version.cannot_read"); Controllers.dialog(Launcher.i18n("version.cannot_read"));
else else
Controllers.getDecorator().startWizard(new InstallerWizardProvider(profile, gameVersion.get(), version, forge, liteLoader, optiFine)); Controllers.getDecorator().startWizard(new InstallerWizardProvider(profile, gameVersion.get(), version, forge, liteLoader, optiFine));
} }

View File

@ -208,7 +208,7 @@ public final class LeftPaneController {
.with(Task.of(Schedulers.javafx(), () -> { .with(Task.of(Schedulers.javafx(), () -> {
Controllers.closeDialog(); Controllers.closeDialog();
checkAccount(); checkAccount();
})).executor(), })).executor(true),
Launcher.i18n("modpack.installing"), "", null); Launcher.i18n("modpack.installing"), "", null);
flag = false; flag = false;
} catch (UnsupportedModpackException ignore) { } catch (UnsupportedModpackException ignore) {

View File

@ -147,19 +147,18 @@ public final class MainPage extends StackPane implements DecoratorPage {
chooser.getExtensionFilters().add(new FileChooser.ExtensionFilter(Launcher.i18n("modpack"), "*.zip")); chooser.getExtensionFilters().add(new FileChooser.ExtensionFilter(Launcher.i18n("modpack"), "*.zip"));
File selectedFile = chooser.showOpenDialog(Controllers.getStage()); File selectedFile = chooser.showOpenDialog(Controllers.getStage());
if (selectedFile != null) { if (selectedFile != null) {
TaskExecutorDialogPane pane = new TaskExecutorDialogPane(null);
try { try {
TaskExecutor executor = ModpackHelper.getUpdateTask(profile, selectedFile, id, ModpackHelper.readModpackConfiguration(repository.getModpackConfiguration(id))) TaskExecutor executor = ModpackHelper.getUpdateTask(profile, selectedFile, id, ModpackHelper.readModpackConfiguration(repository.getModpackConfiguration(id)))
.then(Task.of(Schedulers.javafx(), Controllers::closeDialog)).executor(); .then(Task.of(Schedulers.javafx(), Controllers::closeDialog)).executor(true);
pane.setExecutor(executor); Controllers.taskDialog(executor, Launcher.i18n("modpack.update"), "", null);
pane.setTitle(Launcher.i18n("modpack.update"));
executor.start();
Controllers.dialog(pane);
} catch (UnsupportedModpackException e) { } catch (UnsupportedModpackException e) {
Controllers.closeDialog();
Controllers.dialog(Launcher.i18n("modpack.unsupported"), Launcher.i18n("message.error"), MessageBox.ERROR_MESSAGE); Controllers.dialog(Launcher.i18n("modpack.unsupported"), Launcher.i18n("message.error"), MessageBox.ERROR_MESSAGE);
} catch (MismatchedModpackTypeException e) { } catch (MismatchedModpackTypeException e) {
Controllers.closeDialog();
Controllers.dialog(Launcher.i18n("modpack.mismatched_type"), Launcher.i18n("message.error"), MessageBox.ERROR_MESSAGE); Controllers.dialog(Launcher.i18n("modpack.mismatched_type"), Launcher.i18n("message.error"), MessageBox.ERROR_MESSAGE);
} catch (IOException e) { } catch (IOException e) {
Controllers.closeDialog();
Controllers.dialog(Launcher.i18n("modpack.invalid"), Launcher.i18n("message.error"), MessageBox.ERROR_MESSAGE); Controllers.dialog(Launcher.i18n("modpack.invalid"), Launcher.i18n("message.error"), MessageBox.ERROR_MESSAGE);
} }
} }

View File

@ -0,0 +1,45 @@
/*
* 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.construct;
import javafx.scene.Node;
import javafx.scene.layout.StackPane;
import java.util.Stack;
public class StackContainerPane extends StackPane {
private final Stack<Node> stack = new Stack<>();
public void push(Node node) {
if (node.getProperties().containsKey("controllers"))
stack.push(node);
getChildren().setAll(node);
}
public void pop() {
stack.pop();
if (stack.isEmpty())
getChildren().setAll();
else
getChildren().setAll(stack.peek());
}
public boolean isEmpty() {
return stack.isEmpty();
}
}

View File

@ -24,6 +24,7 @@ import org.jackhuang.hmcl.Launcher;
import org.jackhuang.hmcl.task.FileDownloadTask; import org.jackhuang.hmcl.task.FileDownloadTask;
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.Controllers; import org.jackhuang.hmcl.ui.Controllers;
import org.jackhuang.hmcl.ui.construct.MessageBox; import org.jackhuang.hmcl.ui.construct.MessageBox;
import org.jackhuang.hmcl.util.*; import org.jackhuang.hmcl.util.*;
@ -130,13 +131,15 @@ public class AppDataUpgrader extends IUpgrader {
String hash = null; String hash = null;
if (map.containsKey("packsha1")) if (map.containsKey("packsha1"))
hash = map.get("packsha1"); hash = map.get("packsha1");
JFXUtilities.runInFX(() -> Controllers.dialog(Launcher.i18n("message.downloading"))); Task task = new AppDataUpgraderPackGzTask(NetworkUtils.toURL(map.get("pack")), version.toString(), hash);
if (new AppDataUpgraderPackGzTask(NetworkUtils.toURL(map.get("pack")), version.toString(), hash).test()) { TaskExecutor executor = task.executor();
JFXUtilities.runInFX(() -> Controllers.taskDialog(executor, Launcher.i18n("message.downloading"), "", null));
if (executor.test()) {
new ProcessBuilder(JavaVersion.fromCurrentEnvironment().getBinary().getAbsolutePath(), "-jar", AppDataUpgraderPackGzTask.getSelf(version.toString()).getAbsolutePath()) new ProcessBuilder(JavaVersion.fromCurrentEnvironment().getBinary().getAbsolutePath(), "-jar", AppDataUpgraderPackGzTask.getSelf(version.toString()).getAbsolutePath())
.directory(new File("").getAbsoluteFile()).start(); .directory(new File("").getAbsoluteFile()).start();
System.exit(0); System.exit(0);
} }
Controllers.closeDialog(); JFXUtilities.runInFX(Controllers::closeDialog);
} catch (IOException ex) { } catch (IOException ex) {
Logging.LOG.log(Level.SEVERE, "Failed to create upgrader", ex); Logging.LOG.log(Level.SEVERE, "Failed to create upgrader", ex);
} }
@ -147,8 +150,6 @@ public class AppDataUpgrader extends IUpgrader {
url = map.get(OperatingSystem.CURRENT_OS.getCheckedName()); url = map.get(OperatingSystem.CURRENT_OS.getCheckedName());
else if (map.containsKey(OperatingSystem.UNKNOWN.getCheckedName())) else if (map.containsKey(OperatingSystem.UNKNOWN.getCheckedName()))
url = map.get(OperatingSystem.UNKNOWN.getCheckedName()); url = map.get(OperatingSystem.UNKNOWN.getCheckedName());
if (url == null)
url = Launcher.PUBLISH;
try { try {
java.awt.Desktop.getDesktop().browse(new URI(url)); java.awt.Desktop.getDesktop().browse(new URI(url));
} catch (URISyntaxException | IOException e) { } catch (URISyntaxException | IOException e) {

View File

@ -20,7 +20,6 @@
maxWidth="800"> maxWidth="800">
<center> <center>
<StackPane fx:id="drawerWrapper" styleClass="jfx-decorator-drawer" FXUtils.overflowHidden="true"> <StackPane fx:id="drawerWrapper" styleClass="jfx-decorator-drawer" FXUtils.overflowHidden="true">
<JFXDialog fx:id="dialog" overlayClose="false" />
<BorderPane> <BorderPane>
<left> <left>
<StackPane minWidth="200" maxWidth="200" styleClass="jfx-decorator-content-container"> <StackPane minWidth="200" maxWidth="200" styleClass="jfx-decorator-content-container">

View File

@ -205,6 +205,13 @@ public abstract class Task {
return new TaskExecutor(this); return new TaskExecutor(this);
} }
public final TaskExecutor executor(boolean start) {
TaskExecutor executor = new TaskExecutor(this);
if (start)
executor.start();
return executor;
}
public final TaskExecutor executor(TaskListener taskListener) { public final TaskExecutor executor(TaskListener taskListener) {
TaskExecutor executor = new TaskExecutor(this); TaskExecutor executor = new TaskExecutor(this);
executor.addTaskListener(taskListener); executor.addTaskListener(taskListener);