@zhangqingcq/vgce
Version:
Vector graphics configure editor. svg组态编辑器。基于vue3.3+ts+element-plus+vite
172 lines (170 loc) • 5.68 kB
text/typescript
import { objectDeepClone, randomString } from '@/utils'
import { useGlobalStore } from '../global'
import type { IDoneJson } from '../global/types'
import { EGlobalStoreIntention } from '../global/types'
import type { ContextMenuStoreState, EditPrivateStoreState } from './types'
import { EContextMenuInfoType } from './types'
import { useHistoryRecord } from '@/hooks'
/**
* 编辑器私有状态
*/
export const useEditPrivateStore = defineStore('edit-private-store', {
state: (): EditPrivateStoreState => {
return {
old_done_components: [], //记录预览之前的组件数据
history_doneComponent: [],
history_now_index: 0,
is_record_history: true, //是否需要记录当前状态,如果是操作的历史记录,则不需要记录
max_record_times: 10
}
},
getters: {
getTopBtnUndoStatus(state) {
return state.history_now_index >= 1
},
getTopBtnRedoStatus(state) {
return state.history_now_index + 1 != state.history_doneComponent.length
}
},
actions: {
topUndoBtnClick() {
if (this.history_now_index < 1) {
return
}
const global_store = useGlobalStore()
// select_component_info.value = {};
this.is_record_history = false
this.history_now_index -= 1
global_store.setDoneJson(this.history_doneComponent[this.history_now_index])
},
topRedoBtnClick() {
if (this.history_now_index + 1 == this.history_doneComponent.length) {
return
}
const global_store = useGlobalStore()
this.is_record_history = false
this.history_now_index += 1
global_store.setDoneJson(this.history_doneComponent[this.history_now_index])
}
}
})
export const useContextMenuStore = defineStore('context-menu-store', {
state: (): ContextMenuStoreState => {
return {
display: false,
info: {
[EContextMenuInfoType.Copy]: {
title: '复制',
hot_key: 'Ctrl + c',
enable: true
},
[EContextMenuInfoType.Delete]: {
title: '删除',
hot_key: 'Delete',
enable: true
},
[EContextMenuInfoType.MoveUpTopLevel]: {
title: '置于顶层',
hot_key: 'Ctrl + →',
enable: true
},
[EContextMenuInfoType.MoveDownTopLevel]: {
title: '置于底层',
hot_key: 'Ctrl + ←',
enable: true
},
[EContextMenuInfoType.MoveUpOneLevel]: {
title: '置于上一层',
hot_key: 'Ctrl + ↑',
enable: true
},
[EContextMenuInfoType.MoveDownOneLevel]: {
title: '置于下一层',
hot_key: 'Ctrl + ↓',
enable: true
}
}
}
},
actions: {
onContextMenuClick(type: keyof typeof EContextMenuInfoType) {
const globalStore = useGlobalStore()
if (!globalStore.handle_svg_info) {
return
}
globalStore.intention = EGlobalStoreIntention.Select
switch (type) {
case EContextMenuInfoType.Copy:
const temp_item = objectDeepClone<IDoneJson>(globalStore.handle_svg_info.info)
temp_item.id = randomString()
temp_item.title += '-copy'
temp_item.x += 10
temp_item.y += 10
globalStore.setDoneJson(temp_item)
this.display = false
globalStore.setHandleSvgInfo(temp_item, globalStore.done_json.length)
break
case EContextMenuInfoType.Delete:
globalStore.spliceDoneJson(globalStore.handle_svg_info.index)
this.display = false
globalStore.setHandleSvgInfo(null)
globalStore.intention = EGlobalStoreIntention.None
break
case EContextMenuInfoType.MoveUpOneLevel:
if (
globalStore.done_json.length === 1 ||
globalStore.handle_svg_info.index === globalStore.done_json.length - 1
) {
return
}
const temp_up_one = globalStore.handle_svg_info.info
globalStore.done_json[globalStore.handle_svg_info.index] =
globalStore.done_json[globalStore.handle_svg_info.index + 1]
globalStore.done_json[globalStore.handle_svg_info.index + 1] = temp_up_one
useHistoryRecord(globalStore.done_json)
this.display = false
globalStore.setHandleSvgInfo(temp_up_one, globalStore.handle_svg_info.index + 1)
break
case EContextMenuInfoType.MoveDownOneLevel:
if (globalStore.done_json.length === 1 || globalStore.handle_svg_info.index === 0) {
return
}
const temp_down_one = globalStore.handle_svg_info.info
globalStore.done_json[globalStore.handle_svg_info.index] =
globalStore.done_json[globalStore.handle_svg_info.index - 1]
globalStore.done_json[globalStore.handle_svg_info.index - 1] = temp_down_one
useHistoryRecord(globalStore.done_json)
this.display = false
globalStore.setHandleSvgInfo(temp_down_one, globalStore.handle_svg_info.index - 1)
break
case EContextMenuInfoType.MoveDownTopLevel:
if (globalStore.done_json.length === 1 || globalStore.handle_svg_info.index === 0) {
return
}
const temp_down_top = globalStore.handle_svg_info.info
globalStore.done_json.splice(globalStore.handle_svg_info.index, 1)
globalStore.done_json.unshift(temp_down_top)
useHistoryRecord(globalStore.done_json)
this.display = false
globalStore.setHandleSvgInfo(temp_down_top, 0)
break
case EContextMenuInfoType.MoveUpTopLevel:
if (
globalStore.done_json.length === 1 ||
globalStore.handle_svg_info.index === globalStore.done_json.length
) {
return
}
const temp_up_top = globalStore.handle_svg_info.info
globalStore.done_json.splice(globalStore.handle_svg_info.index, 1)
globalStore.done_json.push(temp_up_top)
useHistoryRecord(globalStore.done_json)
this.display = false
globalStore.setHandleSvgInfo(temp_up_top, globalStore.done_json.length - 1)
break
default:
break
}
}
}
})