Vanessa 2024-05-06 00:02:56 +08:00
parent 6e90a9426b
commit 573013598c
8 changed files with 320 additions and 235 deletions

View file

@ -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
};

View 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;
}
}
}

View file

@ -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))

View file

@ -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"],

View file

@ -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) {

View file

@ -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);
});

View 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;
}
});
}

View file

@ -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
});
});