Browse Source

:art: https://github.com/siyuan-note/siyuan/issues/12989

Vanessa 8 months ago
parent
commit
ab147598e1
2 changed files with 32 additions and 21 deletions
  1. 6 6
      app/src/boot/globalEvent/keydown.ts
  2. 26 15
      app/src/protyle/wysiwyg/keydown.ts

+ 6 - 6
app/src/boot/globalEvent/keydown.ts

@@ -1404,17 +1404,17 @@ export const windowKeyDown = (app: App, event: KeyboardEvent) => {
             return;
         }
 
+        // 闪卡长按 Esc 光标定位到闪卡按钮上 https://github.com/siyuan-note/siyuan/issues/12989
+        if (document.activeElement && hasClosestByClassName(document.activeElement, "card__action")) {
+            return;
+        }
         // 光标在文档树等面板中,按 Esc 回到编辑器中 https://github.com/siyuan-note/siyuan/issues/4289
-        let range;
         if (getSelection().rangeCount > 0) {
-            range = getSelection().getRangeAt(0);
-            const protypleElement = hasClosestByClassName(range.startContainer, "protyle-content", true);
-            if (protypleElement) {
+            const range = getSelection().getRangeAt(0);
+            if (hasClosestByClassName(range.startContainer, "protyle-content", true)) {
                 focusByRange(range);
                 return;
             }
-        } else {
-            range = document.createRange();
         }
         const lastBackStack = window.siyuan.backStack[window.siyuan.backStack.length - 1];
         if (lastBackStack && lastBackStack.protyle.toolbar.range) {

+ 26 - 15
app/src/protyle/wysiwyg/keydown.ts

@@ -14,6 +14,7 @@ import {
 import {
     hasClosestBlock,
     hasClosestByAttribute,
+    hasClosestByClassName,
     hasClosestByMatchTag,
     hasTopClosestByAttribute,
     isInEmbedBlock
@@ -1175,23 +1176,33 @@ export const keydown = (protyle: IProtyle, editorElement: HTMLElement) => {
 
         // esc
         if (event.key === "Escape") {
-            if (!protyle.toolbar.element.classList.contains("fn__none") ||
-                !protyle.hint.element.classList.contains("fn__none") ||
-                !protyle.toolbar.subElement.classList.contains("fn__none")) {
-                hideElements(["toolbar", "hint", "util"], protyle);
-                protyle.hint.enableExtend = false;
-            } else if (nodeElement.classList.contains("protyle-wysiwyg--select")) {
-                hideElements(["select"], protyle);
-                countBlockWord([], protyle.block.rootID);
-            } else if (!window.siyuan.menus.menu.element.classList.contains("fn__none")) {
-                // 防止 ESC 时选中当前块
-                window.siyuan.menus.menu.remove();
+            if (event.repeat) {
+                // https://github.com/siyuan-note/siyuan/issues/12989
+                const cardElement = hasClosestByClassName(range.startContainer, "card__main", true);
+                if (cardElement && document.activeElement && document.activeElement.classList.contains("protyle-wysiwyg")) {
+                    (cardElement.querySelector(".card__action button") as HTMLElement).focus()
+                     hideElements(["select"], protyle);
+                }
             } else {
-                hideElements(["select"], protyle);
-                range.collapse(false);
-                nodeElement.classList.add("protyle-wysiwyg--select");
-                countBlockWord([nodeElement.getAttribute("data-node-id")], protyle.block.rootID);
+                if (!protyle.toolbar.element.classList.contains("fn__none") ||
+                    !protyle.hint.element.classList.contains("fn__none") ||
+                    !protyle.toolbar.subElement.classList.contains("fn__none")) {
+                    hideElements(["toolbar", "hint", "util"], protyle);
+                    protyle.hint.enableExtend = false;
+                } else if (nodeElement.classList.contains("protyle-wysiwyg--select")) {
+                    hideElements(["select"], protyle);
+                    countBlockWord([], protyle.block.rootID);
+                } else if (!window.siyuan.menus.menu.element.classList.contains("fn__none")) {
+                    // 防止 ESC 时选中当前块
+                    window.siyuan.menus.menu.remove();
+                } else {
+                    hideElements(["select"], protyle);
+                    range.collapse(false);
+                    nodeElement.classList.add("protyle-wysiwyg--select");
+                    countBlockWord([nodeElement.getAttribute("data-node-id")], protyle.block.rootID);
+                }
             }
+            event.stopPropagation();
             event.preventDefault();
             return;
         }