Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

canvas.tsx 1.7KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import styled from 'styles'
  2. import state from 'state'
  3. import inputs from 'state/inputs'
  4. import React, { useCallback, useRef } from 'react'
  5. import useZoomEvents from 'hooks/useZoomEvents'
  6. import useCamera from 'hooks/useCamera'
  7. import Defs from './defs'
  8. import Page from './page'
  9. import Brush from './brush'
  10. import Bounds from './bounds/bounding-box'
  11. import BoundsBg from './bounds/bounds-bg'
  12. export default function Canvas() {
  13. const rCanvas = useRef<SVGSVGElement>(null)
  14. const rGroup = useRef<SVGGElement>(null)
  15. const events = useZoomEvents(rCanvas)
  16. useCamera(rGroup)
  17. const handlePointerDown = useCallback((e: React.PointerEvent) => {
  18. rCanvas.current.setPointerCapture(e.pointerId)
  19. state.send('POINTED_CANVAS', inputs.pointerDown(e, 'canvas'))
  20. }, [])
  21. const handlePointerMove = useCallback((e: React.PointerEvent) => {
  22. state.send('MOVED_POINTER', inputs.pointerMove(e))
  23. }, [])
  24. const handlePointerUp = useCallback((e: React.PointerEvent) => {
  25. rCanvas.current.releasePointerCapture(e.pointerId)
  26. state.send('STOPPED_POINTING', { id: 'canvas', ...inputs.pointerUp(e) })
  27. }, [])
  28. return (
  29. <MainSVG
  30. ref={rCanvas}
  31. {...events}
  32. onPointerDown={handlePointerDown}
  33. onPointerMove={handlePointerMove}
  34. onPointerUp={handlePointerUp}
  35. >
  36. <Defs />
  37. <MainGroup ref={rGroup}>
  38. <BoundsBg />
  39. <Page />
  40. <Bounds />
  41. <Brush />
  42. </MainGroup>
  43. </MainSVG>
  44. )
  45. }
  46. const MainSVG = styled('svg', {
  47. position: 'fixed',
  48. top: 0,
  49. left: 0,
  50. width: '100%',
  51. height: '100%',
  52. touchAction: 'none',
  53. zIndex: 100,
  54. '& *': {
  55. userSelect: 'none',
  56. },
  57. })
  58. const MainGroup = styled('g', {})