useSelectElement.ts 3.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import { Ref, computed } from 'vue'
  2. import uniq from 'lodash/uniq'
  3. import { MutationTypes, useStore } from '@/store'
  4. import { PPTElement } from '@/types/slides'
  5. export default (
  6. elementList: Ref<PPTElement[]>,
  7. activeGroupElementId: Ref<string>,
  8. moveElement: (e: MouseEvent, element: PPTElement) => void,
  9. ) => {
  10. const store = useStore()
  11. const activeElementIdList = computed(() => store.state.activeElementIdList)
  12. const handleElementId = computed(() => store.state.handleElementId)
  13. const editorAreaFocus = computed(() => store.state.editorAreaFocus)
  14. const ctrlOrShiftKeyActive = computed<boolean>(() => store.getters.ctrlOrShiftKeyActive)
  15. const selectElement = (e: MouseEvent, element: PPTElement, canMove = true) => {
  16. if(!editorAreaFocus.value) store.commit(MutationTypes.SET_EDITORAREA_FOCUS, true)
  17. // 如果被点击的元素处于未激活状态,则将他设置为激活元素(单选),或者加入到激活元素中(多选)
  18. if(!activeElementIdList.value.includes(element.id)) {
  19. let newActiveIdList: string[] = []
  20. if(ctrlOrShiftKeyActive.value) {
  21. newActiveIdList = [...activeElementIdList.value, element.id]
  22. }
  23. else newActiveIdList = [element.id]
  24. // 同时如果该元素是分组成员,需要将和他同组的元素一起激活
  25. if(element.groupId) {
  26. const groupMembersId: string[] = []
  27. elementList.value.forEach((el: PPTElement) => {
  28. if(el.groupId === element.groupId) groupMembersId.push(el.id)
  29. })
  30. newActiveIdList = [...newActiveIdList, ...groupMembersId]
  31. }
  32. store.commit(MutationTypes.SET_ACTIVE_ELEMENT_ID_LIST, uniq(newActiveIdList))
  33. store.commit(MutationTypes.SET_HANDLE_ELEMENT_ID, element.id)
  34. }
  35. // 如果被点击的元素已激活,且按下了多选按钮,则取消其激活状态(除非该元素或分组是最后的一个激活元素)
  36. else if(ctrlOrShiftKeyActive.value) {
  37. let newActiveIdList: string[] = []
  38. // 同时如果该元素是分组成员,需要将和他同组的元素一起取消
  39. if(element.groupId) {
  40. const groupMembersId: string[] = []
  41. elementList.value.forEach((el: PPTElement) => {
  42. if(el.groupId === element.groupId) groupMembersId.push(el.id)
  43. })
  44. newActiveIdList = activeElementIdList.value.filter(id => !groupMembersId.includes(id))
  45. }
  46. else {
  47. newActiveIdList = activeElementIdList.value.filter(id => id !== element.id)
  48. }
  49. if(newActiveIdList.length > 0) {
  50. store.commit(MutationTypes.SET_ACTIVE_ELEMENT_ID_LIST, newActiveIdList)
  51. }
  52. }
  53. // 如果被点击的元素已激活,且没有按下多选按钮,且该元素不是当前操作元素,则将其设置为当前操作元素
  54. else if(handleElementId.value !== element.id) {
  55. store.commit(MutationTypes.SET_HANDLE_ELEMENT_ID, element.id)
  56. }
  57. // 如果被点击的元素是当前操作元素,且没有按下多选按钮,则该元素下次保持该状态再次被点击时,将被设置为多选元素中的激活成员
  58. else if(activeGroupElementId.value !== element.id) {
  59. const startPageX = e.pageX
  60. const startPageY = e.pageY
  61. ;(e.target as HTMLElement).onmouseup = (e: MouseEvent) => {
  62. const currentPageX = e.pageX
  63. const currentPageY = e.pageY
  64. if(startPageX === currentPageX && startPageY === currentPageY) {
  65. activeGroupElementId.value = element.id
  66. ;(e.target as HTMLElement).onmouseup = null
  67. }
  68. }
  69. }
  70. if(canMove) moveElement(e, element)
  71. }
  72. const selectAllElement = () => {
  73. const unlockedElements = elementList.value.filter(el => !el.lock)
  74. const newActiveElementIdList = unlockedElements.map(el => el.id)
  75. store.commit(MutationTypes.SET_ACTIVE_ELEMENT_ID_LIST, newActiveElementIdList)
  76. }
  77. return {
  78. selectElement,
  79. selectAllElement,
  80. }
  81. }