ScreenHelper.java 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. /*
  2. * Roughly Enough Items by Danielshe.
  3. * Licensed under the MIT License.
  4. */
  5. package me.shedaniel.rei.impl;
  6. import com.google.common.collect.Iterables;
  7. import com.google.common.collect.Lists;
  8. import com.google.common.collect.Sets;
  9. import me.shedaniel.cloth.hooks.ClothClientHooks;
  10. import me.shedaniel.rei.RoughlyEnoughItemsCore;
  11. import me.shedaniel.rei.gui.ContainerScreenOverlay;
  12. import me.shedaniel.rei.gui.widget.SearchFieldWidget;
  13. import me.shedaniel.rei.listeners.ContainerScreenHooks;
  14. import net.fabricmc.api.ClientModInitializer;
  15. import net.fabricmc.fabric.api.event.client.ClientTickCallback;
  16. import net.minecraft.client.MinecraftClient;
  17. import net.minecraft.client.gui.screen.Screen;
  18. import net.minecraft.client.gui.screen.ingame.AbstractContainerScreen;
  19. import net.minecraft.client.util.Window;
  20. import net.minecraft.item.ItemStack;
  21. import net.minecraft.util.ActionResult;
  22. import org.apache.logging.log4j.util.TriConsumer;
  23. import java.util.LinkedHashSet;
  24. import java.util.List;
  25. import java.util.Optional;
  26. public class ScreenHelper implements ClientModInitializer {
  27. public static SearchFieldWidget searchField;
  28. public static List<ItemStack> inventoryStacks = Lists.newArrayList();
  29. private static boolean overlayVisible = true;
  30. private static ContainerScreenOverlay overlay;
  31. private static AbstractContainerScreen<?> lastContainerScreen = null;
  32. private static LinkedHashSet<Screen> lastRecipeScreen = Sets.newLinkedHashSetWithExpectedSize(5);
  33. public static void storeRecipeScreen(Screen screen) {
  34. while (lastRecipeScreen.size() >= 5)
  35. lastRecipeScreen.remove(Iterables.get(lastRecipeScreen, 0));
  36. lastRecipeScreen.add(screen);
  37. }
  38. public static boolean hasLastRecipeScreen() {
  39. return !lastRecipeScreen.isEmpty();
  40. }
  41. public static Screen getLastRecipeScreen() {
  42. Screen screen = Iterables.getLast(lastRecipeScreen);
  43. lastRecipeScreen.remove(screen);
  44. return screen;
  45. }
  46. public static void clearData() {
  47. lastRecipeScreen.clear();
  48. }
  49. public static boolean isOverlayVisible() {
  50. return overlayVisible;
  51. }
  52. public static void toggleOverlayVisible() {
  53. overlayVisible = !overlayVisible;
  54. }
  55. public static Optional<ContainerScreenOverlay> getOptionalOverlay() {
  56. return Optional.ofNullable(overlay);
  57. }
  58. public static ContainerScreenOverlay getLastOverlay(boolean reset, boolean setPage) {
  59. if (overlay == null || reset) {
  60. overlay = new ContainerScreenOverlay();
  61. overlay.init(setPage);
  62. }
  63. return overlay;
  64. }
  65. public static ContainerScreenOverlay getLastOverlay() {
  66. return getLastOverlay(false, false);
  67. }
  68. public static AbstractContainerScreen<?> getLastContainerScreen() {
  69. return lastContainerScreen;
  70. }
  71. public static void setLastContainerScreen(AbstractContainerScreen<?> lastContainerScreen) {
  72. ScreenHelper.lastContainerScreen = lastContainerScreen;
  73. }
  74. public static ContainerScreenHooks getLastContainerScreenHooks() {
  75. return (ContainerScreenHooks) lastContainerScreen;
  76. }
  77. public static void drawHoveringWidget(int x, int y, TriConsumer<Integer, Integer, Float> consumer, int width, int height, float delta) {
  78. Window window = MinecraftClient.getInstance().window;
  79. drawHoveringWidget(window.getScaledWidth(), window.getScaledHeight(), x, y, consumer, width, height, delta);
  80. }
  81. public static void drawHoveringWidget(int screenWidth, int screenHeight, int x, int y, TriConsumer<Integer, Integer, Float> consumer, int width, int height, float delta) {
  82. int actualX = Math.max(x + 12, 6);
  83. int actualY = Math.min(y - height / 2, screenHeight - height - 6);
  84. if (actualX + width > screenWidth)
  85. actualX -= 24 + width;
  86. if (actualY < 6)
  87. actualY += 24;
  88. consumer.accept(actualX, actualY, delta);
  89. }
  90. public static boolean isDarkModeEnabled() {
  91. return RoughlyEnoughItemsCore.getConfigManager().getConfig().isUsingDarkTheme();
  92. }
  93. @Override
  94. public void onInitializeClient() {
  95. ClothClientHooks.SCREEN_INIT_PRE.register((client, screen, screenHooks) -> {
  96. if (lastContainerScreen != screen && screen instanceof AbstractContainerScreen)
  97. lastContainerScreen = (AbstractContainerScreen<?>) screen;
  98. return ActionResult.PASS;
  99. });
  100. ClientTickCallback.EVENT.register(minecraftClient -> {
  101. if (isOverlayVisible() && searchField != null)
  102. searchField.tick();
  103. });
  104. }
  105. }