DraggableWidget.java 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. /*
  2. * Roughly Enough Items by Danielshe.
  3. * Licensed under the MIT License.
  4. */
  5. package me.shedaniel.rei.gui.widget;
  6. import me.shedaniel.math.api.Point;
  7. import me.shedaniel.math.api.Rectangle;
  8. import me.shedaniel.math.impl.PointHelper;
  9. import net.minecraft.client.MinecraftClient;
  10. import net.minecraft.client.gui.Element;
  11. import net.minecraft.client.util.Window;
  12. import org.jetbrains.annotations.ApiStatus;
  13. @ApiStatus.Internal
  14. public abstract class DraggableWidget extends WidgetWithBounds {
  15. public boolean dragged = false;
  16. private Point midPoint, startPoint;
  17. private int relateX, relateY;
  18. public DraggableWidget(Point startingPoint) {
  19. initWidgets(midPoint = startingPoint);
  20. }
  21. public DraggableWidget() {
  22. this(new Point(MinecraftClient.getInstance().getWindow().getScaledWidth() / 2, MinecraftClient.getInstance().getWindow().getScaledHeight() / 2));
  23. }
  24. protected abstract void initWidgets(Point midPoint);
  25. public abstract void updateWidgets(Point midPoint);
  26. public abstract Rectangle getGrabBounds();
  27. public abstract Rectangle getDragBounds();
  28. public final Point getMidPoint() {
  29. return midPoint;
  30. }
  31. @Override
  32. public boolean mouseDragged(double double_1, double double_2, int int_1, double double_3, double double_4) {
  33. Point mouse = PointHelper.fromMouse();
  34. if (int_1 == 0) {
  35. if (!dragged) {
  36. if (getGrabBounds().contains(mouse)) {
  37. startPoint = new Point(midPoint.x, midPoint.y);
  38. relateX = mouse.x - midPoint.x;
  39. relateY = mouse.y - midPoint.y;
  40. dragged = true;
  41. }
  42. } else {
  43. Window window = minecraft.getWindow();
  44. midPoint = processMidPoint(midPoint, mouse, startPoint, window, relateX, relateY);
  45. updateWidgets(midPoint);
  46. }
  47. return true;
  48. }
  49. for (Element listener : children())
  50. if (listener.mouseDragged(double_1, double_2, int_1, double_3, double_4))
  51. return true;
  52. return false;
  53. }
  54. public abstract Point processMidPoint(Point midPoint, Point mouse, Point startPoint, Window window, int relateX, int relateY);
  55. @Override
  56. public boolean mouseReleased(double double_1, double double_2, int int_1) {
  57. if (int_1 == 0)
  58. if (dragged) {
  59. dragged = false;
  60. onMouseReleaseMidPoint(getMidPoint());
  61. return true;
  62. }
  63. for (Element listener : children())
  64. if (listener.mouseReleased(double_1, double_2, int_1))
  65. return true;
  66. return false;
  67. }
  68. public void onMouseReleaseMidPoint(Point midPoint) {
  69. }
  70. }