選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

hacks.ts 3.1KB

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