From 411efbe774b5c010e878c032ef7476121ddce98f Mon Sep 17 00:00:00 2001 From: Burning_TNT Date: Sat, 4 Oct 2025 21:15:22 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9C=A8=E5=85=A8=E5=B1=80=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E4=B8=AD=E5=82=A8=E5=AD=98=E6=98=AF=E5=90=A6=E6=9B=BE=E5=90=91?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E5=B1=95=E7=A4=BA=E8=BF=87=E9=99=B6=E7=93=A6?= =?UTF-8?q?=E8=81=94=E6=9C=BA=E7=94=A8=E6=88=B7=E9=A1=BB=E7=9F=A5=20(#4601?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jackhuang/hmcl/setting/GlobalConfig.java | 17 +++++++ .../terracotta/TerracottaControllerPage.java | 51 ++++++++++++++++--- 2 files changed, 60 insertions(+), 8 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/GlobalConfig.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/GlobalConfig.java index a852756aa..8b5c08ed6 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/GlobalConfig.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/GlobalConfig.java @@ -48,6 +48,8 @@ public final class GlobalConfig implements Observable { private final IntegerProperty agreementVersion = new SimpleIntegerProperty(); + private final IntegerProperty terracottaAgreementVersion = new SimpleIntegerProperty(); + private final IntegerProperty platformPromptVersion = new SimpleIntegerProperty(); private final IntegerProperty logRetention = new SimpleIntegerProperty(); @@ -94,6 +96,18 @@ public final class GlobalConfig implements Observable { this.agreementVersion.set(agreementVersion); } + public int getTerracottaAgreementVersion() { + return terracottaAgreementVersion.get(); + } + + public IntegerProperty terracottaAgreementVersionProperty() { + return terracottaAgreementVersion; + } + + public void setTerracottaAgreementVersion(int terracottaAgreementVersion) { + this.terracottaAgreementVersion.set(terracottaAgreementVersion); + } + public int getPlatformPromptVersion() { return platformPromptVersion.get(); } @@ -153,6 +167,7 @@ public final class GlobalConfig implements Observable { public static final class Serializer implements JsonSerializer, JsonDeserializer { private static final Set knownFields = new HashSet<>(Arrays.asList( "agreementVersion", + "terracottaAgreementVersion", "platformPromptVersion", "logRetention", "userJava", @@ -169,6 +184,7 @@ public final class GlobalConfig implements Observable { JsonObject jsonObject = new JsonObject(); jsonObject.add("agreementVersion", context.serialize(src.getAgreementVersion())); + jsonObject.add("terracottaAgreementVersion", context.serialize(src.getTerracottaAgreementVersion())); jsonObject.add("platformPromptVersion", context.serialize(src.getPlatformPromptVersion())); jsonObject.add("logRetention", context.serialize(src.getLogRetention())); jsonObject.add("fontAntiAliasing", context.serialize(src.getFontAntiAliasing())); @@ -196,6 +212,7 @@ public final class GlobalConfig implements Observable { GlobalConfig config = new GlobalConfig(); config.setAgreementVersion(Optional.ofNullable(obj.get("agreementVersion")).map(JsonElement::getAsInt).orElse(0)); + config.setTerracottaAgreementVersion(Optional.ofNullable(obj.get("terracottaAgreementVersion")).map(JsonElement::getAsInt).orElse(0)); config.setPlatformPromptVersion(Optional.ofNullable(obj.get("platformPromptVersion")).map(JsonElement::getAsInt).orElse(0)); config.setLogRetention(Optional.ofNullable(obj.get("logRetention")).map(JsonElement::getAsInt).orElse(20)); config.setEnableOfflineAccount(Optional.ofNullable(obj.get("enableOfflineAccount")).map(JsonElement::getAsBoolean).orElse(false)); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/terracotta/TerracottaControllerPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/terracotta/TerracottaControllerPage.java index 250357bfb..a8e00cf49 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/terracotta/TerracottaControllerPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/terracotta/TerracottaControllerPage.java @@ -22,6 +22,8 @@ import javafx.beans.property.DoubleProperty; import javafx.beans.property.ObjectProperty; import javafx.beans.property.SimpleDoubleProperty; import javafx.beans.property.SimpleObjectProperty; +import javafx.beans.property.SimpleStringProperty; +import javafx.beans.property.StringProperty; import javafx.beans.value.ChangeListener; import javafx.beans.value.WeakChangeListener; import javafx.collections.FXCollections; @@ -41,6 +43,8 @@ import javafx.scene.layout.HBox; import javafx.scene.layout.Priority; import javafx.scene.layout.StackPane; import javafx.scene.layout.VBox; +import javafx.scene.paint.Color; +import javafx.scene.text.Text; import javafx.scene.text.TextFlow; import org.jackhuang.hmcl.game.LauncherHelper; import org.jackhuang.hmcl.setting.Profile; @@ -80,6 +84,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Locale; +import static org.jackhuang.hmcl.setting.ConfigHolder.globalConfig; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; public class TerracottaControllerPage extends StackPane { @@ -177,13 +182,14 @@ public class TerracottaControllerPage extends StackPane { download.setSubtitle(i18n("terracotta.status.uninitialized.desc")); download.setRightIcon(SVG.ARROW_FORWARD); FXUtils.onClicked(download, () -> { - if (uninitialized.hasLegacy()) { + if (globalConfig().getTerracottaAgreementVersion() >= 1) { TerracottaState.Preparing s = TerracottaManager.install(null); if (s != null) { UI_STATE.set(s); } } else { Controllers.confirmActionDanger(i18n("terracotta.confirm.desc"), i18n("terracotta.confirm.title"), () -> { + globalConfig().setTerracottaAgreementVersion(1); TerracottaState.Preparing s = TerracottaManager.install(null); if (s != null) { UI_STATE.set(s); @@ -557,9 +563,10 @@ public class TerracottaControllerPage extends StackPane { private static final class LineButton extends RipplerContainer { private final WeakListenerHolder holder = new WeakListenerHolder(); - private final TwoLineListItem middle = new TwoLineListItem(); - private final ObjectProperty left = new SimpleObjectProperty<>(); - private final ObjectProperty right = new SimpleObjectProperty<>(); + private final ObjectProperty left = new SimpleObjectProperty<>(this, "left"); + private final ObjectProperty right = new SimpleObjectProperty<>(this, "right"); + private final StringProperty title = new SimpleStringProperty(this, "title", ""); + private final StringProperty subTitle = new SimpleStringProperty(this, "subTitle", ""); public static LineButton of() { return of(true); @@ -584,7 +591,35 @@ public class TerracottaControllerPage extends StackPane { nodes.add(left); } - nodes.add(button.middle); + { + // FIXME: It's sucked to have the following TwoLineListItem-liked logic whose subtitle is a TextFlow. + VBox middle = new VBox(); + middle.getStyleClass().add("two-line-list-item"); + middle.setMouseTransparent(true); + { + HBox firstLine = new HBox(); + firstLine.getStyleClass().add("first-line"); + { + Label lblTitle = new Label(button.title.get()); + lblTitle.getStyleClass().add("title"); + firstLine.getChildren().setAll(lblTitle); + } + + HBox secondLine = new HBox(); + { + Text text = new Text(button.subTitle.get()); + text.setFill(new Color(0, 0, 0, 0.5)); + + TextFlow lblSubtitle = new TextFlow(text); + lblSubtitle.getStyleClass().add("subtitle"); + secondLine.getChildren().setAll(lblSubtitle); + } + + middle.getChildren().setAll(firstLine, secondLine); + } + nodes.add(middle); + } + nodes.add(spacing); Node right = button.right.get(); @@ -593,7 +628,7 @@ public class TerracottaControllerPage extends StackPane { } container.getChildren().setAll(nodes); - }, button.middle.titleProperty(), button.middle.subtitleProperty(), button.left, button.right)); + }, button.title, button.subTitle, button.left, button.right)); button.getProperties().put("ComponentList.noPadding", true); return button; @@ -604,11 +639,11 @@ public class TerracottaControllerPage extends StackPane { } public void setTitle(String title) { - this.middle.setTitle(title); + this.title.set(title); } public void setSubtitle(String subtitle) { - this.middle.setSubtitle(subtitle); + this.subTitle.set(subtitle); } public void setLeftImage(Image left) {