diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAccountPane.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAccountPane.java index 7fc653ed2..18dee5651 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAccountPane.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAccountPane.java @@ -46,6 +46,7 @@ import org.jackhuang.hmcl.ui.animation.ContainerAnimations; import org.jackhuang.hmcl.ui.animation.TransitionHandler; import org.jackhuang.hmcl.ui.construct.AdvancedListBox; import org.jackhuang.hmcl.ui.construct.IconedItem; +import org.jackhuang.hmcl.ui.construct.SpinnerPane; import org.jackhuang.hmcl.ui.construct.Validator; import org.jackhuang.hmcl.util.Constants; import org.jackhuang.hmcl.util.Logging; @@ -71,22 +72,17 @@ public class AddAccountPane extends StackPane { @FXML private Hyperlink linkManageInjectorServers; @FXML private JFXDialogLayout layout; @FXML private JFXButton btnAccept; - @FXML private StackPane acceptPane; - @FXML private JFXSpinner spinnerAccept; + @FXML private SpinnerPane acceptPane; private final Consumer finalization; - private final TransitionHandler transitionHandler; public AddAccountPane(Consumer finalization) { this.finalization = finalization; FXUtils.loadFXML(this, "/assets/fxml/account-add.fxml"); - transitionHandler = new TransitionHandler(acceptPane); - acceptPane.getChildren().setAll(btnAccept); - cboServers.setCellFactory(jfxListCellFactory(server -> new TwoLineListItem(server.getName(), server.getUrl()))); cboServers.setConverter(stringConverter(AuthlibInjectorServer::getName)); - cboServers.setItems(Settings.INSTANCE.SETTINGS.authlibInjectorServers); + cboServers.setItems(Settings.SETTINGS.authlibInjectorServers); // workaround: otherwise the combox will be black if (!cboServers.getItems().isEmpty()) @@ -115,14 +111,6 @@ public class AddAccountPane extends StackPane { btnAccept.setDisable(!txtUsername.validate() || (cboType.getSelectionModel().getSelectedIndex() != 0 && !txtPassword.validate())); } - private void showSpinner() { - transitionHandler.setContent(spinnerAccept, ContainerAnimations.FADE.getAnimationProducer()); - } - - private void hideSpinner() { - transitionHandler.setContent(btnAccept, ContainerAnimations.FADE.getAnimationProducer()); - } - @FXML private void onCreationAccept() { String username = txtUsername.getText(); @@ -154,13 +142,13 @@ public class AddAccountPane extends StackPane { throw new Error(); } - showSpinner(); + acceptPane.showSpinner(); lblCreationWarning.setText(""); Task.ofResult("create_account", () -> factory.create(new Selector(), username, password, addtionalData, Settings.INSTANCE.getProxy())) .finalized(Schedulers.javafx(), variables -> { Settings.INSTANCE.addAccount(variables.get("create_account")); - hideSpinner(); + acceptPane.hideSpinner(); finalization.accept(this); }, exception -> { if (exception instanceof NoSelectedCharacterException) { @@ -168,7 +156,7 @@ public class AddAccountPane extends StackPane { } else { lblCreationWarning.setText(accountException(exception)); } - hideSpinner(); + acceptPane.hideSpinner(); }).start(); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AuthlibInjectorServersPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AuthlibInjectorServersPage.java index 05d2309d4..cca912d5a 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AuthlibInjectorServersPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AuthlibInjectorServersPage.java @@ -16,6 +16,7 @@ import org.jackhuang.hmcl.task.Schedulers; import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.ui.animation.ContainerAnimations; import org.jackhuang.hmcl.ui.animation.TransitionHandler; +import org.jackhuang.hmcl.ui.construct.SpinnerPane; import org.jackhuang.hmcl.ui.wizard.DecoratorPage; import org.jackhuang.hmcl.util.NetworkUtils; @@ -36,7 +37,7 @@ public class AuthlibInjectorServersPage extends StackPane implements DecoratorPa @FXML private JFXDialogLayout confirmServerPane; @FXML private JFXDialog dialog; @FXML private StackPane contentPane; - @FXML private JFXProgressBar progressBar; + @FXML private SpinnerPane nextPane; @FXML private JFXButton btnAddNext; private final TransitionHandler transitionHandler; @@ -58,16 +59,16 @@ public class AuthlibInjectorServersPage extends StackPane implements DecoratorPa } private void removeServer(AuthlibInjectorServerItem item) { - Settings.INSTANCE.SETTINGS.authlibInjectorServers.remove(item.getServer()); + Settings.SETTINGS.authlibInjectorServers.remove(item.getServer()); reload(); } private void reload() { listPane.getChildren().setAll( - Settings.INSTANCE.SETTINGS.authlibInjectorServers.stream() + Settings.SETTINGS.authlibInjectorServers.stream() .map(server -> new AuthlibInjectorServerItem(server, this::removeServer)) .collect(toList())); - if (Settings.INSTANCE.SETTINGS.authlibInjectorServers.isEmpty()) { + if (Settings.SETTINGS.authlibInjectorServers.isEmpty()) { onAdd(); } } @@ -79,7 +80,7 @@ public class AuthlibInjectorServersPage extends StackPane implements DecoratorPa txtServerUrl.resetValidation(); lblCreationWarning.setText(""); addServerPane.setDisable(false); - progressBar.setVisible(false); + nextPane.hideSpinner(); dialog.show(); } @@ -92,13 +93,13 @@ public class AuthlibInjectorServersPage extends StackPane implements DecoratorPa private void onAddNext() { String url = fixInputUrl(txtServerUrl.getText()); - progressBar.setVisible(true); + nextPane.showSpinner(); addServerPane.setDisable(true); Task.of(() -> { serverBeingAdded = new AuthlibInjectorServer(url, Accounts.getAuthlibInjectorServerName(url)); }).finalized(Schedulers.javafx(), (variables, isDependentsSucceeded) -> { - progressBar.setVisible(false); + nextPane.hideSpinner(); addServerPane.setDisable(false); if (isDependentsSucceeded) { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/SpinnerPane.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/SpinnerPane.java new file mode 100644 index 000000000..6b297dd9c --- /dev/null +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/SpinnerPane.java @@ -0,0 +1,61 @@ +/* + * Hello Minecraft! Launcher. + * Copyright (C) 2017 huangyuhui + * + * 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 com.jfoenix.controls.JFXSpinner; +import javafx.beans.DefaultProperty; +import javafx.beans.property.ObjectProperty; +import javafx.beans.property.SimpleObjectProperty; +import javafx.scene.Node; +import javafx.scene.layout.StackPane; +import org.jackhuang.hmcl.ui.animation.ContainerAnimations; +import org.jackhuang.hmcl.ui.animation.TransitionHandler; + +@DefaultProperty("content") +public class SpinnerPane extends StackPane { + private final TransitionHandler transitionHandler = new TransitionHandler(this); + private final JFXSpinner spinner = new JFXSpinner(); + private final StackPane contentPane = new StackPane(); + private final ObjectProperty content = new SimpleObjectProperty<>(this, "content"); + + public SpinnerPane() { + getChildren().setAll(contentPane); + + content.addListener((a, b, newValue) -> contentPane.getChildren().setAll(newValue)); + } + + public void showSpinner() { + transitionHandler.setContent(spinner, ContainerAnimations.FADE.getAnimationProducer()); + } + + public void hideSpinner() { + transitionHandler.setContent(contentPane, ContainerAnimations.FADE.getAnimationProducer()); + } + + public Node getContent() { + return content.get(); + } + + public ObjectProperty contentProperty() { + return content; + } + + public void setContent(Node content) { + this.content.set(content); + } +} diff --git a/HMCL/src/main/resources/assets/css/root.css b/HMCL/src/main/resources/assets/css/root.css index 5fe3cea5d..ba02a24fb 100644 --- a/HMCL/src/main/resources/assets/css/root.css +++ b/HMCL/src/main/resources/assets/css/root.css @@ -919,6 +919,14 @@ -fx-stroke-width: 3.0; } +.small-spinner-pane .jfx-spinner { + -jfx-radius: 10; +} + +.small-spinner-pane .jfx-spinner > .arc { + -fx-stroke-width: 3.0; +} + .second-spinner { -jfx-radius: 30; } diff --git a/HMCL/src/main/resources/assets/fxml/account-add.fxml b/HMCL/src/main/resources/assets/fxml/account-add.fxml index 7cd0320dd..cabe52503 100644 --- a/HMCL/src/main/resources/assets/fxml/account-add.fxml +++ b/HMCL/src/main/resources/assets/fxml/account-add.fxml @@ -5,6 +5,7 @@ + @@ -56,10 +57,9 @@ diff --git a/HMCL/src/main/resources/assets/fxml/authlib-injector-servers.fxml b/HMCL/src/main/resources/assets/fxml/authlib-injector-servers.fxml index e5b4715bd..9695e832c 100644 --- a/HMCL/src/main/resources/assets/fxml/authlib-injector-servers.fxml +++ b/HMCL/src/main/resources/assets/fxml/authlib-injector-servers.fxml @@ -5,6 +5,7 @@ + @@ -47,7 +48,9 @@ @@ -77,7 +80,6 @@ -