import eventBus from '@/utils/eventBus'
import { dvMainStoreWithOut } from '@/store/modules/data-visualization/dvMain'
import { snapshotStoreWithOut } from '@/store/modules/data-visualization/snapshot'
import { copyStoreWithOut } from '@/store/modules/data-visualization/copy'
import { composeStoreWithOut } from '@/store/modules/data-visualization/compose'
import { lockStoreWithOut } from '@/store/modules/data-visualization/lock'
import { storeToRefs } from 'pinia'
import { getCurInfo } from '@/store/modules/data-visualization/common'
import { isGroupCanvas, isTabCanvas } from '@/utils/canvasUtils'
import { groupStyleRevert } from '@/utils/style'
const dvMainStore = dvMainStoreWithOut()
const composeStore = composeStoreWithOut()
const snapshotStore = snapshotStoreWithOut()
const copyStore = copyStoreWithOut()
const lockStore = lockStoreWithOut()
const { curComponent, editMode } = storeToRefs(dvMainStore)
const { areaData } = storeToRefs(composeStore)
const ctrlKey = 17,
shiftKey = 16,
commandKey = 91,
leftKey = 37,
upKey = 38,
rightKey = 39,
downKey = 40,
vKey = 86,
cKey = 67,
xKey = 88,
yKey = 89,
zKey = 90,
gKey = 71,
bKey = 66,
lKey = 76,
uKey = 85,
sKey = 83,
pKey = 80,
dKey = 68,
deleteKey = 46,
macDeleteKey = 8,
eKey = 69,
spaceKey = 32
export const keycodes = [8, 37, 38, 39, 40, 66, 67, 68, 69, 71, 76, 80, 83, 85, 86, 88, 89, 90]
const basemap = {
[vKey]: paste,
[yKey]: redo,
[zKey]: undo,
[sKey]: save,
[pKey]: preview,
[eKey]: clearCanvas
}
const positionMoveKey = {
[leftKey]: move,
[upKey]: move,
[rightKey]: move,
[downKey]: move
}
const lockMap = {
...basemap,
[uKey]: unlock
}
const unlockMap = {
...basemap,
[cKey]: copy,
[xKey]: cut,
[gKey]: compose,
[bKey]: decompose,
[dKey]: deleteComponent,
[deleteKey]: deleteComponent,
[lKey]: lock
}
const checkDialog = () => {
let haveDialog = false
document.querySelectorAll('.ed-overlay').forEach(element => {
if (window.getComputedStyle(element).getPropertyValue('display') != 'none') {
haveDialog = true
}
})
document.querySelectorAll('.ed-popper').forEach(element => {
if (
!element.classList?.contains('template-popper-tips') &&
window.getComputedStyle(element).getPropertyValue('display') != 'none'
) {
haveDialog = true
}
})
if (document.querySelector('.tox-dialog-wrap')) {
haveDialog = true
}
return haveDialog
}
let isCtrlOrCommandDown = false
let isShiftDown = false
export function listenGlobalKeyDown() {
window.onkeydown = e => {
if (editMode.value === 'preview' || checkDialog()) return
const { keyCode } = e
if (positionMoveKey[keyCode] && curComponent.value) {
positionMoveKey[keyCode](keyCode)
e.preventDefault()
e.stopPropagation()
} else if (keyCode === shiftKey) {
isShiftDown = true
composeStore.setIsShiftDownStatus(true)
releaseKeyCheck('shift')
} else if (keyCode === ctrlKey || keyCode === commandKey) {
isCtrlOrCommandDown = true
composeStore.setIsCtrlOrCmdDownStatus(true)
releaseKeyCheck('ctrl')
} else if (keyCode === spaceKey) {
composeStore.setSpaceDownStatus(true)
e.preventDefault()
e.stopPropagation()
} else if ((keyCode == deleteKey || keyCode == macDeleteKey) && curComponent.value) {
deleteComponent()
} else if (isCtrlOrCommandDown) {
if (unlockMap[keyCode] && (!curComponent.value || !curComponent.value.isLock)) {
e.preventDefault()
unlockMap[keyCode]()
} else if (lockMap[keyCode] && curComponent.value && curComponent.value.isLock) {
e.preventDefault()
lockMap[keyCode]()
}
}
}
window.onkeyup = e => {
if (e.keyCode === ctrlKey || e.keyCode === commandKey) {
isCtrlOrCommandDown = false
composeStore.setIsCtrlOrCmdDownStatus(false)
} else if (e.keyCode === shiftKey) {
isShiftDown = true
composeStore.setIsShiftDownStatus(false)
} else if (e.keyCode === spaceKey) {
composeStore.setSpaceDownStatus(false)
e.preventDefault()
e.stopPropagation()
}
}
window.onmousedown = () => {
dvMainStore.setInEditorStatus(false)
}
}
export function releaseAttachKey() {
isCtrlOrCommandDown = false
composeStore.setIsCtrlOrCmdDownStatus(false)
isShiftDown = false
composeStore.setIsShiftDownStatus(false)
}
function releaseKeyCheck(keyType) {
if (keyType === 'shift' && isCtrlOrCommandDown) {
isCtrlOrCommandDown = false
composeStore.setIsCtrlOrCmdDownStatus(false)
} else if (keyType === 'ctrl' && isShiftDown) {
isShiftDown = false
composeStore.setIsShiftDownStatus(false)
}
}
function copy() {
copyStore.copy()
}
function paste() {
copyStore.paste(false)
snapshotStore.recordSnapshotCache('key-paste')
}
function move(keyCode) {
if (curComponent.value) {
const scale = dvMainStore.canvasStyleData.scale / 100
if (keyCode === leftKey) {
curComponent.value.style.left = curComponent.value.style.left - scale
groupAreaAdaptor(-scale, 0)
} else if (keyCode === rightKey) {
curComponent.value.style.left = curComponent.value.style.left + scale
groupAreaAdaptor(scale, 0)
} else if (keyCode === upKey) {
curComponent.value.style.top = curComponent.value.style.top - scale
groupAreaAdaptor(0, -scale)
} else if (keyCode === downKey) {
curComponent.value.style.top = curComponent.value.style.top + scale
groupAreaAdaptor(0, scale)
}
snapshotStore.recordSnapshotCache('key-move')
}
}
function groupAreaAdaptor(leftOffset = 0, topOffset = 0) {
const canvasId = curComponent.value.canvasId
const parentNode = document.querySelector('#editor-' + canvasId)
if (isGroupCanvas(canvasId) || isTabCanvas(canvasId)) {
groupStyleRevert(curComponent.value, {
width: parentNode.offsetWidth,
height: parentNode.offsetHeight
})
} else if (curComponent.value.component === 'GroupArea' && areaData.value.components.length > 0) {
areaData.value.components.forEach(component => {
component.style.top = component.style.top + topOffset
component.style.left = component.style.left + leftOffset
})
}
}
function cut() {
copyStore.cut()
}
function redo() {
snapshotStore.redo()
}
function undo() {
snapshotStore.undo()
}
function compose() {
if (areaData.value.components.length) {
composeStore.compose()
snapshotStore.recordSnapshotCache('key-compose')
}
}
function decompose() {
const curComponentLink = curComponent.value
if (curComponentLink && !curComponentLink.isLock && curComponentLink.component == 'Group') {
composeStore.decompose()
snapshotStore.recordSnapshotCache('key-decompose')
}
}
function save() {
eventBus.emit('save')
}
function preview() {
eventBus.emit('preview')
}
function deleteComponent() {
if (curComponent.value && curComponent.value.component !== 'GroupArea') {
const curInfo = getCurInfo()
if (curInfo) {
dvMainStore.deleteComponent(curInfo.index, curInfo.componentData)
}
} else if (areaData.value.components.length) {
areaData.value.components.forEach(component => {
dvMainStore.deleteComponentById(component.id)
})
eventBus.emit('hideArea-canvas-main')
}
snapshotStore.recordSnapshotCache('listenGlobalKeyDown')
}
function clearCanvas() {
eventBus.emit('clearCanvas')
}
function lock() {
lockStore.lock()
}
function unlock() {
lockStore.unlock()
}