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.

hacks.ts 3.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. import { DrawShape, PointerInfo } from 'types'
  2. import {
  3. getCameraZoom,
  4. getCurrentCamera,
  5. getSelectedIds,
  6. screenToWorld,
  7. setToArray,
  8. } from 'utils'
  9. import { freeze } from 'immer'
  10. import session from './session'
  11. import state from './state'
  12. import vec from 'utils/vec'
  13. import * as Session from './sessions'
  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): void {
  22. const data = { ...state.data }
  23. session.update<Session.DrawSession>(
  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[
  31. selectedId
  32. ] as DrawShape
  33. ;(data.document.pages[data.currentPageId].shapes[selectedId] as DrawShape) = {
  34. ...shape,
  35. points: [...shape.points],
  36. }
  37. state.forceData(freeze(data))
  38. }
  39. export function fastPanUpdate(delta: number[]): void {
  40. const data = { ...state.data }
  41. const camera = getCurrentCamera(data)
  42. camera.point = vec.sub(camera.point, vec.div(delta, camera.zoom))
  43. data.pageStates[data.currentPageId].camera = { ...camera }
  44. state.forceData(freeze(data))
  45. }
  46. export function fastZoomUpdate(point: number[], delta: number): void {
  47. const data = { ...state.data }
  48. const camera = getCurrentCamera(data)
  49. const next = camera.zoom - (delta / 100) * camera.zoom
  50. const p0 = screenToWorld(point, data)
  51. camera.zoom = getCameraZoom(next)
  52. const p1 = screenToWorld(point, data)
  53. camera.point = vec.add(camera.point, vec.sub(p1, p0))
  54. data.pageStates[data.currentPageId].camera = { ...camera }
  55. state.forceData(freeze(data))
  56. }
  57. export function fastPinchCamera(
  58. point: number[],
  59. delta: number[],
  60. distanceDelta: number
  61. ): void {
  62. const data = { ...state.data }
  63. const camera = getCurrentCamera(data)
  64. camera.point = vec.sub(camera.point, vec.div(delta, camera.zoom))
  65. const next = camera.zoom - (distanceDelta / 350) * camera.zoom
  66. const p0 = screenToWorld(point, data)
  67. camera.zoom = getCameraZoom(next)
  68. const p1 = screenToWorld(point, data)
  69. camera.point = vec.add(camera.point, vec.sub(p1, p0))
  70. const pageState = data.pageStates[data.currentPageId]
  71. pageState.camera = { ...camera }
  72. data.pageStates[data.currentPageId] = { ...pageState }
  73. state.forceData(freeze(data))
  74. }
  75. export function fastBrushSelect(point: number[]): void {
  76. const data = { ...state.data }
  77. session.update<Session.BrushSession>(data, screenToWorld(point, data))
  78. state.forceData(freeze(data))
  79. }
  80. export function fastTranslate(info: PointerInfo): void {
  81. const data = { ...state.data }
  82. session.update<Session.TranslateSession>(
  83. data,
  84. screenToWorld(info.point, data),
  85. info.shiftKey,
  86. info.altKey
  87. )
  88. state.forceData(freeze(data))
  89. }
  90. export function fastTransform(info: PointerInfo): void {
  91. const data = { ...state.data }
  92. session.update<Session.TransformSession | Session.TransformSingleSession>(
  93. data,
  94. screenToWorld(info.point, data),
  95. info.shiftKey
  96. )
  97. state.forceData(freeze(data))
  98. }