useSelectElement.ts 3.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import { Ref, computed } from 'vue'
  2. import { useStore } from 'vuex'
  3. import uniq from 'lodash/uniq'
  4. import { State, MutationTypes } from '@/store'
  5. import { PPTElement } from '@/types/slides'
  6. export default (
  7. elementList: Ref<PPTElement[]>,
  8. activeGroupElementId: Ref<string>,
  9. moveElement: (e: MouseEvent, element: PPTElement) => void,
  10. ) => {
  11. const store = useStore<State>()
  12. const activeElementIdList = computed(() => store.state.activeElementIdList)
  13. const handleElementId = computed(() => store.state.handleElementId)
  14. const editorAreaFocus = computed(() => store.state.editorAreaFocus)
  15. const ctrlOrShiftKeyActive: Ref<boolean> = computed(() => store.getters.ctrlOrShiftKeyActive)
  16. const selectElement = (e: MouseEvent, element: PPTElement, canMove = true) => {
  17. if(!editorAreaFocus.value) store.commit(MutationTypes.SET_EDITORAREA_FOCUS, true)
  18. // 如果被点击的元素处于未激活状态,则将他设置为激活元素(单选),或者加入到激活元素中(多选)
  19. if(!activeElementIdList.value.includes(element.id)) {
  20. let newActiveIdList: string[] = []
  21. if(ctrlOrShiftKeyActive.value) {
  22. newActiveIdList = [...activeElementIdList.value, element.id]
  23. }
  24. else newActiveIdList = [element.id]
  25. // 同时如果该元素是分组成员,需要将和他同组的元素一起激活
  26. if(element.groupId) {
  27. const groupMembersId: string[] = []
  28. elementList.value.forEach((el: PPTElement) => {
  29. if(el.groupId === element.groupId) groupMembersId.push(el.id)
  30. })
  31. newActiveIdList = [...newActiveIdList, ...groupMembersId]
  32. }
  33. store.commit(MutationTypes.SET_ACTIVE_ELEMENT_ID_LIST, uniq(newActiveIdList))
  34. store.commit(MutationTypes.SET_HANDLE_ELEMENT_ID, element.id)
  35. }
  36. // 如果被点击的元素已激活,且按下了多选按钮,则取消其激活状态(除非该元素或分组是最后的一个激活元素)
  37. else if(ctrlOrShiftKeyActive.value) {
  38. let newActiveIdList: string[] = []
  39. // 同时如果该元素是分组成员,需要将和他同组的元素一起取消
  40. if(element.groupId) {
  41. const groupMembersId: string[] = []
  42. elementList.value.forEach((el: PPTElement) => {
  43. if(el.groupId === element.groupId) groupMembersId.push(el.id)
  44. })
  45. newActiveIdList = activeElementIdList.value.filter(id => !groupMembersId.includes(id))
  46. }
  47. else {
  48. newActiveIdList = activeElementIdList.value.filter(id => id !== element.id)
  49. }
  50. if(newActiveIdList.length > 0) {
  51. store.commit(MutationTypes.SET_ACTIVE_ELEMENT_ID_LIST, newActiveIdList)
  52. }
  53. }
  54. // 如果被点击的元素已激活,且没有按下多选按钮,且该元素不是当前操作元素,则将其设置为当前操作元素
  55. else if(handleElementId.value !== element.id) {
  56. store.commit(MutationTypes.SET_HANDLE_ELEMENT_ID, element.id)
  57. }
  58. else if(activeGroupElementId.value !== element.id && element.groupId) {
  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. }