Support copy action in LogWindow (#2351)

This commit is contained in:
Burning_TNT 2023-07-06 23:31:55 +08:00 committed by GitHub
parent 421f6f8b6d
commit 9a59ca95a1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -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<ListCell<Log>> 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<Log> 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);
}