From 17150bedcdf80944a64e165976cf2491d409b1c0 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Sun, 5 Jul 2020 15:31:12 +0800 Subject: Fix #370 and changes to how screens are handled Signed-off-by: shedaniel --- .../me/shedaniel/rei/impl/DisplayHelperImpl.java | 46 +++++++++++++++++++--- 1 file changed, 40 insertions(+), 6 deletions(-) (limited to 'src/main/java/me/shedaniel/rei/impl/DisplayHelperImpl.java') diff --git a/src/main/java/me/shedaniel/rei/impl/DisplayHelperImpl.java b/src/main/java/me/shedaniel/rei/impl/DisplayHelperImpl.java index 0744f91f3..a4132e043 100644 --- a/src/main/java/me/shedaniel/rei/impl/DisplayHelperImpl.java +++ b/src/main/java/me/shedaniel/rei/impl/DisplayHelperImpl.java @@ -29,7 +29,12 @@ import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.BaseBoundsHandler; import me.shedaniel.rei.api.DisplayHelper; import me.shedaniel.rei.api.OverlayDecider; +import me.shedaniel.rei.gui.config.DisplayPanelLocation; import me.shedaniel.rei.utils.CollectionUtils; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.util.Window; import org.jetbrains.annotations.ApiStatus; import java.util.Collections; @@ -38,9 +43,10 @@ import java.util.List; import java.util.Map; @ApiStatus.Internal +@Environment(EnvType.CLIENT) public class DisplayHelperImpl implements DisplayHelper { - private static final Comparator BOUNDS_HANDLER_COMPARATOR; + private static final Comparator BOUNDS_HANDLER_COMPARATOR = Comparator.comparingDouble(OverlayDecider::getPriority).reversed(); private static final DisplayBoundsHandler EMPTY = new DisplayBoundsHandler() { @Override public Class getBaseSupportedClass() { @@ -63,13 +69,9 @@ public class DisplayHelperImpl implements DisplayHelper { } }; - static { - Comparator comparator = Comparator.comparingDouble(OverlayDecider::getPriority); - BOUNDS_HANDLER_COMPARATOR = comparator.reversed(); - } - private List screenDisplayBoundsHandlers = Lists.newArrayList(); private Map, DisplayBoundsHandler> handlerCache = Maps.newHashMap(); + private Map, List> deciderSortedCache = Maps.newHashMap(); private Map, List>> handlerSortedCache = Maps.newHashMap(); private BaseBoundsHandler baseBoundsHandler; private Class tempScreen; @@ -85,6 +87,16 @@ public class DisplayHelperImpl implements DisplayHelper { return handlerSortedCache.get(screenClass); } + @Override + public List getSortedOverlayDeciders(Class screenClass) { + List possibleCached = deciderSortedCache.get(screenClass); + if (possibleCached != null) + return possibleCached; + tempScreen = screenClass; + deciderSortedCache.put(screenClass, (List) CollectionUtils.filter(screenDisplayBoundsHandlers, this::filterResponsible)); + return deciderSortedCache.get(screenClass); + } + @Override public List getAllOverlayDeciders() { return Collections.unmodifiableList(screenDisplayBoundsHandlers); @@ -100,6 +112,28 @@ public class DisplayHelperImpl implements DisplayHelper { return handlerCache.get(screenClass); } + @Override + public Rectangle getOverlayBounds(DisplayPanelLocation location, T screen) { + Window window = MinecraftClient.getInstance().getWindow(); + int scaledWidth = window.getScaledWidth(); + int scaledHeight = window.getScaledHeight(); + for (OverlayDecider decider : getSortedOverlayDeciders(screen.getClass())) { + if (decider instanceof DisplayBoundsProvider) { + Rectangle containerBounds = ((DisplayBoundsProvider) decider).getScreenBounds(screen); + if (location == DisplayPanelLocation.LEFT) { + if (containerBounds.x < 10) continue; + return new Rectangle(2, 0, containerBounds.x - 2, scaledHeight); + } else { + if (scaledWidth - containerBounds.getMaxX() < 10) continue; + return new Rectangle(containerBounds.getMaxX() + 2, 0, scaledWidth - containerBounds.getMaxX() - 4, scaledHeight); + } + } else if (decider instanceof DisplayBoundsHandler) { + return location == DisplayPanelLocation.LEFT ? ((DisplayBoundsHandler) decider).getLeftBounds(screen) : ((DisplayBoundsHandler) decider).getRightBounds(screen); + } + } + return new Rectangle(); + } + private boolean filterResponsible(OverlayDecider handler) { return handler.isHandingScreen(tempScreen); } -- cgit