ShortcutKey.vue 4.7 KB

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