Testing out JmonkeyEngine to make a game in Scala with Akka Actors within a pure FP layer
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

129 lines
6.1 KiB

  1. package wow.doge.mygame.utils;
  2. import javafx.event.EventHandler;
  3. import javafx.event.EventType;
  4. import javafx.geometry.Insets;
  5. import javafx.scene.Cursor;
  6. import javafx.scene.Scene;
  7. import javafx.scene.input.MouseEvent;
  8. import javafx.stage.Stage;
  9. //created by Alexander Berg
  10. public class ResizeHelper {
  11. public static ResizeListener addResizeListener(Stage stage) {
  12. ResizeListener resizeListener = new ResizeListener(stage);
  13. Scene scene = stage.getScene();
  14. scene.addEventHandler(MouseEvent.MOUSE_MOVED, resizeListener);
  15. scene.addEventHandler(MouseEvent.MOUSE_PRESSED, resizeListener);
  16. scene.addEventHandler(MouseEvent.MOUSE_DRAGGED, resizeListener);
  17. scene.addEventHandler(MouseEvent.MOUSE_EXITED, resizeListener);
  18. scene.addEventHandler(MouseEvent.MOUSE_EXITED_TARGET, resizeListener);
  19. return resizeListener;
  20. }
  21. public static class ResizeListener implements EventHandler<MouseEvent> {
  22. private Stage stage;
  23. private Scene scene;
  24. private Cursor cursorEvent = Cursor.DEFAULT;
  25. private int border = 4;
  26. private double startX = 0;
  27. private double startY = 0;
  28. private double sceneOffsetX = 0;
  29. private double sceneOffsetY = 0;
  30. private double padTop = 0;
  31. private double padRight = 0;
  32. private double padBottom = 0;
  33. private double padLeft = 0;
  34. public ResizeListener(Stage stage) {
  35. this.stage = stage;
  36. this.scene = stage.getScene();
  37. }
  38. public void setPadding(Insets padding) {
  39. padTop = padding.getTop();
  40. padRight = padding.getRight();
  41. padBottom = padding.getBottom();
  42. padLeft = padding.getLeft();
  43. }
  44. @Override
  45. public void handle(MouseEvent mouseEvent) {
  46. EventType<? extends MouseEvent> mouseEventType = mouseEvent.getEventType();
  47. double mouseEventX = mouseEvent.getSceneX(), mouseEventY = mouseEvent.getSceneY(),
  48. viewWidth = stage.getWidth() - padLeft - padRight,
  49. viewHeight = stage.getHeight() - padTop - padBottom;
  50. if (MouseEvent.MOUSE_MOVED.equals(mouseEventType)) {
  51. if (mouseEventX < border + padLeft && mouseEventY < border + padTop) {
  52. cursorEvent = Cursor.NW_RESIZE;
  53. } else if (mouseEventX < border + padLeft && mouseEventY > viewHeight - border + padTop) {
  54. cursorEvent = Cursor.SW_RESIZE;
  55. } else if (mouseEventX > viewWidth - border + padLeft && mouseEventY < border + padTop) {
  56. cursorEvent = Cursor.NE_RESIZE;
  57. } else if (mouseEventX > viewWidth - border + padLeft && mouseEventY > viewHeight - border + padTop) {
  58. cursorEvent = Cursor.SE_RESIZE;
  59. } else if (mouseEventX < border + padLeft) {
  60. cursorEvent = Cursor.W_RESIZE;
  61. } else if (mouseEventX > viewWidth - border + padLeft) {
  62. cursorEvent = Cursor.E_RESIZE;
  63. } else if (mouseEventY < border + padTop) {
  64. cursorEvent = Cursor.N_RESIZE;
  65. } else if (mouseEventY > viewHeight - border + padTop) {
  66. cursorEvent = Cursor.S_RESIZE;
  67. } else {
  68. cursorEvent = Cursor.DEFAULT;
  69. }
  70. scene.setCursor(cursorEvent);
  71. } else if (MouseEvent.MOUSE_EXITED.equals(mouseEventType)
  72. || MouseEvent.MOUSE_EXITED_TARGET.equals(mouseEventType)) {
  73. scene.setCursor(Cursor.DEFAULT);
  74. } else if (MouseEvent.MOUSE_PRESSED.equals(mouseEventType)) {
  75. startX = viewWidth - mouseEventX;
  76. startY = viewHeight - mouseEventY;
  77. sceneOffsetX = mouseEvent.getSceneX();
  78. sceneOffsetY = mouseEvent.getSceneY();
  79. } else if (MouseEvent.MOUSE_DRAGGED.equals(mouseEventType) && !Cursor.DEFAULT.equals(cursorEvent)) {
  80. if (!Cursor.W_RESIZE.equals(cursorEvent) && !Cursor.E_RESIZE.equals(cursorEvent)) {
  81. double minHeight = stage.getMinHeight() > (border * 2) ? stage.getMinHeight() : (border * 2);
  82. if (Cursor.NW_RESIZE.equals(cursorEvent) || Cursor.N_RESIZE.equals(cursorEvent)
  83. || Cursor.NE_RESIZE.equals(cursorEvent)) {
  84. if (stage.getHeight() > minHeight || mouseEventY < 0) {
  85. double height = stage.getY() - mouseEvent.getScreenY() + stage.getHeight() + sceneOffsetY;
  86. double y = mouseEvent.getScreenY() - sceneOffsetY;
  87. stage.setHeight(height);
  88. stage.setY(y);
  89. }
  90. } else {
  91. if (stage.getHeight() > minHeight || mouseEventY + startY - stage.getHeight() > 0) {
  92. stage.setHeight(mouseEventY + startY + padBottom + padTop);
  93. }
  94. }
  95. }
  96. if (!Cursor.N_RESIZE.equals(cursorEvent) && !Cursor.S_RESIZE.equals(cursorEvent)) {
  97. double minWidth = stage.getMinWidth() > (border * 2) ? stage.getMinWidth() : (border * 2);
  98. if (Cursor.NW_RESIZE.equals(cursorEvent) || Cursor.W_RESIZE.equals(cursorEvent)
  99. || Cursor.SW_RESIZE.equals(cursorEvent)) {
  100. if (stage.getWidth() > minWidth || mouseEventX < 0) {
  101. double width = stage.getX() - mouseEvent.getScreenX() + stage.getWidth() + sceneOffsetX;
  102. double x = mouseEvent.getScreenX() - sceneOffsetX;
  103. stage.setWidth(width);
  104. stage.setX(x);
  105. }
  106. } else {
  107. if (stage.getWidth() > minWidth || mouseEventX + startX - stage.getWidth() > 0) {
  108. stage.setWidth(mouseEventX + startX + padLeft + padRight);
  109. }
  110. }
  111. }
  112. }
  113. }
  114. }
  115. }