使用 LinePane 简化代码 (#5360)
This commit is contained in:
@@ -1299,8 +1299,8 @@ public final class FXUtils {
|
|||||||
return button;
|
return button;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Label newSafeTruncatedLabel(String text) {
|
public static Label newSafeTruncatedLabel() {
|
||||||
Label label = new Label(text);
|
Label label = new Label();
|
||||||
label.setTextOverrun(OverrunStyle.CENTER_WORD_ELLIPSIS);
|
label.setTextOverrun(OverrunStyle.CENTER_WORD_ELLIPSIS);
|
||||||
showTooltipWhenTruncated(label);
|
showTooltipWhenTruncated(label);
|
||||||
return label;
|
return label;
|
||||||
|
|||||||
@@ -142,7 +142,7 @@ public class ComponentList extends Control {
|
|||||||
if (node.getProperties().containsKey("ComponentList.vgrow")) {
|
if (node.getProperties().containsKey("ComponentList.vgrow")) {
|
||||||
VBox.setVgrow(cell, (Priority) node.getProperties().get("ComponentList.vgrow"));
|
VBox.setVgrow(cell, (Priority) node.getProperties().get("ComponentList.vgrow"));
|
||||||
}
|
}
|
||||||
if (node instanceof LineButtonBase || node.getProperties().containsKey("ComponentList.noPadding")) {
|
if (node instanceof LineButtonBase || node instanceof LinePane || node.getProperties().containsKey("ComponentList.noPadding")) {
|
||||||
cell.getStyleClass().add("no-padding");
|
cell.getStyleClass().add("no-padding");
|
||||||
}
|
}
|
||||||
return cell;
|
return cell;
|
||||||
|
|||||||
115
HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/LinePane.java
Normal file
115
HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/LinePane.java
Normal file
@@ -0,0 +1,115 @@
|
|||||||
|
/*
|
||||||
|
* Hello Minecraft! Launcher
|
||||||
|
* Copyright (C) 2026 huangyuhui <huanghongxun2008@126.com> and contributors
|
||||||
|
*
|
||||||
|
* 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package org.jackhuang.hmcl.ui.construct;
|
||||||
|
|
||||||
|
import javafx.beans.property.SimpleStringProperty;
|
||||||
|
import javafx.beans.property.StringProperty;
|
||||||
|
import javafx.beans.property.StringPropertyBase;
|
||||||
|
import javafx.geometry.Insets;
|
||||||
|
import javafx.geometry.Pos;
|
||||||
|
import javafx.scene.control.Label;
|
||||||
|
import javafx.scene.layout.BorderPane;
|
||||||
|
import javafx.scene.layout.Region;
|
||||||
|
import javafx.scene.layout.VBox;
|
||||||
|
|
||||||
|
/// @author Glavo
|
||||||
|
public class LinePane extends BorderPane {
|
||||||
|
|
||||||
|
private static final Insets PADDING = new Insets(8, 8, 8, 16);
|
||||||
|
|
||||||
|
private final Label titleLabel;
|
||||||
|
|
||||||
|
public LinePane() {
|
||||||
|
this.setPadding(PADDING);
|
||||||
|
this.setMinHeight(48);
|
||||||
|
|
||||||
|
this.titleLabel = new Label();
|
||||||
|
this.setCenter(titleLabel);
|
||||||
|
BorderPane.setAlignment(titleLabel, Pos.CENTER_LEFT);
|
||||||
|
titleLabel.textProperty().bind(titleProperty());
|
||||||
|
titleLabel.getStyleClass().add("title");
|
||||||
|
}
|
||||||
|
|
||||||
|
private final StringProperty title = new SimpleStringProperty(this, "title");
|
||||||
|
|
||||||
|
public StringProperty titleProperty() {
|
||||||
|
return title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTitle() {
|
||||||
|
return titleProperty().get();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTitle(String title) {
|
||||||
|
this.titleProperty().set(title);
|
||||||
|
}
|
||||||
|
|
||||||
|
private StringProperty subtitle;
|
||||||
|
|
||||||
|
public StringProperty subtitleProperty() {
|
||||||
|
if (subtitle == null) {
|
||||||
|
subtitle = new StringPropertyBase() {
|
||||||
|
private VBox left;
|
||||||
|
private Label subtitleLabel;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return "subtitle";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object getBean() {
|
||||||
|
return LinePane.this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void invalidated() {
|
||||||
|
String subtitle = get();
|
||||||
|
if (subtitle != null && !subtitle.isEmpty()) {
|
||||||
|
if (left == null) {
|
||||||
|
left = new VBox();
|
||||||
|
left.setMouseTransparent(true);
|
||||||
|
left.setAlignment(Pos.CENTER_LEFT);
|
||||||
|
|
||||||
|
subtitleLabel = new Label();
|
||||||
|
subtitleLabel.setWrapText(true);
|
||||||
|
subtitleLabel.setMinHeight(Region.USE_PREF_SIZE);
|
||||||
|
subtitleLabel.getStyleClass().add("subtitle");
|
||||||
|
}
|
||||||
|
subtitleLabel.setText(subtitle);
|
||||||
|
left.getChildren().setAll(titleLabel, subtitleLabel);
|
||||||
|
LinePane.this.setCenter(left);
|
||||||
|
} else if (left != null) {
|
||||||
|
subtitleLabel.setText(null);
|
||||||
|
LinePane.this.setCenter(titleLabel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return subtitle;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSubtitle() {
|
||||||
|
return subtitleProperty().get();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSubtitle(String subtitle) {
|
||||||
|
subtitleProperty().set(subtitle);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,86 @@
|
|||||||
|
/*
|
||||||
|
* Hello Minecraft! Launcher
|
||||||
|
* Copyright (C) 2026 huangyuhui <huanghongxun2008@126.com> and contributors
|
||||||
|
*
|
||||||
|
* 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package org.jackhuang.hmcl.ui.construct;
|
||||||
|
|
||||||
|
import javafx.beans.property.StringProperty;
|
||||||
|
import javafx.beans.property.StringPropertyBase;
|
||||||
|
import javafx.geometry.Insets;
|
||||||
|
import javafx.geometry.Pos;
|
||||||
|
import javafx.scene.control.Label;
|
||||||
|
import javafx.scene.layout.BorderPane;
|
||||||
|
import org.jackhuang.hmcl.ui.FXUtils;
|
||||||
|
|
||||||
|
/// @author Glavo
|
||||||
|
public final class LineTextPane extends LinePane {
|
||||||
|
|
||||||
|
private static final String DEFAULT_STYLE_CLASS = "line-label-pane";
|
||||||
|
|
||||||
|
public LineTextPane() {
|
||||||
|
this.getStyleClass().add(DEFAULT_STYLE_CLASS);
|
||||||
|
}
|
||||||
|
|
||||||
|
private StringProperty text;
|
||||||
|
|
||||||
|
public StringProperty textProperty() {
|
||||||
|
if (text == null) {
|
||||||
|
text = new StringPropertyBase() {
|
||||||
|
private static final Insets LABEL_MARGIN = new Insets(0, 8, 0, 16);
|
||||||
|
|
||||||
|
private Label rightLabel;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object getBean() {
|
||||||
|
return LineTextPane.this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return "text";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void invalidated() {
|
||||||
|
String text = get();
|
||||||
|
if (text == null || text.isEmpty()) {
|
||||||
|
if (rightLabel != null)
|
||||||
|
rightLabel.setText(null);
|
||||||
|
LineTextPane.this.setRight(null);
|
||||||
|
} else {
|
||||||
|
if (rightLabel == null) {
|
||||||
|
rightLabel = FXUtils.newSafeTruncatedLabel();
|
||||||
|
FXUtils.copyOnDoubleClick(rightLabel);
|
||||||
|
BorderPane.setMargin(rightLabel, LABEL_MARGIN);
|
||||||
|
BorderPane.setAlignment(rightLabel, Pos.CENTER_RIGHT);
|
||||||
|
}
|
||||||
|
rightLabel.setText(text);
|
||||||
|
LineTextPane.this.setRight(rightLabel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getText() {
|
||||||
|
return textProperty().get();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setText(String text) {
|
||||||
|
textProperty().set(text);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -21,9 +21,7 @@ import com.jfoenix.controls.JFXButton;
|
|||||||
import com.jfoenix.controls.JFXTextField;
|
import com.jfoenix.controls.JFXTextField;
|
||||||
import javafx.beans.property.SimpleStringProperty;
|
import javafx.beans.property.SimpleStringProperty;
|
||||||
import javafx.beans.property.StringProperty;
|
import javafx.beans.property.StringProperty;
|
||||||
import javafx.geometry.Insets;
|
|
||||||
import javafx.geometry.Pos;
|
import javafx.geometry.Pos;
|
||||||
import javafx.scene.control.Label;
|
|
||||||
import javafx.scene.control.SkinBase;
|
import javafx.scene.control.SkinBase;
|
||||||
import javafx.scene.layout.BorderPane;
|
import javafx.scene.layout.BorderPane;
|
||||||
import javafx.scene.layout.VBox;
|
import javafx.scene.layout.VBox;
|
||||||
@@ -110,17 +108,14 @@ public final class JavaInstallPage extends WizardSinglePage {
|
|||||||
|
|
||||||
|
|
||||||
{
|
{
|
||||||
BorderPane namePane = new BorderPane();
|
var namePane = new LinePane();
|
||||||
{
|
{
|
||||||
Label label = new Label(i18n("java.install.name"));
|
namePane.setTitle(i18n("java.install.name"));
|
||||||
BorderPane.setAlignment(label, Pos.CENTER_LEFT);
|
|
||||||
namePane.setLeft(label);
|
|
||||||
|
|
||||||
nameField = new JFXTextField();
|
nameField = new JFXTextField();
|
||||||
nameField.textProperty().bindBidirectional(control.nameProperty);
|
nameField.textProperty().bindBidirectional(control.nameProperty);
|
||||||
FXUtils.setLimitWidth(nameField, 200);
|
FXUtils.setLimitWidth(nameField, 200);
|
||||||
BorderPane.setAlignment(nameField, Pos.CENTER_RIGHT);
|
BorderPane.setAlignment(nameField, Pos.CENTER_RIGHT);
|
||||||
BorderPane.setMargin(nameField, new Insets(0, 0, 12, 0));
|
|
||||||
namePane.setRight(nameField);
|
namePane.setRight(nameField);
|
||||||
nameField.setValidators(
|
nameField.setValidators(
|
||||||
new RequiredValidator(),
|
new RequiredValidator(),
|
||||||
@@ -176,16 +171,9 @@ public final class JavaInstallPage extends WizardSinglePage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void addInfo(String name, String value) {
|
private void addInfo(String name, String value) {
|
||||||
BorderPane pane = new BorderPane();
|
LineTextPane pane = new LineTextPane();
|
||||||
|
pane.setTitle(name);
|
||||||
pane.setLeft(new Label(name));
|
pane.setText(value);
|
||||||
|
|
||||||
Label valueLabel = FXUtils.newSafeTruncatedLabel(value);
|
|
||||||
FXUtils.copyOnDoubleClick(valueLabel);
|
|
||||||
BorderPane.setMargin(valueLabel, new Insets(0, 0, 0, 16));
|
|
||||||
BorderPane.setAlignment(valueLabel, Pos.CENTER_RIGHT);
|
|
||||||
pane.setCenter(valueLabel);
|
|
||||||
|
|
||||||
this.componentList.getContent().add(pane);
|
this.componentList.getContent().add(pane);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,7 +47,6 @@ import org.jackhuang.hmcl.util.Lang;
|
|||||||
import org.jackhuang.hmcl.util.StringUtils;
|
import org.jackhuang.hmcl.util.StringUtils;
|
||||||
import org.jackhuang.hmcl.util.i18n.I18n;
|
import org.jackhuang.hmcl.util.i18n.I18n;
|
||||||
import org.jackhuang.hmcl.util.io.FileUtils;
|
import org.jackhuang.hmcl.util.io.FileUtils;
|
||||||
import org.jetbrains.annotations.PropertyKey;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
@@ -57,7 +56,6 @@ import java.time.Duration;
|
|||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.concurrent.Callable;
|
|
||||||
|
|
||||||
import static org.jackhuang.hmcl.util.i18n.I18n.formatDateTime;
|
import static org.jackhuang.hmcl.util.i18n.I18n.formatDateTime;
|
||||||
import static org.jackhuang.hmcl.util.i18n.I18n.i18n;
|
import static org.jackhuang.hmcl.util.i18n.I18n.i18n;
|
||||||
@@ -104,9 +102,9 @@ public final class WorldInfoPage extends SpinnerPane implements WorldManagePage.
|
|||||||
|
|
||||||
ComponentList worldInfo = new ComponentList();
|
ComponentList worldInfo = new ComponentList();
|
||||||
{
|
{
|
||||||
BorderPane worldNamePane = new BorderPane();
|
var worldNamePane = new LinePane();
|
||||||
{
|
{
|
||||||
setLeftLabel(worldNamePane, "world.name");
|
worldNamePane.setTitle(i18n("world.name"));
|
||||||
JFXTextField worldNameField = new JFXTextField();
|
JFXTextField worldNameField = new JFXTextField();
|
||||||
setRightTextField(worldNamePane, worldNameField, 200);
|
setRightTextField(worldNamePane, worldNameField, 200);
|
||||||
|
|
||||||
@@ -129,15 +127,15 @@ public final class WorldInfoPage extends SpinnerPane implements WorldManagePage.
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
BorderPane gameVersionPane = new BorderPane();
|
var gameVersionPane = new LineTextPane();
|
||||||
{
|
{
|
||||||
setLeftLabel(gameVersionPane, "world.info.game_version");
|
gameVersionPane.setTitle(i18n("world.info.game_version"));
|
||||||
setRightTextLabel(gameVersionPane, () -> world.getGameVersion() == null ? "" : world.getGameVersion().toNormalizedString());
|
gameVersionPane.setText(world.getGameVersion() == null ? "" : world.getGameVersion().toNormalizedString());
|
||||||
}
|
}
|
||||||
|
|
||||||
BorderPane iconPane = new BorderPane();
|
var iconPane = new LinePane();
|
||||||
{
|
{
|
||||||
setLeftLabel(iconPane, "world.icon");
|
iconPane.setTitle(i18n("world.icon"));
|
||||||
|
|
||||||
{
|
{
|
||||||
FXUtils.limitSize(iconImageView, 32, 32);
|
FXUtils.limitSize(iconImageView, 32, 32);
|
||||||
@@ -173,9 +171,9 @@ public final class WorldInfoPage extends SpinnerPane implements WorldManagePage.
|
|||||||
iconPane.setRight(hBox);
|
iconPane.setRight(hBox);
|
||||||
}
|
}
|
||||||
|
|
||||||
BorderPane seedPane = new BorderPane();
|
var seedPane = new LinePane();
|
||||||
{
|
{
|
||||||
setLeftLabel(seedPane, "world.info.random_seed");
|
seedPane.setTitle(i18n("world.info.random_seed"));
|
||||||
|
|
||||||
SimpleBooleanProperty visibility = new SimpleBooleanProperty();
|
SimpleBooleanProperty visibility = new SimpleBooleanProperty();
|
||||||
StackPane visibilityButton = new StackPane();
|
StackPane visibilityButton = new StackPane();
|
||||||
@@ -203,51 +201,50 @@ public final class WorldInfoPage extends SpinnerPane implements WorldManagePage.
|
|||||||
|
|
||||||
HBox right = new HBox(8);
|
HBox right = new HBox(8);
|
||||||
{
|
{
|
||||||
|
right.setAlignment(Pos.CENTER_RIGHT);
|
||||||
BorderPane.setAlignment(right, Pos.CENTER_RIGHT);
|
BorderPane.setAlignment(right, Pos.CENTER_RIGHT);
|
||||||
right.getChildren().setAll(visibilityButton, seedLabel);
|
right.getChildren().setAll(visibilityButton, seedLabel);
|
||||||
seedPane.setRight(right);
|
seedPane.setRight(right);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
BorderPane worldSpawnPoint = new BorderPane();
|
var worldSpawnPoint = new LineTextPane();
|
||||||
{
|
{
|
||||||
setLeftLabel(worldSpawnPoint, "world.info.spawn");
|
worldSpawnPoint.setTitle(i18n("world.info.spawn"));
|
||||||
setRightTextLabel(worldSpawnPoint, () -> {
|
|
||||||
if (dataTag.get("spawn") instanceof CompoundTag spawnTag && spawnTag.get("pos") instanceof IntArrayTag posTag) {
|
String value;
|
||||||
return Dimension.of(spawnTag.get("dimension") instanceof StringTag dimensionTag
|
if (dataTag.get("spawn") instanceof CompoundTag spawnTag && spawnTag.get("pos") instanceof IntArrayTag posTag) {
|
||||||
? dimensionTag
|
value = Dimension.of(spawnTag.get("dimension") instanceof StringTag dimensionTag
|
||||||
: new StringTag("SpawnDimension", "minecraft:overworld"))
|
? dimensionTag
|
||||||
.formatPosition(posTag);
|
: new StringTag("SpawnDimension", "minecraft:overworld"))
|
||||||
} else if (dataTag.get("SpawnX") instanceof IntTag intX
|
.formatPosition(posTag);
|
||||||
&& dataTag.get("SpawnY") instanceof IntTag intY
|
} else if (dataTag.get("SpawnX") instanceof IntTag intX
|
||||||
&& dataTag.get("SpawnZ") instanceof IntTag intZ) {
|
&& dataTag.get("SpawnY") instanceof IntTag intY
|
||||||
return Dimension.OVERWORLD.formatPosition(intX.getValue(), intY.getValue(), intZ.getValue());
|
&& dataTag.get("SpawnZ") instanceof IntTag intZ) {
|
||||||
} else {
|
value = Dimension.OVERWORLD.formatPosition(intX.getValue(), intY.getValue(), intZ.getValue());
|
||||||
return "";
|
} else {
|
||||||
}
|
value = null;
|
||||||
});
|
}
|
||||||
|
|
||||||
|
worldSpawnPoint.setText(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
BorderPane lastPlayedPane = new BorderPane();
|
var lastPlayedPane = new LineTextPane();
|
||||||
{
|
{
|
||||||
setLeftLabel(lastPlayedPane, "world.info.last_played");
|
lastPlayedPane.setTitle(i18n("world.info.last_played"));
|
||||||
setRightTextLabel(lastPlayedPane, () -> formatDateTime(Instant.ofEpochMilli(world.getLastPlayed())));
|
lastPlayedPane.setText(formatDateTime(Instant.ofEpochMilli(world.getLastPlayed())));
|
||||||
}
|
}
|
||||||
|
|
||||||
BorderPane timePane = new BorderPane();
|
var timePane = new LineTextPane();
|
||||||
{
|
{
|
||||||
setLeftLabel(timePane, "world.info.time");
|
timePane.setTitle(i18n("world.info.time"));
|
||||||
setRightTextLabel(timePane, () -> {
|
if (dataTag.get("Time") instanceof LongTag timeTag) {
|
||||||
if (dataTag.get("Time") instanceof LongTag timeTag) {
|
Duration duration = Duration.ofSeconds(timeTag.getValue() / 20);
|
||||||
Duration duration = Duration.ofSeconds(timeTag.getValue() / 20);
|
timePane.setText(i18n("world.info.time.format", duration.toDays(), duration.toHoursPart(), duration.toMinutesPart()));
|
||||||
return i18n("world.info.time.format", duration.toDays(), duration.toHoursPart(), duration.toMinutesPart());
|
}
|
||||||
} else {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
LineToggleButton allowCheatsButton = new LineToggleButton();
|
var allowCheatsButton = new LineToggleButton();
|
||||||
{
|
{
|
||||||
allowCheatsButton.setTitle(i18n("world.info.allow_cheats"));
|
allowCheatsButton.setTitle(i18n("world.info.allow_cheats"));
|
||||||
allowCheatsButton.setDisable(isReadOnly);
|
allowCheatsButton.setDisable(isReadOnly);
|
||||||
@@ -255,7 +252,7 @@ public final class WorldInfoPage extends SpinnerPane implements WorldManagePage.
|
|||||||
bindTagAndToggleButton(dataTag.get("allowCommands"), allowCheatsButton);
|
bindTagAndToggleButton(dataTag.get("allowCommands"), allowCheatsButton);
|
||||||
}
|
}
|
||||||
|
|
||||||
LineToggleButton generateFeaturesButton = new LineToggleButton();
|
var generateFeaturesButton = new LineToggleButton();
|
||||||
{
|
{
|
||||||
generateFeaturesButton.setTitle(i18n("world.info.generate_features"));
|
generateFeaturesButton.setTitle(i18n("world.info.generate_features"));
|
||||||
generateFeaturesButton.setDisable(isReadOnly);
|
generateFeaturesButton.setDisable(isReadOnly);
|
||||||
@@ -268,7 +265,7 @@ public final class WorldInfoPage extends SpinnerPane implements WorldManagePage.
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LineSelectButton<Difficulty> difficultyButton = new LineSelectButton<>();
|
var difficultyButton = new LineSelectButton<Difficulty>();
|
||||||
{
|
{
|
||||||
difficultyButton.setTitle(i18n("world.info.difficulty"));
|
difficultyButton.setTitle(i18n("world.info.difficulty"));
|
||||||
difficultyButton.setDisable(worldManagePage.isReadOnly());
|
difficultyButton.setDisable(worldManagePage.isReadOnly());
|
||||||
@@ -292,7 +289,7 @@ public final class WorldInfoPage extends SpinnerPane implements WorldManagePage.
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LineToggleButton difficultyLockPane = new LineToggleButton();
|
var difficultyLockPane = new LineToggleButton();
|
||||||
{
|
{
|
||||||
difficultyLockPane.setTitle(i18n("world.info.difficulty_lock"));
|
difficultyLockPane.setTitle(i18n("world.info.difficulty_lock"));
|
||||||
difficultyLockPane.setDisable(isReadOnly);
|
difficultyLockPane.setDisable(isReadOnly);
|
||||||
@@ -310,57 +307,45 @@ public final class WorldInfoPage extends SpinnerPane implements WorldManagePage.
|
|||||||
if (dataTag.get("Player") instanceof CompoundTag playerTag) {
|
if (dataTag.get("Player") instanceof CompoundTag playerTag) {
|
||||||
ComponentList playerInfo = new ComponentList();
|
ComponentList playerInfo = new ComponentList();
|
||||||
|
|
||||||
BorderPane locationPane = new BorderPane();
|
var locationPane = new LineTextPane();
|
||||||
{
|
{
|
||||||
setLeftLabel(locationPane, "world.info.player.location");
|
locationPane.setTitle(i18n("world.info.player.location"));
|
||||||
setRightTextLabel(locationPane, () -> {
|
Dimension dimension = Dimension.of(playerTag.get("Dimension"));
|
||||||
Dimension dimension = Dimension.of(playerTag.get("Dimension"));
|
if (dimension != null && playerTag.get("Pos") instanceof ListTag posTag) {
|
||||||
if (dimension != null && playerTag.get("Pos") instanceof ListTag posTag) {
|
locationPane.setText(dimension.formatPosition(posTag));
|
||||||
return dimension.formatPosition(posTag);
|
}
|
||||||
}
|
|
||||||
return "";
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
BorderPane lastDeathLocationPane = new BorderPane();
|
var lastDeathLocationPane = new LineTextPane();
|
||||||
{
|
{
|
||||||
setLeftLabel(lastDeathLocationPane, "world.info.player.last_death_location");
|
lastDeathLocationPane.setTitle(i18n("world.info.player.last_death_location"));
|
||||||
setRightTextLabel(lastDeathLocationPane, () -> {
|
// Valid after 22w14a; prior to this version, the game did not record the last death location data.
|
||||||
// Valid after 22w14a; prior to this version, the game did not record the last death location data.
|
if (playerTag.get("LastDeathLocation") instanceof CompoundTag LastDeathLocationTag) {
|
||||||
if (playerTag.get("LastDeathLocation") instanceof CompoundTag LastDeathLocationTag) {
|
Dimension dimension = Dimension.of(LastDeathLocationTag.get("dimension"));
|
||||||
Dimension dimension = Dimension.of(LastDeathLocationTag.get("dimension"));
|
if (dimension != null && LastDeathLocationTag.get("pos") instanceof IntArrayTag posTag) {
|
||||||
if (dimension != null && LastDeathLocationTag.get("pos") instanceof IntArrayTag posTag) {
|
lastDeathLocationPane.setText(dimension.formatPosition(posTag));
|
||||||
return dimension.formatPosition(posTag);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return "";
|
}
|
||||||
});
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
BorderPane spawnPane = new BorderPane();
|
var spawnPane = new LineTextPane();
|
||||||
{
|
{
|
||||||
setLeftLabel(spawnPane, "world.info.player.spawn");
|
spawnPane.setTitle(i18n("world.info.player.spawn"));
|
||||||
setRightTextLabel(spawnPane, () -> {
|
if (playerTag.get("respawn") instanceof CompoundTag respawnTag
|
||||||
|
&& respawnTag.get("dimension") instanceof StringTag dimensionTag
|
||||||
if (playerTag.get("respawn") instanceof CompoundTag respawnTag
|
&& respawnTag.get("pos") instanceof IntArrayTag intArrayTag
|
||||||
&& respawnTag.get("dimension") instanceof StringTag dimensionTag
|
&& intArrayTag.length() >= 3) { // Valid after 25w07a
|
||||||
&& respawnTag.get("pos") instanceof IntArrayTag intArrayTag
|
spawnPane.setText(Dimension.of(dimensionTag).formatPosition(intArrayTag));
|
||||||
&& intArrayTag.length() >= 3) { // Valid after 25w07a
|
} else if (playerTag.get("SpawnX") instanceof IntTag intX
|
||||||
return Dimension.of(dimensionTag).formatPosition(intArrayTag);
|
&& playerTag.get("SpawnY") instanceof IntTag intY
|
||||||
} else if (playerTag.get("SpawnX") instanceof IntTag intX
|
&& playerTag.get("SpawnZ") instanceof IntTag intZ) { // Valid before 25w07a
|
||||||
&& playerTag.get("SpawnY") instanceof IntTag intY
|
// SpawnDimension tag is valid after 20w12a. Prior to this version, the game did not record the respawn point dimension and respawned in the Overworld.
|
||||||
&& playerTag.get("SpawnZ") instanceof IntTag intZ) { // Valid before 25w07a
|
spawnPane.setText((playerTag.get("SpawnDimension") instanceof StringTag dimensionTag ? Dimension.of(dimensionTag) : Dimension.OVERWORLD)
|
||||||
// SpawnDimension tag is valid after 20w12a. Prior to this version, the game did not record the respawn point dimension and respawned in the Overworld.
|
.formatPosition(intX.getValue(), intY.getValue(), intZ.getValue()));
|
||||||
return (playerTag.get("SpawnDimension") instanceof StringTag dimensionTag ? Dimension.of(dimensionTag) : Dimension.OVERWORLD)
|
}
|
||||||
.formatPosition(intX.getValue(), intY.getValue(), intZ.getValue());
|
|
||||||
}
|
|
||||||
|
|
||||||
return "";
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
LineSelectButton<GameType> playerGameTypePane = new LineSelectButton<>();
|
var playerGameTypePane = new LineSelectButton<GameType>();
|
||||||
{
|
{
|
||||||
playerGameTypePane.setTitle(i18n("world.info.player.game_type"));
|
playerGameTypePane.setTitle(i18n("world.info.player.game_type"));
|
||||||
playerGameTypePane.setDisable(worldManagePage.isReadOnly());
|
playerGameTypePane.setDisable(worldManagePage.isReadOnly());
|
||||||
@@ -392,27 +377,27 @@ public final class WorldInfoPage extends SpinnerPane implements WorldManagePage.
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
BorderPane healthPane = new BorderPane();
|
var healthPane = new LinePane();
|
||||||
{
|
{
|
||||||
setLeftLabel(healthPane, "world.info.player.health");
|
healthPane.setTitle(i18n("world.info.player.health"));
|
||||||
setRightTextField(healthPane, 50, playerTag.get("Health"));
|
setRightTextField(healthPane, 50, playerTag.get("Health"));
|
||||||
}
|
}
|
||||||
|
|
||||||
BorderPane foodLevelPane = new BorderPane();
|
var foodLevelPane = new LinePane();
|
||||||
{
|
{
|
||||||
setLeftLabel(foodLevelPane, "world.info.player.food_level");
|
foodLevelPane.setTitle(i18n("world.info.player.food_level"));
|
||||||
setRightTextField(foodLevelPane, 50, playerTag.get("foodLevel"));
|
setRightTextField(foodLevelPane, 50, playerTag.get("foodLevel"));
|
||||||
}
|
}
|
||||||
|
|
||||||
BorderPane foodSaturationPane = new BorderPane();
|
var foodSaturationPane = new LinePane();
|
||||||
{
|
{
|
||||||
setLeftLabel(foodSaturationPane, "world.info.player.food_saturation_level");
|
foodSaturationPane.setTitle(i18n("world.info.player.food_saturation_level"));
|
||||||
setRightTextField(foodSaturationPane, 50, playerTag.get("foodSaturationLevel"));
|
setRightTextField(foodSaturationPane, 50, playerTag.get("foodSaturationLevel"));
|
||||||
}
|
}
|
||||||
|
|
||||||
BorderPane xpLevelPane = new BorderPane();
|
var xpLevelPane = new LinePane();
|
||||||
{
|
{
|
||||||
setLeftLabel(xpLevelPane, "world.info.player.xp_level");
|
xpLevelPane.setTitle(i18n("world.info.player.xp_level"));
|
||||||
setRightTextField(xpLevelPane, 50, playerTag.get("XpLevel"));
|
setRightTextField(xpLevelPane, 50, playerTag.get("XpLevel"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -425,12 +410,6 @@ public final class WorldInfoPage extends SpinnerPane implements WorldManagePage.
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setLeftLabel(BorderPane borderPane, @PropertyKey(resourceBundle = "assets.lang.I18N") String key) {
|
|
||||||
Label label = new Label(i18n(key));
|
|
||||||
BorderPane.setAlignment(label, Pos.CENTER_LEFT);
|
|
||||||
borderPane.setLeft(label);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setRightTextField(BorderPane borderPane, int perfWidth, Tag tag) {
|
private void setRightTextField(BorderPane borderPane, int perfWidth, Tag tag) {
|
||||||
JFXTextField textField = new JFXTextField();
|
JFXTextField textField = new JFXTextField();
|
||||||
setRightTextField(borderPane, textField, perfWidth);
|
setRightTextField(borderPane, textField, perfWidth);
|
||||||
@@ -450,18 +429,6 @@ public final class WorldInfoPage extends SpinnerPane implements WorldManagePage.
|
|||||||
borderPane.setRight(textField);
|
borderPane.setRight(textField);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setRightTextLabel(BorderPane borderPane, Callable<String> setNameCall) {
|
|
||||||
Label label = new Label();
|
|
||||||
FXUtils.copyOnDoubleClick(label);
|
|
||||||
BorderPane.setAlignment(label, Pos.CENTER_RIGHT);
|
|
||||||
try {
|
|
||||||
label.setText(setNameCall.call());
|
|
||||||
} catch (Exception e) {
|
|
||||||
LOG.warning("Exception happened when setting name", e);
|
|
||||||
}
|
|
||||||
borderPane.setRight(label);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void bindTagAndToggleButton(Tag tag, LineToggleButton toggleButton) {
|
private void bindTagAndToggleButton(Tag tag, LineToggleButton toggleButton) {
|
||||||
if (tag instanceof ByteTag byteTag) {
|
if (tag instanceof ByteTag byteTag) {
|
||||||
byte value = byteTag.getValue();
|
byte value = byteTag.getValue();
|
||||||
|
|||||||
Reference in New Issue
Block a user