From 66abc317e5fc36a397ca1cc919e388fbe143956b Mon Sep 17 00:00:00 2001 From: shedaniel Date: Wed, 1 Apr 2020 20:01:34 +0800 Subject: ScrollingContainer & SubsetsMenu && 20w18b Signed-off-by: shedaniel --- .../rei/impl/subsets/SubsetsRegistryImpl.java | 83 ++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 src/main/java/me/shedaniel/rei/impl/subsets/SubsetsRegistryImpl.java (limited to 'src/main/java/me/shedaniel/rei/impl/subsets/SubsetsRegistryImpl.java') diff --git a/src/main/java/me/shedaniel/rei/impl/subsets/SubsetsRegistryImpl.java b/src/main/java/me/shedaniel/rei/impl/subsets/SubsetsRegistryImpl.java new file mode 100644 index 000000000..58e19dd9f --- /dev/null +++ b/src/main/java/me/shedaniel/rei/impl/subsets/SubsetsRegistryImpl.java @@ -0,0 +1,83 @@ +package me.shedaniel.rei.impl.subsets; + +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; +import me.shedaniel.rei.api.EntryStack; +import me.shedaniel.rei.api.subsets.SubsetsRegistry; +import me.shedaniel.rei.utils.CollectionUtils; +import net.minecraft.util.Identifier; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.*; + +@ApiStatus.Experimental +@ApiStatus.Internal +public class SubsetsRegistryImpl implements SubsetsRegistry { + private final Map> entryPaths = Maps.newHashMap(); + + public void reset() { + entryPaths.clear(); + } + + @Override + public @NotNull List getEntryPaths(@NotNull EntryStack stack) { + List strings = null; + for (Map.Entry> entry : entryPaths.entrySet()) { + if (CollectionUtils.findFirstOrNullEqualsEntryIgnoreAmount(entry.getValue(), stack) != null) { + if (strings == null) + strings = Lists.newArrayList(); + strings.add(entry.getKey()); + } + } + return strings == null ? Collections.emptyList() : strings; + } + + @Override + public void registerPathEntry(@NotNull String path, @NotNull EntryStack stack) { + getOrCreatePathEntries(path).add(stack.copy().setting(EntryStack.Settings.CHECK_AMOUNT, EntryStack.Settings.FALSE).setting(EntryStack.Settings.RENDER_COUNTS, EntryStack.Settings.FALSE).setting(EntryStack.Settings.CHECK_TAGS, EntryStack.Settings.TRUE)); + } + + @Override + public void registerPathEntries(@NotNull String path, @NotNull Collection stacks) { + Set entries = getOrCreatePathEntries(path); + for (EntryStack stack : stacks) { + entries.add(stack.copy().setting(EntryStack.Settings.CHECK_AMOUNT, EntryStack.Settings.FALSE).setting(EntryStack.Settings.RENDER_COUNTS, EntryStack.Settings.FALSE).setting(EntryStack.Settings.CHECK_TAGS, EntryStack.Settings.TRUE)); + } + } + + @Nullable + @Override + public Set getPathEntries(@NotNull String path) { + if (!isPathValid(path)) + throw new IllegalArgumentException("Illegal path: " + path); + return entryPaths.get(path); + } + + @Override + public @NotNull Set getPaths() { + return entryPaths.keySet(); + } + + @NotNull + @Override + public Set getOrCreatePathEntries(@NotNull String path) { + Set paths = getPathEntries(path); + if (paths == null) { + entryPaths.put(path, Sets.newLinkedHashSet()); + paths = Objects.requireNonNull(getPathEntries(path)); + } + return paths; + } + + private boolean isPathValid(String path) { + String[] pathSegments = path.split("/"); + for (String pathSegment : pathSegments) { + if (!Identifier.isValid(pathSegment)) + return false; + } + return true; + } +} -- cgit