MarkTool.vue 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. <template>
  2. <div class="mark-tool">
  3. <div>
  4. <div class="mark-tool-item" @click="toAllPage">
  5. <img src="@/assets/icons/icon-all-page.svg" />
  6. <p>全卷</p>
  7. </div>
  8. <div
  9. :class="[
  10. 'mark-tool-item',
  11. { 'is-active': store.setting.uiSetting['minimap.modal'] },
  12. ]"
  13. @click="toThumbnail"
  14. >
  15. <img src="@/assets/icons/icon-thumbnail.svg" />
  16. <p>缩略图</p>
  17. </div>
  18. <div class="mark-tool-item" @click="toIssuePaper">
  19. <img src="@/assets/icons/icon-issue-paper.svg" />
  20. <p>问题试卷</p>
  21. </div>
  22. <div class="mark-tool-item tool-scale">
  23. <div>
  24. <span>Aa</span>
  25. <a-slider
  26. v-model:value="store.setting.uiSetting['score.fontSize.scale']"
  27. :min="0.5"
  28. :step="0.1"
  29. :max="2"
  30. />
  31. </div>
  32. <p>分数/标记大小</p>
  33. </div>
  34. <div
  35. :class="[
  36. 'mark-tool-item',
  37. { 'is-active': store.setting.uiSetting['shortCut.modal'] },
  38. ]"
  39. @click="toShortcut"
  40. >
  41. <img src="@/assets/icons/icon-shortcut.svg" />
  42. <p>快捷键</p>
  43. </div>
  44. <div
  45. :class="[
  46. 'mark-tool-item',
  47. { 'is-active': store.setting.uiSetting['specialTag.modal'] },
  48. ]"
  49. @click="toSpecialTag"
  50. >
  51. <img src="@/assets/icons/icon-special-tag.svg" />
  52. <p>特殊标记</p>
  53. </div>
  54. </div>
  55. <div>
  56. <div class="mark-tool-item" @click="toAllZero">
  57. <img src="@/assets/icons/icon-all-zero.svg" />
  58. <p>全部零分</p>
  59. </div>
  60. <div
  61. :class="['mark-tool-item', { 'is-active': greaterThanOneScale }]"
  62. @click="toMagnify"
  63. >
  64. <img src="@/assets/icons/icon-magnify.svg" />
  65. <p>放大</p>
  66. </div>
  67. <div
  68. :class="['mark-tool-item', { 'is-active': lessThanOneScale }]"
  69. @click="toMinify"
  70. >
  71. <img src="@/assets/icons/icon-minify.svg" />
  72. <p>缩小</p>
  73. </div>
  74. <div class="mark-tool-item" @click="toOrigin">
  75. <img src="@/assets/icons/icon-origin-size.svg" />
  76. <p>实际大小</p>
  77. </div>
  78. </div>
  79. </div>
  80. <MarkProblemDialog ref="problemRef" />
  81. </template>
  82. <script setup lang="ts">
  83. import { computed, onMounted, onUnmounted } from "vue";
  84. import { store } from "@/store/store";
  85. import { Modal } from "ant-design-vue";
  86. import MarkProblemDialog from "./MarkProblemDialog.vue";
  87. type ShowModalFunc = () => void;
  88. const emit = defineEmits(["allZeroSubmit"]);
  89. let problemRef = $ref<InstanceType<typeof MarkProblemDialog>>();
  90. const toAllPage = () => {
  91. store.allPaperModal = !store.allPaperModal;
  92. };
  93. const toThumbnail = () => {
  94. store.setting.uiSetting["minimap.modal"] =
  95. !store.setting.uiSetting["minimap.modal"];
  96. };
  97. const toIssuePaper = () => {
  98. (problemRef.showModal as ShowModalFunc)();
  99. };
  100. const toShortcut = () => {
  101. store.setting.uiSetting["shortCut.modal"] =
  102. !store.setting.uiSetting["shortCut.modal"];
  103. };
  104. const toSpecialTag = () => {
  105. store.setting.uiSetting["specialTag.modal"] =
  106. !store.setting.uiSetting["specialTag.modal"];
  107. };
  108. const toAllZero = () => {
  109. Modal.confirm({
  110. title: "操作警告",
  111. content: "确定给全零分?",
  112. onOk() {
  113. emit("allZeroSubmit");
  114. },
  115. });
  116. };
  117. const toMagnify = () => {
  118. const s = store.setting.uiSetting["answer.paper.scale"];
  119. if (s < 3)
  120. store.setting.uiSetting["answer.paper.scale"] = +(s + 0.2).toFixed(1);
  121. };
  122. const toMinify = () => {
  123. const s = store.setting.uiSetting["answer.paper.scale"];
  124. if (s > 0.2)
  125. store.setting.uiSetting["answer.paper.scale"] = +(s - 0.2).toFixed(1);
  126. };
  127. const toOrigin = () => {
  128. store.setting.uiSetting["answer.paper.scale"] = 1;
  129. };
  130. const greaterThanOneScale = computed(() => {
  131. return store.setting.uiSetting["answer.paper.scale"] > 1;
  132. });
  133. const lessThanOneScale = computed(() => {
  134. return store.setting.uiSetting["answer.paper.scale"] < 1;
  135. });
  136. function keyListener(event: KeyboardEvent) {
  137. if (event.key === "+") {
  138. toMagnify();
  139. } else if (event.key === "-") {
  140. toMinify();
  141. }
  142. }
  143. onMounted(() => {
  144. document.addEventListener("keydown", keyListener);
  145. });
  146. onUnmounted(() => {
  147. document.removeEventListener("keydown", keyListener);
  148. });
  149. </script>