diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java index 724eb7def..44e208ac5 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java @@ -391,9 +391,6 @@ public final class Controllers { Controllers.getSettingsPage().showFeedback(); Controllers.navigate(Controllers.getSettingsPage()); break; - case "hmcl://hide-announcement": - Controllers.getRootPage().getMainPage().hideAnnouncementPane(); - break; } } else { FXUtils.openLink(href); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/FXUtils.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/FXUtils.java index 141ac78a2..d709b9223 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/FXUtils.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/FXUtils.java @@ -1005,8 +1005,8 @@ public final class FXUtils { hyperlinkAction.accept(link); }); text.setCursor(Cursor.HAND); + text.setFill(Color.web("#0070E0")); text.setUnderline(true); - text.setFill(Color.web("#283593")); texts.add(text); } else if ("b".equals(element.getTagName())) { Text text = new Text(element.getTextContent()); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/AnnouncementCard.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/AnnouncementCard.java index 7262bcadd..5e80222c4 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/AnnouncementCard.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/AnnouncementCard.java @@ -17,21 +17,36 @@ */ package org.jackhuang.hmcl.ui.construct; +import javafx.scene.Cursor; +import javafx.scene.Node; import javafx.scene.control.Label; +import javafx.scene.layout.BorderPane; import javafx.scene.layout.VBox; import javafx.scene.text.TextFlow; +import org.jackhuang.hmcl.setting.Theme; import org.jackhuang.hmcl.ui.Controllers; import org.jackhuang.hmcl.ui.FXUtils; +import org.jackhuang.hmcl.ui.SVG; -public class AnnouncementCard extends VBox { +public final class AnnouncementCard extends VBox { - public AnnouncementCard(String title, String content) { - TextFlow tf = FXUtils.segmentToTextFlow(content, Controllers::onHyperlinkAction); + public AnnouncementCard(String title, String content, Runnable onClose) { + TextFlow body = FXUtils.segmentToTextFlow(content, Controllers::onHyperlinkAction); + body.setLineSpacing(4); - Label label = new Label(title); - label.getStyleClass().add("title"); - getChildren().setAll(label, tf); - setSpacing(14); + BorderPane titleBar = new BorderPane(); + titleBar.getStyleClass().add("title"); + titleBar.setLeft(new Label(title)); + + if (onClose != null) { + Node hideNode = SVG.CLOSE.createIcon(Theme.blackFill(), 20, 20); + hideNode.setOnMouseClicked(e -> onClose.run()); + hideNode.setCursor(Cursor.HAND); + titleBar.setRight(hideNode); + } + + getChildren().setAll(titleBar, body); + setSpacing(16); getStyleClass().addAll("card", "announcement"); } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/MainPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/MainPage.java index f33272555..1c0f99162 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/MainPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/MainPage.java @@ -32,7 +32,6 @@ import javafx.scene.Node; import javafx.scene.control.Label; import javafx.scene.image.ImageView; import javafx.scene.layout.HBox; -import javafx.scene.layout.Pane; import javafx.scene.layout.StackPane; import javafx.scene.layout.VBox; import javafx.scene.shape.Rectangle; @@ -46,6 +45,8 @@ import org.jackhuang.hmcl.ui.Controllers; import org.jackhuang.hmcl.ui.FXUtils; import org.jackhuang.hmcl.ui.SVG; import org.jackhuang.hmcl.ui.animation.AnimationUtils; +import org.jackhuang.hmcl.ui.animation.ContainerAnimations; +import org.jackhuang.hmcl.ui.animation.TransitionPane; import org.jackhuang.hmcl.ui.construct.AnnouncementCard; import org.jackhuang.hmcl.ui.construct.MessageDialogPane; import org.jackhuang.hmcl.ui.construct.PopupMenu; @@ -83,7 +84,7 @@ public final class MainPage extends StackPane implements DecoratorPage { private final ObservableList versionNodes; private Profile profile; - private VBox announcementPane; + private TransitionPane announcementPane; private final StackPane updatePane; private final JFXButton menuButton; @@ -102,13 +103,23 @@ public final class MainPage extends StackPane implements DecoratorPage { setPadding(new Insets(20)); if (Metadata.isNightly() || (Metadata.isDev() && !Objects.equals(Metadata.VERSION, config().getShownTips().get(ANNOUNCEMENT)))) { - announcementPane = new VBox(16); + AnnouncementCard announcementCard = null; + if (Metadata.isNightly()) { - announcementPane.getChildren().add(new AnnouncementCard(i18n("update.channel.nightly.title"), i18n("update.channel.nightly.hint"))); + announcementCard = new AnnouncementCard(i18n("update.channel.nightly.title"), i18n("update.channel.nightly.hint"), null); } else if (Metadata.isDev()) { - announcementPane.getChildren().add(new AnnouncementCard(i18n("update.channel.dev.title"), i18n("update.channel.dev.hint"))); + announcementCard = new AnnouncementCard(i18n("update.channel.dev.title"), i18n("update.channel.dev.hint"), this::hideAnnouncementPane); + } + + if (announcementCard != null) { + VBox announcementBox = new VBox(16); + announcementBox.getChildren().add(announcementCard); + + announcementPane = new TransitionPane(); + announcementPane.setContent(announcementBox, ContainerAnimations.NONE.getAnimationProducer()); + + getChildren().add(announcementPane); } - getChildren().add(announcementPane); } updatePane = new StackPane(); @@ -290,10 +301,7 @@ public final class MainPage extends StackPane implements DecoratorPage { public void hideAnnouncementPane() { if (announcementPane != null) { config().getShownTips().put(ANNOUNCEMENT, Metadata.VERSION); - Pane parent = (Pane) announcementPane.getParent(); - if (parent != null) - parent.getChildren().remove(announcementPane); - announcementPane = null; + announcementPane.setContent(new StackPane(), ContainerAnimations.FADE.getAnimationProducer()); } }