This commit is contained in:
parent
6e90a9426b
commit
573013598c
8 changed files with 320 additions and 235 deletions
|
@ -4,17 +4,18 @@ import {upDownHint} from "../../util/upDownHint";
|
|||
import {updateHotkeyTip} from "../../protyle/util/compatibility";
|
||||
import {isMobile} from "../../util/functions";
|
||||
import {Constants} from "../../constants";
|
||||
import {getActiveTab, getDockByType} from "../../layout/tabUtil";
|
||||
import {Editor} from "../../editor";
|
||||
import {Search} from "../../search";
|
||||
/// #if !MOBILE
|
||||
import {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";
|
||||
/// #endif
|
||||
import {addEditorToDatabase, addFilesToDatabase} from "../../protyle/render/av/addToDatabase";
|
||||
import {hasClosestByClassName} from "../../protyle/util/hasClosest";
|
||||
import {newDailyNote} from "../../util/mount";
|
||||
import {getCurrentEditor} from "../../mobile/editor";
|
||||
|
||||
export const commandPanel = (app: App) => {
|
||||
const range = getSelection().getRangeAt(0);
|
||||
|
@ -37,7 +38,6 @@ export const commandPanel = (app: App) => {
|
|||
});
|
||||
dialog.element.setAttribute("data-key", Constants.DIALOG_COMMANDPANEL);
|
||||
const listElement = dialog.element.querySelector("#commands");
|
||||
/// #if !MOBILE
|
||||
let html = "";
|
||||
Object.keys(window.siyuan.config.keymap.general).forEach((key) => {
|
||||
if (["addToDatabase", "fileTree", "outline", "bookmark", "tag", "dailyNote", "inbox", "backlinks", "graphView", "globalGraph"].includes(key)) {
|
||||
|
@ -48,7 +48,6 @@ export const commandPanel = (app: App) => {
|
|||
}
|
||||
});
|
||||
listElement.insertAdjacentHTML("beforeend", html);
|
||||
/// #endif
|
||||
app.plugins.forEach(plugin => {
|
||||
plugin.commands.forEach(command => {
|
||||
const liElement = document.createElement("li");
|
||||
|
@ -81,7 +80,6 @@ export const commandPanel = (app: App) => {
|
|||
|
||||
const inputElement = dialog.element.querySelector(".b3-text-field") as HTMLInputElement;
|
||||
inputElement.focus();
|
||||
/// #if !MOBILE
|
||||
listElement.addEventListener("click", (event: KeyboardEvent) => {
|
||||
const liElement = hasClosestByClassName(event.target as HTMLElement, "b3-list-item");
|
||||
if (liElement) {
|
||||
|
@ -94,7 +92,6 @@ export const commandPanel = (app: App) => {
|
|||
}
|
||||
}
|
||||
});
|
||||
/// #endif
|
||||
inputElement.addEventListener("keydown", (event: KeyboardEvent) => {
|
||||
event.stopPropagation();
|
||||
if (event.isComposing) {
|
||||
|
@ -153,10 +150,76 @@ export const execByCommand = (options: {
|
|||
protyle?: IProtyle,
|
||||
fileLiElements?: Element[]
|
||||
}) => {
|
||||
/// #if !MOBILE
|
||||
/// #if MOBILE
|
||||
switch (options.command) {
|
||||
case "fileTree":
|
||||
getDockByType("file").toggleModel("file");
|
||||
return;
|
||||
case "outline":
|
||||
getDockByType("outline").toggleModel("outline");
|
||||
return;
|
||||
case "bookmark":
|
||||
getDockByType("bookmark").toggleModel("bookmark");
|
||||
return;
|
||||
case "tag":
|
||||
getDockByType("tag").toggleModel("tag");
|
||||
return;
|
||||
case "inbox":
|
||||
getDockByType("inbox").toggleModel("inbox");
|
||||
return;
|
||||
case "backlinks":
|
||||
getDockByType("backlink").toggleModel("backlink");
|
||||
return;
|
||||
case "graphView":
|
||||
getDockByType("graph").toggleModel("graph");
|
||||
return;
|
||||
case "globalGraph":
|
||||
getDockByType("globalGraph").toggleModel("globalGraph");
|
||||
return;
|
||||
}
|
||||
/// #else
|
||||
switch (options.command) {
|
||||
case "fileTree":
|
||||
getDockByType("file").toggleModel("file");
|
||||
return;
|
||||
case "outline":
|
||||
getDockByType("outline").toggleModel("outline");
|
||||
return;
|
||||
case "bookmark":
|
||||
getDockByType("bookmark").toggleModel("bookmark");
|
||||
return;
|
||||
case "tag":
|
||||
getDockByType("tag").toggleModel("tag");
|
||||
return;
|
||||
case "inbox":
|
||||
getDockByType("inbox").toggleModel("inbox");
|
||||
return;
|
||||
case "backlinks":
|
||||
getDockByType("backlink").toggleModel("backlink");
|
||||
return;
|
||||
case "graphView":
|
||||
getDockByType("graph").toggleModel("graph");
|
||||
return;
|
||||
case "globalGraph":
|
||||
getDockByType("globalGraph").toggleModel("globalGraph");
|
||||
return;
|
||||
}
|
||||
/// #endif
|
||||
switch (options.command) {
|
||||
case "dailyNote":
|
||||
newDailyNote(options.app);
|
||||
return;
|
||||
}
|
||||
|
||||
const isFileFocus = document.querySelector(".layout__tab--active")?.classList.contains("sy__file");
|
||||
|
||||
let protyle = options.protyle;
|
||||
/// #if MOBILE
|
||||
if (!protyle) {
|
||||
protyle = getCurrentEditor().protyle;
|
||||
options.previousRange = protyle.toolbar.range;
|
||||
}
|
||||
/// #endif
|
||||
const range: Range = options.previousRange || getSelection().getRangeAt(0);
|
||||
let fileLiElements = options.fileLiElements;
|
||||
if (!isFileFocus && !protyle) {
|
||||
|
@ -261,33 +324,5 @@ export const execByCommand = (options: {
|
|||
addFilesToDatabase(fileLiElements);
|
||||
}
|
||||
break;
|
||||
case "fileTree":
|
||||
getDockByType("file").toggleModel("file");
|
||||
break;
|
||||
case "outline":
|
||||
getDockByType("outline").toggleModel("outline");
|
||||
break;
|
||||
case "bookmark":
|
||||
getDockByType("bookmark").toggleModel("bookmark");
|
||||
break;
|
||||
case "tag":
|
||||
getDockByType("tag").toggleModel("tag");
|
||||
break;
|
||||
case "dailyNote":
|
||||
newDailyNote(options.app);
|
||||
break;
|
||||
case "inbox":
|
||||
getDockByType("inbox").toggleModel("inbox");
|
||||
break;
|
||||
case "backlinks":
|
||||
getDockByType("backlink").toggleModel("backlink");
|
||||
break;
|
||||
case "graphView":
|
||||
getDockByType("graph").toggleModel("graph");
|
||||
break;
|
||||
case "globalGraph":
|
||||
getDockByType("globalGraph").toggleModel("globalGraph");
|
||||
break;
|
||||
}
|
||||
/// #endif
|
||||
};
|
||||
|
|
196
app/src/boot/globalEvent/commonHotkey.ts
Normal file
196
app/src/boot/globalEvent/commonHotkey.ts
Normal file
|
@ -0,0 +1,196 @@
|
|||
import {Constants} from "../../constants";
|
||||
import {fetchPost} from "../../util/fetch";
|
||||
/// #if !BROWSER
|
||||
import {sendGlobalShortcut} from "./keydown";
|
||||
import {ipcRenderer} from "electron";
|
||||
/// #endif
|
||||
import {App} from "../../index";
|
||||
import {isMac, isNotCtrl, isOnlyMeta} from "../../protyle/util/compatibility";
|
||||
import {showPopover} from "../../block/popover";
|
||||
|
||||
const matchKeymap = (keymap: Config.IKeys, key1: "general" | "editor", key2?: "general" | "insert" | "heading" | "list" | "table") => {
|
||||
if (key1 === "general") {
|
||||
if (!window.siyuan.config.keymap[key1]) {
|
||||
/// #if !BROWSER
|
||||
ipcRenderer.send(Constants.SIYUAN_CMD, {
|
||||
cmd: "writeLog",
|
||||
msg: "window.siyuan.config.keymap.general is not found"
|
||||
});
|
||||
/// #endif
|
||||
window.siyuan.config.keymap[key1] = keymap as Config.IKeymapGeneral;
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
if (!window.siyuan.config.keymap[key1]) {
|
||||
/// #if !BROWSER
|
||||
ipcRenderer.send(Constants.SIYUAN_CMD, {
|
||||
cmd: "writeLog",
|
||||
msg: "window.siyuan.config.keymap.editor is not found"
|
||||
});
|
||||
/// #endif
|
||||
window.siyuan.config.keymap[key1] = JSON.parse(JSON.stringify(Constants.SIYUAN_KEYMAP.editor));
|
||||
return false;
|
||||
}
|
||||
if (!window.siyuan.config.keymap[key1][key2]) {
|
||||
/// #if !BROWSER
|
||||
ipcRenderer.send(Constants.SIYUAN_CMD, {
|
||||
cmd: "writeLog",
|
||||
msg: `window.siyuan.config.keymap.editor.${key2} is not found`
|
||||
});
|
||||
/// #endif
|
||||
(window.siyuan.config.keymap[key1][key2] as Config.IKeymapEditor[typeof key2]) = keymap as Config.IKeymapEditor[typeof key2];
|
||||
return false;
|
||||
}
|
||||
}
|
||||
let match = true;
|
||||
Object.keys(keymap).forEach(key => {
|
||||
if (key1 === "general") {
|
||||
if (!window.siyuan.config.keymap[key1][key] || window.siyuan.config.keymap[key1][key].default !== keymap[key].default) {
|
||||
/// #if !BROWSER
|
||||
ipcRenderer.send(Constants.SIYUAN_CMD, {
|
||||
cmd: "writeLog",
|
||||
msg: `window.siyuan.config.keymap.${key1}.${key} is not found or match: ${window.siyuan.config.keymap[key1][key]?.default}`
|
||||
});
|
||||
/// #endif
|
||||
match = false;
|
||||
window.siyuan.config.keymap[key1][key] = keymap[key];
|
||||
}
|
||||
} else {
|
||||
if (!window.siyuan.config.keymap[key1][key2][key] || window.siyuan.config.keymap[key1][key2][key].default !== keymap[key].default) {
|
||||
/// #if !BROWSER
|
||||
ipcRenderer.send(Constants.SIYUAN_CMD, {
|
||||
cmd: "writeLog",
|
||||
msg: `window.siyuan.config.keymap.${key1}.${key2}.${key} is not found or match: ${window.siyuan.config.keymap[key1][key2][key]?.default}`
|
||||
});
|
||||
/// #endif
|
||||
match = false;
|
||||
window.siyuan.config.keymap[key1][key2][key] = keymap[key];
|
||||
}
|
||||
}
|
||||
});
|
||||
return match;
|
||||
};
|
||||
|
||||
const hasKeymap = (keymap: Record<string, IKeymapItem>, key1: "general" | "editor", key2?: "general" | "insert" | "heading" | "list" | "table") => {
|
||||
let match = true;
|
||||
if (key1 === "editor") {
|
||||
if (Object.keys(window.siyuan.config.keymap[key1][key2]).length !== Object.keys(Constants.SIYUAN_KEYMAP[key1][key2]).length) {
|
||||
Object.keys(window.siyuan.config.keymap[key1][key2]).forEach(item => {
|
||||
if (!Constants.SIYUAN_KEYMAP[key1][key2][item]) {
|
||||
match = false;
|
||||
delete window.siyuan.config.keymap[key1][key2][item];
|
||||
}
|
||||
});
|
||||
}
|
||||
} else {
|
||||
if (Object.keys(window.siyuan.config.keymap[key1]).length !== Object.keys(Constants.SIYUAN_KEYMAP[key1]).length) {
|
||||
Object.keys(window.siyuan.config.keymap[key1]).forEach(item => {
|
||||
if (!Constants.SIYUAN_KEYMAP[key1][item]) {
|
||||
match = false;
|
||||
delete window.siyuan.config.keymap[key1][item];
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
return match;
|
||||
};
|
||||
|
||||
export const correctHotkey = (app: App) => {
|
||||
const matchKeymap1 = matchKeymap(Constants.SIYUAN_KEYMAP.general, "general");
|
||||
const matchKeymap2 = matchKeymap(Constants.SIYUAN_KEYMAP.editor.general, "editor", "general");
|
||||
const matchKeymap3 = matchKeymap(Constants.SIYUAN_KEYMAP.editor.insert, "editor", "insert");
|
||||
const matchKeymap4 = matchKeymap(Constants.SIYUAN_KEYMAP.editor.heading, "editor", "heading");
|
||||
const matchKeymap5 = matchKeymap(Constants.SIYUAN_KEYMAP.editor.list, "editor", "list");
|
||||
const matchKeymap6 = matchKeymap(Constants.SIYUAN_KEYMAP.editor.table, "editor", "table");
|
||||
|
||||
const hasKeymap1 = hasKeymap(Constants.SIYUAN_KEYMAP.general, "general");
|
||||
const hasKeymap2 = hasKeymap(Constants.SIYUAN_KEYMAP.editor.general, "editor", "general");
|
||||
const hasKeymap3 = hasKeymap(Constants.SIYUAN_KEYMAP.editor.insert, "editor", "insert");
|
||||
const hasKeymap4 = hasKeymap(Constants.SIYUAN_KEYMAP.editor.heading, "editor", "heading");
|
||||
const hasKeymap5 = hasKeymap(Constants.SIYUAN_KEYMAP.editor.list, "editor", "list");
|
||||
const hasKeymap6 = hasKeymap(Constants.SIYUAN_KEYMAP.editor.table, "editor", "table");
|
||||
if (!window.siyuan.config.readonly &&
|
||||
(!matchKeymap1 || !matchKeymap2 || !matchKeymap3 || !matchKeymap4 || !matchKeymap5 || !matchKeymap6 ||
|
||||
!hasKeymap1 || !hasKeymap2 || !hasKeymap3 || !hasKeymap4 || !hasKeymap5 || !hasKeymap6)) {
|
||||
/// #if !BROWSER
|
||||
ipcRenderer.send(Constants.SIYUAN_CMD, {
|
||||
cmd: "writeLog",
|
||||
msg: "update keymap"
|
||||
});
|
||||
/// #endif
|
||||
fetchPost("/api/setting/setKeymap", {
|
||||
data: window.siyuan.config.keymap
|
||||
}, () => {
|
||||
/// #if !BROWSER
|
||||
sendGlobalShortcut(app);
|
||||
/// #endif
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
export const filterHotkey = (event: KeyboardEvent, app: App) => {
|
||||
// https://github.com/siyuan-note/siyuan/issues/9848 忘记为什么要阻止了 .av__mask 的情况,测了下没问题就先移除
|
||||
if (document.getElementById("progress") || document.getElementById("errorLog") || event.isComposing) {
|
||||
return true;
|
||||
}
|
||||
const target = event.target as HTMLElement;
|
||||
if (isNotCtrl(event) && !event.shiftKey && !event.altKey &&
|
||||
!["INPUT", "TEXTAREA"].includes(target.tagName) &&
|
||||
["0", "1", "2", "3", "4", "j", "k", "l", ";", "s", " ", "p", "enter", "a", "s", "d", "f", "q", "x"].includes(event.key.toLowerCase())) {
|
||||
let cardElement: Element;
|
||||
window.siyuan.dialogs.find(item => {
|
||||
if (item.element.getAttribute("data-key") === Constants.DIALOG_OPENCARD) {
|
||||
cardElement = item.element;
|
||||
return true;
|
||||
}
|
||||
});
|
||||
if (!cardElement) {
|
||||
cardElement = document.querySelector(`.layout__wnd--active div[data-key="${Constants.DIALOG_OPENCARD}"]:not(.fn__none)`);
|
||||
}
|
||||
if (cardElement) {
|
||||
event.preventDefault();
|
||||
cardElement.dispatchEvent(new CustomEvent("click", {detail: event.key.toLowerCase()}));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// 仅处理以下快捷键操作
|
||||
if (isNotCtrl(event) && event.key !== "Escape" && !event.shiftKey && !event.altKey &&
|
||||
Constants.KEYCODELIST[event.keyCode] !== "PageUp" &&
|
||||
Constants.KEYCODELIST[event.keyCode] !== "PageDown" &&
|
||||
event.key !== "Home" && event.key !== "End" &&
|
||||
!/^F\d{1,2}$/.test(event.key) && event.key.indexOf("Arrow") === -1 && event.key !== "Enter" && event.key !== "Backspace" && event.key !== "Delete") {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!event.altKey && !event.shiftKey && isOnlyMeta(event)) {
|
||||
if ((isMac() ? event.key === "Meta" : event.key === "Control") || isOnlyMeta(event)) {
|
||||
window.siyuan.ctrlIsPressed = true;
|
||||
if ((event.key === "Meta" || event.key === "Control") &&
|
||||
window.siyuan.config.editor.floatWindowMode === 1 && !event.repeat) {
|
||||
showPopover(app);
|
||||
}
|
||||
} else {
|
||||
window.siyuan.ctrlIsPressed = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (!event.altKey && event.shiftKey && isNotCtrl(event)) {
|
||||
if (event.key === "Shift") {
|
||||
window.siyuan.shiftIsPressed = true;
|
||||
if (!event.repeat) {
|
||||
showPopover(app, true);
|
||||
}
|
||||
} else {
|
||||
window.siyuan.shiftIsPressed = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (event.altKey && !event.shiftKey && isNotCtrl(event)) {
|
||||
if (event.key === "Alt") {
|
||||
window.siyuan.altIsPressed = true;
|
||||
} else {
|
||||
window.siyuan.altIsPressed = false;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -74,6 +74,7 @@ import {historyKeydown} from "../../history/keydown";
|
|||
import {zoomOut} from "../../menus/protyle";
|
||||
import {getPlainText} from "../../protyle/util/paste";
|
||||
import {commandPanel, execByCommand} from "./commandPanel";
|
||||
import {filterHotkey} from "./commonHotkey";
|
||||
|
||||
const switchDialogEvent = (app: App, event: MouseEvent) => {
|
||||
event.preventDefault();
|
||||
|
@ -1099,71 +1100,9 @@ const panelTreeKeydown = (app: App, event: KeyboardEvent) => {
|
|||
|
||||
let switchDialog: Dialog;
|
||||
export const windowKeyDown = (app: App, event: KeyboardEvent) => {
|
||||
// https://github.com/siyuan-note/siyuan/issues/9848 忘记为什么要阻止了 .av__mask 的情况,测了下没问题就先移除
|
||||
if (document.getElementById("progress") || document.getElementById("errorLog") || event.isComposing) {
|
||||
if (filterHotkey(event, app)) {
|
||||
return;
|
||||
}
|
||||
const target = event.target as HTMLElement;
|
||||
if (isNotCtrl(event) && !event.shiftKey && !event.altKey &&
|
||||
!["INPUT", "TEXTAREA"].includes(target.tagName) &&
|
||||
["0", "1", "2", "3", "4", "j", "k", "l", ";", "s", " ", "p", "enter", "a", "s", "d", "f", "q", "x"].includes(event.key.toLowerCase())) {
|
||||
let cardElement: Element;
|
||||
window.siyuan.dialogs.find(item => {
|
||||
if (item.element.getAttribute("data-key") === Constants.DIALOG_OPENCARD) {
|
||||
cardElement = item.element;
|
||||
return true;
|
||||
}
|
||||
});
|
||||
if (!cardElement) {
|
||||
cardElement = document.querySelector(`.layout__wnd--active div[data-key="${Constants.DIALOG_OPENCARD}"]:not(.fn__none)`);
|
||||
}
|
||||
if (cardElement) {
|
||||
event.preventDefault();
|
||||
cardElement.dispatchEvent(new CustomEvent("click", {detail: event.key.toLowerCase()}));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// 仅处理以下快捷键操作
|
||||
if (isNotCtrl(event) && event.key !== "Escape" && !event.shiftKey && !event.altKey &&
|
||||
Constants.KEYCODELIST[event.keyCode] !== "PageUp" &&
|
||||
Constants.KEYCODELIST[event.keyCode] !== "PageDown" &&
|
||||
event.key !== "Home" && event.key !== "End" &&
|
||||
!/^F\d{1,2}$/.test(event.key) && event.key.indexOf("Arrow") === -1 && event.key !== "Enter" && event.key !== "Backspace" && event.key !== "Delete") {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!event.altKey && !event.shiftKey && isOnlyMeta(event)) {
|
||||
if ((isMac() ? event.key === "Meta" : event.key === "Control") || isOnlyMeta(event)) {
|
||||
window.siyuan.ctrlIsPressed = true;
|
||||
if ((event.key === "Meta" || event.key === "Control") &&
|
||||
window.siyuan.config.editor.floatWindowMode === 1 && !event.repeat) {
|
||||
showPopover(app);
|
||||
}
|
||||
} else {
|
||||
window.siyuan.ctrlIsPressed = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (!event.altKey && event.shiftKey && isNotCtrl(event)) {
|
||||
if (event.key === "Shift") {
|
||||
window.siyuan.shiftIsPressed = true;
|
||||
if (!event.repeat) {
|
||||
showPopover(app, true);
|
||||
}
|
||||
} else {
|
||||
window.siyuan.shiftIsPressed = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (event.altKey && !event.shiftKey && isNotCtrl(event)) {
|
||||
if (event.key === "Alt") {
|
||||
window.siyuan.altIsPressed = true;
|
||||
} else {
|
||||
window.siyuan.altIsPressed = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (switchDialog &&
|
||||
(matchAuxiliaryHotKey(window.siyuan.config.keymap.general.goToEditTabNext.custom, event) ||
|
||||
matchAuxiliaryHotKey(window.siyuan.config.keymap.general.goToEditTabPrev.custom, event))
|
||||
|
|
|
@ -28,123 +28,10 @@ import {initWindowEvent} from "./globalEvent/event";
|
|||
import {sendGlobalShortcut} from "./globalEvent/keydown";
|
||||
import {closeWindow} from "../window/closeWin";
|
||||
import {checkFold} from "../util/noRelyPCFunction";
|
||||
|
||||
const matchKeymap = (keymap: Config.IKeys, key1: "general" | "editor", key2?: "general" | "insert" | "heading" | "list" | "table") => {
|
||||
if (key1 === "general") {
|
||||
if (!window.siyuan.config.keymap[key1]) {
|
||||
/// #if !BROWSER
|
||||
ipcRenderer.send(Constants.SIYUAN_CMD, {
|
||||
cmd: "writeLog",
|
||||
msg: "window.siyuan.config.keymap.general is not found"
|
||||
});
|
||||
/// #endif
|
||||
window.siyuan.config.keymap[key1] = keymap as Config.IKeymapGeneral;
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
if (!window.siyuan.config.keymap[key1]) {
|
||||
/// #if !BROWSER
|
||||
ipcRenderer.send(Constants.SIYUAN_CMD, {
|
||||
cmd: "writeLog",
|
||||
msg: "window.siyuan.config.keymap.editor is not found"
|
||||
});
|
||||
/// #endif
|
||||
window.siyuan.config.keymap[key1] = JSON.parse(JSON.stringify(Constants.SIYUAN_KEYMAP.editor));
|
||||
return false;
|
||||
}
|
||||
if (!window.siyuan.config.keymap[key1][key2]) {
|
||||
/// #if !BROWSER
|
||||
ipcRenderer.send(Constants.SIYUAN_CMD, {
|
||||
cmd: "writeLog",
|
||||
msg: `window.siyuan.config.keymap.editor.${key2} is not found`
|
||||
});
|
||||
/// #endif
|
||||
(window.siyuan.config.keymap[key1][key2] as Config.IKeymapEditor[typeof key2]) = keymap as Config.IKeymapEditor[typeof key2];
|
||||
return false;
|
||||
}
|
||||
}
|
||||
let match = true;
|
||||
Object.keys(keymap).forEach(key => {
|
||||
if (key1 === "general") {
|
||||
if (!window.siyuan.config.keymap[key1][key] || window.siyuan.config.keymap[key1][key].default !== keymap[key].default) {
|
||||
/// #if !BROWSER
|
||||
ipcRenderer.send(Constants.SIYUAN_CMD, {
|
||||
cmd: "writeLog",
|
||||
msg: `window.siyuan.config.keymap.${key1}.${key} is not found or match: ${window.siyuan.config.keymap[key1][key]?.default}`
|
||||
});
|
||||
/// #endif
|
||||
match = false;
|
||||
window.siyuan.config.keymap[key1][key] = keymap[key];
|
||||
}
|
||||
} else {
|
||||
if (!window.siyuan.config.keymap[key1][key2][key] || window.siyuan.config.keymap[key1][key2][key].default !== keymap[key].default) {
|
||||
/// #if !BROWSER
|
||||
ipcRenderer.send(Constants.SIYUAN_CMD, {
|
||||
cmd: "writeLog",
|
||||
msg: `window.siyuan.config.keymap.${key1}.${key2}.${key} is not found or match: ${window.siyuan.config.keymap[key1][key2][key]?.default}`
|
||||
});
|
||||
/// #endif
|
||||
match = false;
|
||||
window.siyuan.config.keymap[key1][key2][key] = keymap[key];
|
||||
}
|
||||
}
|
||||
});
|
||||
return match;
|
||||
};
|
||||
|
||||
const hasKeymap = (keymap: Record<string, IKeymapItem>, key1: "general" | "editor", key2?: "general" | "insert" | "heading" | "list" | "table") => {
|
||||
let match = true;
|
||||
if (key1 === "editor") {
|
||||
if (Object.keys(window.siyuan.config.keymap[key1][key2]).length !== Object.keys(Constants.SIYUAN_KEYMAP[key1][key2]).length) {
|
||||
Object.keys(window.siyuan.config.keymap[key1][key2]).forEach(item => {
|
||||
if (!Constants.SIYUAN_KEYMAP[key1][key2][item]) {
|
||||
match = false;
|
||||
delete window.siyuan.config.keymap[key1][key2][item];
|
||||
}
|
||||
});
|
||||
}
|
||||
} else {
|
||||
if (Object.keys(window.siyuan.config.keymap[key1]).length !== Object.keys(Constants.SIYUAN_KEYMAP[key1]).length) {
|
||||
Object.keys(window.siyuan.config.keymap[key1]).forEach(item => {
|
||||
if (!Constants.SIYUAN_KEYMAP[key1][item]) {
|
||||
match = false;
|
||||
delete window.siyuan.config.keymap[key1][item];
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
return match;
|
||||
};
|
||||
import {correctHotkey} from "./globalEvent/commonHotkey";
|
||||
|
||||
export const onGetConfig = (isStart: boolean, app: App) => {
|
||||
const matchKeymap1 = matchKeymap(Constants.SIYUAN_KEYMAP.general, "general");
|
||||
const matchKeymap2 = matchKeymap(Constants.SIYUAN_KEYMAP.editor.general, "editor", "general");
|
||||
const matchKeymap3 = matchKeymap(Constants.SIYUAN_KEYMAP.editor.insert, "editor", "insert");
|
||||
const matchKeymap4 = matchKeymap(Constants.SIYUAN_KEYMAP.editor.heading, "editor", "heading");
|
||||
const matchKeymap5 = matchKeymap(Constants.SIYUAN_KEYMAP.editor.list, "editor", "list");
|
||||
const matchKeymap6 = matchKeymap(Constants.SIYUAN_KEYMAP.editor.table, "editor", "table");
|
||||
|
||||
const hasKeymap1 = hasKeymap(Constants.SIYUAN_KEYMAP.general, "general");
|
||||
const hasKeymap2 = hasKeymap(Constants.SIYUAN_KEYMAP.editor.general, "editor", "general");
|
||||
const hasKeymap3 = hasKeymap(Constants.SIYUAN_KEYMAP.editor.insert, "editor", "insert");
|
||||
const hasKeymap4 = hasKeymap(Constants.SIYUAN_KEYMAP.editor.heading, "editor", "heading");
|
||||
const hasKeymap5 = hasKeymap(Constants.SIYUAN_KEYMAP.editor.list, "editor", "list");
|
||||
const hasKeymap6 = hasKeymap(Constants.SIYUAN_KEYMAP.editor.table, "editor", "table");
|
||||
if (!window.siyuan.config.readonly &&
|
||||
(!matchKeymap1 || !matchKeymap2 || !matchKeymap3 || !matchKeymap4 || !matchKeymap5 || !matchKeymap6 ||
|
||||
!hasKeymap1 || !hasKeymap2 || !hasKeymap3 || !hasKeymap4 || !hasKeymap5 || !hasKeymap6)) {
|
||||
/// #if !BROWSER
|
||||
ipcRenderer.send(Constants.SIYUAN_CMD, {
|
||||
cmd: "writeLog",
|
||||
msg: "update keymap"
|
||||
});
|
||||
/// #endif
|
||||
fetchPost("/api/setting/setKeymap", {
|
||||
data: window.siyuan.config.keymap
|
||||
}, () => {
|
||||
sendGlobalShortcut(app);
|
||||
});
|
||||
}
|
||||
correctHotkey(app);
|
||||
/// #if !BROWSER
|
||||
ipcRenderer.invoke(Constants.SIYUAN_INIT, {
|
||||
languages: window.siyuan.languages["_trayMenu"],
|
||||
|
|
|
@ -26,6 +26,8 @@ import {saveScroll} from "../protyle/scroll/saveScroll";
|
|||
import {removeBlock} from "../protyle/wysiwyg/remove";
|
||||
import {isNotEditBlock} from "../protyle/wysiwyg/getBlock";
|
||||
import {updateCardHV} from "../card/util";
|
||||
import {mobileKeydown} from "./util/keydown";
|
||||
import {correctHotkey} from "../boot/globalEvent/commonHotkey";
|
||||
|
||||
class App {
|
||||
public plugins: import("../plugin").Plugin[] = [];
|
||||
|
@ -85,8 +87,8 @@ class App {
|
|||
updateCardHV();
|
||||
});
|
||||
fetchPost("/api/system/getConf", {}, async (confResponse) => {
|
||||
confResponse.data.conf.keymap = Constants.SIYUAN_KEYMAP;
|
||||
window.siyuan.config = confResponse.data.conf;
|
||||
correctHotkey(siyuanApp);
|
||||
await loadPlugins(this);
|
||||
getLocalStorage(() => {
|
||||
fetchGet(`/appearance/langs/${window.siyuan.config.appearance.lang}.json?v=${Constants.SIYUAN_VERSION}`, (lauguages: IObject) => {
|
||||
|
@ -116,6 +118,9 @@ class App {
|
|||
document.addEventListener("touchend", (event) => {
|
||||
handleTouchEnd(event, siyuanApp);
|
||||
}, false);
|
||||
window.addEventListener("keydown", (event) => {
|
||||
mobileKeydown(siyuanApp, event);
|
||||
});
|
||||
// 移动端删除键 https://github.com/siyuan-note/siyuan/issues/9259
|
||||
window.addEventListener("keydown", (event) => {
|
||||
if (getSelection().rangeCount > 0) {
|
||||
|
|
|
@ -62,6 +62,9 @@ export const initRightMenu = (app: App) => {
|
|||
<div id="menuSearch" class="b3-menu__item">
|
||||
<svg class="b3-menu__icon"><use xlink:href="#iconSearch"></use></svg><span class="b3-menu__label">${window.siyuan.languages.search}</span>
|
||||
</div>
|
||||
<div id="menuCommand" class="b3-menu__item">
|
||||
<svg class="b3-menu__icon"><use xlink:href="#iconTerminal"></use></svg><span class="b3-menu__label">${window.siyuan.languages.commandPanel}</span>
|
||||
</div>
|
||||
<div class="b3-menu__item${window.siyuan.config.readonly ? " fn__none" : ""}" id="menuSyncNow">
|
||||
<svg class="b3-menu__icon"><use xlink:href="#iconCloudSucc"></use></svg><span class="b3-menu__label">${window.siyuan.languages.syncNow}</span>
|
||||
</div>
|
||||
|
@ -136,6 +139,12 @@ export const initRightMenu = (app: App) => {
|
|||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
break;
|
||||
} else if (target.id === "menuCommand") {
|
||||
closePanel();
|
||||
commandPanel(app);
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
break;
|
||||
} else if (target.id === "menuSearch") {
|
||||
popSearch(app);
|
||||
event.preventDefault();
|
||||
|
@ -178,16 +187,6 @@ export const initRightMenu = (app: App) => {
|
|||
break;
|
||||
} else if (target.id === "menuPlugin") {
|
||||
const menu = new Menu();
|
||||
menu.addItem({
|
||||
icon: "iconTerminal",
|
||||
label: window.siyuan.languages.commandPanel,
|
||||
click() {
|
||||
commandPanel(app);
|
||||
}
|
||||
});
|
||||
if (unPinsMenu.length > 0) {
|
||||
menu.addSeparator();
|
||||
}
|
||||
unPinsMenu.forEach(item => {
|
||||
menu.addItem(item);
|
||||
});
|
||||
|
|
18
app/src/mobile/util/keydown.ts
Normal file
18
app/src/mobile/util/keydown.ts
Normal file
|
@ -0,0 +1,18 @@
|
|||
import {App} from "../../index";
|
||||
import {execByCommand} from "../../boot/globalEvent/commandPanel";
|
||||
import {matchHotKey} from "../../protyle/util/hotKey";
|
||||
import {getCurrentEditor} from "../editor";
|
||||
import {filterHotkey} from "../../boot/globalEvent/commonHotkey";
|
||||
|
||||
export const mobileKeydown = (app: App, event: KeyboardEvent) => {
|
||||
if (filterHotkey(event, app)) {
|
||||
return;
|
||||
}
|
||||
const protyle = getCurrentEditor().protyle;
|
||||
Object.keys(window.siyuan.config.keymap.general).find((key) => {
|
||||
if (matchHotKey(window.siyuan.config.keymap.general[key].custom, event)) {
|
||||
execByCommand({command: key, app, protyle, previousRange: protyle.toolbar.range});
|
||||
return true;
|
||||
}
|
||||
});
|
||||
}
|
|
@ -58,26 +58,32 @@ export const addEditorToDatabase = (protyle: IProtyle, range: Range, type?: stri
|
|||
focusByRange(range);
|
||||
});
|
||||
} else {
|
||||
const selectElement: Element[] = [];
|
||||
protyle.wysiwyg.element.querySelectorAll(".protyle-wysiwyg--select").forEach(item => {
|
||||
selectElement.push(item);
|
||||
let targetElement: HTMLElement
|
||||
const ids: string[] = []
|
||||
protyle.wysiwyg.element.querySelectorAll(".protyle-wysiwyg--select").forEach((item: HTMLElement) => {
|
||||
if (!targetElement) {
|
||||
targetElement = item;
|
||||
}
|
||||
ids.push(item.getAttribute("data-node-id"));
|
||||
});
|
||||
if (selectElement.length === 0) {
|
||||
if (!targetElement) {
|
||||
const nodeElement = hasClosestBlock(range.startContainer);
|
||||
if (nodeElement) {
|
||||
selectElement.push(nodeElement);
|
||||
targetElement = nodeElement;
|
||||
ids.push(nodeElement.getAttribute("data-node-id"));
|
||||
}
|
||||
}
|
||||
if (selectElement.length === 0) {
|
||||
return;
|
||||
if (!targetElement) {
|
||||
targetElement = protyle.wysiwyg.element;
|
||||
ids.push(protyle.block.rootID);
|
||||
}
|
||||
openSearchAV("", selectElement[0] as HTMLElement, (listItemElement) => {
|
||||
openSearchAV("", targetElement, (listItemElement) => {
|
||||
const srcIDs: string[] = [];
|
||||
const srcs: IOperationSrcs[] = [];
|
||||
selectElement.forEach(item => {
|
||||
srcIDs.push(item.getAttribute("data-node-id"));
|
||||
ids.forEach(item => {
|
||||
srcIDs.push(item);
|
||||
srcs.push({
|
||||
id: item.getAttribute("data-node-id"),
|
||||
id: item,
|
||||
isDetached: false
|
||||
});
|
||||
});
|
||||
|
|
Loading…
Add table
Reference in a new issue