diff options
| author | shedaniel <daniel@shedaniel.me> | 2020-07-05 15:31:12 +0800 |
|---|---|---|
| committer | shedaniel <daniel@shedaniel.me> | 2020-07-05 15:31:12 +0800 |
| commit | 17150bedcdf80944a64e165976cf2491d409b1c0 (patch) | |
| tree | f71725bf6c37fd2bc82fbf8bf07a4b98ba2d1584 /src/main/java/me/shedaniel/rei/impl/DisplayHelperImpl.java | |
| parent | af1b3f780d8edb361c00421cdd991f3f2b86849c (diff) | |
| download | RoughlyEnoughItems-17150bedcdf80944a64e165976cf2491d409b1c0.tar.gz RoughlyEnoughItems-17150bedcdf80944a64e165976cf2491d409b1c0.tar.bz2 RoughlyEnoughItems-17150bedcdf80944a64e165976cf2491d409b1c0.zip | |
Fix #370 and changes to how screens are handled
Signed-off-by: shedaniel <daniel@shedaniel.me>
Diffstat (limited to 'src/main/java/me/shedaniel/rei/impl/DisplayHelperImpl.java')
| -rw-r--r-- | src/main/java/me/shedaniel/rei/impl/DisplayHelperImpl.java | 46 |
1 files changed, 40 insertions, 6 deletions
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<OverlayDecider> BOUNDS_HANDLER_COMPARATOR; + private static final Comparator<OverlayDecider> BOUNDS_HANDLER_COMPARATOR = Comparator.comparingDouble(OverlayDecider::getPriority).reversed(); private static final DisplayBoundsHandler<Object> EMPTY = new DisplayBoundsHandler<Object>() { @Override public Class<Object> getBaseSupportedClass() { @@ -63,13 +69,9 @@ public class DisplayHelperImpl implements DisplayHelper { } }; - static { - Comparator<OverlayDecider> comparator = Comparator.comparingDouble(OverlayDecider::getPriority); - BOUNDS_HANDLER_COMPARATOR = comparator.reversed(); - } - private List<OverlayDecider> screenDisplayBoundsHandlers = Lists.newArrayList(); private Map<Class<?>, DisplayBoundsHandler<?>> handlerCache = Maps.newHashMap(); + private Map<Class<?>, List<OverlayDecider>> deciderSortedCache = Maps.newHashMap(); private Map<Class<?>, List<DisplayBoundsHandler<?>>> handlerSortedCache = Maps.newHashMap(); private BaseBoundsHandler baseBoundsHandler; private Class<?> tempScreen; @@ -86,6 +88,16 @@ public class DisplayHelperImpl implements DisplayHelper { } @Override + public List<OverlayDecider> getSortedOverlayDeciders(Class<?> screenClass) { + List<OverlayDecider> 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<OverlayDecider> getAllOverlayDeciders() { return Collections.unmodifiableList(screenDisplayBoundsHandlers); } @@ -100,6 +112,28 @@ public class DisplayHelperImpl implements DisplayHelper { return handlerCache.get(screenClass); } + @Override + public <T> 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<T>) 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<T>) decider).getLeftBounds(screen) : ((DisplayBoundsHandler<T>) decider).getRightBounds(screen); + } + } + return new Rectangle(); + } + private boolean filterResponsible(OverlayDecider handler) { return handler.isHandingScreen(tempScreen); } |
