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.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. import { PointerInfo } from 'types'
  2. import {
  3. getCameraZoom,
  4. getCurrentCamera,
  5. getSelectedIds,
  6. screenToWorld,
  7. setToArray,
  8. setZoomCSS,
  9. } from 'utils/utils'
  10. import { freeze } from 'immer'
  11. import session from './session'
  12. import state from './state'
  13. import vec from 'utils/vec'
  14. /**
  15. * While a user is drawing with the draw tool, we want to update the shape without
  16. * going through the trouble of updating the entire state machine. Speciifcally, we
  17. * do not want to push the change through immer. Instead, we'll push the change
  18. * directly to the state using `forceData`.
  19. * @param info
  20. */
  21. export function fastDrawUpdate(info: PointerInfo) {
  22. const data = { ...state.data }
  23. session.current.update(
  24. data,
  25. screenToWorld(info.point, data),
  26. info.pressure,
  27. info.shiftKey
  28. )
  29. const selectedId = setToArray(getSelectedIds(data))[0]
  30. const shape = data.document.pages[data.currentPageId].shapes[selectedId]
  31. data.document.pages[data.currentPageId].shapes[selectedId] = { ...shape }
  32. state.forceData(freeze(data))
  33. }
  34. export function fastPanUpdate(delta: number[]) {
  35. const data = { ...state.data }
  36. const camera = getCurrentCamera(data)
  37. camera.point = vec.sub(camera.point, vec.div(delta, camera.zoom))
  38. data.pageStates[data.currentPageId].camera = { ...camera }
  39. state.forceData(freeze(data))
  40. }
  41. export function fastZoomUpdate(point: number[], delta: number) {
  42. const data = { ...state.data }
  43. const camera = getCurrentCamera(data)
  44. const next = camera.zoom - (delta / 100) * camera.zoom
  45. const p0 = screenToWorld(point, data)
  46. camera.zoom = getCameraZoom(next)
  47. const p1 = screenToWorld(point, data)
  48. camera.point = vec.add(camera.point, vec.sub(p1, p0))
  49. data.pageStates[data.currentPageId].camera = { ...camera }
  50. state.forceData(freeze(data))
  51. }
  52. export function fastPinchCamera(
  53. point: number[],
  54. delta: number[],
  55. distanceDelta: number,
  56. angleDelta: number
  57. ) {
  58. const data = { ...state.data }
  59. const camera = getCurrentCamera(data)
  60. camera.point = vec.sub(camera.point, vec.div(delta, camera.zoom))
  61. const next = camera.zoom - (distanceDelta / 350) * camera.zoom
  62. const p0 = screenToWorld(point, data)
  63. camera.zoom = getCameraZoom(next)
  64. const p1 = screenToWorld(point, data)
  65. camera.point = vec.add(camera.point, vec.sub(p1, p0))
  66. const pageState = data.pageStates[data.currentPageId]
  67. pageState.camera = { ...camera }
  68. data.pageStates[data.currentPageId] = { ...pageState }
  69. state.forceData(freeze(data))
  70. }
  71. export function fastBrushSelect(point: number[]) {
  72. const data = { ...state.data }
  73. session.current.update(data, screenToWorld(point, data))
  74. state.forceData(freeze(data))
  75. }
  76. export function fastTranslate(info: PointerInfo) {
  77. const data = { ...state.data }
  78. session.current.update(
  79. data,
  80. screenToWorld(info.point, data),
  81. info.shiftKey,
  82. info.altKey
  83. )
  84. state.forceData(freeze(data))
  85. }
  86. export function fastTransform(info: PointerInfo) {
  87. const data = { ...state.data }
  88. session.current.update(
  89. data,
  90. screenToWorld(info.point, data),
  91. info.shiftKey,
  92. info.altKey
  93. )
  94. state.forceData(freeze(data))
  95. }