diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java index b0adc1eb6..260faeb1b 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java @@ -407,6 +407,31 @@ public class Settings { this.backgroundImageType.set(backgroundImageType); } + /**************************************** + * THEME * + ****************************************/ + + private final ImmediateObjectProperty theme = new ImmediateObjectProperty(this, "theme", Theme.getTheme(SETTINGS.getTheme()).orElse(Theme.BLUE)) { + @Override + public void invalidated() { + super.invalidated(); + + SETTINGS.setTheme(get().name().toLowerCase()); + } + }; + + public Theme getTheme() { + return theme.get(); + } + + public void setTheme(Theme theme) { + this.theme.set(theme); + } + + public ImmediateObjectProperty themeProperty() { + return theme; + } + /**************************************** * PROFILES * ****************************************/ diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Theme.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Theme.java new file mode 100644 index 000000000..5db748d53 --- /dev/null +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Theme.java @@ -0,0 +1,45 @@ +/* + * 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.setting; + +import java.util.Optional; + +public enum Theme { + BLUE, + DARK_BLUE, + GREEN, + ORANGE, + PURPLE, + RED; + + public String[] getStylesheets() { + return new String[]{ + Theme.class.getResource("/css/jfoenix-fonts.css").toExternalForm(), + Theme.class.getResource("/css/jfoenix-design.css").toExternalForm(), + Theme.class.getResource("/assets/css/" + name().toLowerCase() + ".css").toExternalForm(), + Theme.class.getResource("/assets/css/root.css").toExternalForm() + }; + } + + public static Optional getTheme(String name) { + for (Theme theme : values()) + if (theme.name().equalsIgnoreCase(name)) + return Optional.of(theme); + return Optional.empty(); + } +} 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 63b803b0a..9fa5500f6 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java @@ -92,7 +92,7 @@ public final class Controllers { decorator.setCustomMaximize(false); scene = new Scene(decorator, 804, 521); - scene.getStylesheets().addAll(FXUtils.STYLESHEETS); + scene.getStylesheets().addAll(Settings.INSTANCE.getTheme().getStylesheets()); stage.setMinWidth(804); stage.setMaxWidth(804); stage.setMinHeight(521); 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 9b7049ee8..a60af8e82 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/FXUtils.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/FXUtils.java @@ -132,12 +132,6 @@ public final class FXUtils { Lang.invoke(() -> loader.load()); } - public static WritableImage takeSnapshot(Parent node, double width, double height) { - Scene scene = new Scene(node, width, height); - scene.getStylesheets().addAll(STYLESHEETS); - return scene.snapshot(null); - } - public static void resetChildren(JFXMasonryPane pane, List children) { // Fixes mis-repositioning. ReflectionHelper.setFieldContent(JFXMasonryPane.class, pane, "oldBoxes", null); @@ -325,12 +319,6 @@ public final class FXUtils { public static final Image DEFAULT_ICON = new Image("/assets/img/icon.png"); - public static final String[] STYLESHEETS = new String[]{ - FXUtils.class.getResource("/css/jfoenix-fonts.css").toExternalForm(), - FXUtils.class.getResource("/css/jfoenix-design.css").toExternalForm(), - FXUtils.class.getResource("/assets/css/jfoenix-main-demo.css").toExternalForm() - }; - public static final Interpolator SINE = new Interpolator() { @Override protected double curve(double t) { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/LogWindow.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/LogWindow.java index 2edea87e7..9e8a34fdb 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/LogWindow.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/LogWindow.java @@ -62,7 +62,7 @@ public final class LogWindow extends Stage { public LogWindow() { setScene(new Scene(impl, 800, 480)); - getScene().getStylesheets().addAll(FXUtils.STYLESHEETS); + getScene().getStylesheets().addAll(Settings.INSTANCE.getTheme().getStylesheets()); setTitle(Main.i18n("logwindow.title")); getIcons().add(new Image("/assets/img/icon.png")); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java index b9f4baf47..e441e657a 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java @@ -20,6 +20,7 @@ package org.jackhuang.hmcl.ui; import com.jfoenix.controls.JFXButton; import com.jfoenix.controls.JFXComboBox; import com.jfoenix.controls.JFXTextField; +import javafx.application.Platform; import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; import javafx.collections.FXCollections; @@ -77,6 +78,8 @@ public final class SettingsPage extends StackPane implements DecoratorPage { private ScrollPane scroll; @FXML private MultiFileItem backgroundItem; + @FXML + private MultiFileItem themeItem; { FXUtils.loadFXML(this, "/assets/fxml/setting.fxml"); @@ -152,6 +155,20 @@ public final class SettingsPage extends StackPane implements DecoratorPage { backgroundItem.setToggleSelectedListener(newValue -> { Settings.INSTANCE.setBackgroundImageType((EnumBackgroundImage) newValue.getUserData()); }); + + themeItem.loadChildren(Arrays.asList( + themeItem.createChildren(Main.i18n("color.blue"), Theme.BLUE), + themeItem.createChildren(Main.i18n("color.dark_blue"), Theme.DARK_BLUE), + themeItem.createChildren(Main.i18n("color.green"), Theme.GREEN), + themeItem.createChildren(Main.i18n("color.orange"), Theme.ORANGE), + themeItem.createChildren(Main.i18n("color.purple"), Theme.PURPLE), + themeItem.createChildren(Main.i18n("color.red"), Theme.RED) + )); + + themeItem.getGroup().getToggles().stream().filter(it -> Settings.INSTANCE.getTheme() == it.getUserData()).findFirst().ifPresent(it -> it.setSelected(true)); + themeItem.setToggleSelectedListener(newValue -> Settings.INSTANCE.setTheme((Theme) newValue.getUserData())); + Settings.INSTANCE.themeProperty().setChangedListenerAndOperate(it -> + themeItem.setSubtitle(Main.i18n("color." + it.name().toLowerCase()))); } private void initBackgroundItemSubtitle() { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/WebStage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/WebStage.java index 603c94f04..83148a583 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/WebStage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/WebStage.java @@ -21,13 +21,14 @@ import javafx.scene.Scene; import javafx.scene.image.Image; import javafx.scene.web.WebView; import javafx.stage.Stage; +import org.jackhuang.hmcl.setting.Settings; public class WebStage extends Stage { private final WebView webView = new WebView(); public WebStage() { setScene(new Scene(webView, 800, 480)); - getScene().getStylesheets().addAll(FXUtils.STYLESHEETS); + getScene().getStylesheets().addAll(Settings.INSTANCE.getTheme().getStylesheets()); getIcons().add(new Image("/assets/img/icon.png")); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/RipplerContainer.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/RipplerContainer.java index 21a491076..0f91804c9 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/RipplerContainer.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/RipplerContainer.java @@ -134,6 +134,8 @@ public class RipplerContainer extends StackPane { }; selectedProperty().addListener(listener); + selectedProperty().addListener((a, b, newValue) -> + pseudoClassStateChanged(PseudoClass.getPseudoClass("selected"), newValue)); ripplerFillProperty().addListener(listener); setShape(Lang.apply(new Rectangle(), rectangle -> { diff --git a/HMCL/src/main/resources/assets/css/blue.css b/HMCL/src/main/resources/assets/css/blue.css new file mode 100644 index 000000000..7059f605b --- /dev/null +++ b/HMCL/src/main/resources/assets/css/blue.css @@ -0,0 +1,5 @@ +.root { + -fx-base-color: #3F51B5; + -fx-base-check-color: derive(-fx-base-color, 30%); + -fx-base-text-fill: white; +} \ No newline at end of file diff --git a/HMCL/src/main/resources/assets/css/dark_blue.css b/HMCL/src/main/resources/assets/css/dark_blue.css new file mode 100644 index 000000000..0e5d6cbbb --- /dev/null +++ b/HMCL/src/main/resources/assets/css/dark_blue.css @@ -0,0 +1,5 @@ +.root { + -fx-base-color: #283593; + -fx-base-check-color: derive(-fx-base-color, 30%); + -fx-base-text-fill: white; +} \ No newline at end of file diff --git a/HMCL/src/main/resources/assets/css/green.css b/HMCL/src/main/resources/assets/css/green.css new file mode 100644 index 000000000..c7a8acbc5 --- /dev/null +++ b/HMCL/src/main/resources/assets/css/green.css @@ -0,0 +1,5 @@ +.root { + -fx-base-color: #43A047; + -fx-base-check-color: derive(-fx-base-color, 30%); + -fx-base-text-fill: black; +} \ No newline at end of file diff --git a/HMCL/src/main/resources/assets/css/orange.css b/HMCL/src/main/resources/assets/css/orange.css new file mode 100644 index 000000000..c01de02c4 --- /dev/null +++ b/HMCL/src/main/resources/assets/css/orange.css @@ -0,0 +1,5 @@ +.root { + -fx-base-color: #E67E22; + -fx-base-check-color: derive(-fx-base-color, 30%); + -fx-base-text-fill: black; +} \ No newline at end of file diff --git a/HMCL/src/main/resources/assets/css/purple.css b/HMCL/src/main/resources/assets/css/purple.css new file mode 100644 index 000000000..360a3e6eb --- /dev/null +++ b/HMCL/src/main/resources/assets/css/purple.css @@ -0,0 +1,5 @@ +.root { + -fx-base-color: #9C27B0; + -fx-base-check-color: derive(-fx-base-color, 30%); + -fx-base-text-fill: white; +} \ No newline at end of file diff --git a/HMCL/src/main/resources/assets/css/red.css b/HMCL/src/main/resources/assets/css/red.css new file mode 100644 index 000000000..fff023d48 --- /dev/null +++ b/HMCL/src/main/resources/assets/css/red.css @@ -0,0 +1,5 @@ +.root { + -fx-base-color: #F44336; + -fx-base-check-color: derive(-fx-base-color, 30%); + -fx-base-text-fill: black; +} \ No newline at end of file diff --git a/HMCL/src/main/resources/assets/css/jfoenix-main-demo.css b/HMCL/src/main/resources/assets/css/root.css similarity index 99% rename from HMCL/src/main/resources/assets/css/jfoenix-main-demo.css rename to HMCL/src/main/resources/assets/css/root.css index 868232e52..7764fea64 100644 --- a/HMCL/src/main/resources/assets/css/jfoenix-main-demo.css +++ b/HMCL/src/main/resources/assets/css/root.css @@ -4,8 +4,6 @@ */ .root { - -fx-base-color: #ec407a; - -fx-base-check-color: derive(-fx-base-color, 30%);/*#0F9D58;*/ -fx-font-family: "Roboto"; } @@ -46,6 +44,14 @@ -fx-border-width: 1; } +.rippler-container:selected .label { + -fx-text-fill: -fx-base-text-fill; +} + +.rippler-container= .label { + -fx-text-fill: white; +} + .class-title { -fx-font-size: 12px; -fx-padding: 0 16 0 16; diff --git a/HMCL/src/main/resources/assets/fxml/account.fxml b/HMCL/src/main/resources/assets/fxml/account.fxml index 6bb350441..01ac93492 100644 --- a/HMCL/src/main/resources/assets/fxml/account.fxml +++ b/HMCL/src/main/resources/assets/fxml/account.fxml @@ -15,7 +15,7 @@ - + diff --git a/HMCL/src/main/resources/assets/fxml/setting.fxml b/HMCL/src/main/resources/assets/fxml/setting.fxml index 6a091edc0..32766dc03 100644 --- a/HMCL/src/main/resources/assets/fxml/setting.fxml +++ b/HMCL/src/main/resources/assets/fxml/setting.fxml @@ -66,7 +66,9 @@