feat: 新增快捷键

Re-1.0
咬轮猫 3 years ago
parent 3bbfc19b7c
commit 5ffbf871ee

@ -2,6 +2,8 @@
<template> <template>
<div <div
class="canvas" class="canvas"
tabindex="0"
ref="canvasRef"
@drop="dropEvent" @drop="dropEvent"
@dragenter="dragEnterEvent" @dragenter="dragEnterEvent"
@dragover="dragOverEvent" @dragover="dragOverEvent"
@ -9,6 +11,7 @@
@mousemove="onCanvasMouseMove" @mousemove="onCanvasMouseMove"
@mouseup="onCanvasMouseUp" @mouseup="onCanvasMouseUp"
@contextmenu="onCanvasContextMenuEvent" @contextmenu="onCanvasContextMenuEvent"
@keydown="onHandleKeyDown"
> >
<svg <svg
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
@ -178,7 +181,7 @@
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { computed, getCurrentInstance, reactive, ref } from 'vue'; import { computed, getCurrentInstance, onMounted, reactive, ref } from 'vue';
import { useConfigStore } from '@/store/config'; import { useConfigStore } from '@/store/config';
import { useGlobalStore } from '@/store/global'; import { useGlobalStore } from '@/store/global';
import { import {
@ -212,7 +215,9 @@
import ConnectionLine from '@/components/webtopo-svg-edit/components/connection-line/index.vue'; import ConnectionLine from '@/components/webtopo-svg-edit/components/connection-line/index.vue';
import { IVisiableInfo } from './types'; import { IVisiableInfo } from './types';
import { ComponentImport } from '@/config-center'; import { ComponentImport } from '@/config-center';
import { useContextMenuStore } from '@/store/system'; import { useContextMenuStore, useEditPrivateStore } from '@/store/system';
import { EContextMenuInfoType } from '@/store/system/types';
import { useHistoryRecord } from '@/hooks';
// import HandlePanel from '../handle-panel/index.vue'; // import HandlePanel from '../handle-panel/index.vue';
// //
const instance = getCurrentInstance(); const instance = getCurrentInstance();
@ -224,8 +229,10 @@
const globalStore = useGlobalStore(); const globalStore = useGlobalStore();
const configStore = useConfigStore(); const configStore = useConfigStore();
const svgEditLayoutStore = useSvgEditLayoutStore(); const svgEditLayoutStore = useSvgEditLayoutStore();
const editPrivateStore = useEditPrivateStore();
const contextMenuStore = useContextMenuStore(); const contextMenuStore = useContextMenuStore();
const contextMenuRef = ref<HTMLElement>(); const contextMenuRef = ref<HTMLElement>();
const canvasRef = ref<HTMLElement>();
const cursor_style = computed(() => const cursor_style = computed(() =>
globalStore.intention == EGlobalStoreIntention.MoveCanvas globalStore.intention == EGlobalStoreIntention.MoveCanvas
? 'grab' ? 'grab'
@ -312,6 +319,7 @@
globalStore.setDoneJson(done_item_json); globalStore.setDoneJson(done_item_json);
globalStore.intention = EGlobalStoreIntention.None; globalStore.intention = EGlobalStoreIntention.None;
} }
canvasRef.value?.focus();
}; };
const dragEnterEvent = (e: DragEvent) => { const dragEnterEvent = (e: DragEvent) => {
//dragenterdragover drop //dragenterdragover drop
@ -322,6 +330,7 @@
e.preventDefault(); e.preventDefault();
}; };
const onSvgMouseDown = (select_item: IDoneJson, index: number, e: MouseEvent) => { const onSvgMouseDown = (select_item: IDoneJson, index: number, e: MouseEvent) => {
canvasRef.value?.focus();
if (globalStore.intention === EGlobalStoreIntention.Connection) { if (globalStore.intention === EGlobalStoreIntention.Connection) {
return; return;
} }
@ -726,12 +735,71 @@
height: actual_bound.height * scale_y height: actual_bound.height * scale_y
}; };
}; };
const onHandleKeyDown = (e: KeyboardEvent) => {
console.log(e, 733);
e.preventDefault();
if (globalStore.handle_svg_info && !e.ctrlKey && e.key == 'ArrowUp') {
globalStore.done_json[globalStore.handle_svg_info.index].y -= 1;
useHistoryRecord(globalStore.done_json);
} else if (globalStore.handle_svg_info && !e.ctrlKey && e.key == 'ArrowDown') {
globalStore.handle_svg_info.info.y += 1;
useHistoryRecord(globalStore.done_json);
} else if (globalStore.handle_svg_info && !e.ctrlKey && e.key == 'ArrowLeft') {
globalStore.handle_svg_info.info.x -= 1;
useHistoryRecord(globalStore.done_json);
} else if (globalStore.handle_svg_info && !e.ctrlKey && e.key == 'ArrowRight') {
globalStore.handle_svg_info.info.x += 1;
useHistoryRecord(globalStore.done_json);
}
//ctrl c
else if (e.ctrlKey && e.key.toLowerCase() == 'c') {
contextMenuStore.onContextMenuClick(EContextMenuInfoType.Copy);
}
//deleted
else if (!e.ctrlKey && e.key == 'Delete') {
contextMenuStore.onContextMenuClick(EContextMenuInfoType.Delete);
}
//
else if (e.ctrlKey && e.key == 'ArrowUp') {
contextMenuStore.onContextMenuClick(EContextMenuInfoType.MoveUpOneLevel);
}
//
else if (e.ctrlKey && e.key == 'ArrowDown') {
contextMenuStore.onContextMenuClick(EContextMenuInfoType.MoveDownOneLevel);
}
//
else if (e.ctrlKey && e.key == 'ArrowLeft') {
contextMenuStore.onContextMenuClick(EContextMenuInfoType.MoveDownTopLevel);
}
//
else if (e.ctrlKey && e.key == 'ArrowRight') {
contextMenuStore.onContextMenuClick(EContextMenuInfoType.MoveUpTopLevel);
}
//ctrl+shift+z
else if (e.ctrlKey && e.shiftKey && e.key.toLowerCase() == 'z') {
editPrivateStore.topRedoBtnClick();
}
//ctrl+z
else if (e.ctrlKey && e.key.toLowerCase() == 'z') {
editPrivateStore.topUndoBtnClick();
}
//ctrl+delete
else if (e.ctrlKey && e.key.toLowerCase() == 'delete') {
globalStore.done_json.length <= 0 || globalStore.setDoneJson([]);
}
};
onMounted(() => {
canvasRef.value?.focus();
});
</script> </script>
<style lang="less" scoped> <style lang="less" scoped>
.canvas { .canvas {
width: 100%; width: 100%;
height: 100%; height: 100%;
cursor: v-bind('cursor_style'); cursor: v-bind('cursor_style');
&:focus-visible {
outline: 0px;
}
} }
.svg-item-none { .svg-item-none {

@ -18,7 +18,7 @@
<div class="flex justify-between" style="width: calc(100% - 440px)"> <div class="flex justify-between" style="width: calc(100% - 440px)">
<div class="flex items-center"> <div class="flex items-center">
<el-icon <el-icon
title="撤销" title="撤销 ctrl+z"
:size="20" :size="20"
:class="`${ :class="`${
editPrivateStore.getTopBtnUndoStatus ? 'icon-normal' : 'icon-disable' editPrivateStore.getTopBtnUndoStatus ? 'icon-normal' : 'icon-disable'
@ -28,7 +28,7 @@
<svg-analysis name="undo"></svg-analysis> <svg-analysis name="undo"></svg-analysis>
</el-icon> </el-icon>
<el-icon <el-icon
title="重做" title="重做 ctrl+shift+z"
:class="`${editPrivateStore.getTopBtnRedoStatus ? 'icon-normal' : 'icon-disable'} ml-5px`" :class="`${editPrivateStore.getTopBtnRedoStatus ? 'icon-normal' : 'icon-disable'} ml-5px`"
:size="20" :size="20"
@click="() => editPrivateStore.topRedoBtnClick()" @click="() => editPrivateStore.topRedoBtnClick()"
@ -37,7 +37,7 @@
</el-icon> </el-icon>
<el-divider direction="vertical"></el-divider> <el-divider direction="vertical"></el-divider>
<el-icon <el-icon
title="清空" title="清空 ctrl+delete"
:class="`${globalStore.done_json.length > 0 ? 'icon-normal' : 'icon-disable'}`" :class="`${globalStore.done_json.length > 0 ? 'icon-normal' : 'icon-disable'}`"
:size="20" :size="20"
@click="onDeleteBtnClick" @click="onDeleteBtnClick"

@ -1,7 +1,7 @@
import { objectDeepClone, randomString } from '@/utils'; import { objectDeepClone, randomString } from '@/utils';
import { defineStore } from 'pinia'; import { defineStore } from 'pinia';
import { useGlobalStore } from '../global'; import { useGlobalStore } from '../global';
import { IDoneJson } from '../global/types'; import { EGlobalStoreIntention, IDoneJson } from '../global/types';
import { ContextMenuStoreState, EContextMenuInfoType, EditPrivateStoreState } from './types'; import { ContextMenuStoreState, EContextMenuInfoType, EditPrivateStoreState } from './types';
import { useHistoryRecord } from '@/hooks'; import { useHistoryRecord } from '@/hooks';
/** /**
@ -99,6 +99,7 @@ export const useContextMenuStore = defineStore('context-menu-store', {
if (!globalStore.handle_svg_info) { if (!globalStore.handle_svg_info) {
return; return;
} }
globalStore.intention = EGlobalStoreIntention.Select;
switch (type) { switch (type) {
case EContextMenuInfoType.Copy: case EContextMenuInfoType.Copy:
const temp_item = objectDeepClone<IDoneJson>(globalStore.handle_svg_info.info); const temp_item = objectDeepClone<IDoneJson>(globalStore.handle_svg_info.info);
@ -108,10 +109,12 @@ export const useContextMenuStore = defineStore('context-menu-store', {
temp_item.y += 10; temp_item.y += 10;
globalStore.setDoneJson(temp_item); globalStore.setDoneJson(temp_item);
this.display = false; this.display = false;
globalStore.setHandleSvgInfo(temp_item, globalStore.done_json.length);
break; break;
case EContextMenuInfoType.Delete: case EContextMenuInfoType.Delete:
globalStore.spliceDoneJson(globalStore.handle_svg_info.index); globalStore.spliceDoneJson(globalStore.handle_svg_info.index);
this.display = false; this.display = false;
globalStore.setHandleSvgInfo(null);
break; break;
case EContextMenuInfoType.MoveUpOneLevel: case EContextMenuInfoType.MoveUpOneLevel:
if ( if (
@ -126,6 +129,7 @@ export const useContextMenuStore = defineStore('context-menu-store', {
globalStore.done_json[globalStore.handle_svg_info.index + 1] = temp_up_one; globalStore.done_json[globalStore.handle_svg_info.index + 1] = temp_up_one;
useHistoryRecord(globalStore.done_json); useHistoryRecord(globalStore.done_json);
this.display = false; this.display = false;
globalStore.setHandleSvgInfo(temp_up_one, globalStore.handle_svg_info.index + 1);
break; break;
case EContextMenuInfoType.MoveDownOneLevel: case EContextMenuInfoType.MoveDownOneLevel:
if (globalStore.done_json.length === 1 || globalStore.handle_svg_info.index === 0) { if (globalStore.done_json.length === 1 || globalStore.handle_svg_info.index === 0) {
@ -137,16 +141,18 @@ export const useContextMenuStore = defineStore('context-menu-store', {
globalStore.done_json[globalStore.handle_svg_info.index - 1] = temp_down_one; globalStore.done_json[globalStore.handle_svg_info.index - 1] = temp_down_one;
useHistoryRecord(globalStore.done_json); useHistoryRecord(globalStore.done_json);
this.display = false; this.display = false;
globalStore.setHandleSvgInfo(temp_down_one, globalStore.handle_svg_info.index - 1);
break; break;
case EContextMenuInfoType.MoveDownTopLevel: case EContextMenuInfoType.MoveDownTopLevel:
if (globalStore.done_json.length === 1 || globalStore.handle_svg_info.index === 0) { if (globalStore.done_json.length === 1 || globalStore.handle_svg_info.index === 0) {
return; return;
} }
const temp_up_top = globalStore.handle_svg_info.info; const temp_down_top = globalStore.handle_svg_info.info;
globalStore.done_json.splice(globalStore.handle_svg_info.index, 1); globalStore.done_json.splice(globalStore.handle_svg_info.index, 1);
globalStore.done_json.unshift(temp_up_top); globalStore.done_json.unshift(temp_down_top);
useHistoryRecord(globalStore.done_json); useHistoryRecord(globalStore.done_json);
this.display = false; this.display = false;
globalStore.setHandleSvgInfo(temp_down_top, 0);
break; break;
case EContextMenuInfoType.MoveUpTopLevel: case EContextMenuInfoType.MoveUpTopLevel:
if ( if (
@ -155,11 +161,12 @@ export const useContextMenuStore = defineStore('context-menu-store', {
) { ) {
return; return;
} }
const temp_down_top = globalStore.handle_svg_info.info; const temp_up_top = globalStore.handle_svg_info.info;
globalStore.done_json.splice(globalStore.handle_svg_info.index, 1); globalStore.done_json.splice(globalStore.handle_svg_info.index, 1);
globalStore.done_json.push(temp_down_top); globalStore.done_json.push(temp_up_top);
useHistoryRecord(globalStore.done_json); useHistoryRecord(globalStore.done_json);
this.display = false; this.display = false;
globalStore.setHandleSvgInfo(temp_up_top, globalStore.done_json.length - 1);
break; break;
default: default:
break; break;

@ -26,3 +26,18 @@ export enum EContextMenuInfoType {
MoveUpTopLevel = 'MoveUpTopLevel', MoveUpTopLevel = 'MoveUpTopLevel',
MoveDownTopLevel = 'MoveDownTopLevel' MoveDownTopLevel = 'MoveDownTopLevel'
} }
export enum EShortcutKeyType {
Copy = 'Copy',
Delete = 'Delete',
MoveUpOneLevel = 'MoveUpOneLevel',
MoveDownOneLevel = 'MoveDownOneLevel',
MoveUpTopLevel = 'MoveUpTopLevel',
MoveDownTopLevel = 'MoveDownTopLevel',
Redo = 'Redo',
Undo = 'Undo',
MoveUp = 'MoveUp',
MoveDown = 'MoveDown',
MoveLeft = 'MoveLeft',
MoveRight = 'MoveRight'
}

Loading…
Cancel
Save