diff --git a/app/src/boot/globalEvent/commandPanel.ts b/app/src/boot/globalEvent/command/panel.ts
similarity index 81%
rename from app/src/boot/globalEvent/commandPanel.ts
rename to app/src/boot/globalEvent/command/panel.ts
index 4632a9133..0e42ad2c2 100644
--- a/app/src/boot/globalEvent/commandPanel.ts
+++ b/app/src/boot/globalEvent/command/panel.ts
@@ -1,27 +1,29 @@
-import {Dialog} from "../../dialog";
-import {App} from "../../index";
-import {upDownHint} from "../../util/upDownHint";
-import {updateHotkeyTip} from "../../protyle/util/compatibility";
-import {isMobile} from "../../util/functions";
-import {Constants} from "../../constants";
-import {Editor} from "../../editor";
+import {Dialog} from "../../../dialog";
+import {App} from "../../../index";
+import {upDownHint} from "../../../util/upDownHint";
+import {updateHotkeyTip} from "../../../protyle/util/compatibility";
+import {isMobile} from "../../../util/functions";
+import {Constants} from "../../../constants";
+import {Editor} from "../../../editor";
/// #if MOBILE
-import {getCurrentEditor} from "../../mobile/editor";
-import {openDock} from "../../mobile/dock/util";
-import {popMenu} from "../../mobile/menu";
+import {getCurrentEditor} from "../../../mobile/editor";
+import {openDock} from "../../../mobile/dock/util";
+import {popMenu} from "../../../mobile/menu";
/// #else
-import {closeTabByType, getActiveTab, getDockByType} from "../../layout/tabUtil";
-import {Custom} from "../../layout/dock/Custom";
-import {getAllModels} from "../../layout/getAll";
-import {Files} from "../../layout/dock/Files";
-import {Search} from "../../search";
-import {openSetting} from "../../config";
-import {Tab} from "../../layout/Tab";
+import {closeTabByType, getActiveTab, getDockByType} from "../../../layout/tabUtil";
+import {Custom} from "../../../layout/dock/Custom";
+import {getAllModels} from "../../../layout/getAll";
+import {Files} from "../../../layout/dock/Files";
+import {Search} from "../../../search";
+import {openSetting} from "../../../config";
+import {Tab} from "../../../layout/Tab";
/// #endif
-import {openHistory} from "../../history/history";
-import {addEditorToDatabase, addFilesToDatabase} from "../../protyle/render/av/addToDatabase";
-import {hasClosestByClassName} from "../../protyle/util/hasClosest";
-import {newDailyNote} from "../../util/mount";
+import {openHistory} from "../../../history/history";
+import {addEditorToDatabase, addFilesToDatabase} from "../../../protyle/render/av/addToDatabase";
+import {hasClosestByClassName} from "../../../protyle/util/hasClosest";
+import {newDailyNote} from "../../../util/mount";
+import {onluProtyleCommand} from "./protyle";
+import {editor as editorConfig} from "../../../config/editor";
export const commandPanel = (app: App) => {
const range = getSelection().getRangeAt(0);
@@ -49,11 +51,14 @@ export const commandPanel = (app: App) => {
let keys;
/// #if MOBILE
keys = ["addToDatabase", "fileTree", "outline", "bookmark", "tag", "dailyNote", "inbox", "backlinks", "config",
- "dataHistory"];
+ "dataHistory", "editReadonly", "enter", "enterBack", "globalSearch", "goBack", "goForward"];
/// #else
keys = ["addToDatabase", "fileTree", "outline", "bookmark", "tag", "dailyNote", "inbox", "backlinks",
"graphView", "globalGraph", "closeAll", "closeLeft", "closeOthers", "closeRight", "closeTab",
- "closeUnmodified", "config", "dataHistory"];
+ "closeUnmodified", "config", "dataHistory", "editReadonly", "enter", "enterBack", "globalSearch", "goBack",
+ "goForward", "goToEditTabNext", "goToEditTabPrev", "goToTab1", "goToTab2", "goToTab3", "goToTab4",
+ "goToTab5", "goToTab6", "goToTab7", "goToTab8", "goToTab9", "goToTabNext", "goToTabPrev"];
+
/// #endif
if (keys.includes(key)) {
html += `
@@ -158,58 +163,52 @@ const filterList = (inputElement: HTMLInputElement, listElement: Element) => {
});
};
-export const execByCommand = (options: {
- command: string,
- app?: App,
- previousRange?: Range,
- protyle?: IProtyle,
- fileLiElements?: Element[]
-}) => {
+const globalCommand = (command: string, app: App) => {
/// #if MOBILE
- switch (options.command) {
+ switch (command) {
case "fileTree":
openDock("file");
- return;
+ return true;
case "outline":
case "bookmark":
case "tag":
case "inbox":
- openDock(options.command);
- return;
+ openDock(command);
+ return true;
case "backlinks":
openDock("backlink");
- return;
+ return true;
case "config":
popMenu();
- return;
+ return true;
}
/// #else
- switch (options.command) {
+ switch (command) {
case "fileTree":
getDockByType("file").toggleModel("file");
- return;
+ return true;
case "outline":
getDockByType("outline").toggleModel("outline");
- return;
+ return true;
case "bookmark":
case "tag":
case "inbox":
- getDockByType(options.command).toggleModel(options.command);
- return;
+ getDockByType(command).toggleModel(command);
+ return true;
case "backlinks":
getDockByType("backlink").toggleModel("backlink");
- return;
+ return true;
case "graphView":
getDockByType("graph").toggleModel("graph");
- return;
+ return true;
case "globalGraph":
getDockByType("globalGraph").toggleModel("globalGraph");
- return;
+ return true;
case "config":
- openSetting(options.app);
- return;
+ openSetting(app);
+ return true;
}
- if (options.command === "closeUnmodified") {
+ if (command === "closeUnmodified") {
const tab = getActiveTab(false);
if (tab) {
const unmodifiedTabs: Tab[] = [];
@@ -223,9 +222,9 @@ export const execByCommand = (options: {
closeTabByType(tab, "other", unmodifiedTabs);
}
}
- return;
+ return true;
}
- if (options.command === "closeTab") {
+ if (command === "closeTab") {
const activeTabElement = document.querySelector(".layout__tab--active");
if (activeTabElement && activeTabElement.getBoundingClientRect().width > 0) {
let type = "";
@@ -238,22 +237,22 @@ export const execByCommand = (options: {
if (type) {
getDockByType(type)?.toggleModel(type, false, true);
}
- return;
+ return true;
}
const tab = getActiveTab(false);
if (tab) {
tab.parent.removeTab(tab.id);
}
- return;
+ return true;
}
- if (options.command === "closeOthers" || options.command === "closeAll") {
+ if (command === "closeOthers" || command === "closeAll") {
const tab = getActiveTab(false);
if (tab) {
- closeTabByType(tab, options.command);
+ closeTabByType(tab, command);
}
- return;
+ return true;
}
- if (options.command === "closeLeft" || options.command === "closeRight") {
+ if (command === "closeLeft" || command === "closeRight") {
const tab = getActiveTab(false);
if (tab) {
const leftTabs: Tab[] = [];
@@ -269,7 +268,7 @@ export const execByCommand = (options: {
rightTabs.push(item);
}
});
- if (options.command === "closeLeft") {
+ if (command === "closeLeft") {
if (leftTabs.length > 0) {
closeTabByType(tab, "other", leftTabs);
}
@@ -279,16 +278,33 @@ export const execByCommand = (options: {
}
}
}
- return;
+ return true;
}
/// #endif
- switch (options.command) {
+ switch (command) {
case "dailyNote":
- newDailyNote(options.app);
- return;
+ newDailyNote(app);
+ return true;
case "dataHistory":
- openHistory(options.app);
- return;
+ openHistory(app);
+ return true;
+ case "editReadonly":
+ editorConfig.setReadonly(!window.siyuan.config.editor.readOnly);
+ return true;
+ }
+
+ return false
+}
+
+export const execByCommand = (options: {
+ command: string,
+ app?: App,
+ previousRange?: Range,
+ protyle?: IProtyle,
+ fileLiElements?: Element[]
+}) => {
+ if (globalCommand(options.command, options.app)) {
+ return;
}
const isFileFocus = document.querySelector(".layout__tab--active")?.classList.contains("sy__file");
@@ -387,6 +403,16 @@ export const execByCommand = (options: {
}
}
}
+
+ // only protyle
+ if (!isFileFocus && onluProtyleCommand({
+ command: options.command,
+ previousRange: range,
+ protyle
+ })) {
+ return;
+ }
+
if (isFileFocus && !fileLiElements) {
const dockFile = getDockByType("file");
if (!dockFile) {
@@ -396,6 +422,7 @@ export const execByCommand = (options: {
fileLiElements = Array.from(files.element.querySelectorAll(".b3-list-item--focus"));
}
+ // protyle and file tree
switch (options.command) {
case "addToDatabase":
if (!isFileFocus) {
diff --git a/app/src/boot/globalEvent/command/protyle.ts b/app/src/boot/globalEvent/command/protyle.ts
new file mode 100644
index 000000000..3cc5155c3
--- /dev/null
+++ b/app/src/boot/globalEvent/command/protyle.ts
@@ -0,0 +1,28 @@
+import {hasClosestBlock} from "../../../protyle/util/hasClosest";
+import {getTopAloneElement} from "../../../protyle/wysiwyg/getBlock";
+import {enterBack, zoomOut} from "../../../menus/protyle";
+
+export const onluProtyleCommand = (options: {
+ command: string,
+ previousRange: Range,
+ protyle: IProtyle,
+}) => {
+ const nodeElement = hasClosestBlock(options.previousRange.startContainer);
+ if (!nodeElement) {
+ return false;
+ }
+ if (options.command === "enter") {
+ let topNodeElement = getTopAloneElement(nodeElement);
+ if (topNodeElement.parentElement.classList.contains("li") && topNodeElement.parentElement.parentElement.classList.contains("list") &&
+ topNodeElement.nextElementSibling?.classList.contains("list") && topNodeElement.previousElementSibling.classList.contains("protyle-action")) {
+ topNodeElement = topNodeElement.parentElement;
+ }
+ zoomOut({protyle: options.protyle, id: topNodeElement.getAttribute("data-node-id")});
+ return true;
+ }
+ if (options.command === "enterBack") {
+ enterBack(options.protyle, nodeElement.getAttribute("data-node-id"));
+ return true;
+ }
+ return false;
+}
diff --git a/app/src/boot/globalEvent/keydown.ts b/app/src/boot/globalEvent/keydown.ts
index 34292322e..91d232612 100644
--- a/app/src/boot/globalEvent/keydown.ts
+++ b/app/src/boot/globalEvent/keydown.ts
@@ -72,7 +72,7 @@ import {openNewWindow} from "../../window/openNewWindow";
import {historyKeydown} from "../../history/keydown";
import {zoomOut} from "../../menus/protyle";
import {getPlainText} from "../../protyle/util/paste";
-import {commandPanel, execByCommand} from "./commandPanel";
+import {commandPanel, execByCommand} from "./command/panel";
import {filterHotkey} from "./commonHotkey";
const switchDialogEvent = (app: App, event: MouseEvent) => {
diff --git a/app/src/layout/topBar.ts b/app/src/layout/topBar.ts
index 9c53330ed..1fa1884de 100644
--- a/app/src/layout/topBar.ts
+++ b/app/src/layout/topBar.ts
@@ -19,7 +19,7 @@ import {fetchPost} from "../util/fetch";
import {needSubscribe} from "../util/needSubscribe";
import * as dayjs from "dayjs";
import {exportLayout} from "./util";
-import {commandPanel} from "../boot/globalEvent/commandPanel";
+import {commandPanel} from "../boot/globalEvent/command/panel";
export const initBar = (app: App) => {
const toolbarElement = document.getElementById("toolbar");
diff --git a/app/src/mobile/menu/index.ts b/app/src/mobile/menu/index.ts
index 2017a3966..5d25057f9 100644
--- a/app/src/mobile/menu/index.ts
+++ b/app/src/mobile/menu/index.ts
@@ -20,7 +20,7 @@ import {isHuawei, isInAndroid, isInIOS} from "../../protyle/util/compatibility";
import {newFile} from "../../util/newFile";
import {afterLoadPlugin} from "../../plugin/loader";
import {Menu} from "../../plugin/Menu";
-import {commandPanel} from "../../boot/globalEvent/commandPanel";
+import {commandPanel} from "../../boot/globalEvent/command/panel";
export const popMenu = () => {
activeBlur();
diff --git a/app/src/mobile/util/keydown.ts b/app/src/mobile/util/keydown.ts
index f84134ab3..b97328c15 100644
--- a/app/src/mobile/util/keydown.ts
+++ b/app/src/mobile/util/keydown.ts
@@ -1,5 +1,5 @@
import {App} from "../../index";
-import {execByCommand} from "../../boot/globalEvent/commandPanel";
+import {execByCommand} from "../../boot/globalEvent/command/panel";
import {matchHotKey} from "../../protyle/util/hotKey";
import {getCurrentEditor} from "../editor";
import {filterHotkey} from "../../boot/globalEvent/commonHotkey";
diff --git a/app/src/protyle/wysiwyg/keydown.ts b/app/src/protyle/wysiwyg/keydown.ts
index ca51cca78..ab24428d1 100644
--- a/app/src/protyle/wysiwyg/keydown.ts
+++ b/app/src/protyle/wysiwyg/keydown.ts
@@ -49,7 +49,7 @@ import {
getStartEndElement,
upSelect
} from "./commonHotkey";
-import {enterBack, fileAnnotationRefMenu, linkMenu, refMenu, setFold, tagMenu, zoomOut} from "../../menus/protyle";
+import {fileAnnotationRefMenu, linkMenu, refMenu, setFold, tagMenu, zoomOut} from "../../menus/protyle";
import {openAttr} from "../../menus/commonMenuItem";
import {Constants} from "../../constants";
import {fetchPost} from "../../util/fetch";
@@ -67,6 +67,7 @@ import {avKeydown} from "../render/av/keydown";
import {checkFold} from "../../util/noRelyPCFunction";
import {AIActions} from "../../ai/actions";
import {openLink} from "../../editor/openLink";
+import {onluProtyleCommand} from "../../boot/globalEvent/command/protyle";
export const getContentByInlineHTML = (range: Range, cb: (content: string) => void) => {
let html = "";
@@ -468,19 +469,22 @@ export const keydown = (protyle: IProtyle, editorElement: HTMLElement) => {
}
if (matchHotKey(window.siyuan.config.keymap.general.enter.custom, event)) {
- let topNodeElement = getTopAloneElement(nodeElement);
- if (topNodeElement.parentElement.classList.contains("li") && topNodeElement.parentElement.parentElement.classList.contains("list") &&
- topNodeElement.nextElementSibling?.classList.contains("list") && topNodeElement.previousElementSibling.classList.contains("protyle-action")) {
- topNodeElement = topNodeElement.parentElement;
- }
- zoomOut({protyle, id: topNodeElement.getAttribute("data-node-id")});
+ onluProtyleCommand({
+ protyle,
+ command: "enter",
+ previousRange: range,
+ })
event.preventDefault();
event.stopPropagation();
return;
}
if (matchHotKey(window.siyuan.config.keymap.general.enterBack.custom, event)) {
- enterBack(protyle, nodeElement.getAttribute("data-node-id"));
+ onluProtyleCommand({
+ protyle,
+ command: "enterBack",
+ previousRange: range,
+ })
event.preventDefault();
event.stopPropagation();
return;