useMarkHeader.ts 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. import { reactive, ref, computed, watch, toRefs, onMounted, onBeforeUnmount } from 'vue'
  2. import { useRouter, useRoute } from 'vue-router'
  3. import bus from '@/utils/bus'
  4. function getParentNodeIsScroll(el: any): any {
  5. if (el.className.includes('scroll-auto')) {
  6. return el
  7. } else {
  8. return getParentNodeIsScroll(el.parentNode)
  9. }
  10. }
  11. const useMarkHeader = () => {
  12. const { back, push } = useRouter()
  13. const imgOperation = reactive<{
  14. rotate: number
  15. scale: number
  16. center: boolean
  17. frontColor: string
  18. backgroundColor: string
  19. }>({
  20. rotate: 0,
  21. scale: 1,
  22. center: false,
  23. frontColor: 'transparent',
  24. backgroundColor: '#fff',
  25. })
  26. /** 返回 */
  27. const onBack = () => {
  28. back()
  29. }
  30. /** 放大/缩小 */
  31. const onScaleChange = (val: number) => {
  32. imgOperation.scale = val
  33. }
  34. /** 居中 */
  35. const onCenter = (center: boolean) => {
  36. imgOperation.center = center
  37. }
  38. /** 旋转 */
  39. const onRotate = (val: number) => {
  40. imgOperation.rotate = val
  41. }
  42. /** 设置前景色 */
  43. const setFrontColor = (val: string) => {
  44. imgOperation.frontColor = val
  45. }
  46. /** 设置背景色 */
  47. const setBackgroundColor = (val: string) => {
  48. imgOperation.backgroundColor = val
  49. }
  50. /** 查看样卷 */
  51. const onViewSample = () => {
  52. push({ name: 'MarkingViewSample' })
  53. }
  54. /** 查看评分标准 */
  55. const onViewStandard = () => {
  56. // push({ name: 'MarkStandard' })
  57. bus.emit('showStandard')
  58. }
  59. function markKeyBoardEvents(e: any) {
  60. if (e.key === 'F7') {
  61. e.preventDefault()
  62. bus.emit('scale-up')
  63. } else if (e.key === 'F8') {
  64. e.preventDefault()
  65. bus.emit('scale-down')
  66. } else if (e.key === 'F9') {
  67. e.preventDefault()
  68. bus.emit('init-scale')
  69. } else if (e.key === 'F10') {
  70. e.preventDefault()
  71. bus.emit('fast-send-msg')
  72. } else if (e.key === 'F12') {
  73. e.preventDefault()
  74. bus.emit('mark-method-toggle')
  75. } else if (e.code === 'Space' || e.key === 'ArrowUp' || e.key === 'ArrowDown') {
  76. if (e.target.tagName === 'INPUT' || (e.target.className || '').includes('contenteditable-ele')) {
  77. return false
  78. } else {
  79. const imgWrap = document.querySelector('.img-wrap')
  80. if (!imgWrap) {
  81. return
  82. } else {
  83. const pWrap = getParentNodeIsScroll(imgWrap)
  84. let t = (pWrap as any).scrollTop
  85. t += e.key === 'ArrowUp' ? -100 : 100
  86. pWrap.scrollTo({
  87. left: 0,
  88. top: t,
  89. behavior: 'smooth',
  90. })
  91. }
  92. }
  93. } else if (e.keyCode == 36) {
  94. const imgWrap = document.querySelector('.img-wrap')
  95. if (!imgWrap) {
  96. return
  97. } else {
  98. const pWrap = getParentNodeIsScroll(imgWrap)
  99. pWrap.scrollTo({
  100. left: 0,
  101. top: 0,
  102. behavior: 'smooth',
  103. })
  104. }
  105. } else if (e.keyCode == 35) {
  106. const imgWrap = document.querySelector('.img-wrap')
  107. if (!imgWrap) {
  108. return
  109. } else {
  110. const pWrap = getParentNodeIsScroll(imgWrap)
  111. pWrap.scrollTo({
  112. left: 0,
  113. top: pWrap.scrollHeight,
  114. behavior: 'smooth',
  115. })
  116. }
  117. } else if (e.key == 'Backspace') {
  118. if (e.target.tagName === 'INPUT' || (e.target.className || '').includes('contenteditable-ele')) {
  119. return false
  120. } else {
  121. bus.emit('mark-prev')
  122. }
  123. }
  124. }
  125. function paperDblClick(e: any) {
  126. if (typeof e.target.className === 'string' && (e.target.className || '').includes('paper-img')) {
  127. bus.emit('scale-up')
  128. }
  129. }
  130. onMounted(() => {
  131. const route = useRoute()
  132. if (route.path === '/marking/mark') {
  133. document.addEventListener('keydown', markKeyBoardEvents)
  134. document.addEventListener('dblclick', paperDblClick)
  135. }
  136. })
  137. onBeforeUnmount(() => {
  138. const route = useRoute()
  139. if (route.path === '/marking/mark') {
  140. document.removeEventListener('keydown', markKeyBoardEvents)
  141. document.removeEventListener('dblclick', paperDblClick)
  142. }
  143. })
  144. return {
  145. ...toRefs(imgOperation),
  146. onBack,
  147. onScaleChange,
  148. onCenter,
  149. onRotate,
  150. setFrontColor,
  151. setBackgroundColor,
  152. onViewSample,
  153. onViewStandard,
  154. }
  155. }
  156. export default useMarkHeader