您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

useCanvasEvents.ts 1.9KB

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