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.

state.ts 2.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import { createSelectorHook, createState } from "@state-designer/react"
  2. import { clamp, screenToWorld } from "utils/utils"
  3. import * as vec from "utils/vec"
  4. import { Data, ShapeType } from "types"
  5. const initialData: Data = {
  6. camera: {
  7. point: [0, 0],
  8. zoom: 1,
  9. },
  10. currentPageId: "page0",
  11. document: {
  12. pages: {
  13. page0: {
  14. id: "page0",
  15. type: "page",
  16. name: "Page 0",
  17. childIndex: 0,
  18. shapes: {
  19. shape0: {
  20. id: "shape0",
  21. type: ShapeType.Circle,
  22. name: "Shape 0",
  23. parentId: "page0",
  24. childIndex: 1,
  25. point: [100, 100],
  26. radius: 50,
  27. rotation: 0,
  28. },
  29. shape1: {
  30. id: "shape1",
  31. type: ShapeType.Rectangle,
  32. name: "Shape 1",
  33. parentId: "page0",
  34. childIndex: 1,
  35. point: [300, 300],
  36. size: [200, 200],
  37. rotation: 0,
  38. },
  39. shape2: {
  40. id: "shape2",
  41. type: ShapeType.Circle,
  42. name: "Shape 2",
  43. parentId: "page0",
  44. childIndex: 2,
  45. point: [200, 800],
  46. radius: 25,
  47. rotation: 0,
  48. },
  49. },
  50. },
  51. },
  52. },
  53. }
  54. const state = createState({
  55. data: initialData,
  56. on: {
  57. ZOOMED_CAMERA: {
  58. do: "zoomCamera",
  59. },
  60. PANNED_CAMERA: {
  61. do: "panCamera",
  62. },
  63. },
  64. actions: {
  65. zoomCamera(data, payload: { delta: number; point: number[] }) {
  66. const { camera } = data
  67. const p0 = screenToWorld(payload.point, data)
  68. camera.zoom = clamp(
  69. camera.zoom - (payload.delta / 100) * camera.zoom,
  70. 0.5,
  71. 3
  72. )
  73. const p1 = screenToWorld(payload.point, data)
  74. camera.point = vec.add(camera.point, vec.sub(p1, p0))
  75. },
  76. panCamera(data, payload: { delta: number[]; point: number[] }) {
  77. const { camera } = data
  78. data.camera.point = vec.sub(
  79. camera.point,
  80. vec.div(payload.delta, camera.zoom)
  81. )
  82. },
  83. },
  84. })
  85. export default state
  86. export const useSelector = createSelectorHook(state)