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 32928e3c7..84133508b 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/FXUtils.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/FXUtils.java @@ -318,18 +318,33 @@ public final class FXUtils { checkBox.selectedProperty().unbindBidirectional(property); } + /** + * Bind combo box selection with given enum property bidirectionally. + * You should only and always use {@code bindEnum} as well as {@code unbindEnum} at the same time. + * @param comboBox the combo box being bound with {@code property}. + * @param property the property being bound with {@code combo box}. + * @see #unbindEnum(JFXComboBox) + */ + @SuppressWarnings("unchecked") public static void bindEnum(JFXComboBox comboBox, Property property) { unbindEnum(comboBox); ChangeListener listener = (a, b, newValue) -> { ((Property) property).setValue(property.getValue().getClass().getEnumConstants()[newValue.intValue()]); }; comboBox.getSelectionModel().select(property.getValue().ordinal()); - comboBox.getProperties().put("listener", listener); + comboBox.getProperties().put("FXUtils.bindEnum.listener", listener); comboBox.getSelectionModel().selectedIndexProperty().addListener(listener); } + /** + * Unbind combo box selection with given enum property bidirectionally. + * You should only and always use {@code bindEnum} as well as {@code unbindEnum} at the same time. + * @param comboBox the combo box being bound with the property which can be inferred by {@code bindEnum}. + * @see #bindEnum(JFXComboBox, Property) + */ + @SuppressWarnings("unchecked") public static void unbindEnum(JFXComboBox comboBox) { - ChangeListener listener = Lang.get(comboBox.getProperties(), "listener", ChangeListener.class).orElse(null); + ChangeListener listener = Lang.get(comboBox.getProperties(), "FXUtils.bindEnum.listener", ChangeListener.class).orElse(null); if (listener == null) return; comboBox.getSelectionModel().selectedIndexProperty().removeListener(listener); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/AssetIndex.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/AssetIndex.java index c5eb0df61..ebade171c 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/AssetIndex.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/AssetIndex.java @@ -18,6 +18,7 @@ package org.jackhuang.hmcl.game; import com.google.gson.annotations.SerializedName; +import org.jackhuang.hmcl.util.ToStringBuilder; import java.util.Collections; import java.util.HashMap; @@ -52,4 +53,8 @@ public final class AssetIndex { return Collections.unmodifiableMap(objects); } + @Override + public String toString() { + return new ToStringBuilder(this).append("virtual", virtual).append("objects", objects).toString(); + } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/DownloadInfo.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/DownloadInfo.java index 0eddcf612..0ec7b7340 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/DownloadInfo.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/DownloadInfo.java @@ -21,6 +21,7 @@ import com.google.gson.JsonParseException; import com.google.gson.annotations.SerializedName; import org.jackhuang.hmcl.util.Immutable; import org.jackhuang.hmcl.util.StringUtils; +import org.jackhuang.hmcl.util.ToStringBuilder; import org.jackhuang.hmcl.util.Validation; /** @@ -67,6 +68,11 @@ public class DownloadInfo implements Validation { return size; } + @Override + public String toString() { + return new ToStringBuilder(this).append("url", url).append("sha1", sha1).append("size", size).toString(); + } + @Override public void validate() throws JsonParseException { if (StringUtils.isBlank(url)) diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/ExtractRules.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/ExtractRules.java index 7aa3e7526..a8ed46440 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/ExtractRules.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/ExtractRules.java @@ -32,7 +32,7 @@ public final class ExtractRules { private final List exclude; public ExtractRules() { - this.exclude = Collections.EMPTY_LIST; + this.exclude = Collections.emptyList(); } public ExtractRules(List exclude) { @@ -44,7 +44,7 @@ public final class ExtractRules { } public boolean shouldExtract(String path) { - return exclude.stream().noneMatch(it -> path.startsWith(it)); + return exclude.stream().noneMatch(path::startsWith); } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/Library.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/Library.java index a8eeee2a3..b783e192f 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/Library.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/Library.java @@ -22,6 +22,7 @@ import com.google.gson.reflect.TypeToken; import org.jackhuang.hmcl.util.Constants; import org.jackhuang.hmcl.util.OperatingSystem; import org.jackhuang.hmcl.util.Platform; +import org.jackhuang.hmcl.util.ToStringBuilder; import java.lang.reflect.Type; import java.util.List; @@ -142,7 +143,7 @@ public class Library implements Comparable { @Override public String toString() { - return "Library[" + getName() + "]"; + return new ToStringBuilder(this).append("name", getName()).toString(); } @Override diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/ToStringBuilder.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/ToStringBuilder.java new file mode 100644 index 000000000..29135510f --- /dev/null +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/ToStringBuilder.java @@ -0,0 +1,23 @@ +package org.jackhuang.hmcl.util; + +public class ToStringBuilder { + + private final StringBuilder stringBuilder; + private boolean first = true; + + public ToStringBuilder(Object object) { + stringBuilder = new StringBuilder(object.getClass().getSimpleName()).append(" ["); + } + + public ToStringBuilder append(String name, Object content) { + if (!first) + stringBuilder.append(", "); + stringBuilder.append(name).append('=').append(content.toString()); + return this; + } + + @Override + public String toString() { + return stringBuilder.toString() + "]"; + } +}