From ddb5aa9a3d26114e26d8fec7adfc86c3899b71e9 Mon Sep 17 00:00:00 2001 From: Snownee Date: Tue, 16 Mar 2021 15:38:20 +0800 Subject: [PATCH] Human friendly schematic selection --- .../schematics/ClientSchematicLoader.java | 51 +++++++++++++++++++ .../gui/widgets/SelectionScrollInput.java | 12 +++++ 2 files changed, 63 insertions(+) diff --git a/src/main/java/com/simibubi/create/content/schematics/ClientSchematicLoader.java b/src/main/java/com/simibubi/create/content/schematics/ClientSchematicLoader.java index 3eea730d0..cbb4dc930 100644 --- a/src/main/java/com/simibubi/create/content/schematics/ClientSchematicLoader.java +++ b/src/main/java/com/simibubi/create/content/schematics/ClientSchematicLoader.java @@ -9,6 +9,7 @@ import java.nio.file.Paths; import java.nio.file.StandardOpenOption; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -142,6 +143,56 @@ public class ClientSchematicLoader { e.printStackTrace(); } + Collections.sort(availableSchematics, (a, b) -> { + if (a.endsWith(".nbt")) + a = a.substring(0, a.length() - 4); + if (b.endsWith(".nbt")) + b = b.substring(0, b.length() - 4); + int aLength = a.length(); + int bLength = b.length(); + int minSize = Math.min(aLength, bLength); + char aChar, bChar; + boolean aNumber, bNumber; + boolean asNumeric = false; + int lastNumericCompare = 0; + for (int i = 0; i < minSize; i++) { + aChar = a.charAt(i); + bChar = b.charAt(i); + aNumber = aChar >= '0' && aChar <= '9'; + bNumber = bChar >= '0' && bChar <= '9'; + if (asNumeric) + if (aNumber && bNumber) { + if (lastNumericCompare == 0) + lastNumericCompare = aChar - bChar; + } else if (aNumber) + return 1; + else if (bNumber) + return -1; + else if (lastNumericCompare == 0) { + if (aChar != bChar) + return aChar - bChar; + asNumeric = false; + } else + return lastNumericCompare; + else if (aNumber && bNumber) { + asNumeric = true; + if (lastNumericCompare == 0) + lastNumericCompare = aChar - bChar; + } else if (aChar != bChar) + return aChar - bChar; + } + if (asNumeric) + if (aLength > bLength && a.charAt(bLength) >= '0' && a.charAt(bLength) <= '9') // as number + return 1; // a has bigger size, thus b is smaller + else if (bLength > aLength && b.charAt(aLength) >= '0' && b.charAt(aLength) <= '9') // as number + return -1; // b has bigger size, thus a is smaller + else if (lastNumericCompare == 0) + return aLength - bLength; + else + return lastNumericCompare; + else + return aLength - bLength; + }); } public List getAvailableSchematics() { diff --git a/src/main/java/com/simibubi/create/foundation/gui/widgets/SelectionScrollInput.java b/src/main/java/com/simibubi/create/foundation/gui/widgets/SelectionScrollInput.java index b3e528baa..b190190ee 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/widgets/SelectionScrollInput.java +++ b/src/main/java/com/simibubi/create/foundation/gui/widgets/SelectionScrollInput.java @@ -38,6 +38,16 @@ public class SelectionScrollInput extends ScrollInput { protected void updateTooltip() { toolTip.clear(); toolTip.add(TextFormatting.BLUE + title); + int min = Math.min(this.max - 16, state - 7); + int max = Math.max(this.min + 16, state + 8); + min = Math.max(min, this.min); + max = Math.min(max, this.max); + if (this.min + 1 == min) + min--; + if (min > this.min) + toolTip.add(TextFormatting.GRAY + "> ..."); + if (this.max - 1 == max) + max++; for (int i = min; i < max; i++) { StringBuilder result = new StringBuilder(); if (i == state) @@ -46,6 +56,8 @@ public class SelectionScrollInput extends ScrollInput { result.append(TextFormatting.GRAY).append("> ").append(options.get(i)); toolTip.add(result.toString()); } + if (max < this.max) + toolTip.add(TextFormatting.GRAY + "> ..."); toolTip.add(TextFormatting.DARK_GRAY + "" + TextFormatting.ITALIC + scrollToSelect); }