diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/AccountAdvancedListItem.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/AccountAdvancedListItem.java index dd6225ab8..3aca65468 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/AccountAdvancedListItem.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/AccountAdvancedListItem.java @@ -17,6 +17,7 @@ */ package org.jackhuang.hmcl.ui.account; +import javafx.beans.binding.Bindings; import javafx.beans.property.ObjectProperty; import javafx.beans.property.SimpleObjectProperty; import javafx.scene.image.Image; @@ -37,12 +38,13 @@ public class AccountAdvancedListItem extends AdvancedListItem { protected void invalidated() { Account account = get(); if (account == null) { + titleProperty().unbind(); setTitle(i18n("account.missing")); setSubtitle(i18n("account.missing.add")); imageProperty().unbind(); setImage(new Image("/assets/img/craft_table.png")); } else { - setTitle(account.getCharacter()); + titleProperty().bind(Bindings.createStringBinding(account::getCharacter, account)); setSubtitle(accountSubtitle(account)); imageProperty().bind(TexturesLoader.fxAvatarBinding(account, 32)); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/AccountListItem.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/AccountListItem.java index b6f3c82d4..1d1e92fef 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/AccountListItem.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/AccountListItem.java @@ -17,19 +17,28 @@ */ package org.jackhuang.hmcl.ui.account; +import javafx.beans.binding.Bindings; +import javafx.beans.binding.StringBinding; import javafx.beans.property.*; import javafx.scene.control.RadioButton; import javafx.scene.control.Skin; import javafx.scene.image.Image; import org.jackhuang.hmcl.auth.Account; +import org.jackhuang.hmcl.auth.AuthenticationException; +import org.jackhuang.hmcl.auth.CredentialExpiredException; import org.jackhuang.hmcl.auth.authlibinjector.AuthlibInjectorAccount; import org.jackhuang.hmcl.auth.authlibinjector.AuthlibInjectorServer; import org.jackhuang.hmcl.auth.offline.OfflineAccount; import org.jackhuang.hmcl.game.TexturesLoader; import org.jackhuang.hmcl.setting.Accounts; +import org.jackhuang.hmcl.ui.DialogController; +import static org.jackhuang.hmcl.util.Lang.thread; +import static org.jackhuang.hmcl.util.Logging.LOG; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; +import java.util.logging.Level; + public class AccountListItem extends RadioButton { private final Account account; @@ -42,17 +51,22 @@ public class AccountListItem extends RadioButton { getStyleClass().clear(); setUserData(account); - StringBuilder subtitleString = new StringBuilder(Accounts.getLocalizedLoginTypeName(Accounts.getAccountFactory(account))); + String loginTypeName = Accounts.getLocalizedLoginTypeName(Accounts.getAccountFactory(account)); if (account instanceof AuthlibInjectorAccount) { AuthlibInjectorServer server = ((AuthlibInjectorAccount) account).getServer(); - subtitleString.append(", ").append(i18n("account.injector.server")).append(": ").append(server.getName()); + subtitle.bind(Bindings.concat( + loginTypeName, ", ", i18n("account.injector.server"), ": ", + Bindings.createStringBinding(server::getName, server))); + } else { + subtitle.set(loginTypeName); } - if (account instanceof OfflineAccount) - title.set(account.getCharacter()); - else - title.set(account.getUsername() + " - " + account.getCharacter()); - subtitle.set(subtitleString.toString()); + StringBinding characterName = Bindings.createStringBinding(account::getCharacter, account); + if (account instanceof OfflineAccount) { + title.bind(characterName); + } else { + title.bind(Bindings.concat(account.getUsername(), " - ", characterName)); + } image.bind(TexturesLoader.fxAvatarBinding(account, 32)); } @@ -64,6 +78,19 @@ public class AccountListItem extends RadioButton { public void refresh() { account.clearCache(); + thread(() -> { + try { + account.logIn(); + } catch (CredentialExpiredException e) { + try { + DialogController.logIn(account); + } catch (Exception e1) { + LOG.log(Level.WARNING, "Failed to refresh " + account + " with password", e1); + } + } catch (AuthenticationException e) { + LOG.log(Level.WARNING, "Failed to refresh " + account + " with token", e); + } + }); } public void remove() { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/AuthlibInjectorServerItem.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/AuthlibInjectorServerItem.java index 3f261e070..f8a777695 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/AuthlibInjectorServerItem.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/AuthlibInjectorServerItem.java @@ -19,6 +19,8 @@ package org.jackhuang.hmcl.ui.account; import com.jfoenix.controls.JFXButton; import com.jfoenix.effects.JFXDepthManager; + +import javafx.beans.binding.Bindings; import javafx.geometry.Pos; import javafx.scene.control.Label; import javafx.scene.layout.BorderPane; @@ -33,17 +35,17 @@ public final class AuthlibInjectorServerItem extends BorderPane { private final AuthlibInjectorServer server; private final Label lblServerName = new Label(); - private final Label lblServerIp = new Label(); + private final Label lblServerUrl = new Label(); public AuthlibInjectorServerItem(AuthlibInjectorServer server, Consumer deleteCallback) { this.server = server; lblServerName.setStyle("-fx-font-size: 15;"); - lblServerIp.setStyle("-fx-font-size: 10;"); + lblServerUrl.setStyle("-fx-font-size: 10;"); VBox center = new VBox(); BorderPane.setAlignment(center, Pos.CENTER); - center.getChildren().addAll(lblServerName, lblServerIp); + center.getChildren().addAll(lblServerName, lblServerUrl); setCenter(center); JFXButton right = new JFXButton(); @@ -55,8 +57,8 @@ public final class AuthlibInjectorServerItem extends BorderPane { setStyle("-fx-background-radius: 2; -fx-background-color: white; -fx-padding: 8;"); JFXDepthManager.setDepth(this, 1); - lblServerName.setText(server.getName()); - lblServerIp.setText(server.getUrl()); + lblServerName.textProperty().bind(Bindings.createStringBinding(server::getName, server)); + lblServerUrl.setText(server.getUrl()); } public AuthlibInjectorServer getServer() {