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.4KB

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