ShortcutKey.vue 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. <template>
  2. <div class="shortcut-key"></div>
  3. </template>
  4. <script>
  5. import { mapState, mapMutations, mapActions } from "vuex";
  6. import { deepCopy, randomCode, getElementId } from "../../../plugins/utils";
  7. import { getModel as getPageModel } from "../../../elements/page/model";
  8. export default {
  9. name: "shortcut-key",
  10. data() {
  11. return {};
  12. },
  13. computed: {
  14. ...mapState("free", [
  15. "cardConfig",
  16. "pages",
  17. "curElement",
  18. "curPage",
  19. "curPageNo",
  20. "curColumnId",
  21. "curCopyElement",
  22. "openElementEditDialog",
  23. ]),
  24. },
  25. methods: {
  26. ...mapMutations("free", ["setCurCopyElement", "setOpenElementEditDialog"]),
  27. ...mapActions("free", [
  28. "modifyElement",
  29. "addPage",
  30. "removePage",
  31. "pasteElement",
  32. "removeElement",
  33. "moveElementZindex",
  34. ]),
  35. keyEvent(e) {
  36. if (this.openElementEditDialog) return;
  37. // move
  38. const moveAction = ["ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight"];
  39. const isCtrlKey = e.ctrlKey || e.metaKey;
  40. if (moveAction.includes(e.code)) {
  41. e.preventDefault();
  42. // move zindex
  43. if (isCtrlKey) {
  44. this.toMoverElementZindex(e.code);
  45. return;
  46. }
  47. const size = e.shiftKey ? 10 : 1;
  48. this.toMoveElement(e.code, size);
  49. return;
  50. }
  51. if (e.code === "KeyC" && isCtrlKey && !e.repeat) {
  52. e.preventDefault();
  53. this.toCopeElement();
  54. return;
  55. }
  56. if (e.code === "KeyV" && isCtrlKey && !e.repeat) {
  57. e.preventDefault();
  58. this.toPasteElement();
  59. return;
  60. }
  61. if (e.code === "KeyE" && isCtrlKey && !e.repeat) {
  62. e.preventDefault();
  63. this.toEditElement();
  64. return;
  65. }
  66. if (e.code === "KeyP" && isCtrlKey && !e.repeat) {
  67. e.preventDefault();
  68. this.$emit("sk-preview");
  69. return;
  70. }
  71. if (e.code === "KeyS" && isCtrlKey && !e.shiftKey && !e.repeat) {
  72. e.preventDefault();
  73. this.$emit("sk-save");
  74. return;
  75. }
  76. if (e.code === "KeyS" && isCtrlKey && e.shiftKey && !e.repeat) {
  77. e.preventDefault();
  78. this.$emit("sk-submit");
  79. return;
  80. }
  81. if (
  82. e.code === "Delete" &&
  83. !isCtrlKey &&
  84. !e.altKey &&
  85. !e.shiftKey &&
  86. !e.repeat
  87. ) {
  88. if (!this.curElement.id) return;
  89. e.preventDefault();
  90. this.removeElement(this.curElement);
  91. return;
  92. }
  93. // create new page
  94. // ctrl+n / ctrl+shift+n :无法重置浏览器默认操作
  95. if (e.code === "KeyN" && isCtrlKey && e.altKey && !e.repeat) {
  96. e.preventDefault();
  97. this.toAddPage();
  98. return;
  99. }
  100. // ctrl+alt+delete :无法重置系统默认操作
  101. if (e.code === "KeyD" && isCtrlKey && e.altKey && !e.repeat) {
  102. e.preventDefault();
  103. this.toDeletePage();
  104. return;
  105. }
  106. },
  107. // actions
  108. toMoveElement(direction, size) {
  109. if (!this.curElement.id) return;
  110. const actionSet = {
  111. ArrowUp: ["y", -1],
  112. ArrowDown: ["y", 1],
  113. ArrowLeft: ["x", -1],
  114. ArrowRight: ["x", 1],
  115. };
  116. const [moveParam, moveDirection] = actionSet[direction];
  117. const moveData = {
  118. [moveParam]: this.curElement[moveParam] + moveDirection * size,
  119. key: randomCode(),
  120. };
  121. this.modifyElement(Object.assign({}, this.curElement, moveData));
  122. },
  123. toMoverElementZindex(direction) {
  124. if (!this.curElement.id) return;
  125. const actionSet = {
  126. ArrowUp: -1,
  127. ArrowDown: 1,
  128. };
  129. if (!actionSet[direction]) return;
  130. this.moveElementZindex({
  131. curElement: this.curElement,
  132. pos: actionSet[direction],
  133. });
  134. },
  135. toAddPage() {
  136. const page = getPageModel(this.cardConfig);
  137. this.addPage(page);
  138. },
  139. toDeletePage() {
  140. if (this.pages.length === 1) {
  141. this.$message.error("只剩最后一页,不能再删除了");
  142. return;
  143. }
  144. this.removePage(this.curPage);
  145. },
  146. toCopeElement() {
  147. this.setCurCopyElement(deepCopy(this.curElement));
  148. },
  149. toPasteElement() {
  150. if (!this.curCopyElement.id) return;
  151. if (!this.curColumnId) return;
  152. this.pasteElement({
  153. element: {
  154. ...deepCopy(this.curCopyElement),
  155. x: 50,
  156. y: 50,
  157. id: getElementId(),
  158. key: randomCode(),
  159. },
  160. toColumnId: this.curColumnId,
  161. });
  162. },
  163. toEditElement() {
  164. if (!this.curElement.id) return;
  165. this.setOpenElementEditDialog(true);
  166. },
  167. // event
  168. registShortcutKey() {
  169. document.addEventListener("keydown", this.keyEvent);
  170. },
  171. removeShortcutKey() {
  172. document.removeEventListener("keydown", this.keyEvent);
  173. },
  174. },
  175. beforeDestroy() {
  176. this.removeShortcutKey();
  177. },
  178. };
  179. </script>