mirror of
https://github.com/palxiao/poster-design.git
synced 2025-06-08 03:19:59 +08:00
201 lines
5.3 KiB
Vue
201 lines
5.3 KiB
Vue
<template>
|
|
<div v-show="showMenuBg" id="menu-bg" class="menu-bg" @click="closeMenu">
|
|
<ul ref="menuList" class="menu-list" :style="styleObj">
|
|
<li
|
|
v-for="(item, index) in menuListData.list"
|
|
:key="index"
|
|
:class="{ 'menu-item': true, 'disable-menu': dCopyElement.length === 0 && item.type === 'paste' }"
|
|
@click.stop="selectMenu(item.type)"
|
|
>
|
|
{{ item.text }}
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</template>
|
|
|
|
<script lang="ts" setup>
|
|
import { computed, onMounted, ref } from 'vue'
|
|
// import { useStore } from 'vuex'
|
|
import {
|
|
widgetMenu as widget,
|
|
pageMenu as page,
|
|
menuList as menu,
|
|
TMenuItemData, TWidgetItemData,
|
|
} from './rcMenuData'
|
|
import { getTarget } from '@/common/methods/target'
|
|
// import { useSetupMapGetters } from '@/common/hooks/mapGetters';
|
|
import { storeToRefs } from 'pinia';
|
|
import { useControlStore, useWidgetStore } from '@/store';
|
|
|
|
// const store = useStore()
|
|
const menuListData = ref<TMenuItemData>({...menu})
|
|
const showMenuBg = ref<boolean>(false)
|
|
const widgetMenu = ref<TWidgetItemData[]>({...widget})
|
|
const pageMenu = ref<TWidgetItemData[]>({...page})
|
|
|
|
const widgetStore = useWidgetStore()
|
|
// const {dActiveElement, dWidgets, dCopyElement} = useSetupMapGetters(['dActiveElement', 'dWidgets', 'dCopyElement'])
|
|
|
|
const {dActiveElement, dWidgets, dCopyElement} = storeToRefs(widgetStore)
|
|
const { dAltDown } = storeToRefs(useControlStore())
|
|
|
|
|
|
const styleObj = computed(() => {
|
|
return {
|
|
left: menuListData.value.left + 'px',
|
|
top: menuListData.value.top + 'px',
|
|
}
|
|
})
|
|
|
|
onMounted(() => {
|
|
document.oncontextmenu = mouseRightClick
|
|
})
|
|
async function mouseRightClick(e: MouseEvent) {
|
|
e.stopPropagation()
|
|
e.preventDefault()
|
|
if (showMenuBg.value) {
|
|
showMenuBg.value = false
|
|
return
|
|
}
|
|
if (!e.target) return
|
|
let target = await getTarget(e.target as HTMLElement)
|
|
if (!target) return
|
|
let type = target.getAttribute('data-type')
|
|
if (type) {
|
|
let uuid = target.getAttribute('data-uuid') // 设置选中元素
|
|
|
|
if (uuid !== '-1' && !dAltDown.value) {
|
|
let widget = dWidgets.value.find((item: any) => item.uuid === uuid)
|
|
if (
|
|
widget?.parent !== '-1' &&
|
|
widget?.parent !== dActiveElement.value?.uuid &&
|
|
widget?.parent !== dActiveElement.value?.parent
|
|
) {
|
|
uuid = widget?.parent || ""
|
|
}
|
|
}
|
|
widgetStore.selectWidget({
|
|
uuid: uuid ?? '-1',
|
|
})
|
|
// store.dispatch('selectWidget', {
|
|
// uuid: uuid ?? '-1',
|
|
// })
|
|
showMenu(e)
|
|
}
|
|
}
|
|
|
|
function showMenu(e: MouseEvent) {
|
|
let isPage = dActiveElement.value?.uuid === '-1'
|
|
menuListData.value.list = isPage ? pageMenu.value : widgetMenu.value
|
|
if (dActiveElement.value?.isContainer) {
|
|
let ungroup: TWidgetItemData[] = [
|
|
{
|
|
type: 'ungroup',
|
|
text: '取消组合',
|
|
},
|
|
]
|
|
menuListData.value.list = ungroup.concat(menuListData.value.list)
|
|
}
|
|
showMenuBg.value = true
|
|
// document.getElementById('menu-bg').addEventListener('click', this.closeMenu, false)
|
|
let mx = e.pageX
|
|
let my = e.pageY
|
|
let listWidth = 120
|
|
if (mx + listWidth > window.innerWidth) {
|
|
mx -= listWidth
|
|
}
|
|
let listHeight = (14 + 10) * menuListData.value.list.length + 10
|
|
if (my + listHeight > window.innerHeight) {
|
|
my -= listHeight
|
|
}
|
|
menuListData.value.left = mx
|
|
menuListData.value.top = my
|
|
}
|
|
|
|
function closeMenu() {
|
|
showMenuBg.value = false
|
|
}
|
|
|
|
/** 点击菜单触发事件 */
|
|
function selectMenu(type: TWidgetItemData['type']) {
|
|
switch (type) {
|
|
case 'copy':
|
|
widgetStore.copyWidget()
|
|
// store.dispatch('copyWidget')
|
|
break
|
|
case 'paste':
|
|
if (dCopyElement.value.length === 0) {
|
|
return
|
|
}
|
|
widgetStore.pasteWidget()
|
|
// store.dispatch('pasteWidget')
|
|
break
|
|
case 'index-up':
|
|
widgetStore.updateLayerIndex({
|
|
uuid: dActiveElement.value?.uuid || "",
|
|
value: 1,
|
|
isGroup: dActiveElement.value?.isContainer,
|
|
})
|
|
// store.dispatch('updateLayerIndex', {
|
|
// uuid: dActiveElement.value.uuid,
|
|
// value: 1,
|
|
// isGroup: dActiveElement.value.isContainer,
|
|
// })
|
|
break
|
|
case 'index-down':
|
|
widgetStore.updateLayerIndex({
|
|
uuid: dActiveElement.value?.uuid || "",
|
|
value: -1,
|
|
isGroup: dActiveElement.value?.isContainer,
|
|
})
|
|
// store.dispatch('updateLayerIndex', {
|
|
// uuid: dActiveElement.value.uuid,
|
|
// value: -1,
|
|
// isGroup: dActiveElement.value.isContainer,
|
|
// })
|
|
break
|
|
case 'del':
|
|
widgetStore.deleteWidget()
|
|
// store.dispatch('deleteWidget')
|
|
break
|
|
case 'ungroup':
|
|
widgetStore.ungroup(dActiveElement.value?.uuid || "")
|
|
// store.dispatch('ungroup', dActiveElement.value.uuid)
|
|
break
|
|
}
|
|
closeMenu()
|
|
}
|
|
|
|
</script>
|
|
|
|
<style lang="less" scoped>
|
|
.menu-bg {
|
|
height: 100%;
|
|
position: absolute;
|
|
width: 100%;
|
|
z-index: 99999;
|
|
.menu-list {
|
|
background-color: @color-white;
|
|
box-shadow: 1px 0px 10px 3px rgba(0, 0, 0, 0.1);
|
|
padding: 5px;
|
|
position: absolute;
|
|
width: 120px;
|
|
.menu-item {
|
|
cursor: pointer;
|
|
font-size: 14px;
|
|
line-height: 1;
|
|
padding: 5px 15px;
|
|
width: 100%;
|
|
&:hover {
|
|
background-color: #ececec;
|
|
}
|
|
}
|
|
.menu-item.disable-menu {
|
|
background-color: @color-white;
|
|
color: #aaaaaa;
|
|
cursor: not-allowed;
|
|
}
|
|
}
|
|
}
|
|
</style>
|