Advertisement
Guest User

Untitled

a guest
Feb 26th, 2020
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 8.68 KB | None | 0 0
  1. package shared.draw.rectangle
  2.  
  3. import javafx.event.EventHandler
  4. import javafx.scene.Cursor
  5. import javafx.scene.input.MouseEvent
  6. import javafx.scene.shape.Rectangle
  7.  
  8. class ResizableRectangle() : Rectangle() {
  9.  
  10.     private val resizableRectangleListener: ResizableRectangleListener = object : ResizableRectangleListener {
  11.  
  12.         override var resizableRectangleCursorState: ResizableRectangleCursorState = ResizableRectangleCursorState.INIT
  13.  
  14.         private val MOUSE_MARGIN: Double = 10.0
  15.         private val RESIZE_LIMIT: Double = MOUSE_MARGIN + 20.0
  16.  
  17.         private var pressedPoint: Pair<Double, Double>? = null
  18.  
  19.         private fun isOnLedge(mouse: Double, pos: Double): Boolean {
  20.             return (mouse > pos - MOUSE_MARGIN && mouse < pos + MOUSE_MARGIN)
  21.         }
  22.  
  23.         override fun onMovePressed(mouseEvent: MouseEvent, rectangle: Rectangle) {
  24.             pressedPoint = Pair(mouseEvent.sceneX - rectangle.x, mouseEvent.sceneY - rectangle.y)
  25.         }
  26.  
  27.         override fun onMouseRelease(mouseEvent: MouseEvent) {
  28.             pressedPoint = null
  29.         }
  30.  
  31.         override fun onMouseDragged(
  32.             mouseEvent: MouseEvent,
  33.             rectangle: Rectangle
  34.         ) {
  35.             when (resizableRectangleCursorState) {
  36.                 ResizableRectangleCursorState.MOVE -> {
  37.                     pressedPoint?.let { pressedPoint ->
  38.                         rectangle.x = mouseEvent.sceneX - pressedPoint.first
  39.                         rectangle.y = mouseEvent.sceneY - pressedPoint.second
  40.                     }
  41.                 }
  42.  
  43.                 ResizableRectangleCursorState.LEFT -> {
  44.                     if (RESIZE_LIMIT < (rectangle.width + (rectangle.x - mouseEvent.sceneX))) {
  45.                         val beforeX: Double = rectangle.x
  46.                         rectangle.x = mouseEvent.sceneX
  47.                         rectangle.width = rectangle.width + (beforeX - rectangle.x)
  48.                     }
  49.                 }
  50.  
  51.                 ResizableRectangleCursorState.RIGHT -> {
  52.                     if (RESIZE_LIMIT < (rectangle.width + (mouseEvent.sceneX - (rectangle.x + rectangle.width)))) {
  53.                         rectangle.width = rectangle.width + (mouseEvent.sceneX - (rectangle.x + rectangle.width))
  54.                     }
  55.                 }
  56.  
  57.                 ResizableRectangleCursorState.TOP -> {
  58.                     if (RESIZE_LIMIT < (rectangle.height + (rectangle.y - mouseEvent.sceneY))) {
  59.                         val beforeY: Double = rectangle.y
  60.                         rectangle.y = mouseEvent.sceneY
  61.                         rectangle.height = rectangle.height + (beforeY - rectangle.y)
  62.                     }
  63.                 }
  64.  
  65.                 ResizableRectangleCursorState.BOTTOM -> {
  66.                     if (RESIZE_LIMIT < (rectangle.height + (mouseEvent.sceneY - (rectangle.y + rectangle.height)))) {
  67.                         rectangle.height = rectangle.height + (mouseEvent.sceneY - (rectangle.y + rectangle.height))
  68.                     }
  69.                 }
  70.  
  71.                 ResizableRectangleCursorState.TOP_LEFT -> {
  72.                     if (RESIZE_LIMIT < (rectangle.width + (rectangle.x - mouseEvent.sceneX))) {
  73.                         val beforeX: Double = rectangle.x
  74.                         rectangle.x = mouseEvent.sceneX
  75.                         rectangle.width = rectangle.width + (beforeX - rectangle.x)
  76.                     }
  77.  
  78.                     if (RESIZE_LIMIT < (rectangle.height + (rectangle.y - mouseEvent.sceneY))) {
  79.                         val beforeY: Double = rectangle.y
  80.                         rectangle.y = mouseEvent.sceneY
  81.                         rectangle.height = rectangle.height + (beforeY - rectangle.y)
  82.                     }
  83.                 }
  84.  
  85.                 ResizableRectangleCursorState.TOP_RIGHT -> {
  86.                     if (RESIZE_LIMIT < (rectangle.height + (rectangle.y - mouseEvent.sceneY))) {
  87.                         val beforeY: Double = rectangle.y
  88.                         rectangle.y = mouseEvent.sceneY
  89.                         rectangle.height = rectangle.height + (beforeY - rectangle.y)
  90.                     }
  91.  
  92.                     if (RESIZE_LIMIT < (rectangle.width + (mouseEvent.sceneX - (rectangle.x + rectangle.width)))) {
  93.                         rectangle.width = rectangle.width + (mouseEvent.sceneX - (rectangle.x + rectangle.width))
  94.                     }
  95.                 }
  96.  
  97.                 ResizableRectangleCursorState.BOTTOM_RIGHT -> {
  98.                     if (RESIZE_LIMIT < (rectangle.height + (mouseEvent.sceneY - (rectangle.y + rectangle.height)))) {
  99.                         rectangle.height = rectangle.height + (mouseEvent.sceneY - (rectangle.y + rectangle.height))
  100.                     }
  101.  
  102.                     if (RESIZE_LIMIT < (rectangle.width + (mouseEvent.sceneX - (rectangle.x + rectangle.width)))) {
  103.                         rectangle.width = rectangle.width + (mouseEvent.sceneX - (rectangle.x + rectangle.width))
  104.                     }
  105.                 }
  106.  
  107.                 ResizableRectangleCursorState.BOTTOM_LEFT -> {
  108.                     if (RESIZE_LIMIT < (rectangle.height + (mouseEvent.sceneY - (rectangle.y + rectangle.height)))) {
  109.                         rectangle.height = rectangle.height + (mouseEvent.sceneY - (rectangle.y + rectangle.height))
  110.                     }
  111.  
  112.                     if (RESIZE_LIMIT < (rectangle.width + (rectangle.x - mouseEvent.sceneX))) {
  113.                         val beforeX: Double = rectangle.x
  114.                         rectangle.x = mouseEvent.sceneX
  115.                         rectangle.width = rectangle.width + (beforeX - rectangle.x)
  116.                     }
  117.                 }
  118.  
  119.                 ResizableRectangleCursorState.INIT -> return
  120.             }
  121.         }
  122.  
  123.         override fun onMouseMoved(mouseEvent: MouseEvent, rectangle: Rectangle) {
  124.             if (isOnLedge(mouseEvent.x, rectangle.x) && isOnLedge(mouseEvent.y, rectangle.y)) {
  125.                 cursor = Cursor.NW_RESIZE
  126.                 resizableRectangleCursorState = ResizableRectangleCursorState.TOP_LEFT
  127.  
  128.                 return
  129.             }
  130.  
  131.             if (isOnLedge(mouseEvent.x, rectangle.x + rectangle.width) && isOnLedge(mouseEvent.y, rectangle.y)) {
  132.                 cursor = Cursor.NE_RESIZE
  133.                 resizableRectangleCursorState = ResizableRectangleCursorState.TOP_RIGHT
  134.  
  135.                 return
  136.             }
  137.  
  138.             if (isOnLedge(mouseEvent.x, rectangle.x) && isOnLedge(mouseEvent.y, rectangle.y + rectangle.height)) {
  139.                 cursor = Cursor.SW_RESIZE
  140.                 resizableRectangleCursorState = ResizableRectangleCursorState.BOTTOM_LEFT
  141.  
  142.                 return
  143.             }
  144.  
  145.             if (isOnLedge(mouseEvent.x, rectangle.x + rectangle.width) && isOnLedge(mouseEvent.y, rectangle.y + rectangle.height)) {
  146.                 cursor = Cursor.SE_RESIZE
  147.                 resizableRectangleCursorState = ResizableRectangleCursorState.BOTTOM_RIGHT
  148.  
  149.                 return
  150.             }
  151.  
  152.             if (isOnLedge(mouseEvent.x, rectangle.x)) {
  153.                 cursor = Cursor.W_RESIZE
  154.                 resizableRectangleCursorState = ResizableRectangleCursorState.LEFT
  155.  
  156.                 return
  157.             }
  158.  
  159.             if (isOnLedge(mouseEvent.y, rectangle.y)) {
  160.                 cursor = Cursor.N_RESIZE
  161.                 resizableRectangleCursorState = ResizableRectangleCursorState.TOP
  162.  
  163.                 return
  164.             }
  165.  
  166.             if (isOnLedge(mouseEvent.x, rectangle.x + rectangle.width)) {
  167.                 cursor = Cursor.E_RESIZE
  168.                 resizableRectangleCursorState = ResizableRectangleCursorState.RIGHT
  169.  
  170.                 return
  171.             }
  172.  
  173.             if (isOnLedge(mouseEvent.y, rectangle.y + rectangle.height)) {
  174.                 cursor = Cursor.S_RESIZE
  175.                 resizableRectangleCursorState = ResizableRectangleCursorState.BOTTOM
  176.  
  177.                 return
  178.             }
  179.  
  180.             cursor = Cursor.MOVE
  181.             resizableRectangleCursorState = ResizableRectangleCursorState.MOVE
  182.         }
  183.     }
  184.  
  185.     init {
  186.         this.onMouseMoved = EventHandler<MouseEvent> { p0 ->
  187.             p0?.let {
  188.                 resizableRectangleListener.onMouseMoved(p0, this)
  189.             }
  190.         }
  191.  
  192.         this.onMouseDragged = EventHandler<MouseEvent> { p0 ->
  193.             p0?.let {
  194.                 resizableRectangleListener.onMouseDragged(p0, this)
  195.             }
  196.         }
  197.  
  198.         this.onMousePressed = EventHandler<MouseEvent> { p0 ->
  199.             p0?.let {
  200.                 resizableRectangleListener.onMovePressed(p0, this)
  201.             }
  202.         }
  203.  
  204.         this.onMouseReleased = EventHandler<MouseEvent> { p0 ->
  205.             p0?.let {
  206.                 resizableRectangleListener.onMouseRelease(p0)
  207.             }
  208.         }
  209.     }
  210. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement