use-fingering.ts 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import { typeById, ITypeContentItem } from '/src/constant/fingering-colexiu'
  2. import { Fingering as IFingering } from '/src/music-sheet/fingering/types'
  3. import getTypes from '/src/music-sheet/fingering/types'
  4. import { formatFixedKey, getImageSize, useFingeringSrc } from '/src/music-sheet/fingering'
  5. import detailState from '/src/pages/detail/state'
  6. import runtime, * as RuntimeUtils from '/src/pages/detail/runtime'
  7. import { reactive, Ref, ref } from 'vue'
  8. import formatId from '../fingering/format-id'
  9. export type FingeringStatus = 'init' | 'show' | 'hidden'
  10. const fingeringWidth = ref(0)
  11. const fingeringStatus: Ref<FingeringStatus> = ref('hidden')
  12. const fingeringViewInfo = async (type: ITypeContentItem) => {
  13. // @ts-ignore
  14. const detail: ITypeContentItem = type
  15. // 该声部有指法情况
  16. if (detail) {
  17. const activeType: IFingering = await getTypes(detail.name)
  18. if (activeType) {
  19. const usedFixedKey = formatFixedKey(detail.name, detailState.fixedKey)
  20. const fullsrc = useFingeringSrc(activeType, detail.name, usedFixedKey.value)
  21. const { width, height } = await getImageSize(fullsrc.value)
  22. const containerHeight = document.getElementById('colexiu-detail-music-sheet')?.clientHeight || 0
  23. const w = runtime.evaluatingStatus ? 0 : width
  24. const scale = containerHeight / height
  25. fingeringWidth.value = containerHeight ? scale * w : w
  26. if (width) {
  27. fingeringStatus.value = 'show'
  28. }
  29. return reactive({
  30. width,
  31. height,
  32. scale,
  33. usedFixedKey: usedFixedKey.value,
  34. fullsrc: fullsrc.value,
  35. activeType,
  36. detail,
  37. })
  38. }
  39. } else {
  40. fingeringStatus.value = 'hidden'
  41. }
  42. }
  43. export const useFingering = async (code = '') => {
  44. const activeType = ref({})
  45. const detail = ref({})
  46. const res = await fingeringViewInfo(typeById[formatId(code)])
  47. activeType.value = res?.activeType || {}
  48. detail.value = res?.detail || {}
  49. return [fingeringStatus, fingeringWidth, activeType, detail]
  50. }