diff options
Diffstat (limited to 'src/main/java/me/shedaniel/rei/client/DisplayHelperImpl.java')
| -rw-r--r-- | src/main/java/me/shedaniel/rei/client/DisplayHelperImpl.java | 40 |
1 files changed, 22 insertions, 18 deletions
diff --git a/src/main/java/me/shedaniel/rei/client/DisplayHelperImpl.java b/src/main/java/me/shedaniel/rei/client/DisplayHelperImpl.java index 28c5f5e43..6ab47f79f 100644 --- a/src/main/java/me/shedaniel/rei/client/DisplayHelperImpl.java +++ b/src/main/java/me/shedaniel/rei/client/DisplayHelperImpl.java @@ -14,25 +14,21 @@ import java.util.stream.Collectors; public class DisplayHelperImpl implements DisplayHelper { - private static final Comparator BOUNDS_HANDLER_COMPARATOR = Comparator.comparingDouble(value -> { - if (value instanceof DisplayBoundsHandler) - return (double) ((DisplayBoundsHandler) value).getPriority(); - return -Double.MAX_VALUE; - }).reversed(); + private static final Comparator<DisplayBoundsHandler> BOUNDS_HANDLER_COMPARATOR; private static final DisplayBoundsHandler EMPTY = new DisplayBoundsHandler() { @Override public Class getBaseSupportedClass() { - return null; + return Object.class; } @Override public Rectangle getLeftBounds(Object screen) { - return new Rectangle(); + return DisplayBoundsHandler.EMPTY; } @Override public Rectangle getRightBounds(Object screen) { - return new Rectangle(); + return DisplayBoundsHandler.EMPTY; } @Override @@ -40,30 +36,38 @@ public class DisplayHelperImpl implements DisplayHelper { return -10f; } }; - private List<DisplayBoundsHandler> screenDisplayBoundsHandlerMap = Lists.newArrayList(); + + static { + Comparator<DisplayBoundsHandler> comparator = Comparator.comparingDouble(DisplayBoundsHandler::getPriority); + BOUNDS_HANDLER_COMPARATOR = comparator.reversed(); + } + + private List<DisplayBoundsHandler> screenDisplayBoundsHandlers = Lists.newArrayList(); private Map<Class, DisplayBoundsHandler> handlerCache = Maps.newHashMap(); private BaseBoundsHandler baseBoundsHandler; @Override public List<DisplayBoundsHandler> getSortedBoundsHandlers(Class screenClass) { - List<DisplayBoundsHandler> list = Lists.newArrayList(screenDisplayBoundsHandlerMap.stream().filter(handler -> handler.getBaseSupportedClass().isAssignableFrom(screenClass)).collect(Collectors.toList())); - list.sort(BOUNDS_HANDLER_COMPARATOR); - return list; + return screenDisplayBoundsHandlers.stream().filter(handler -> handler.getBaseSupportedClass().isAssignableFrom(screenClass)).sorted(BOUNDS_HANDLER_COMPARATOR).collect(Collectors.toList()); + } + + @Override + public List<DisplayBoundsHandler> getAllBoundsHandlers() { + return screenDisplayBoundsHandlers; } @Override public DisplayBoundsHandler getResponsibleBoundsHandler(Class screenClass) { - Optional<DisplayBoundsHandler> handler = handlerCache.entrySet().stream().filter(entry -> entry.getKey().equals(screenClass)).map(Map.Entry::getValue).findAny(); - if (handler.isPresent()) - return handler.get(); - List<DisplayBoundsHandler> sortedBoundsHandlers = getSortedBoundsHandlers(screenClass); - handlerCache.put(screenClass, sortedBoundsHandlers.isEmpty() ? EMPTY : sortedBoundsHandlers.get(0)); + Optional<DisplayBoundsHandler> any = handlerCache.entrySet().stream().filter(entry -> entry.getKey().equals(screenClass)).map(Map.Entry::getValue).findAny(); + if (any.isPresent()) + return any.get(); + handlerCache.put(screenClass, screenDisplayBoundsHandlers.stream().filter(handler -> handler.getBaseSupportedClass().isAssignableFrom(screenClass)).sorted(BOUNDS_HANDLER_COMPARATOR).findAny().orElse(EMPTY)); return handlerCache.get(screenClass); } @Override public void registerBoundsHandler(DisplayBoundsHandler handler) { - screenDisplayBoundsHandlerMap.add(handler); + screenDisplayBoundsHandlers.add(handler); } @Override |
