From 9a59ca95a1ac53072dbf48ed6e27be42d48129a2 Mon Sep 17 00:00:00 2001 From: Burning_TNT <88144530+burningtnt@users.noreply.github.com> Date: Thu, 6 Jul 2023 23:31:55 +0800 Subject: [PATCH] Support copy action in LogWindow (#2351) --- .../java/org/jackhuang/hmcl/ui/LogWindow.java | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) 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 42acfd20b..117c2633c 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/LogWindow.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/LogWindow.java @@ -33,6 +33,7 @@ import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.Label; import javafx.scene.control.*; +import javafx.scene.input.KeyCode; import javafx.scene.layout.*; import javafx.stage.Stage; import org.jackhuang.hmcl.game.LauncherHelper; @@ -144,6 +145,7 @@ public final class LogWindow extends Stage { private static class Log { private final String log; private final Log4jLevel level; + private boolean selected = false; public Log(String log, Log4jLevel level) { this.log = log; @@ -237,6 +239,8 @@ public final class LogWindow extends Stage { private static final PseudoClass DEBUG = PseudoClass.getPseudoClass("debug"); private static final PseudoClass TRACE = PseudoClass.getPseudoClass("trace"); + private final Set> selected = new HashSet<>(); + private static ToggleButton createToggleButton(String backgroundColor, StringProperty buttonText, BooleanProperty showLevel) { ToggleButton button = new ToggleButton(); button.setStyle("-fx-background-color: " + backgroundColor + ";"); @@ -306,6 +310,22 @@ public final class LogWindow extends Stage { setPadding(new Insets(2)); setWrapText(true); setGraphic(null); + + setStyle("-fx-background-color: #FFFFFF;"); + setOnMouseClicked(event -> { + if (!event.isControlDown()) { + for (ListCell logListCell: selected) { + logListCell.setStyle("-fx-background-color: #FFFFFF;"); + logListCell.getItem().selected = false; + } + + selected.clear(); + } + + selected.add(this); + setStyle("-fx-background-color: #c4c4c4;"); + getItem().selected = true; + }); } @Override @@ -326,12 +346,35 @@ public final class LogWindow extends Stage { pseudoClassStateChanged(TRACE, !empty && item.level == Log4jLevel.TRACE); if (empty) { setText(null); + setStyle("-fx-background-color: #FFFFFF;"); } else { setText(item.log); + if (item.selected) { + setStyle("-fx-background-color: #c4c4c4;"); + } else { + setStyle("-fx-background-color: #FFFFFF;"); + } } } }); + listView.setOnKeyPressed(event -> { + if (event.isControlDown() && event.getCode() == KeyCode.C) { + StringBuilder stringBuilder = new StringBuilder(); + + for (Log item : listView.getItems()) { + if (item != null && item.selected) { + if (item.log != null) { + stringBuilder.append(item.log); + } + stringBuilder.append('\n'); + } + } + + FXUtils.copyText(stringBuilder.toString()); + } + }); + VBox.setVgrow(listView, Priority.ALWAYS); vbox.getChildren().add(listView); }