ContainerGuiOverlay.java 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. package me.shedaniel.rei.gui;
  2. import com.mojang.blaze3d.platform.GlStateManager;
  3. import me.shedaniel.rei.client.ClientHelper;
  4. import me.shedaniel.rei.gui.widget.*;
  5. import me.shedaniel.rei.listeners.IMixinContainerGui;
  6. import net.minecraft.client.MinecraftClient;
  7. import net.minecraft.client.gui.ContainerGui;
  8. import net.minecraft.client.gui.Gui;
  9. import net.minecraft.client.gui.GuiEventListener;
  10. import net.minecraft.client.gui.widget.TextFieldWidget;
  11. import net.minecraft.client.render.GuiLighting;
  12. import net.minecraft.client.resource.language.I18n;
  13. import net.minecraft.client.util.Window;
  14. import net.minecraft.util.math.MathHelper;
  15. import java.awt.*;
  16. import java.util.ArrayList;
  17. import java.util.List;
  18. public class ContainerGuiOverlay extends Gui {
  19. private static int page = 0;
  20. private final List<IWidget> widgets;
  21. private final List<QueuedTooltip> queuedTooltips;
  22. private Rectangle rectangle;
  23. private IMixinContainerGui containerGui;
  24. private Window window;
  25. private ItemListOverlay itemListOverlay;
  26. private ButtonWidget buttonLeft, buttonRight;
  27. private TextFieldWidget searchField;
  28. public ContainerGuiOverlay(ContainerGui containerGui) {
  29. this.queuedTooltips = new ArrayList<>();
  30. this.containerGui = (IMixinContainerGui) containerGui;
  31. this.widgets = new ArrayList<>();
  32. }
  33. public void onInitialized() {
  34. String searchTerm = searchField != null ? searchField.getText() : "";
  35. //Update Variables
  36. this.widgets.clear();
  37. this.window = MinecraftClient.getInstance().window;
  38. if (MinecraftClient.getInstance().currentGui instanceof ContainerGui)
  39. this.containerGui = (IMixinContainerGui) MinecraftClient.getInstance().currentGui;
  40. this.rectangle = calculateBoundary();
  41. widgets.add(this.itemListOverlay = new ItemListOverlay(this, containerGui, page));
  42. this.itemListOverlay.updateList(getItemListArea(), page, searchTerm);
  43. widgets.add(buttonLeft = new ButtonWidget(rectangle.x, rectangle.y + 5, 16, 16, "<") {
  44. @Override
  45. public void onPressed(int button, double mouseX, double mouseY) {
  46. page--;
  47. if (page < 0)
  48. page = getTotalPage();
  49. itemListOverlay.updateList(getItemListArea(), page, searchField.getText());
  50. }
  51. });
  52. widgets.add(buttonRight = new ButtonWidget(rectangle.x + rectangle.width - 18, rectangle.y + 5, 16, 16, ">") {
  53. @Override
  54. public void onPressed(int button, double mouseX, double mouseY) {
  55. page++;
  56. if (page > getTotalPage())
  57. page = 0;
  58. itemListOverlay.updateList(getItemListArea(), page, searchField.getText());
  59. }
  60. });
  61. page = MathHelper.clamp(page, 0, getTotalPage());
  62. widgets.add(new ButtonWidget(10, 10, 40, 20, "") {
  63. @Override
  64. public void draw(int int_1, int int_2, float float_1) {
  65. this.text = getCheatModeText();
  66. super.draw(int_1, int_2, float_1);
  67. }
  68. @Override
  69. public void onPressed(int button, double mouseX, double mouseY) {
  70. ClientHelper.setCheating(!ClientHelper.isCheating());
  71. }
  72. });
  73. this.widgets.add(new LabelWidget(rectangle.x + (rectangle.width / 2), rectangle.y + 10, "") {
  74. @Override
  75. public void draw(int mouseX, int mouseY, float partialTicks) {
  76. this.text = String.format("%s/%s", page + 1, getTotalPage() + 1);
  77. super.draw(mouseX, mouseY, partialTicks);
  78. }
  79. });
  80. Rectangle textFieldArea = getTextFieldArea();
  81. this.listeners.add(searchField = new TextFieldWidget(-1, MinecraftClient.getInstance().fontRenderer,
  82. (int) textFieldArea.getX(), (int) textFieldArea.getY(), (int) textFieldArea.getWidth(), (int) textFieldArea.getHeight()));
  83. searchField.setChangedListener((id, text) -> {
  84. itemListOverlay.updateList(page, text);
  85. });
  86. searchField.setText(searchTerm);
  87. this.listeners.addAll(widgets);
  88. }
  89. private Rectangle getTextFieldArea() {
  90. if (MinecraftClient.getInstance().currentGui instanceof RecipeViewingWidget) {
  91. RecipeViewingWidget widget = (RecipeViewingWidget) MinecraftClient.getInstance().currentGui;
  92. return new Rectangle(widget.getBounds().x, window.getScaledHeight() - 22, widget.getBounds().width, 18);
  93. }
  94. return new Rectangle(containerGui.getContainerLeft(), window.getScaledHeight() - 22, containerGui.getContainerWidth(), 18);
  95. }
  96. private String getCheatModeText() {
  97. return I18n.translate(String.format("%s%s", "text.rei.", ClientHelper.isCheating() ? "cheat" : "nocheat"));
  98. }
  99. private Rectangle getItemListArea() {
  100. return new Rectangle(rectangle.x + 2, rectangle.y + 24, rectangle.width - 4, rectangle.height - 27);
  101. }
  102. public Rectangle getRectangle() {
  103. return rectangle;
  104. }
  105. public void render(int mouseX, int mouseY, float partialTicks) {
  106. GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
  107. GuiLighting.disable();
  108. this.draw(mouseX, mouseY, partialTicks);
  109. GuiLighting.disable();
  110. queuedTooltips.forEach(queuedTooltip -> containerGui.getContainerGui().drawTooltip(queuedTooltip.text, queuedTooltip.mouse.x, queuedTooltip.mouse.y));
  111. queuedTooltips.clear();
  112. GuiLighting.disable();
  113. searchField.render(mouseX, mouseY, partialTicks);
  114. }
  115. public void addTooltip(QueuedTooltip queuedTooltip) {
  116. queuedTooltips.add(queuedTooltip);
  117. }
  118. @Override
  119. public void draw(int int_1, int int_2, float float_1) {
  120. widgets.forEach(widget -> {
  121. GuiLighting.disable();
  122. widget.draw(int_1, int_2, float_1);
  123. });
  124. GuiLighting.disable();
  125. itemListOverlay.draw(int_1, int_2, float_1);
  126. GuiLighting.disable();
  127. super.draw(int_1, int_2, float_1);
  128. }
  129. private Rectangle calculateBoundary() {
  130. int startX = containerGui.getContainerLeft() + containerGui.getContainerWidth() + 10;
  131. int width = window.getScaledWidth() - startX;
  132. if (MinecraftClient.getInstance().currentGui instanceof RecipeViewingWidget) {
  133. RecipeViewingWidget widget = (RecipeViewingWidget) MinecraftClient.getInstance().currentGui;
  134. width = window.getScaledWidth() - (widget.getBounds().x + widget.getBounds().width + 10);
  135. }
  136. return new Rectangle(startX, 0, width, window.getScaledHeight());
  137. }
  138. private int getTotalPage() {
  139. return MathHelper.ceil(itemListOverlay.getCurrentDisplayed().size() / itemListOverlay.getTotalSlotsPerPage());
  140. }
  141. @Override
  142. public boolean mouseScrolled(double amount) {
  143. if (rectangle.contains(ClientHelper.getMouseLocation())) {
  144. if (amount > 0 && buttonLeft.enabled)
  145. buttonLeft.onPressed(0, 0, 0);
  146. else if (amount < 0 && buttonRight.enabled)
  147. buttonRight.onPressed(0, 0, 0);
  148. else return false;
  149. return true;
  150. }
  151. for(IWidget widget : widgets)
  152. if (widget.mouseScrolled(amount))
  153. return true;
  154. return false;
  155. }
  156. @Override
  157. public boolean keyPressed(int int_1, int int_2, int int_3) {
  158. for(GuiEventListener listener : listeners)
  159. if (listener.keyPressed(int_1, int_2, int_3))
  160. return true;
  161. return false;
  162. }
  163. @Override
  164. public boolean charTyped(char char_1, int int_1) {
  165. for(GuiEventListener listener : listeners)
  166. if (listener.charTyped(char_1, int_1))
  167. return true;
  168. return super.charTyped(char_1, int_1);
  169. }
  170. }