From 30493491181cec7a32c2bce360e623504fb896d8 Mon Sep 17 00:00:00 2001 From: Unknown Date: Wed, 30 Jan 2019 21:12:10 +0800 Subject: Close #17 --- .../java/me/shedaniel/rei/api/IRecipeCategory.java | 7 +- .../rei/api/IRecipeCategoryCraftable.java | 10 +- .../me/shedaniel/rei/api/SpeedCraftFunctional.java | 6 +- .../java/me/shedaniel/rei/client/ClientHelper.java | 18 +- .../java/me/shedaniel/rei/client/GuiHelper.java | 40 +-- .../java/me/shedaniel/rei/client/RecipeHelper.java | 16 +- .../me/shedaniel/rei/gui/ContainerGuiOverlay.java | 286 -------------------- .../shedaniel/rei/gui/ContainerScreenOverlay.java | 286 ++++++++++++++++++++ .../me/shedaniel/rei/gui/widget/ConfigWidget.java | 10 +- .../rei/gui/widget/RecipeViewingWidget.java | 290 -------------------- .../rei/gui/widget/RecipeViewingWidgetScreen.java | 297 +++++++++++++++++++++ .../rei/gui/widget/SpeedCraftingButtonWidget.java | 15 +- .../me/shedaniel/rei/gui/widget/TabWidget.java | 4 +- .../shedaniel/rei/gui/widget/TextFieldWidget.java | 18 +- .../rei/listeners/IMixinContainerGui.java | 23 -- .../rei/listeners/IMixinContainerScreen.java | 23 ++ .../me/shedaniel/rei/mixin/MixinContainerGui.java | 110 -------- .../shedaniel/rei/mixin/MixinContainerScreen.java | 110 ++++++++ .../shedaniel/rei/mixin/MixinCraftingTableGui.java | 42 --- .../rei/mixin/MixinCraftingTableScreen.java | 42 +++ .../rei/mixin/MixinCreativePlayerInventoryGui.java | 62 ----- .../mixin/MixinCreativePlayerInventoryScreen.java | 62 +++++ .../rei/mixin/MixinPlayerInventoryGui.java | 43 --- .../rei/mixin/MixinPlayerInventoryScreen.java | 43 +++ .../rei/plugin/DefaultBlastingCategory.java | 4 +- .../rei/plugin/DefaultBrewingCategory.java | 4 +- .../rei/plugin/DefaultCampfireCategory.java | 9 +- .../rei/plugin/DefaultCraftingCategory.java | 11 +- .../me/shedaniel/rei/plugin/DefaultPlugin.java | 79 +++--- .../rei/plugin/DefaultSmeltingCategory.java | 9 +- .../rei/plugin/DefaultSmokingCategory.java | 9 +- .../rei/plugin/DefaultStoneCuttingCategory.java | 7 +- 32 files changed, 1004 insertions(+), 991 deletions(-) delete mode 100644 src/main/java/me/shedaniel/rei/gui/ContainerGuiOverlay.java create mode 100644 src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java delete mode 100644 src/main/java/me/shedaniel/rei/gui/widget/RecipeViewingWidget.java create mode 100644 src/main/java/me/shedaniel/rei/gui/widget/RecipeViewingWidgetScreen.java delete mode 100644 src/main/java/me/shedaniel/rei/listeners/IMixinContainerGui.java create mode 100644 src/main/java/me/shedaniel/rei/listeners/IMixinContainerScreen.java delete mode 100644 src/main/java/me/shedaniel/rei/mixin/MixinContainerGui.java create mode 100644 src/main/java/me/shedaniel/rei/mixin/MixinContainerScreen.java delete mode 100644 src/main/java/me/shedaniel/rei/mixin/MixinCraftingTableGui.java create mode 100644 src/main/java/me/shedaniel/rei/mixin/MixinCraftingTableScreen.java delete mode 100644 src/main/java/me/shedaniel/rei/mixin/MixinCreativePlayerInventoryGui.java create mode 100644 src/main/java/me/shedaniel/rei/mixin/MixinCreativePlayerInventoryScreen.java delete mode 100644 src/main/java/me/shedaniel/rei/mixin/MixinPlayerInventoryGui.java create mode 100644 src/main/java/me/shedaniel/rei/mixin/MixinPlayerInventoryScreen.java (limited to 'src/main/java') diff --git a/src/main/java/me/shedaniel/rei/api/IRecipeCategory.java b/src/main/java/me/shedaniel/rei/api/IRecipeCategory.java index cc2bb0e4a..123fa20df 100644 --- a/src/main/java/me/shedaniel/rei/api/IRecipeCategory.java +++ b/src/main/java/me/shedaniel/rei/api/IRecipeCategory.java @@ -3,7 +3,7 @@ package me.shedaniel.rei.api; import com.mojang.blaze3d.platform.GlStateManager; import me.shedaniel.rei.gui.widget.IWidget; import me.shedaniel.rei.gui.widget.RecipeBaseWidget; -import me.shedaniel.rei.gui.widget.RecipeViewingWidget; +import me.shedaniel.rei.gui.widget.RecipeViewingWidgetScreen; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.Drawable; import net.minecraft.client.render.GuiLighting; @@ -13,6 +13,7 @@ import net.minecraft.util.Identifier; import java.awt.*; import java.util.Arrays; import java.util.List; +import java.util.function.Supplier; public interface IRecipeCategory { @@ -27,14 +28,14 @@ public interface IRecipeCategory { return false; } - default public List setupDisplay(T recipeDisplay, Rectangle bounds) { + default public List setupDisplay(Supplier recipeDisplaySupplier, Rectangle bounds) { return Arrays.asList(new RecipeBaseWidget(bounds)); } default public void drawCategoryBackground(Rectangle bounds) { GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F); GuiLighting.disable(); - MinecraftClient.getInstance().getTextureManager().bindTexture(RecipeViewingWidget.CHEST_GUI_TEXTURE); + MinecraftClient.getInstance().getTextureManager().bindTexture(RecipeViewingWidgetScreen.CHEST_GUI_TEXTURE); new Drawable() { }.drawTexturedRect((int) bounds.getX(), (int) bounds.getY(), 0, 0, (int) bounds.getWidth(), (int) bounds.getHeight()); diff --git a/src/main/java/me/shedaniel/rei/api/IRecipeCategoryCraftable.java b/src/main/java/me/shedaniel/rei/api/IRecipeCategoryCraftable.java index f782ccadd..a0ffb689e 100644 --- a/src/main/java/me/shedaniel/rei/api/IRecipeCategoryCraftable.java +++ b/src/main/java/me/shedaniel/rei/api/IRecipeCategoryCraftable.java @@ -1,18 +1,18 @@ package me.shedaniel.rei.api; import me.shedaniel.rei.gui.widget.IWidget; -import me.shedaniel.rei.listeners.IMixinContainerGui; -import net.minecraft.client.gui.Gui; +import me.shedaniel.rei.listeners.IMixinContainerScreen; +import net.minecraft.client.gui.Screen; import java.awt.*; import java.util.List; public interface IRecipeCategoryCraftable { - public boolean canAutoCraftHere(Class guiClass, T recipe); + public boolean canAutoCraftHere(Class screenClasses, T recipe); - public boolean performAutoCraft(Gui gui, T recipe); + public boolean performAutoCraft(Screen gui, T recipe); - public void registerAutoCraftButton(List widgets, Rectangle rectangle, IMixinContainerGui parentGui, T recipe); + public void registerAutoCraftButton(List widgets, Rectangle rectangle, IMixinContainerScreen parentScreen, T recipe); } diff --git a/src/main/java/me/shedaniel/rei/api/SpeedCraftFunctional.java b/src/main/java/me/shedaniel/rei/api/SpeedCraftFunctional.java index e2ed4b83d..bf89e3c2e 100644 --- a/src/main/java/me/shedaniel/rei/api/SpeedCraftFunctional.java +++ b/src/main/java/me/shedaniel/rei/api/SpeedCraftFunctional.java @@ -1,13 +1,13 @@ package me.shedaniel.rei.api; -import net.minecraft.client.gui.Gui; +import net.minecraft.client.gui.Screen; public interface SpeedCraftFunctional { public Class[] getFunctioningFor(); - public boolean performAutoCraft(Gui gui, T recipe); + public boolean performAutoCraft(Screen screen, T recipe); - public boolean acceptRecipe(Gui gui, T recipe); + public boolean acceptRecipe(Screen screen, T recipe); } diff --git a/src/main/java/me/shedaniel/rei/client/ClientHelper.java b/src/main/java/me/shedaniel/rei/client/ClientHelper.java index 55061aa90..8c0683209 100644 --- a/src/main/java/me/shedaniel/rei/client/ClientHelper.java +++ b/src/main/java/me/shedaniel/rei/client/ClientHelper.java @@ -6,16 +6,16 @@ import io.netty.buffer.Unpooled; import me.shedaniel.rei.RoughlyEnoughItemsCore; import me.shedaniel.rei.api.IRecipeCategory; import me.shedaniel.rei.api.IRecipeDisplay; -import me.shedaniel.rei.gui.ContainerGuiOverlay; +import me.shedaniel.rei.gui.ContainerScreenOverlay; import me.shedaniel.rei.gui.widget.ConfigWidget; -import me.shedaniel.rei.gui.widget.RecipeViewingWidget; +import me.shedaniel.rei.gui.widget.RecipeViewingWidgetScreen; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.client.keybinding.FabricKeyBinding; import net.fabricmc.fabric.impl.client.keybinding.KeyBindingRegistryImpl; import net.fabricmc.loader.FabricLoader; import net.minecraft.client.MinecraftClient; import net.minecraft.client.Mouse; -import net.minecraft.client.gui.Gui; +import net.minecraft.client.gui.Screen; import net.minecraft.client.util.InputUtil; import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.EnchantmentHelper; @@ -115,22 +115,22 @@ public class ClientHelper implements ClientModInitializer { } } - public static boolean executeRecipeKeyBind(ContainerGuiOverlay overlay, ItemStack stack) { + public static boolean executeRecipeKeyBind(ContainerScreenOverlay overlay, ItemStack stack) { Map> map = RecipeHelper.getInstance().getRecipesFor(stack); if (map.keySet().size() > 0) - MinecraftClient.getInstance().openGui(new RecipeViewingWidget(MinecraftClient.getInstance().window, map)); + MinecraftClient.getInstance().openScreen(new RecipeViewingWidgetScreen(MinecraftClient.getInstance().window, map)); return map.keySet().size() > 0; } - public static boolean executeUsageKeyBind(ContainerGuiOverlay overlay, ItemStack stack) { + public static boolean executeUsageKeyBind(ContainerScreenOverlay overlay, ItemStack stack) { Map> map = RecipeHelper.getInstance().getUsagesFor(stack); if (map.keySet().size() > 0) - MinecraftClient.getInstance().openGui(new RecipeViewingWidget(MinecraftClient.getInstance().window, map)); + MinecraftClient.getInstance().openScreen(new RecipeViewingWidgetScreen(MinecraftClient.getInstance().window, map)); return map.keySet().size() > 0; } - public static void openConfigWindow(Gui parent) { - MinecraftClient.getInstance().openGui(new ConfigWidget(parent)); + public static void openConfigWindow(Screen parent) { + MinecraftClient.getInstance().openScreen(new ConfigWidget(parent)); } public static List getInventoryItemsTypes() { diff --git a/src/main/java/me/shedaniel/rei/client/GuiHelper.java b/src/main/java/me/shedaniel/rei/client/GuiHelper.java index b962866f2..2b453c784 100644 --- a/src/main/java/me/shedaniel/rei/client/GuiHelper.java +++ b/src/main/java/me/shedaniel/rei/client/GuiHelper.java @@ -1,11 +1,11 @@ package me.shedaniel.rei.client; import com.google.common.collect.Lists; -import me.shedaniel.rei.gui.ContainerGuiOverlay; +import me.shedaniel.rei.gui.ContainerScreenOverlay; import me.shedaniel.rei.gui.widget.TextFieldWidget; -import me.shedaniel.rei.listeners.IMixinContainerGui; +import me.shedaniel.rei.listeners.IMixinContainerScreen; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.ContainerGui; +import net.minecraft.client.gui.ContainerScreen; import net.minecraft.item.ItemStack; import java.util.List; @@ -13,11 +13,11 @@ import java.util.List; public class GuiHelper { public static TextFieldWidget searchField; - private static boolean overlayVisible = true; - private static ContainerGuiOverlay overlay; public static List inventoryStacks = Lists.newArrayList(); - private static ContainerGui lastContainerGui; - private static IMixinContainerGui lastMixinContainerGui; + private static boolean overlayVisible = true; + private static ContainerScreenOverlay overlay; + private static ContainerScreen lastContainerScreen; + private static IMixinContainerScreen lastMixinContainerScreen; public static boolean isOverlayVisible() { return overlayVisible; @@ -27,36 +27,36 @@ public class GuiHelper { overlayVisible = !overlayVisible; } - public static ContainerGuiOverlay getLastOverlay() { + public static ContainerScreenOverlay getLastOverlay() { return overlay; } - public static void setOverlay(ContainerGuiOverlay overlay) { + public static void setOverlay(ContainerScreenOverlay overlay) { GuiHelper.overlay = overlay; overlay.onInitialized(); } public static void onTick(MinecraftClient client) { - if (client.currentGui instanceof ContainerGui && lastContainerGui != client.currentGui) { - GuiHelper.lastContainerGui = (ContainerGui) client.currentGui; - GuiHelper.lastMixinContainerGui = (IMixinContainerGui) lastContainerGui; + if (client.currentScreen instanceof ContainerScreen && lastContainerScreen != client.currentScreen) { + GuiHelper.lastContainerScreen = (ContainerScreen) client.currentScreen; + GuiHelper.lastMixinContainerScreen = (IMixinContainerScreen) lastContainerScreen; } } - public static ContainerGui getLastContainerGui() { - return lastContainerGui; + public static ContainerScreen getLastContainerScreen() { + return lastContainerScreen; } - public static IMixinContainerGui getLastMixinContainerGui() { - return lastMixinContainerGui; + public static void setLastContainerScreen(ContainerScreen lastContainerScreen) { + GuiHelper.lastContainerScreen = lastContainerScreen; } - public static void setLastContainerGui(ContainerGui lastContainerGui) { - GuiHelper.lastContainerGui = lastContainerGui; + public static IMixinContainerScreen getLastMixinContainerScreen() { + return lastMixinContainerScreen; } - public static void setLastMixinContainerGui(IMixinContainerGui lastMixinContainerGui) { - GuiHelper.lastMixinContainerGui = lastMixinContainerGui; + public static void setLastMixinContainerScreen(IMixinContainerScreen lastMixinContainerScreen) { + GuiHelper.lastMixinContainerScreen = lastMixinContainerScreen; } } diff --git a/src/main/java/me/shedaniel/rei/client/RecipeHelper.java b/src/main/java/me/shedaniel/rei/client/RecipeHelper.java index 0224933fa..80d76c5f1 100644 --- a/src/main/java/me/shedaniel/rei/client/RecipeHelper.java +++ b/src/main/java/me/shedaniel/rei/client/RecipeHelper.java @@ -56,7 +56,7 @@ public class RecipeHelper { public void registerCategory(IRecipeCategory category) { categories.add(category); - recipeCategoryListMap.put(category.getIdentifier(), Lists.newArrayList()); + recipeCategoryListMap.put(category.getIdentifier(), Lists.newLinkedList()); } public void registerRecipe(Identifier categoryIdentifier, IRecipeDisplay display) { @@ -67,7 +67,7 @@ public class RecipeHelper { public Map> getRecipesFor(ItemStack stack) { Map> categoriesMap = new HashMap<>(); - categories.forEach(f -> categoriesMap.put(f.getIdentifier(), new LinkedList<>())); + categories.forEach(f -> categoriesMap.put(f.getIdentifier(), Lists.newArrayList())); for(Map.Entry> entry : recipeCategoryListMap.entrySet()) { IRecipeCategory category = getCategory(entry.getKey()); for(IRecipeDisplay recipeDisplay : entry.getValue()) @@ -75,10 +75,9 @@ public class RecipeHelper { if (category.checkTags() ? ItemStack.areEqual(stack, outputStack) : ItemStack.areEqualIgnoreTags(stack, outputStack)) categoriesMap.get(recipeDisplay.getRecipeCategory()).add(recipeDisplay); } - categoriesMap.keySet().removeIf(f -> categoriesMap.get(f).isEmpty()); - Map> recipeCategoryListMap = Maps.newHashMap(); + Map> recipeCategoryListMap = Maps.newLinkedHashMap(); categories.forEach(category -> { - if (categoriesMap.containsKey(category.getIdentifier())) + if (categoriesMap.containsKey(category.getIdentifier()) && !categoriesMap.get(category.getIdentifier()).isEmpty()) recipeCategoryListMap.put(category, categoriesMap.get(category.getIdentifier())); }); return recipeCategoryListMap; @@ -94,7 +93,7 @@ public class RecipeHelper { public Map> getUsagesFor(ItemStack stack) { Map> categoriesMap = new HashMap<>(); - categories.forEach(f -> categoriesMap.put(f.getIdentifier(), new LinkedList<>())); + categories.forEach(f -> categoriesMap.put(f.getIdentifier(), Lists.newArrayList())); for(Map.Entry> entry : recipeCategoryListMap.entrySet()) { IRecipeCategory category = getCategory(entry.getKey()); for(IRecipeDisplay recipeDisplay : entry.getValue()) { @@ -112,10 +111,9 @@ public class RecipeHelper { } } } - categoriesMap.keySet().removeIf(f -> categoriesMap.get(f).isEmpty()); - Map> recipeCategoryListMap = Maps.newHashMap(); + Map> recipeCategoryListMap = Maps.newLinkedHashMap(); categories.forEach(category -> { - if (categoriesMap.containsKey(category.getIdentifier())) + if (categoriesMap.containsKey(category.getIdentifier()) && !categoriesMap.get(category.getIdentifier()).isEmpty()) recipeCategoryListMap.put(category, categoriesMap.get(category.getIdentifier())); }); return recipeCategoryListMap; diff --git a/src/main/java/me/shedaniel/rei/gui/ContainerGuiOverlay.java b/src/main/java/me/shedaniel/rei/gui/ContainerGuiOverlay.java deleted file mode 100644 index 21c18153c..000000000 --- a/src/main/java/me/shedaniel/rei/gui/ContainerGuiOverlay.java +++ /dev/null @@ -1,286 +0,0 @@ -package me.shedaniel.rei.gui; - -import com.google.common.collect.Lists; -import com.mojang.blaze3d.platform.GlStateManager; -import me.shedaniel.rei.RoughlyEnoughItemsCore; -import me.shedaniel.rei.client.ClientHelper; -import me.shedaniel.rei.client.GuiHelper; -import me.shedaniel.rei.gui.widget.*; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.ContainerGui; -import net.minecraft.client.gui.Gui; -import net.minecraft.client.gui.GuiEventListener; -import net.minecraft.client.render.GuiLighting; -import net.minecraft.client.resource.language.I18n; -import net.minecraft.client.util.Window; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.MathHelper; - -import java.awt.*; -import java.util.Collections; -import java.util.LinkedList; -import java.util.List; -import java.util.stream.Collectors; - -public class ContainerGuiOverlay extends Gui { - - private static final List QUEUED_TOOLTIPS = Lists.newArrayList(); - public static String searchTerm = ""; - private static int page = 0; - private static ItemListOverlay itemListOverlay; - private final List widgets = Lists.newArrayList(); - private Rectangle rectangle; - private Window window; - private ButtonWidget buttonLeft, buttonRight; - private int lastLeft; - - public void onInitialized() { - //Update Variables - this.widgets.clear(); - this.window = MinecraftClient.getInstance().window; - this.rectangle = calculateBoundary(); - this.lastLeft = getLeft(); - widgets.add(this.itemListOverlay = new ItemListOverlay(page)); - this.itemListOverlay.updateList(getItemListArea(), page, searchTerm); - - widgets.add(buttonLeft = new ButtonWidget(rectangle.x, rectangle.y + 5, 16, 16, "<") { - @Override - public void onPressed(int button, double mouseX, double mouseY) { - page--; - if (page < 0) - page = getTotalPage(); - itemListOverlay.updateList(getItemListArea(), page, searchTerm); - } - }); - widgets.add(buttonRight = new ButtonWidget(rectangle.x + rectangle.width - 18, rectangle.y + 5, 16, 16, ">") { - @Override - public void onPressed(int button, double mouseX, double mouseY) { - page++; - if (page > getTotalPage()) - page = 0; - itemListOverlay.updateList(getItemListArea(), page, searchTerm); - } - }); - page = MathHelper.clamp(page, 0, getTotalPage()); - widgets.add(new ButtonWidget(10, 10, 40, 20, "") { - @Override - public void draw(int int_1, int int_2, float float_1) { - this.text = getCheatModeText(); - super.draw(int_1, int_2, float_1); - } - - @Override - public void onPressed(int button, double mouseX, double mouseY) { - ClientHelper.setCheating(!ClientHelper.isCheating()); - } - }); - widgets.add(new ButtonWidget(10, 35, 40, 20, I18n.translate("text.rei.config")) { - @Override - public void onPressed(int button, double mouseX, double mouseY) { - ClientHelper.openConfigWindow(GuiHelper.getLastContainerGui()); - } - }); - this.widgets.add(new LabelWidget(rectangle.x + (rectangle.width / 2), rectangle.y + 10, "") { - @Override - public void draw(int mouseX, int mouseY, float partialTicks) { - page = MathHelper.clamp(page, 0, getTotalPage()); - this.text = String.format("%s/%s", page + 1, getTotalPage() + 1); - super.draw(mouseX, mouseY, partialTicks); - } - }); - if (GuiHelper.searchField == null) - GuiHelper.searchField = new TextFieldWidget(0, 0, 0, 0) { - @Override - public boolean mouseClicked(double double_1, double double_2, int int_1) { - if (isVisible() && getBounds().contains(double_1, double_2) && int_1 == 1) { - setText(""); - return true; - } - return super.mouseClicked(double_1, double_2, int_1); - } - }; - GuiHelper.searchField.setChangedListener(s -> { - searchTerm = s; - itemListOverlay.updateList(page, searchTerm); - }); - GuiHelper.searchField.setBounds(getTextFieldArea()); - this.widgets.add(GuiHelper.searchField); - GuiHelper.searchField.setText(searchTerm); - if (RoughlyEnoughItemsCore.getConfigHelper().showCraftableOnlyButton()) - this.widgets.add(new CraftableToggleButtonWidget(getCraftableToggleArea()) { - @Override - public void onPressed(int button, double mouseX, double mouseY) { - RoughlyEnoughItemsCore.getConfigHelper().toggleCraftableOnly(); - itemListOverlay.updateList(page, searchTerm); - } - }); - - this.itemListOverlay.updateList(getItemListArea(), page, searchTerm); - this.listeners.addAll(widgets); - } - - private Rectangle getTextFieldArea() { - int widthRemoved = RoughlyEnoughItemsCore.getConfigHelper().showCraftableOnlyButton() ? 22 : 0; - if (RoughlyEnoughItemsCore.getConfigHelper().sideSearchField()) - return new Rectangle(rectangle.x + 2, window.getScaledHeight() - 22, rectangle.width - 6 - widthRemoved, 18); - if (MinecraftClient.getInstance().currentGui instanceof RecipeViewingWidget) { - RecipeViewingWidget widget = (RecipeViewingWidget) MinecraftClient.getInstance().currentGui; - return new Rectangle(widget.getBounds().x, window.getScaledHeight() - 22, widget.getBounds().width - widthRemoved, 18); - } - return new Rectangle(GuiHelper.getLastMixinContainerGui().getContainerLeft(), window.getScaledHeight() - 22, GuiHelper.getLastMixinContainerGui().getContainerWidth() - widthRemoved, 18); - } - - private Rectangle getCraftableToggleArea() { - Rectangle searchBoxArea = getTextFieldArea(); - searchBoxArea.setLocation(searchBoxArea.x + searchBoxArea.width + 4, searchBoxArea.y - 1); - searchBoxArea.setSize(20, 20); - return searchBoxArea; - } - - private String getCheatModeText() { - return I18n.translate(String.format("%s%s", "text.rei.", ClientHelper.isCheating() ? "cheat" : "nocheat")); - } - - private Rectangle getItemListArea() { - return new Rectangle(rectangle.x + 2, rectangle.y + 24, rectangle.width - 4, rectangle.height - (RoughlyEnoughItemsCore.getConfigHelper().sideSearchField() ? 27 + 22 : 27)); - } - - public Rectangle getRectangle() { - return rectangle; - } - - public void render(int mouseX, int mouseY, float partialTicks) { - List currentStacks = ClientHelper.getInventoryItemsTypes(); - if (getLeft() != lastLeft) - onInitialized(); - else if (RoughlyEnoughItemsCore.getConfigHelper().craftableOnly() && (!hasSameListContent(new LinkedList<>(GuiHelper.inventoryStacks), currentStacks) || (currentStacks.size() != GuiHelper.inventoryStacks.size()))) { - GuiHelper.inventoryStacks = ClientHelper.getInventoryItemsTypes(); - itemListOverlay.updateList(page, searchTerm); - } - GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F); - GuiLighting.disable(); - this.draw(mouseX, mouseY, partialTicks); - GuiLighting.disable(); - QUEUED_TOOLTIPS.stream().filter(queuedTooltip -> queuedTooltip != null).forEach(queuedTooltip -> MinecraftClient.getInstance().currentGui.drawTooltip(queuedTooltip.text, queuedTooltip.mouse.x, queuedTooltip.mouse.y)); - QUEUED_TOOLTIPS.clear(); - GuiLighting.disable(); - } - - private boolean hasSameListContent(List list1, List list2) { - Collections.sort(list1, (itemStack, t1) -> { - return itemStack.getDisplayName().getFormattedText().compareToIgnoreCase(t1.getDisplayName().getFormattedText()); - }); - Collections.sort(list2, (itemStack, t1) -> { - return itemStack.getDisplayName().getFormattedText().compareToIgnoreCase(t1.getDisplayName().getFormattedText()); - }); - String lastString = String.join("", list1.stream().map(itemStack -> { - return itemStack.getDisplayName().getFormattedText(); - }).collect(Collectors.toList())), currentString = String.join("", list2.stream().map(itemStack -> { - return itemStack.getDisplayName().getFormattedText(); - }).collect(Collectors.toList())); - return lastString.equals(currentString); - } - - public void addTooltip(QueuedTooltip queuedTooltip) { - QUEUED_TOOLTIPS.add(queuedTooltip); - } - - @Override - public void draw(int int_1, int int_2, float float_1) { - if (!GuiHelper.isOverlayVisible()) - return; - widgets.forEach(widget -> { - GuiLighting.disable(); - widget.draw(int_1, int_2, float_1); - }); - GuiLighting.disable(); - itemListOverlay.draw(int_1, int_2, float_1); - GuiLighting.disable(); - super.draw(int_1, int_2, float_1); - } - - private Rectangle calculateBoundary() { - int startX = GuiHelper.getLastMixinContainerGui().getContainerLeft() + GuiHelper.getLastMixinContainerGui().getContainerWidth() + 10; - int width = window.getScaledWidth() - startX; - if (MinecraftClient.getInstance().currentGui instanceof RecipeViewingWidget) { - RecipeViewingWidget widget = (RecipeViewingWidget) MinecraftClient.getInstance().currentGui; - startX = widget.getBounds().x + widget.getBounds().width + 10; - width = window.getScaledWidth() - startX; - } - return new Rectangle(startX, 0, width, window.getScaledHeight()); - } - - private int getLeft() { - if (MinecraftClient.getInstance().currentGui instanceof RecipeViewingWidget) { - RecipeViewingWidget widget = (RecipeViewingWidget) MinecraftClient.getInstance().currentGui; - return widget.getBounds().x; - } - return GuiHelper.getLastMixinContainerGui().getContainerLeft(); - } - - private int getTotalPage() { - return MathHelper.ceil(itemListOverlay.getCurrentDisplayed().size() / itemListOverlay.getTotalSlotsPerPage()); - } - - @Override - public boolean mouseScrolled(double amount) { - if (rectangle.contains(ClientHelper.getMouseLocation())) { - if (amount > 0 && buttonLeft.enabled) - buttonLeft.onPressed(0, 0, 0); - else if (amount < 0 && buttonRight.enabled) - buttonRight.onPressed(0, 0, 0); - else - return false; - return true; - } - for(IWidget widget : widgets) - if (widget.mouseScrolled(amount)) - return true; - return false; - } - - @Override - public boolean keyPressed(int int_1, int int_2, int int_3) { - for(GuiEventListener listener : listeners) - if (listener.keyPressed(int_1, int_2, int_3)) - return true; - Point point = ClientHelper.getMouseLocation(); - ItemStack itemStack = null; - for(IWidget widget : itemListOverlay.getListeners()) - if (widget instanceof ItemSlotWidget && ((ItemSlotWidget) widget).isHighlighted(point.x, point.y)) { - itemStack = ((ItemSlotWidget) widget).getCurrentStack(); - break; - } - if (itemStack == null && MinecraftClient.getInstance().currentGui instanceof RecipeViewingWidget) { - RecipeViewingWidget recipeViewingWidget = (RecipeViewingWidget) MinecraftClient.getInstance().currentGui; - for(GuiEventListener entry : recipeViewingWidget.getEntries()) - if (entry instanceof ItemSlotWidget && ((ItemSlotWidget) entry).isHighlighted(point.x, point.y)) { - itemStack = ((ItemSlotWidget) entry).getCurrentStack(); - break; - } - } - if (itemStack == null && MinecraftClient.getInstance().currentGui instanceof ContainerGui) - if (GuiHelper.getLastMixinContainerGui().getHoveredSlot() != null) - itemStack = GuiHelper.getLastMixinContainerGui().getHoveredSlot().getStack(); - if (itemStack != null && !itemStack.isEmpty()) { - if (ClientHelper.RECIPE.matchesKey(int_1, int_2)) - return ClientHelper.executeRecipeKeyBind(this, itemStack); - else if (ClientHelper.USAGE.matchesKey(int_1, int_2)) - return ClientHelper.executeUsageKeyBind(this, itemStack); - } - if (ClientHelper.HIDE.matchesKey(int_1, int_2)) { - GuiHelper.toggleOverlayVisible(); - return true; - } - return false; - } - - @Override - public boolean charTyped(char char_1, int int_1) { - for(GuiEventListener listener : listeners) - if (listener.charTyped(char_1, int_1)) - return true; - return super.charTyped(char_1, int_1); - } - -} diff --git a/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java b/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java new file mode 100644 index 000000000..3da3443cc --- /dev/null +++ b/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java @@ -0,0 +1,286 @@ +package me.shedaniel.rei.gui; + +import com.google.common.collect.Lists; +import com.mojang.blaze3d.platform.GlStateManager; +import me.shedaniel.rei.RoughlyEnoughItemsCore; +import me.shedaniel.rei.client.ClientHelper; +import me.shedaniel.rei.client.GuiHelper; +import me.shedaniel.rei.gui.widget.*; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.ContainerScreen; +import net.minecraft.client.gui.GuiEventListener; +import net.minecraft.client.gui.Screen; +import net.minecraft.client.render.GuiLighting; +import net.minecraft.client.resource.language.I18n; +import net.minecraft.client.util.Window; +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.MathHelper; + +import java.awt.*; +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; +import java.util.stream.Collectors; + +public class ContainerScreenOverlay extends Screen { + + private static final List QUEUED_TOOLTIPS = Lists.newArrayList(); + public static String searchTerm = ""; + private static int page = 0; + private static ItemListOverlay itemListOverlay; + private final List widgets = Lists.newArrayList(); + private Rectangle rectangle; + private Window window; + private ButtonWidget buttonLeft, buttonRight; + private int lastLeft; + + public void onInitialized() { + //Update Variables + this.widgets.clear(); + this.window = MinecraftClient.getInstance().window; + this.rectangle = calculateBoundary(); + this.lastLeft = getLeft(); + widgets.add(this.itemListOverlay = new ItemListOverlay(page)); + this.itemListOverlay.updateList(getItemListArea(), page, searchTerm); + + widgets.add(buttonLeft = new ButtonWidget(rectangle.x, rectangle.y + 5, 16, 16, "<") { + @Override + public void onPressed(int button, double mouseX, double mouseY) { + page--; + if (page < 0) + page = getTotalPage(); + itemListOverlay.updateList(getItemListArea(), page, searchTerm); + } + }); + widgets.add(buttonRight = new ButtonWidget(rectangle.x + rectangle.width - 18, rectangle.y + 5, 16, 16, ">") { + @Override + public void onPressed(int button, double mouseX, double mouseY) { + page++; + if (page > getTotalPage()) + page = 0; + itemListOverlay.updateList(getItemListArea(), page, searchTerm); + } + }); + page = MathHelper.clamp(page, 0, getTotalPage()); + widgets.add(new ButtonWidget(10, 10, 40, 20, "") { + @Override + public void draw(int int_1, int int_2, float float_1) { + this.text = getCheatModeText(); + super.draw(int_1, int_2, float_1); + } + + @Override + public void onPressed(int button, double mouseX, double mouseY) { + ClientHelper.setCheating(!ClientHelper.isCheating()); + } + }); + widgets.add(new ButtonWidget(10, 35, 40, 20, I18n.translate("text.rei.config")) { + @Override + public void onPressed(int button, double mouseX, double mouseY) { + ClientHelper.openConfigWindow(GuiHelper.getLastContainerScreen()); + } + }); + this.widgets.add(new LabelWidget(rectangle.x + (rectangle.width / 2), rectangle.y + 10, "") { + @Override + public void draw(int mouseX, int mouseY, float partialTicks) { + page = MathHelper.clamp(page, 0, getTotalPage()); + this.text = String.format("%s/%s", page + 1, getTotalPage() + 1); + super.draw(mouseX, mouseY, partialTicks); + } + }); + if (GuiHelper.searchField == null) + GuiHelper.searchField = new TextFieldWidget(0, 0, 0, 0) { + @Override + public boolean mouseClicked(double double_1, double double_2, int int_1) { + if (isVisible() && getBounds().contains(double_1, double_2) && int_1 == 1) { + setText(""); + return true; + } + return super.mouseClicked(double_1, double_2, int_1); + } + }; + GuiHelper.searchField.setChangedListener(s -> { + searchTerm = s; + itemListOverlay.updateList(page, searchTerm); + }); + GuiHelper.searchField.setBounds(getTextFieldArea()); + this.widgets.add(GuiHelper.searchField); + GuiHelper.searchField.setText(searchTerm); + if (RoughlyEnoughItemsCore.getConfigHelper().showCraftableOnlyButton()) + this.widgets.add(new CraftableToggleButtonWidget(getCraftableToggleArea()) { + @Override + public void onPressed(int button, double mouseX, double mouseY) { + RoughlyEnoughItemsCore.getConfigHelper().toggleCraftableOnly(); + itemListOverlay.updateList(page, searchTerm); + } + }); + + this.itemListOverlay.updateList(getItemListArea(), page, searchTerm); + this.listeners.addAll(widgets); + } + + private Rectangle getTextFieldArea() { + int widthRemoved = RoughlyEnoughItemsCore.getConfigHelper().showCraftableOnlyButton() ? 22 : 0; + if (RoughlyEnoughItemsCore.getConfigHelper().sideSearchField()) + return new Rectangle(rectangle.x + 2, window.getScaledHeight() - 22, rectangle.width - 6 - widthRemoved, 18); + if (MinecraftClient.getInstance().currentScreen instanceof RecipeViewingWidgetScreen) { + RecipeViewingWidgetScreen widget = (RecipeViewingWidgetScreen) MinecraftClient.getInstance().currentScreen; + return new Rectangle(widget.getBounds().x, window.getScaledHeight() - 22, widget.getBounds().width - widthRemoved, 18); + } + return new Rectangle(GuiHelper.getLastMixinContainerScreen().getContainerLeft(), window.getScaledHeight() - 22, GuiHelper.getLastMixinContainerScreen().getContainerWidth() - widthRemoved, 18); + } + + private Rectangle getCraftableToggleArea() { + Rectangle searchBoxArea = getTextFieldArea(); + searchBoxArea.setLocation(searchBoxArea.x + searchBoxArea.width + 4, searchBoxArea.y - 1); + searchBoxArea.setSize(20, 20); + return searchBoxArea; + } + + private String getCheatModeText() { + return I18n.translate(String.format("%s%s", "text.rei.", ClientHelper.isCheating() ? "cheat" : "nocheat")); + } + + private Rectangle getItemListArea() { + return new Rectangle(rectangle.x + 2, rectangle.y + 24, rectangle.width - 4, rectangle.height - (RoughlyEnoughItemsCore.getConfigHelper().sideSearchField() ? 27 + 22 : 27)); + } + + public Rectangle getRectangle() { + return rectangle; + } + + public void render(int mouseX, int mouseY, float partialTicks) { + List currentStacks = ClientHelper.getInventoryItemsTypes(); + if (getLeft() != lastLeft) + onInitialized(); + else if (RoughlyEnoughItemsCore.getConfigHelper().craftableOnly() && (!hasSameListContent(new LinkedList<>(GuiHelper.inventoryStacks), currentStacks) || (currentStacks.size() != GuiHelper.inventoryStacks.size()))) { + GuiHelper.inventoryStacks = ClientHelper.getInventoryItemsTypes(); + itemListOverlay.updateList(page, searchTerm); + } + GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F); + GuiLighting.disable(); + this.draw(mouseX, mouseY, partialTicks); + GuiLighting.disable(); + QUEUED_TOOLTIPS.stream().filter(queuedTooltip -> queuedTooltip != null).forEach(queuedTooltip -> MinecraftClient.getInstance().currentScreen.drawTooltip(queuedTooltip.text, queuedTooltip.mouse.x, queuedTooltip.mouse.y)); + QUEUED_TOOLTIPS.clear(); + GuiLighting.disable(); + } + + private boolean hasSameListContent(List list1, List list2) { + Collections.sort(list1, (itemStack, t1) -> { + return itemStack.getDisplayName().getFormattedText().compareToIgnoreCase(t1.getDisplayName().getFormattedText()); + }); + Collections.sort(list2, (itemStack, t1) -> { + return itemStack.getDisplayName().getFormattedText().compareToIgnoreCase(t1.getDisplayName().getFormattedText()); + }); + String lastString = String.join("", list1.stream().map(itemStack -> { + return itemStack.getDisplayName().getFormattedText(); + }).collect(Collectors.toList())), currentString = String.join("", list2.stream().map(itemStack -> { + return itemStack.getDisplayName().getFormattedText(); + }).collect(Collectors.toList())); + return lastString.equals(currentString); + } + + public void addTooltip(QueuedTooltip queuedTooltip) { + QUEUED_TOOLTIPS.add(queuedTooltip); + } + + @Override + public void draw(int int_1, int int_2, float float_1) { + if (!GuiHelper.isOverlayVisible()) + return; + widgets.forEach(widget -> { + GuiLighting.disable(); + widget.draw(int_1, int_2, float_1); + }); + GuiLighting.disable(); + itemListOverlay.draw(int_1, int_2, float_1); + GuiLighting.disable(); + super.draw(int_1, int_2, float_1); + } + + private Rectangle calculateBoundary() { + int startX = GuiHelper.getLastMixinContainerScreen().getContainerLeft() + GuiHelper.getLastMixinContainerScreen().getContainerWidth() + 10; + int width = window.getScaledWidth() - startX; + if (MinecraftClient.getInstance().currentScreen instanceof RecipeViewingWidgetScreen) { + RecipeViewingWidgetScreen widget = (RecipeViewingWidgetScreen) MinecraftClient.getInstance().currentScreen; + startX = widget.getBounds().x + widget.getBounds().width + 10; + width = window.getScaledWidth() - startX; + } + return new Rectangle(startX, 0, width, window.getScaledHeight()); + } + + private int getLeft() { + if (MinecraftClient.getInstance().currentScreen instanceof RecipeViewingWidgetScreen) { + RecipeViewingWidgetScreen widget = (RecipeViewingWidgetScreen) MinecraftClient.getInstance().currentScreen; + return widget.getBounds().x; + } + return GuiHelper.getLastMixinContainerScreen().getContainerLeft(); + } + + private int getTotalPage() { + return MathHelper.ceil(itemListOverlay.getCurrentDisplayed().size() / itemListOverlay.getTotalSlotsPerPage()); + } + + @Override + public boolean mouseScrolled(double amount) { + if (rectangle.contains(ClientHelper.getMouseLocation())) { + if (amount > 0 && buttonLeft.enabled) + buttonLeft.onPressed(0, 0, 0); + else if (amount < 0 && buttonRight.enabled) + buttonRight.onPressed(0, 0, 0); + else + return false; + return true; + } + for(IWidget widget : widgets) + if (widget.mouseScrolled(amount)) + return true; + return false; + } + + @Override + public boolean keyPressed(int int_1, int int_2, int int_3) { + for(GuiEventListener listener : listeners) + if (listener.keyPressed(int_1, int_2, int_3)) + return true; + Point point = ClientHelper.getMouseLocation(); + ItemStack itemStack = null; + for(IWidget widget : itemListOverlay.getListeners()) + if (widget instanceof ItemSlotWidget && ((ItemSlotWidget) widget).isHighlighted(point.x, point.y)) { + itemStack = ((ItemSlotWidget) widget).getCurrentStack(); + break; + } + if (itemStack == null && MinecraftClient.getInstance().currentScreen instanceof RecipeViewingWidgetScreen) { + RecipeViewingWidgetScreen recipeViewingWidget = (RecipeViewingWidgetScreen) MinecraftClient.getInstance().currentScreen; + for(GuiEventListener entry : recipeViewingWidget.getEntries()) + if (entry instanceof ItemSlotWidget && ((HighlightableWidget) entry).isHighlighted(point.x, point.y)) { + itemStack = ((ItemSlotWidget) entry).getCurrentStack(); + break; + } + } + if (itemStack == null && MinecraftClient.getInstance().currentScreen instanceof ContainerScreen) + if (GuiHelper.getLastMixinContainerScreen().getHoveredSlot() != null) + itemStack = GuiHelper.getLastMixinContainerScreen().getHoveredSlot().getStack(); + if (itemStack != null && !itemStack.isEmpty()) { + if (ClientHelper.RECIPE.matchesKey(int_1, int_2)) + return ClientHelper.executeRecipeKeyBind(this, itemStack); + else if (ClientHelper.USAGE.matchesKey(int_1, int_2)) + return ClientHelper.executeUsageKeyBind(this, itemStack); + } + if (ClientHelper.HIDE.matchesKey(int_1, int_2)) { + GuiHelper.toggleOverlayVisible(); + return true; + } + return false; + } + + @Override + public boolean charTyped(char char_1, int int_1) { + for(GuiEventListener listener : listeners) + if (listener.charTyped(char_1, int_1)) + return true; + return super.charTyped(char_1, int_1); + } + +} diff --git a/src/main/java/me/shedaniel/rei/gui/widget/ConfigWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/ConfigWidget.java index 25f46c802..d1391d978 100644 --- a/src/main/java/me/shedaniel/rei/gui/widget/ConfigWidget.java +++ b/src/main/java/me/shedaniel/rei/gui/widget/ConfigWidget.java @@ -4,8 +4,8 @@ import com.google.common.collect.Lists; import me.shedaniel.rei.RoughlyEnoughItemsCore; import me.shedaniel.rei.client.REIItemListOrdering; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.Gui; import net.minecraft.client.gui.GuiEventListener; +import net.minecraft.client.gui.Screen; import net.minecraft.client.render.GuiLighting; import net.minecraft.client.resource.language.I18n; import net.minecraft.client.util.Window; @@ -14,12 +14,12 @@ import java.io.IOException; import java.util.Arrays; import java.util.List; -public class ConfigWidget extends Gui { +public class ConfigWidget extends Screen { private List widgets; - private Gui parent; + private Screen parent; - public ConfigWidget(Gui parent) { + public ConfigWidget(Screen parent) { this.parent = parent; this.widgets = Lists.newArrayList(); } @@ -27,7 +27,7 @@ public class ConfigWidget extends Gui { @Override public boolean keyPressed(int int_1, int int_2, int int_3) { if (int_1 == 256 && this.doesEscapeKeyClose()) { - MinecraftClient.getInstance().openGui(parent); + MinecraftClient.getInstance().openScreen(parent); return true; } else { return super.keyPressed(int_1, int_2, int_3); diff --git a/src/main/java/me/shedaniel/rei/gui/widget/RecipeViewingWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/RecipeViewingWidget.java deleted file mode 100644 index 2004f38c5..000000000 --- a/src/main/java/me/shedaniel/rei/gui/widget/RecipeViewingWidget.java +++ /dev/null @@ -1,290 +0,0 @@ -package me.shedaniel.rei.gui.widget; - -import com.google.common.collect.Lists; -import com.mojang.blaze3d.platform.GlStateManager; -import me.shedaniel.rei.api.IRecipeCategory; -import me.shedaniel.rei.api.IRecipeDisplay; -import me.shedaniel.rei.api.SpeedCraftAreaSupplier; -import me.shedaniel.rei.api.SpeedCraftFunctional; -import me.shedaniel.rei.client.ClientHelper; -import me.shedaniel.rei.client.GuiHelper; -import me.shedaniel.rei.client.RecipeHelper; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.audio.PositionedSoundInstance; -import net.minecraft.client.gui.ContainerGui; -import net.minecraft.client.gui.Gui; -import net.minecraft.client.gui.GuiEventListener; -import net.minecraft.client.render.GuiLighting; -import net.minecraft.client.util.Window; -import net.minecraft.sound.SoundEvents; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.MathHelper; - -import java.awt.*; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -public class RecipeViewingWidget extends Gui { - - public static final Identifier CHEST_GUI_TEXTURE = new Identifier("roughlyenoughitems", "textures/gui/recipecontainer.png"); - private static final Identifier CREATIVE_INVENTORY_TABS = new Identifier("textures/gui/container/creative_inventory/tabs.png"); - public final int guiWidth = 176; - public final int guiHeight = 186; - - private List widgets; - private List tabs; - private Window window; - private Rectangle bounds; - private Map> categoriesMap; - private List categories; - private IRecipeCategory selectedCategory; - private int page, categoryPages; - private ButtonWidget recipeBack, recipeNext, categoryBack, categoryNext; - - public RecipeViewingWidget(Window window, Map> categoriesMap) { - this.categoryPages = 0; - this.window = window; - this.widgets = Lists.newArrayList(); - this.bounds = new Rectangle(window.getScaledWidth() / 2 - guiWidth / 2, window.getScaledHeight() / 2 - guiHeight / 2, guiWidth, guiHeight); - this.categoriesMap = categoriesMap; - this.categories = Lists.newArrayList(); - RecipeHelper.getInstance().getCategories().forEach(category -> { - if (categoriesMap.containsKey(category)) - categories.add(category); - }); - this.selectedCategory = categories.get(0); - this.tabs = new ArrayList<>(); - } - - public static SpeedCraftFunctional getSpeedCraftFunctionalByCategory(ContainerGui containerGui, IRecipeCategory category) { - for(SpeedCraftFunctional functional : RecipeHelper.getInstance().getSpeedCraftFunctional(category)) - for(Class aClass : functional.getFunctioningFor()) - if (containerGui.getClass().isAssignableFrom(aClass)) - return functional; - return null; - } - - @Override - public boolean keyPressed(int int_1, int int_2, int int_3) { - if ((int_1 == 256 || this.client.options.keyInventory.matchesKey(int_1, int_2)) && this.doesEscapeKeyClose()) { - MinecraftClient.getInstance().openGui(GuiHelper.getLastContainerGui()); - return true; - } - for(GuiEventListener listener : listeners) - if (listener.keyPressed(int_1, int_2, int_3)) - return true; - return super.keyPressed(int_1, int_2, int_3); - } - - @Override - public boolean isPauseScreen() { - return false; - } - - @Override - protected void onInitialized() { - super.onInitialized(); - this.tabs.clear(); - this.widgets.clear(); - this.bounds = new Rectangle(window.getScaledWidth() / 2 - guiWidth / 2, window.getScaledHeight() / 2 - guiHeight / 2, guiWidth, guiHeight); - - widgets.add(categoryBack = new ButtonWidget((int) bounds.getX() + 5, (int) bounds.getY() + 5, 12, 12, "<") { - @Override - public void onPressed(int button, double mouseX, double mouseY) { - int currentCategoryIndex = categories.indexOf(selectedCategory); - currentCategoryIndex--; - if (currentCategoryIndex < 0) - currentCategoryIndex = categories.size() - 1; - selectedCategory = categories.get(currentCategoryIndex); - categoryPages = MathHelper.floor(currentCategoryIndex / 6d); - RecipeViewingWidget.this.onInitialized(); - } - }); - widgets.add(categoryNext = new ButtonWidget((int) bounds.getX() + 159, (int) bounds.getY() + 5, 12, 12, ">") { - @Override - public void onPressed(int button, double mouseX, double mouseY) { - int currentCategoryIndex = categories.indexOf(selectedCategory); - currentCategoryIndex++; - if (currentCategoryIndex >= categories.size()) - currentCategoryIndex = 0; - selectedCategory = categories.get(currentCategoryIndex); - categoryPages = MathHelper.floor(currentCategoryIndex / 6d); - RecipeViewingWidget.this.onInitialized(); - } - }); - categoryBack.enabled = categories.size() > 1; - categoryNext.enabled = categories.size() > 1; - - widgets.add(recipeBack = new ButtonWidget((int) bounds.getX() + 5, (int) bounds.getY() + 21, 12, 12, "<") { - @Override - public void onPressed(int button, double mouseX, double mouseY) { - page--; - if (page < 0) - page = getTotalPages(selectedCategory) - 1; - RecipeViewingWidget.this.onInitialized(); - } - }); - widgets.add(recipeNext = new ButtonWidget((int) bounds.getX() + 159, (int) bounds.getY() + 21, 12, 12, ">") { - @Override - public void onPressed(int button, double mouseX, double mouseY) { - page++; - if (page >= getTotalPages(selectedCategory)) - page = 0; - RecipeViewingWidget.this.onInitialized(); - } - }); - recipeBack.enabled = categoriesMap.get(selectedCategory).size() > getRecipesPerPage(); - recipeNext.enabled = categoriesMap.get(selectedCategory).size() > getRecipesPerPage(); - - widgets.add(new LabelWidget((int) bounds.getCenterX(), (int) bounds.getY() + 7, "") { - @Override - public void draw(int mouseX, int mouseY, float partialTicks) { - this.text = selectedCategory.getCategoryName(); - super.draw(mouseX, mouseY, partialTicks); - } - }); - widgets.add(new LabelWidget((int) bounds.getCenterX(), (int) bounds.getY() + 23, "") { - @Override - public void draw(int mouseX, int mouseY, float partialTicks) { - this.text = String.format("%d/%d", page + 1, getTotalPages(selectedCategory)); - super.draw(mouseX, mouseY, partialTicks); - } - }); - for(int i = 0; i < 6; i++) { - int j = i + categoryPages * 6; - if (categories.size() > j) { - TabWidget tab; - tabs.add(tab = new TabWidget(i, this, new Rectangle(bounds.x + 4 + 28 * i, bounds.y - 28, 28, 28)) { - @Override - public boolean onMouseClick(int button, double mouseX, double mouseY) { - if (getBounds().contains(mouseX, mouseY)) { - MinecraftClient.getInstance().getSoundLoader().play(PositionedSoundInstance.master(SoundEvents.UI_BUTTON_CLICK, 1.0F)); - if (getId() + categoryPages * 6 == categories.indexOf(selectedCategory)) - return false; - selectedCategory = categories.get(getId() + categoryPages * 6); - page = 0; - RecipeViewingWidget.this.onInitialized(); - return true; - } - return false; - } - }); - tab.setItem(categories.get(j).getCategoryIcon(), categories.get(j).getCategoryName(), tab.getId() + categoryPages * 6 == categories.indexOf(selectedCategory)); - } - } - SpeedCraftAreaSupplier supplier = RecipeHelper.getInstance().getSpeedCraftButtonArea(selectedCategory); - final SpeedCraftFunctional functional = getSpeedCraftFunctionalByCategory(GuiHelper.getLastContainerGui(), selectedCategory); - if (page * getRecipesPerPage() < categoriesMap.get(selectedCategory).size()) { - final IRecipeDisplay topDisplay = categoriesMap.get(selectedCategory).get(page * getRecipesPerPage()); - widgets.addAll(selectedCategory.setupDisplay(topDisplay, new Rectangle((int) getBounds().getCenterX() - 75, getBounds().y + 40, 150, selectedCategory.usesFullPage() ? 140 : 66))); - if (supplier != null) - widgets.add(new SpeedCraftingButtonWidget(supplier.get(new Rectangle((int) getBounds().getCenterX() - 75, getBounds().y + 40, 150, selectedCategory.usesFullPage() ? 140 : 66)), supplier.getButtonText(), functional, topDisplay)); - if (!selectedCategory.usesFullPage() && page * getRecipesPerPage() + 1 < categoriesMap.get(selectedCategory).size()) { - final IRecipeDisplay middleDisplay = categoriesMap.get(selectedCategory).get(page * getRecipesPerPage() + 1); - widgets.addAll(selectedCategory.setupDisplay(middleDisplay, new Rectangle((int) getBounds().getCenterX() - 75, getBounds().y + 113, 150, 66))); - if (supplier != null) - widgets.add(new SpeedCraftingButtonWidget(supplier.get(new Rectangle((int) getBounds().getCenterX() - 75, getBounds().y + 113, 150, 66)), supplier.getButtonText(), functional, middleDisplay)); - } - } - - GuiHelper.getLastOverlay().onInitialized(); - listeners.addAll(tabs); - listeners.add(GuiHelper.getLastOverlay()); - listeners.addAll(widgets); - } - - public int getPage() { - return page; - } - - public int getCategoryPage() { - return categoryPages; - } - - private int getRecipesPerPage() { - if (selectedCategory.usesFullPage()) - return 1; - return 2; - } - - @Override - public void draw(int mouseX, int mouseY, float partialTicks) { - drawBackground(); - tabs.stream().filter(tabWidget -> { - return !tabWidget.isSelected(); - }).forEach(tabWidget -> tabWidget.draw(mouseX, mouseY, partialTicks)); - GuiLighting.disable(); - super.draw(mouseX, mouseY, partialTicks); - widgets.forEach(widget -> { - GuiLighting.disable(); - widget.draw(mouseX, mouseY, partialTicks); - }); - GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F); - GuiLighting.disable(); - tabs.stream().filter(TabWidget::isSelected).forEach(tabWidget -> tabWidget.draw(mouseX, mouseY, partialTicks)); - GuiHelper.getLastOverlay().render(mouseX, mouseY, partialTicks); - } - - @Override - public void drawBackground() { - drawBackground(0); - if (selectedCategory != null) - selectedCategory.drawCategoryBackground(bounds); - else { - GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F); - GuiLighting.disable(); - this.client.getTextureManager().bindTexture(CHEST_GUI_TEXTURE); - this.drawTexturedRect((int) bounds.getX(), (int) bounds.getY(), 0, 0, (int) bounds.getWidth(), (int) bounds.getHeight()); - } - } - - public int getTotalPages(IRecipeCategory category) { - return MathHelper.ceil(categoriesMap.get(category).size() / (double) getRecipesPerPage()); - } - - public Rectangle getBounds() { - return bounds; - } - - @Override - public boolean charTyped(char char_1, int int_1) { - for(GuiEventListener listener : listeners) - if (listener.charTyped(char_1, int_1)) - return true; - return super.charTyped(char_1, int_1); - } - - @Override - public boolean mouseScrolled(double amount) { - for(GuiEventListener listener : listeners) - if (listener.mouseScrolled(amount)) - return true; - if (getBounds().contains(ClientHelper.getMouseLocation())) { - if (amount > 0 && recipeBack.enabled) - recipeBack.onPressed(0, 0, 0); - else if (amount < 0 && recipeNext.enabled) - recipeNext.onPressed(0, 0, 0); - } - if ((new Rectangle(bounds.x, bounds.y - 28, bounds.width, 28)).contains(ClientHelper.getMouseLocation())) { - if (amount > 0 && categoryBack.enabled) - categoryBack.onPressed(0, 0, 0); - else if (amount < 0 && categoryNext.enabled) - categoryNext.onPressed(0, 0, 0); - } - return super.mouseScrolled(amount); - } - - @Override - public boolean mouseClicked(double double_1, double double_2, int int_1) { - for(GuiEventListener entry : getEntries()) - if (entry.mouseClicked(double_1, double_2, int_1)) { - focusOn(entry); - if (int_1 == 0) - setActive(true); - return true; - } - return false; - } - -} diff --git a/src/main/java/me/shedaniel/rei/gui/widget/RecipeViewingWidgetScreen.java b/src/main/java/me/shedaniel/rei/gui/widget/RecipeViewingWidgetScreen.java new file mode 100644 index 000000000..f65bfe763 --- /dev/null +++ b/src/main/java/me/shedaniel/rei/gui/widget/RecipeViewingWidgetScreen.java @@ -0,0 +1,297 @@ +package me.shedaniel.rei.gui.widget; + +import com.google.common.collect.Lists; +import com.mojang.blaze3d.platform.GlStateManager; +import me.shedaniel.rei.api.IRecipeCategory; +import me.shedaniel.rei.api.IRecipeDisplay; +import me.shedaniel.rei.api.SpeedCraftAreaSupplier; +import me.shedaniel.rei.api.SpeedCraftFunctional; +import me.shedaniel.rei.client.ClientHelper; +import me.shedaniel.rei.client.GuiHelper; +import me.shedaniel.rei.client.RecipeHelper; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.audio.PositionedSoundInstance; +import net.minecraft.client.gui.ContainerScreen; +import net.minecraft.client.gui.GuiEventListener; +import net.minecraft.client.gui.Screen; +import net.minecraft.client.render.GuiLighting; +import net.minecraft.client.util.Window; +import net.minecraft.sound.SoundEvents; +import net.minecraft.util.Identifier; +import net.minecraft.util.math.MathHelper; + +import java.awt.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.function.Supplier; + +public class RecipeViewingWidgetScreen extends Screen { + + public static final Identifier CHEST_GUI_TEXTURE = new Identifier("roughlyenoughitems", "textures/gui/recipecontainer.png"); + private static final Identifier CREATIVE_INVENTORY_TABS = new Identifier("textures/gui/container/creative_inventory/tabs.png"); + public final int guiWidth = 176; + public final int guiHeight = 186; + + private List widgets; + private List tabs; + private Window window; + private Rectangle bounds; + private Map> categoriesMap; + private List categories; + private IRecipeCategory selectedCategory; + private int page, categoryPages; + private ButtonWidget recipeBack, recipeNext, categoryBack, categoryNext; + + public RecipeViewingWidgetScreen(Window window, Map> categoriesMap) { + this.categoryPages = 0; + this.window = window; + this.widgets = Lists.newArrayList(); + this.bounds = new Rectangle(window.getScaledWidth() / 2 - guiWidth / 2, window.getScaledHeight() / 2 - guiHeight / 2, guiWidth, guiHeight); + this.categoriesMap = categoriesMap; + this.categories = Lists.newArrayList(); + RecipeHelper.getInstance().getCategories().forEach(category -> { + if (categoriesMap.containsKey(category)) + categories.add(category); + }); + this.selectedCategory = categories.get(0); + this.tabs = new ArrayList<>(); + } + + public static SpeedCraftFunctional getSpeedCraftFunctionalByCategory(ContainerScreen containerScreen, IRecipeCategory category) { + for(SpeedCraftFunctional functional : RecipeHelper.getInstance().getSpeedCraftFunctional(category)) + for(Class aClass : functional.getFunctioningFor()) + if (containerScreen.getClass().isAssignableFrom(aClass)) + return functional; + return null; + } + + @Override + public boolean keyPressed(int int_1, int int_2, int int_3) { + if ((int_1 == 256 || this.client.options.keyInventory.matchesKey(int_1, int_2)) && this.