From a072fb7beaa37c50b3bea062521a262295381a79 Mon Sep 17 00:00:00 2001 From: Glavo Date: Thu, 29 Feb 2024 02:03:42 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B9=E8=BF=9B=E4=BB=BB=E5=8A=A1=E6=A0=8F?= =?UTF-8?q?=E5=9B=BE=E6=A0=87=E8=B4=A8=E9=87=8F=20(#2864)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 改进任务栏图标质量 * update --- .../java/org/jackhuang/hmcl/ui/Controllers.java | 3 +-- .../java/org/jackhuang/hmcl/ui/CrashWindow.java | 3 +-- .../java/org/jackhuang/hmcl/ui/FXUtils.java | 15 +++++++++++++-- .../org/jackhuang/hmcl/ui/GameCrashWindow.java | 3 +-- .../java/org/jackhuang/hmcl/ui/LogWindow.java | 3 +-- .../java/org/jackhuang/hmcl/ui/WebStage.java | 3 +-- HMCL/src/main/resources/assets/img/icon@4x.png | Bin 0 -> 18223 bytes 7 files changed, 18 insertions(+), 12 deletions(-) create mode 100644 HMCL/src/main/resources/assets/img/icon@4x.png 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 5a4fe371d..9975f47d2 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java @@ -61,7 +61,6 @@ import java.util.List; import java.util.concurrent.CompletableFuture; import static org.jackhuang.hmcl.setting.ConfigHolder.*; -import static org.jackhuang.hmcl.ui.FXUtils.newBuiltinImage; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; public final class Controllers { @@ -262,7 +261,7 @@ public final class Controllers { decorator.getDecorator().prefHeightProperty().bind(scene.heightProperty()); scene.getStylesheets().setAll(Theme.getTheme().getStylesheets(config().getLauncherFontFamily())); - stage.getIcons().add(newBuiltinImage("/assets/img/icon.png")); + FXUtils.setIcon(stage); stage.setTitle(Metadata.FULL_TITLE); stage.initStyle(StageStyle.TRANSPARENT); stage.setScene(scene); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/CrashWindow.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/CrashWindow.java index cb8936947..a3f85c619 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/CrashWindow.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/CrashWindow.java @@ -30,7 +30,6 @@ import org.jackhuang.hmcl.Metadata; import org.jackhuang.hmcl.countly.CrashReport; import org.jackhuang.hmcl.upgrade.UpdateChecker; -import static org.jackhuang.hmcl.ui.FXUtils.newBuiltinImage; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; /** @@ -70,7 +69,7 @@ public class CrashWindow extends Stage { Scene scene = new Scene(pane, 800, 480); setScene(scene); - getIcons().add(newBuiltinImage("/assets/img/icon.png")); + FXUtils.setIcon(this); setTitle(i18n("message.error")); setOnCloseRequest(e -> System.exit(1)); 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 1db2b3b23..ab818bfeb 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/FXUtils.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/FXUtils.java @@ -43,6 +43,7 @@ import javafx.scene.layout.StackPane; import javafx.scene.shape.Rectangle; import javafx.scene.text.Text; import javafx.scene.text.TextFlow; +import javafx.stage.Stage; import javafx.util.Callback; import javafx.util.Duration; import javafx.util.StringConverter; @@ -676,6 +677,16 @@ public final class FXUtils { comboBox.getSelectionModel().selectedIndexProperty().removeListener(listener); } + public static void setIcon(Stage stage) { + String icon; + if (OperatingSystem.CURRENT_OS == OperatingSystem.WINDOWS) { + icon = "/assets/img/icon.png"; + } else { + icon = "/assets/img/icon@4x.png"; + } + stage.getIcons().add(newBuiltinImage(icon)); + } + /** * Suppress IllegalArgumentException since the url is supposed to be correct definitely. * @@ -769,8 +780,8 @@ public final class FXUtils { Task.runAsync(() -> { Path newPath = Files.createTempFile("hmcl-net-resource-cache-", ".cache"); try ( // Make sure the file is released from JVM before we put the path into remoteImageCache. - OutputStream outputStream = Files.newOutputStream(newPath); - PNGWriter writer = new PNGWriter(outputStream, PNGType.RGBA, PNGWriter.DEFAULT_COMPRESS_LEVEL) + OutputStream outputStream = Files.newOutputStream(newPath); + PNGWriter writer = new PNGWriter(outputStream, PNGType.RGBA, PNGWriter.DEFAULT_COMPRESS_LEVEL) ) { writer.write(PNGJavaFXUtils.asArgbImage(image)); } catch (IOException e) { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/GameCrashWindow.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/GameCrashWindow.java index f7946995e..7adea92a9 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/GameCrashWindow.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/GameCrashWindow.java @@ -66,7 +66,6 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; import static org.jackhuang.hmcl.setting.ConfigHolder.config; -import static org.jackhuang.hmcl.ui.FXUtils.newBuiltinImage; import static org.jackhuang.hmcl.ui.FXUtils.runInFX; import static org.jackhuang.hmcl.util.Logging.LOG; import static org.jackhuang.hmcl.util.Pair.pair; @@ -116,7 +115,7 @@ public class GameCrashWindow extends Stage { setScene(new Scene(view, 800, 480)); getScene().getStylesheets().addAll(Theme.getTheme().getStylesheets(config().getLauncherFontFamily())); setTitle(i18n("game.crash.title")); - getIcons().add(newBuiltinImage("/assets/img/icon.png")); + FXUtils.setIcon(this); analyzeCrashReport(); } 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 798e25d83..694e700fc 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/LogWindow.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/LogWindow.java @@ -60,7 +60,6 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; import static org.jackhuang.hmcl.setting.ConfigHolder.config; -import static org.jackhuang.hmcl.ui.FXUtils.newBuiltinImage; import static org.jackhuang.hmcl.util.Lang.thread; import static org.jackhuang.hmcl.util.Logging.LOG; import static org.jackhuang.hmcl.util.StringUtils.parseEscapeSequence; @@ -98,7 +97,7 @@ public final class LogWindow extends Stage { setScene(new Scene(impl, 800, 480)); getScene().getStylesheets().addAll(Theme.getTheme().getStylesheets(config().getLauncherFontFamily())); setTitle(i18n("logwindow.title")); - getIcons().add(newBuiltinImage("/assets/img/icon.png")); + FXUtils.setIcon(this); levelShownMap.values().forEach(property -> property.addListener((a, b, newValue) -> shakeLogs())); 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 32a413407..1b57ca0aa 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/WebStage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/WebStage.java @@ -29,7 +29,6 @@ import org.jackhuang.hmcl.Metadata; import org.jackhuang.hmcl.setting.Theme; import static org.jackhuang.hmcl.setting.ConfigHolder.config; -import static org.jackhuang.hmcl.ui.FXUtils.newBuiltinImage; public class WebStage extends Stage { protected final StackPane pane = new StackPane(); @@ -44,7 +43,7 @@ public class WebStage extends Stage { public WebStage(int width, int height) { setScene(new Scene(pane, width, height)); getScene().getStylesheets().addAll(Theme.getTheme().getStylesheets(config().getLauncherFontFamily())); - getIcons().add(newBuiltinImage("/assets/img/icon.png")); + FXUtils.setIcon(this); webView.getEngine().setUserDataDirectory(Metadata.HMCL_DIRECTORY.toFile()); webView.setContextMenuEnabled(false); progressBar.progressProperty().bind(webView.getEngine().getLoadWorker().progressProperty()); diff --git a/HMCL/src/main/resources/assets/img/icon@4x.png b/HMCL/src/main/resources/assets/img/icon@4x.png new file mode 100644 index 0000000000000000000000000000000000000000..161e6fbf8f07b4837427bf91e26bfa15705394c0 GIT binary patch literal 18223 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%0D-s=iHcqC6j$K!Y|Ih|g)+28$O=i~#?lD~k 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