| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238 |
- <template>
- <div class="editor">
- <EditorHeader class="layout-header" />
- <div class="layout-content">
- <Thumbnails class="layout-content-left" />
- <div class="layout-content-center">
- <CanvasTool class="center-top" />
- <Canvas class="center-body" />
- </div>
- <Toolbar class="layout-content-right" />
- </div>
- </div>
- </template>
- <script lang="ts">
- import { computed, defineComponent, onMounted, onUnmounted, ref } from 'vue'
- import { useStore } from 'vuex'
- import { State } from '@/store/state'
- import { KEYCODE } from '@/configs/keyCode'
- import { decrypt } from '@/utils/index'
- import { message } from 'ant-design-vue'
- import EditorHeader from './EditorHeader/index.vue'
- import Canvas from './Canvas/index.vue'
- import CanvasTool from './CanvasTool/index.vue'
- import Thumbnails from './Thumbnails/index.vue'
- import Toolbar from './Toolbar/index.vue'
- export default defineComponent({
- name: 'editor',
- components: {
- EditorHeader,
- Canvas,
- CanvasTool,
- Thumbnails,
- Toolbar,
- },
- setup() {
- const ctrlKeyDown = ref(false)
- const shiftKeyDown = ref(false)
- const store = useStore<State>()
- const editorAreaFocus = computed(() => store.state.editorAreaFocus)
- const thumbnailsFocus = computed(() => store.state.thumbnailsFocus)
- const disableHotkeys = computed(() => store.state.disableHotkeys)
- const copy = () => {
- message.success('copy')
- }
- const cut = () => {
- message.success('cut')
- }
- const undo = () => {
- message.success('undo')
- }
- const redo = () => {
- message.success('redo')
- }
- const selectAll = () => {
- message.success('selectAll')
- }
- const lock = () => {
- message.success('lock')
- }
- const combine = () => {
- message.success('combine')
- }
- const uncombine = () => {
- message.success('uncombine')
- }
- const remove = () => {
- message.success('remove')
- }
- const move = (key: number) => {
- message.success(`move: ${key}`)
- }
- const create = () => {
- message.success('create')
- }
- const keydownListener = (e: KeyboardEvent) => {
- const { keyCode, ctrlKey, shiftKey } = e
- if(ctrlKey && !ctrlKeyDown.value) ctrlKeyDown.value = true
- if(shiftKey && !shiftKeyDown.value) shiftKeyDown.value = true
-
- if(!editorAreaFocus.value && !thumbnailsFocus.value) return
- if(ctrlKey && keyCode === KEYCODE.C) {
- e.preventDefault()
- copy()
- }
- if(ctrlKey && keyCode === KEYCODE.X) {
- e.preventDefault()
- cut()
- }
- if(ctrlKey && keyCode === KEYCODE.Z) {
- e.preventDefault()
- undo()
- }
- if(ctrlKey && keyCode === KEYCODE.Y) {
- e.preventDefault()
- redo()
- }
- if(ctrlKey && keyCode === KEYCODE.A) {
- e.preventDefault()
- selectAll()
- }
- if(ctrlKey && keyCode === KEYCODE.L) {
- e.preventDefault()
- lock()
- }
- if(!shiftKey && ctrlKey && keyCode === KEYCODE.G) {
- e.preventDefault()
- combine()
- }
- if(shiftKey && ctrlKey && keyCode === KEYCODE.G) {
- e.preventDefault()
- uncombine()
- }
- if(keyCode === KEYCODE.DELETE) {
- e.preventDefault()
- remove()
- }
- if(keyCode === KEYCODE.UP) {
- e.preventDefault()
- move(KEYCODE.UP)
- }
- if(keyCode === KEYCODE.DOWN) {
- e.preventDefault()
- move(KEYCODE.DOWN)
- }
- if(keyCode === KEYCODE.LEFT) {
- e.preventDefault()
- move(KEYCODE.LEFT)
- }
- if(keyCode === KEYCODE.RIGHT) {
- e.preventDefault()
- move(KEYCODE.RIGHT)
- }
- if(keyCode === KEYCODE.ENTER) {
- e.preventDefault()
- create()
- }
- }
-
- const keyupListener = () => {
- if(ctrlKeyDown.value) ctrlKeyDown.value = false
- if(shiftKeyDown.value) shiftKeyDown.value = false
- }
- const pasteImageFile = (imageFile: File) => {
- console.log(imageFile)
- }
- const pasteText = (text: string) => {
- let content
- try {
- content = JSON.parse(decrypt(text))
- }
- catch {
- content = text
- }
- console.log(content)
- }
- const pasteListener = (e: ClipboardEvent) => {
- if(!editorAreaFocus.value && !thumbnailsFocus.value) return
- if(disableHotkeys.value) return
- if(!e.clipboardData) return
- const clipboardDataItems = e.clipboardData.items
- const clipboardDataFirstItem = clipboardDataItems[0]
- if(!clipboardDataFirstItem) return
- for(const item of clipboardDataItems) {
- if(item.kind === 'file' && item.type.indexOf('image') !== -1) {
- const imageFile = item.getAsFile()
- if(imageFile) pasteImageFile(imageFile)
- return
- }
- }
- if( clipboardDataFirstItem.kind === 'string' && clipboardDataFirstItem.type === 'text/plain' ) {
- clipboardDataFirstItem.getAsString(text => pasteText(text))
- }
- }
- onMounted(() => {
- document.addEventListener('keydown', keydownListener)
- document.addEventListener('keyup', keyupListener)
- window.addEventListener('blur', keyupListener)
- document.addEventListener('paste', pasteListener)
- })
- onUnmounted(() => {
- document.removeEventListener('keydown', keydownListener)
- document.removeEventListener('keyup', keyupListener)
- window.removeEventListener('blur', keyupListener)
- document.removeEventListener('paste', pasteListener)
- })
- },
- })
- </script>
- <style lang="scss" scoped>
- .editor {
- height: 100%;
- }
- .layout-header {
- height: 40px;
- }
- .layout-content {
- height: calc(100% - 40px);
- display: flex;
- }
- .layout-content-left {
- width: 160px;
- height: 100%;
- flex-shrink: 0;
- }
- .layout-content-center {
- width: calc(100% - 160px - 260px);
- .center-top {
- height: 40px;
- }
- .center-body {
- height: calc(100% - 40px);
- }
- }
- .layout-content-right {
- width: 260px;
- height: 100%;
- }
- </style>
|