index.vue 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. <template>
  2. <div class="editor">
  3. <EditorHeader class="layout-header" />
  4. <div class="layout-content">
  5. <Thumbnails class="layout-content-left" />
  6. <div class="layout-content-center">
  7. <CanvasTool class="center-top" />
  8. <Canvas class="center-body" />
  9. </div>
  10. <Toolbar class="layout-content-right" />
  11. </div>
  12. </div>
  13. </template>
  14. <script lang="ts">
  15. import { computed, defineComponent, onMounted, onUnmounted, ref } from 'vue'
  16. import { useStore } from 'vuex'
  17. import { State } from '@/store/state'
  18. import { KEYCODE } from '@/configs/keyCode'
  19. import { decrypt } from '@/utils/index'
  20. import { message } from 'ant-design-vue'
  21. import EditorHeader from './EditorHeader/index.vue'
  22. import Canvas from './Canvas/index.vue'
  23. import CanvasTool from './CanvasTool/index.vue'
  24. import Thumbnails from './Thumbnails/index.vue'
  25. import Toolbar from './Toolbar/index.vue'
  26. export default defineComponent({
  27. name: 'editor',
  28. components: {
  29. EditorHeader,
  30. Canvas,
  31. CanvasTool,
  32. Thumbnails,
  33. Toolbar,
  34. },
  35. setup() {
  36. const ctrlKeyDown = ref(false)
  37. const shiftKeyDown = ref(false)
  38. const store = useStore<State>()
  39. const editorAreaFocus = computed(() => store.state.editorAreaFocus)
  40. const thumbnailsFocus = computed(() => store.state.thumbnailsFocus)
  41. const disableHotkeys = computed(() => store.state.disableHotkeys)
  42. const copy = () => {
  43. message.success('copy')
  44. }
  45. const cut = () => {
  46. message.success('cut')
  47. }
  48. const undo = () => {
  49. message.success('undo')
  50. }
  51. const redo = () => {
  52. message.success('redo')
  53. }
  54. const selectAll = () => {
  55. message.success('selectAll')
  56. }
  57. const lock = () => {
  58. message.success('lock')
  59. }
  60. const combine = () => {
  61. message.success('combine')
  62. }
  63. const uncombine = () => {
  64. message.success('uncombine')
  65. }
  66. const remove = () => {
  67. message.success('remove')
  68. }
  69. const move = (key: number) => {
  70. message.success(`move: ${key}`)
  71. }
  72. const create = () => {
  73. message.success('create')
  74. }
  75. const keydownListener = (e: KeyboardEvent) => {
  76. const { keyCode, ctrlKey, shiftKey } = e
  77. if(ctrlKey && !ctrlKeyDown.value) ctrlKeyDown.value = true
  78. if(shiftKey && !shiftKeyDown.value) shiftKeyDown.value = true
  79. if(!editorAreaFocus.value && !thumbnailsFocus.value) return
  80. if(ctrlKey && keyCode === KEYCODE.C) {
  81. e.preventDefault()
  82. copy()
  83. }
  84. if(ctrlKey && keyCode === KEYCODE.X) {
  85. e.preventDefault()
  86. cut()
  87. }
  88. if(ctrlKey && keyCode === KEYCODE.Z) {
  89. e.preventDefault()
  90. undo()
  91. }
  92. if(ctrlKey && keyCode === KEYCODE.Y) {
  93. e.preventDefault()
  94. redo()
  95. }
  96. if(ctrlKey && keyCode === KEYCODE.A) {
  97. e.preventDefault()
  98. selectAll()
  99. }
  100. if(ctrlKey && keyCode === KEYCODE.L) {
  101. e.preventDefault()
  102. lock()
  103. }
  104. if(!shiftKey && ctrlKey && keyCode === KEYCODE.G) {
  105. e.preventDefault()
  106. combine()
  107. }
  108. if(shiftKey && ctrlKey && keyCode === KEYCODE.G) {
  109. e.preventDefault()
  110. uncombine()
  111. }
  112. if(keyCode === KEYCODE.DELETE) {
  113. e.preventDefault()
  114. remove()
  115. }
  116. if(keyCode === KEYCODE.UP) {
  117. e.preventDefault()
  118. move(KEYCODE.UP)
  119. }
  120. if(keyCode === KEYCODE.DOWN) {
  121. e.preventDefault()
  122. move(KEYCODE.DOWN)
  123. }
  124. if(keyCode === KEYCODE.LEFT) {
  125. e.preventDefault()
  126. move(KEYCODE.LEFT)
  127. }
  128. if(keyCode === KEYCODE.RIGHT) {
  129. e.preventDefault()
  130. move(KEYCODE.RIGHT)
  131. }
  132. if(keyCode === KEYCODE.ENTER) {
  133. e.preventDefault()
  134. create()
  135. }
  136. }
  137. const keyupListener = () => {
  138. if(ctrlKeyDown.value) ctrlKeyDown.value = false
  139. if(shiftKeyDown.value) shiftKeyDown.value = false
  140. }
  141. const pasteImageFile = (imageFile: File) => {
  142. console.log(imageFile)
  143. }
  144. const pasteText = (text: string) => {
  145. let content
  146. try {
  147. content = JSON.parse(decrypt(text))
  148. }
  149. catch {
  150. content = text
  151. }
  152. console.log(content)
  153. }
  154. const pasteListener = (e: ClipboardEvent) => {
  155. if(!editorAreaFocus.value && !thumbnailsFocus.value) return
  156. if(disableHotkeys.value) return
  157. if(!e.clipboardData) return
  158. const clipboardDataItems = e.clipboardData.items
  159. const clipboardDataFirstItem = clipboardDataItems[0]
  160. if(!clipboardDataFirstItem) return
  161. for(const item of clipboardDataItems) {
  162. if(item.kind === 'file' && item.type.indexOf('image') !== -1) {
  163. const imageFile = item.getAsFile()
  164. if(imageFile) pasteImageFile(imageFile)
  165. return
  166. }
  167. }
  168. if( clipboardDataFirstItem.kind === 'string' && clipboardDataFirstItem.type === 'text/plain' ) {
  169. clipboardDataFirstItem.getAsString(text => pasteText(text))
  170. }
  171. }
  172. onMounted(() => {
  173. document.addEventListener('keydown', keydownListener)
  174. document.addEventListener('keyup', keyupListener)
  175. window.addEventListener('blur', keyupListener)
  176. document.addEventListener('paste', pasteListener)
  177. })
  178. onUnmounted(() => {
  179. document.removeEventListener('keydown', keydownListener)
  180. document.removeEventListener('keyup', keyupListener)
  181. window.removeEventListener('blur', keyupListener)
  182. document.removeEventListener('paste', pasteListener)
  183. })
  184. },
  185. })
  186. </script>
  187. <style lang="scss" scoped>
  188. .editor {
  189. height: 100%;
  190. }
  191. .layout-header {
  192. height: 40px;
  193. }
  194. .layout-content {
  195. height: calc(100% - 40px);
  196. display: flex;
  197. }
  198. .layout-content-left {
  199. width: 160px;
  200. height: 100%;
  201. flex-shrink: 0;
  202. }
  203. .layout-content-center {
  204. width: calc(100% - 160px - 260px);
  205. .center-top {
  206. height: 40px;
  207. }
  208. .center-body {
  209. height: calc(100% - 40px);
  210. }
  211. }
  212. .layout-content-right {
  213. width: 260px;
  214. height: 100%;
  215. }
  216. </style>