Human friendly schematic selection

This commit is contained in:
Snownee 2021-03-16 15:38:20 +08:00
parent 8b5d5abc06
commit ddb5aa9a3d
2 changed files with 63 additions and 0 deletions

View file

@ -9,6 +9,7 @@ import java.nio.file.Paths;
import java.nio.file.StandardOpenOption; import java.nio.file.StandardOpenOption;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
@ -142,6 +143,56 @@ public class ClientSchematicLoader {
e.printStackTrace(); 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<String> getAvailableSchematics() { public List<String> getAvailableSchematics() {

View file

@ -38,6 +38,16 @@ public class SelectionScrollInput extends ScrollInput {
protected void updateTooltip() { protected void updateTooltip() {
toolTip.clear(); toolTip.clear();
toolTip.add(TextFormatting.BLUE + title); 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++) { for (int i = min; i < max; i++) {
StringBuilder result = new StringBuilder(); StringBuilder result = new StringBuilder();
if (i == state) if (i == state)
@ -46,6 +56,8 @@ public class SelectionScrollInput extends ScrollInput {
result.append(TextFormatting.GRAY).append("> ").append(options.get(i)); result.append(TextFormatting.GRAY).append("> ").append(options.get(i));
toolTip.add(result.toString()); toolTip.add(result.toString());
} }
if (max < this.max)
toolTip.add(TextFormatting.GRAY + "> ...");
toolTip.add(TextFormatting.DARK_GRAY + "" + TextFormatting.ITALIC + scrollToSelect); toolTip.add(TextFormatting.DARK_GRAY + "" + TextFormatting.ITALIC + scrollToSelect);
} }