From 34ceb1a29d344df2d8b79cc4a06f7e6cbae99147 Mon Sep 17 00:00:00 2001 From: huanghongxun Date: Sat, 28 Aug 2021 01:24:36 +0800 Subject: [PATCH] feat: title bar with color --- .../main/java/org/jackhuang/hmcl/Metadata.java | 2 +- .../java/org/jackhuang/hmcl/setting/Theme.java | 2 +- .../org/jackhuang/hmcl/ui/Controllers.java | 4 ++-- .../hmcl/ui/decorator/DecoratorPage.java | 10 ++-------- .../ui/decorator/DecoratorTransitionPage.java | 17 ++--------------- .../org/jackhuang/hmcl/ui/main/AboutPage.java | 13 ++++++------- .../hmcl/ui/main/LauncherSettingsPage.java | 2 +- .../org/jackhuang/hmcl/ui/main/MainPage.java | 17 ++++++++++++++++- .../org/jackhuang/hmcl/ui/main/RootPage.java | 1 - .../hmcl/ui/versions/GameListPage.java | 2 +- .../hmcl/ui/versions/VersionPage.java | 2 +- HMCL/src/main/resources/assets/css/root.css | 6 +++--- .../main/resources/assets/img/gamerteam.jpg | Bin 14487 -> 0 bytes .../main/resources/assets/lang/I18N.properties | 2 +- .../assets/lang/I18N_zh_CN.properties | 2 +- 15 files changed, 38 insertions(+), 44 deletions(-) delete mode 100644 HMCL/src/main/resources/assets/img/gamerteam.jpg diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/Metadata.java b/HMCL/src/main/java/org/jackhuang/hmcl/Metadata.java index 27c51c4df..5ab515bd1 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/Metadata.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/Metadata.java @@ -30,7 +30,7 @@ public final class Metadata { private Metadata() {} public static final String VERSION = System.getProperty("hmcl.version.override", JarUtils.thisJar().flatMap(JarUtils::getImplementationVersion).orElse("@develop@")); - public static final String NAME = "HMCL"; + public static final String NAME = "Hello Minecraft! Launcher"; public static final String TITLE = NAME + " " + VERSION; public static final String UPDATE_URL = System.getProperty("hmcl.update_source.override", "https://hmcl.huangyuhui.net/api/update_link"); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Theme.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Theme.java index 66a4cf112..47ecf8ae3 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Theme.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Theme.java @@ -41,7 +41,7 @@ public class Theme { public static final Theme BLUE = new Theme("blue", "#5C6BC0"); public static final Color BLACK = Color.web("#292929"); public static final Color[] SUGGESTED_COLORS = new Color[]{ - Color.web("#5C6BC0"), // blue + Color.web("#3D6DA3"), // blue Color.web("#283593"), // dark blue Color.web("#43A047"), // green Color.web("#E67E22"), // orange 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 2d9a8b0ad..e5db94849 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java @@ -172,8 +172,8 @@ public final class Controllers { scene = new Scene(decorator.getDecorator()); scene.setFill(Color.TRANSPARENT); - stage.setMinHeight(482 + 32); - stage.setMinWidth(802 + 32); + stage.setMinHeight(450 + 2 + 40 + 16); // bg height + border width*2 + toolbar height + shadow width*2 + stage.setMinWidth(800 + 2 + 16); // bg width + border width*2 + shadow width*2 decorator.getDecorator().prefWidthProperty().bind(scene.widthProperty()); decorator.getDecorator().prefHeightProperty().bind(scene.heightProperty()); scene.getStylesheets().setAll(config().getTheme().getStylesheets()); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/decorator/DecoratorPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/decorator/DecoratorPage.java index 17d60eed2..5ffc22f7d 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/decorator/DecoratorPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/decorator/DecoratorPage.java @@ -50,20 +50,18 @@ public interface DecoratorPage extends Refreshable { private final boolean backable; private final boolean refreshable; private final boolean animate; - private final boolean titleBarTransparent; private final double leftPaneWidth; public State(String title, Node titleNode, boolean backable, boolean refreshable, boolean animate) { - this(title, titleNode, backable, refreshable, animate, false, 0); + this(title, titleNode, backable, refreshable, animate, 0); } - public State(String title, Node titleNode, boolean backable, boolean refreshable, boolean animate, boolean titleBarTransparent, double leftPaneWidth) { + public State(String title, Node titleNode, boolean backable, boolean refreshable, boolean animate, double leftPaneWidth) { this.title = title; this.titleNode = titleNode; this.backable = backable; this.refreshable = refreshable; this.animate = animate; - this.titleBarTransparent = titleBarTransparent; this.leftPaneWidth = leftPaneWidth; } @@ -95,10 +93,6 @@ public interface DecoratorPage extends Refreshable { return animate; } - public boolean isTitleBarTransparent() { - return titleBarTransparent; - } - public double getLeftPaneWidth() { return leftPaneWidth; } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/decorator/DecoratorTransitionPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/decorator/DecoratorTransitionPage.java index 3acddadd3..58b3ef42d 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/decorator/DecoratorTransitionPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/decorator/DecoratorTransitionPage.java @@ -31,7 +31,6 @@ import org.jackhuang.hmcl.ui.wizard.Refreshable; public abstract class DecoratorTransitionPage extends Control implements DecoratorPage { protected final ReadOnlyObjectWrapper state = new ReadOnlyObjectWrapper<>(State.fromTitle("")); private final DoubleProperty leftPaneWidth = new SimpleDoubleProperty(); - private final BooleanProperty titleBarTransparent = new SimpleBooleanProperty(false); private final BooleanProperty backable = new SimpleBooleanProperty(false); private final BooleanProperty refreshable = new SimpleBooleanProperty(false); private Node currentPage; @@ -57,11 +56,11 @@ public abstract class DecoratorTransitionPage extends Control implements Decorat if (to instanceof DecoratorPage) { state.bind(Bindings.createObjectBinding(() -> { State state = ((DecoratorPage) to).stateProperty().get(); - return new State(state.getTitle(), state.getTitleNode(), backable.get(), state.isRefreshable(), true, titleBarTransparent.get(), leftPaneWidth.get()); + return new State(state.getTitle(), state.getTitleNode(), backable.get(), state.isRefreshable(), true, leftPaneWidth.get()); }, ((DecoratorPage) to).stateProperty())); } else { state.unbind(); - state.set(new State("", null, backable.get(), false, true, titleBarTransparent.get(), leftPaneWidth.get())); + state.set(new State("", null, backable.get(), false, true, leftPaneWidth.get())); } if (to instanceof Region) { @@ -121,16 +120,4 @@ public abstract class DecoratorTransitionPage extends Control implements Decorat public void setLeftPaneWidth(double leftPaneWidth) { this.leftPaneWidth.set(leftPaneWidth); } - - public boolean isTitleBarTransparent() { - return titleBarTransparent.get(); - } - - public BooleanProperty titleBarTransparentProperty() { - return titleBarTransparent; - } - - public void setTitleBarTransparent(boolean titleBarTransparent) { - this.titleBarTransparent.set(titleBarTransparent); - } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/AboutPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/AboutPage.java index d0ff59d78..b187efcb5 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/AboutPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/AboutPage.java @@ -63,11 +63,10 @@ public class AboutPage extends StackPane { bangbang93.setSubtitle(i18n("about.thanks_to.bangbang93.statement")); bangbang93.setExternalLink("https://bmclapi2.bangbang93.com/"); - IconedTwoLineListItem gamerteam = new IconedTwoLineListItem(); - gamerteam.setTitle("gamerteam"); - gamerteam.setImage(new Image("/assets/img/gamerteam.jpg", 32, 32, false, true)); - gamerteam.setSubtitle(i18n("about.thanks_to.gamerteam.statement")); - gamerteam.setExternalLink("http://www.zhaisoul.com/"); + IconedTwoLineListItem redLnn = new IconedTwoLineListItem(); + redLnn.setTitle("Red_lnn"); + redLnn.setImage(new Image("/assets/img/red_lnn.jpg", 32, 32, false, true)); + redLnn.setSubtitle(i18n("about.thanks_to.gamerteam.statement")); IconedTwoLineListItem mcbbs = new IconedTwoLineListItem(); mcbbs.setImage(new Image("/assets/img/chest.png", 32, 32, false, true)); @@ -80,14 +79,14 @@ public class AboutPage extends StackPane { contributors.setTitle(i18n("about.thanks_to.contributors")); contributors.setSubtitle(i18n("about.thanks_to.contributors.statement")); contributors.setExternalLink("https://github.com/huanghongxun/HMCL/graphs/contributors"); - contributors.setExternalLink("https://hmcl.huangyuhui.net/api/redirect/sponsor"); IconedTwoLineListItem users = new IconedTwoLineListItem(); users.setImage(new Image("/assets/img/craft_table.png", 32, 32, false, true)); users.setTitle(i18n("about.thanks_to.users")); users.setSubtitle(i18n("about.thanks_to.users.statement")); + users.setExternalLink("https://hmcl.huangyuhui.net/api/redirect/sponsor"); - thanks.getContent().setAll(yushijinhun, bangbang93, gamerteam, mcbbs, users, contributors); + thanks.getContent().setAll(yushijinhun, bangbang93, mcbbs, redLnn, users, contributors); } ComponentList dep = new ComponentList(); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/LauncherSettingsPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/LauncherSettingsPage.java index 77fca2189..447e70172 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/LauncherSettingsPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/LauncherSettingsPage.java @@ -33,7 +33,7 @@ import static org.jackhuang.hmcl.ui.versions.VersionPage.wrap; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; public class LauncherSettingsPage extends BorderPane implements DecoratorPage { - private final ReadOnlyObjectWrapper state = new ReadOnlyObjectWrapper<>(new State(i18n("settings.launcher"), null, true, false, true, false, 200)); + private final ReadOnlyObjectWrapper state = new ReadOnlyObjectWrapper<>(new State(i18n("settings.launcher"), null, true, false, true, 200)); private final TabHeader tab; private final TabHeader.Tab settingsTab = new TabHeader.Tab<>("settingsPage"); private final TabHeader.Tab helpTab = new TabHeader.Tab<>("helpPage"); 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 2ad1fc248..a116ec90a 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 @@ -30,6 +30,8 @@ import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.Node; import javafx.scene.control.Label; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; import javafx.scene.layout.HBox; import javafx.scene.layout.StackPane; import javafx.scene.layout.VBox; @@ -59,7 +61,7 @@ import static org.jackhuang.hmcl.ui.FXUtils.SINE; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; public final class MainPage extends StackPane implements DecoratorPage { - private final ReadOnlyObjectWrapper state = new ReadOnlyObjectWrapper<>(State.fromTitle("HMCL " + Metadata.VERSION)); + private final ReadOnlyObjectWrapper state = new ReadOnlyObjectWrapper<>(); private final PopupMenu menu = new PopupMenu(); private final JFXPopup popup = new JFXPopup(menu); @@ -75,6 +77,19 @@ public final class MainPage extends StackPane implements DecoratorPage { private JFXButton menuButton; { + HBox titleNode = new HBox(8); + titleNode.setPadding(new Insets(0, 0, 0, 2)); + titleNode.setAlignment(Pos.CENTER_LEFT); + + ImageView titleIcon = new ImageView(); + titleIcon.setImage(new Image("/assets/img/icon.png", 20, 20, false, false)); + + Label titleLabel = new Label(Metadata.TITLE); + titleLabel.getStyleClass().add("jfx-decorator-title"); + titleNode.getChildren().setAll(titleIcon, titleLabel); + + state.setValue(State.fromTitleNode(titleNode)); + setPadding(new Insets(20)); updatePane = new StackPane(); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/RootPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/RootPage.java index 8e3e8dc6f..86d190c45 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/RootPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/RootPage.java @@ -93,7 +93,6 @@ public class RootPage extends DecoratorTabPage { @Override protected void onNavigated(Node to) { backableProperty().set(!(to instanceof MainPage)); - setTitleBarTransparent(to instanceof MainPage); super.onNavigated(to); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/GameListPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/GameListPage.java index 8a518b908..cc7c42bc6 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/GameListPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/GameListPage.java @@ -244,7 +244,7 @@ public class GameListPage extends ListPageBase implements Decorato public GameListSkin() { super(GameList.this); - state.set(new State(i18n("version.manage"), null, true, false, true, false, 200)); + state.set(new State(i18n("version.manage"), null, true, false, true, 200)); } @Override diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionPage.java index 133d7ea38..309663d48 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionPage.java @@ -388,7 +388,7 @@ public class VersionPage extends Control implements DecoratorPage, ModDownloadPa } control.state.bind(Bindings.createObjectBinding(() -> - new State(i18n("version.manage.manage.title", getSkinnable().getVersion()), null, true, false, true, false, 200), + new State(i18n("version.manage.manage.title", getSkinnable().getVersion()), null, true, false, true, 200), getSkinnable().version)); //control.transitionPane.getStyleClass().add("gray-background"); diff --git a/HMCL/src/main/resources/assets/css/root.css b/HMCL/src/main/resources/assets/css/root.css index c5879078d..c42898f69 100644 --- a/HMCL/src/main/resources/assets/css/root.css +++ b/HMCL/src/main/resources/assets/css/root.css @@ -398,7 +398,7 @@ -fx-font-weight: BOLD; } -.jfx-tool-bar .background { +.jfx-tool-bar.background { -fx-background-color: -fx-base-color; } @@ -1140,12 +1140,12 @@ .window { -fx-background-color: transparent; - -fx-padding: 16; + -fx-padding: 8; } .body { -fx-border-radius: 5; - -fx-effect: dropshadow(gaussian, rgba(0, 0, 0, 0.4), 20, 0.3, 0.0, 0.0); + -fx-effect: dropshadow(gaussian, rgba(0, 0, 0, 0.4), 10, 0.3, 0.0, 0.0); } .debug-border { diff --git a/HMCL/src/main/resources/assets/img/gamerteam.jpg b/HMCL/src/main/resources/assets/img/gamerteam.jpg deleted file mode 100644 index 0ee98e3ce7d541b0bbc0f37a4c7705f762afcbe6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14487 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 diff --git a/HMCL/src/main/resources/assets/lang/I18N.properties b/HMCL/src/main/resources/assets/lang/I18N.properties index b14d6c2d8..ea6ca2f66 100644 --- a/HMCL/src/main/resources/assets/lang/I18N.properties +++ b/HMCL/src/main/resources/assets/lang/I18N.properties @@ -29,7 +29,7 @@ about.legal=Legal Acknowledgement about.thanks_to=Thanks to about.thanks_to.bangbang93.statement=BMCLAPI about.thanks_to.contributors=All contributors who participated in this project via issues, pull requests, etc. -about.thanks_to.gamerteam.statement=gamerteam (Default background image) +about.thanks_to.gamerteam.statement=Default background image about.thanks_to.mcbbs=MCBBS about.thanks_to.mcbbs.statement=Provide MCBBS download source about.thanks_to.users=Members of HMCL User Group diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties index 261909fad..c10223b42 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties @@ -30,7 +30,7 @@ about.thanks_to=鸣谢 about.thanks_to.bangbang93.statement=提供 BMCLAPI 下载源,请赞助支持 BMCLAPI! about.thanks_to.contributors=所有通过 Issues、Pull Requests 等方式参与本项目的贡献者 about.thanks_to.contributors.statement=没有开源社区的支持,Hello Minecraft! Launcher 无法走到今天 -about.thanks_to.gamerteam.statement=提供默认背景图与 HMCL 官方网站 CDN +about.thanks_to.gamerteam.statement=提供默认背景图 about.thanks_to.mcbbs=MCBBS 我的世界中文论坛 about.thanks_to.mcbbs.statement=提供 MCBBS 下载源 about.thanks_to.users=HMCL 用户群成员