use-viewer.ts 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. import { Viewer } from "../viewer.ts";
  2. import { computed, ref, watch, watchEffect } from "vue";
  3. import { dragListener, scaleListener } from "../../utils/event.ts";
  4. import {
  5. globalWatch,
  6. installGlobalVar,
  7. useStage,
  8. } from "./use-global-vars.ts";
  9. import { useCan } from './use-status'
  10. import { mergeFuns } from "../../utils/shared.ts";
  11. import { Transform } from "konva/lib/Util";
  12. import { lineLen } from "@/utils/math.ts";
  13. import { useResize } from "./use-event.ts";
  14. export const useViewer = installGlobalVar(() => {
  15. const stage = useStage();
  16. const viewer = new Viewer();
  17. const can = useCan()
  18. const size = useResize()
  19. const transform = ref(new Transform());
  20. const init = (dom: HTMLDivElement) => {
  21. const onDestroy = mergeFuns(
  22. dragListener(dom, {
  23. move: ({ end, prev }) => {
  24. if (can.viewMode) {
  25. viewer.movePixel({ x: end.x - prev.x, y: end.y - prev.y });
  26. }
  27. },
  28. notPrevent: true,
  29. }),
  30. scaleListener(dom, (info) => {
  31. if (can.viewMode) {
  32. viewer.scalePixel(info.center, info.scale);
  33. }
  34. }),
  35. watchEffect(() => {
  36. size.value && viewer.setSize(size.value)
  37. })
  38. )
  39. viewer.bus.on("transformChange", (newTransform) => {
  40. transform.value = newTransform;
  41. });
  42. transform.value = viewer.transform;
  43. return onDestroy;
  44. };
  45. return {
  46. var: {
  47. transform: transform,
  48. viewer,
  49. },
  50. onDestroy: globalWatch(
  51. () => can.viewMouseReact,
  52. (can, _, onCleanup) => {
  53. if (can) {
  54. const dom = stage.value!.getNode().container();
  55. onCleanup(init(dom));
  56. }
  57. },
  58. { immediate: true }
  59. ),
  60. };
  61. }, Symbol("viewer"));
  62. export const useViewerTransform = installGlobalVar(() => {
  63. const viewer = useViewer();
  64. return viewer.transform;
  65. }, Symbol("viewTransform"));
  66. export const useViewerTransformConfig = () => {
  67. const transform = useViewerTransform();
  68. return computed(() => transform.value.decompose());
  69. };
  70. export const useViewerInvertTransform = () => {
  71. const transform = useViewerTransform();
  72. return computed(() => transform.value.copy().invert());
  73. };
  74. export const useViewerInvertTransformConfig = () => {
  75. const transform = useViewerInvertTransform();
  76. return computed(() => transform.value.decompose());
  77. };
  78. export const useUnitTransform = installGlobalVar(() => {
  79. const transform = useViewerTransform();
  80. const invTransform = useViewerInvertTransform();
  81. return {
  82. getPixel(real: number) {
  83. return lineLen(
  84. invTransform.value.point({ x: real, y: 0 }),
  85. invTransform.value.point({ x: 0, y: 0 })
  86. );
  87. },
  88. getReal(pixel: number) {
  89. return lineLen(
  90. transform.value.point({ x: pixel, y: 0 }),
  91. transform.value.point({ x: 0, y: 0 })
  92. );
  93. },
  94. };
  95. }, Symbol("unitTransform"));
  96. export const useCacheUnitTransform = installGlobalVar(() => {
  97. const unitTransform = useUnitTransform();
  98. const transform = useViewerTransform();
  99. const invTransform = useViewerInvertTransform();
  100. let pixelCache: Record<string, number> = {};
  101. let realCache: Record<string, number> = {};
  102. watch(transform, () => {
  103. pixelCache = {};
  104. });
  105. watch(invTransform, () => {
  106. realCache = {};
  107. });
  108. return {
  109. getPixel(real: number) {
  110. if (real in pixelCache) {
  111. return pixelCache[real];
  112. } else {
  113. return (pixelCache[real] = unitTransform.getPixel(real));
  114. }
  115. },
  116. getReal(pixel: number) {
  117. if (pixel in realCache) {
  118. return realCache[pixel];
  119. } else {
  120. return (pixelCache[pixel] = unitTransform.getReal(pixel));
  121. }
  122. },
  123. };
  124. }, Symbol("cacheUnitTransform"));