DraggableWidget.java 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package me.shedaniel.rei.gui.widget;
  2. import me.shedaniel.cloth.api.ClientUtils;
  3. import net.minecraft.client.MinecraftClient;
  4. import net.minecraft.client.gui.InputListener;
  5. import net.minecraft.client.util.Window;
  6. import java.awt.*;
  7. public abstract class DraggableWidget extends HighlightableWidget {
  8. public boolean dragged = false;
  9. private Point midPoint, startPoint;
  10. private int relateX, relateY;
  11. public DraggableWidget(Point startingPoint) {
  12. initWidgets(midPoint = startingPoint);
  13. }
  14. public DraggableWidget() {
  15. this(new Point(MinecraftClient.getInstance().window.getScaledWidth() / 2, MinecraftClient.getInstance().window.getScaledHeight() / 2));
  16. }
  17. protected abstract void initWidgets(Point midPoint);
  18. public abstract void updateWidgets(Point midPoint);
  19. public abstract Rectangle getGrabBounds();
  20. public abstract Rectangle getDragBounds();
  21. public final Point getMidPoint() {
  22. return midPoint;
  23. }
  24. @Override
  25. public boolean mouseDragged(double double_1, double double_2, int int_1, double double_3, double double_4) {
  26. Point mouse = ClientUtils.getMouseLocation();
  27. if (int_1 == 0) {
  28. if (!dragged) {
  29. if (getGrabBounds().contains(mouse)) {
  30. startPoint = new Point(midPoint.x, midPoint.y);
  31. relateX = mouse.x - midPoint.x;
  32. relateY = mouse.y - midPoint.y;
  33. dragged = true;
  34. }
  35. } else {
  36. Window window = MinecraftClient.getInstance().window;
  37. midPoint = processMidPoint(midPoint, mouse, startPoint, window, relateX, relateY);
  38. updateWidgets(midPoint);
  39. }
  40. return true;
  41. }
  42. for(InputListener listener : getInputListeners())
  43. if (listener.mouseDragged(double_1, double_2, int_1, double_3, double_4))
  44. return true;
  45. return false;
  46. }
  47. public abstract Point processMidPoint(Point midPoint, Point mouse, Point startPoint, Window window, int relateX, int relateY);
  48. @Override
  49. public boolean mouseReleased(double double_1, double double_2, int int_1) {
  50. if (int_1 == 0)
  51. if (dragged) {
  52. dragged = false;
  53. onMouseReleaseMidPoint(getMidPoint());
  54. return true;
  55. }
  56. for(InputListener listener : getInputListeners())
  57. if (listener.mouseReleased(double_1, double_2, int_1))
  58. return true;
  59. return false;
  60. }
  61. public void onMouseReleaseMidPoint(Point midPoint) {}
  62. }