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.

useCanvasEvents.ts 2.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. /* eslint-disable @typescript-eslint/explicit-module-boundary-types */
  2. import { MutableRefObject, useCallback } from 'react'
  3. import state from 'state'
  4. import {
  5. fastBrushSelect,
  6. fastDrawUpdate,
  7. fastTransform,
  8. fastTranslate,
  9. } from 'state/hacks'
  10. import inputs from 'state/inputs'
  11. import Vec from 'utils/vec'
  12. export default function useCanvasEvents(
  13. rCanvas: MutableRefObject<SVGGElement>
  14. ) {
  15. const handlePointerDown = useCallback((e: React.PointerEvent) => {
  16. if (!inputs.canAccept(e.pointerId)) return
  17. rCanvas.current.setPointerCapture(e.pointerId)
  18. if (e.button === 0) {
  19. state.send('POINTED_CANVAS', inputs.pointerDown(e, 'canvas'))
  20. } else if (e.button === 2) {
  21. state.send('RIGHT_POINTED', inputs.pointerDown(e, 'canvas'))
  22. }
  23. }, [])
  24. const handlePointerMove = useCallback((e: React.PointerEvent) => {
  25. if (!inputs.canAccept(e.pointerId)) return
  26. const prev = inputs.pointer?.point
  27. const info = inputs.pointerMove(e)
  28. if (prev && state.isIn('selecting') && inputs.keys[' ']) {
  29. state.send('KEYBOARD_PANNED_CAMERA', { delta: Vec.sub(prev, info.point) })
  30. return
  31. }
  32. if (state.isIn('draw.editing')) {
  33. fastDrawUpdate(info)
  34. } else if (state.isIn('brushSelecting')) {
  35. fastBrushSelect(info.point)
  36. } else if (state.isIn('translatingSelection')) {
  37. fastTranslate(info)
  38. } else if (state.isIn('transformingSelection')) {
  39. fastTransform(info)
  40. }
  41. state.send('MOVED_POINTER', info)
  42. }, [])
  43. const handlePointerUp = useCallback((e: React.PointerEvent) => {
  44. if (!inputs.canAccept(e.pointerId)) return
  45. e.stopPropagation()
  46. rCanvas.current.releasePointerCapture(e.pointerId)
  47. state.send('STOPPED_POINTING', {
  48. id: 'canvas',
  49. ...inputs.pointerUp(e, 'canvas'),
  50. })
  51. }, [])
  52. const handleTouchStart = useCallback(() => {
  53. // if (isMobile()) {
  54. // if (e.touches.length === 2) {
  55. // state.send('TOUCH_UNDO')
  56. // } else state.send('TOUCHED_CANVAS')
  57. // }
  58. }, [])
  59. return {
  60. onPointerDown: handlePointerDown,
  61. onPointerMove: handlePointerMove,
  62. onPointerUp: handlePointerUp,
  63. onTouchStart: handleTouchStart,
  64. }
  65. }