MarkDrawTrack.vue 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. <template>
  2. <template v-for="(track, index) in trackList" :key="index">
  3. <div class="score-container" :style="computeTopAndLeft(track)">
  4. <span class="m-auto">
  5. {{ track.score }}
  6. </span>
  7. </div>
  8. </template>
  9. </template>
  10. <script lang="ts">
  11. import { Track } from "@/types";
  12. import { defineComponent, PropType } from "vue";
  13. import { store } from "./store";
  14. export default defineComponent({
  15. name: "MarkDrawTrack",
  16. props: {
  17. trackList: {
  18. type: Array as PropType<Array<Track>>,
  19. },
  20. originalImage: {
  21. type: Object as PropType<HTMLImageElement>,
  22. },
  23. sliceImage: {
  24. type: Object as PropType<HTMLImageElement>,
  25. required: true,
  26. },
  27. dx: { type: Number, required: true },
  28. dy: { type: Number, required: true },
  29. },
  30. setup({ trackList, originalImage, sliceImage, dx, dy }) {
  31. const computeTopAndLeft = (track: Track) => {
  32. const topInsideSlice = track.offsetY - dy;
  33. const leftInsideSlice = track.offsetX - dx;
  34. // console.log({
  35. // topInsideSlice,
  36. // leftInsideSlice,
  37. // offx: track.offsetX,
  38. // offy: track.offsetY,
  39. // dx,
  40. // dy,
  41. // });
  42. return {
  43. top: (topInsideSlice / sliceImage.naturalHeight) * 100 + "%",
  44. left: (leftInsideSlice / sliceImage.naturalWidth) * 100 + "%",
  45. "font-size": store.setting.uiSetting["answer.paper.scale"] * 2.2 + "em",
  46. };
  47. };
  48. // const
  49. // const trackList: Array<Track> = reactive([]);
  50. // return { trackList };
  51. return { store, computeTopAndLeft };
  52. },
  53. });
  54. </script>
  55. <style scoped>
  56. .score-container {
  57. position: absolute;
  58. display: flex;
  59. place-content: center;
  60. color: red;
  61. /* to center score */
  62. width: 200px;
  63. height: 200px;
  64. margin-top: -100px;
  65. margin-left: -100px;
  66. /* to click through div */
  67. pointer-events: none;
  68. }
  69. </style>