`;
});
let range: Range;
if (getSelection().rangeCount > 0) {
range = getSelection().getRangeAt(0).cloneRange();
}
switchDialog = new Dialog({
content: `
${dockHtml}
${tabHtml}
`,
disableClose: true,
disableAnimation: true,
transparent: true,
destroyCallback: () => {
if (range && range.getBoundingClientRect().height !== 0) {
focusByRange(range);
}
}
});
// 需移走光标,否则编辑器会继续监听并执行按键操作
switchDialog.element.querySelector("input").focus();
if (isMac()) {
switchDialog.element.addEventListener("contextmenu", (event) => {
switchDialogEvent(event, switchDialog);
});
}
switchDialog.element.addEventListener("click", (event) => {
switchDialogEvent(event, switchDialog);
});
return;
}
if (matchHotKey(window.siyuan.config.keymap.general.recentDocs.custom, event)) {
event.preventDefault();
if (window.siyuan.dialogs.length > 0) {
hideElements(["dialog"]);
return;
}
return;
}
if (matchHotKey(window.siyuan.config.keymap.general.syncNow.custom, event)) {
event.preventDefault();
syncGuide(document.querySelector("#barSync"));
return;
}
if (matchHotKey(window.siyuan.config.keymap.general.editMode.custom, event)) {
event.preventDefault();
editor.setMode();
return;
}
if (matchHotKey(window.siyuan.config.keymap.general.lockScreen.custom, event)) {
exportLayout(false, () => {
fetchPost("/api/system/logoutAuth", {}, () => {
window.location.href = "/";
});
});
event.preventDefault();
return;
}
if (matchHotKey(window.siyuan.config.keymap.general.dataHistory.custom, event)) {
openHistory();
event.preventDefault();
return;
}
if (!window.siyuan.config.readonly && matchHotKey(window.siyuan.config.keymap.general.config.custom, event)) {
openSetting();
event.preventDefault();
return;
}
const target = event.target as HTMLElement;
if (matchHotKey("⌘A", event) && target.tagName !== "INPUT" && target.tagName !== "TEXTAREA") {
event.preventDefault();
return;
}
const matchDock = getAllDocks().find(item => {
if (matchHotKey(window.siyuan.config.keymap.general[item.hotkeyLangId].custom, event)) {
getDockByType(item.type).toggleModel(item.type);
if (target.classList.contains("protyle-wysiwyg") ||
target.classList.contains("protyle-title__input") ||
target.tagName === "INPUT" || target.tagName === "TEXTAREA") {
target.blur();
}
event.preventDefault();
return true;
}
});
if (matchDock) {
return;
}
if (matchHotKey(window.siyuan.config.keymap.general.dailyNote.custom, event)) {
newDailyNote();
if (target.classList.contains("protyle-wysiwyg") ||
target.classList.contains("protyle-title__input") ||
target.tagName === "INPUT" || target.tagName === "TEXTAREA") {
target.blur();
}
event.preventDefault();
return;
}
if (matchHotKey(window.siyuan.config.keymap.general.newFile.custom, event)) {
newFile(undefined, undefined, true);
event.preventDefault();
return;
}
if (event.key === "Escape" && !event.isComposing) {
const imgPreviewElement = document.querySelector(".protyle-img");
if (imgPreviewElement) {
imgPreviewElement.remove();
return;
}
if (!window.siyuan.menus.menu.element.classList.contains("fn__none")) {
window.siyuan.menus.menu.remove();
return;
}
if (window.siyuan.dialogs.length > 0) {
hideElements(["dialog"]);
return;
}
// remove blockpopover
const maxEditLevels: { [key: string]: number } = {oid: 0};
window.siyuan.blockPanels.forEach((item) => {
if (item.targetElement && item.element.getAttribute("data-pin") === "true") {
const level = parseInt(item.element.getAttribute("data-level"));
const oid = item.element.getAttribute("data-oid");
if (maxEditLevels[oid]) {
if (level > maxEditLevels[oid]) {
maxEditLevels[oid] = level;
}
} else {
maxEditLevels[oid] = 1;
}
}
});
let destroyBlock = false;
for (let i = 0; i < window.siyuan.blockPanels.length; i++) {
const item = window.siyuan.blockPanels[i];
if (item.targetElement && item.element.getAttribute("data-pin") === "false" &&
parseInt(item.element.getAttribute("data-level")) > (maxEditLevels[item.element.getAttribute("data-oid")] || 0)) {
item.destroy();
if (item.esc) {
item.esc();
}
destroyBlock = true;
i--;
}
}
if (destroyBlock) {
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) {
focusByRange(range);
return;
}
} else {
range = document.createRange();
}
const lastBackStack = window.siyuan.backStack[window.siyuan.backStack.length - 1];
if (lastBackStack && lastBackStack.protyle.toolbar.range) {
focusByRange(lastBackStack.protyle.toolbar.range);
} else {
const editor = getAllModels().editor[0];
if (editor) {
focusBlock(editor.editor.protyle.wysiwyg.element.firstElementChild);
}
}
event.preventDefault();
return;
}
if (matchHotKey(window.siyuan.config.keymap.general.goForward.custom, event)) {
goForward();
event.preventDefault();
return;
}
if (matchHotKey(window.siyuan.config.keymap.general.goBack.custom, event)) {
goBack();
event.preventDefault();
return;
}
const confirmElement = document.querySelector("#confirmDialogConfirmBtn");
if (confirmElement && event.key === "Enter") {
confirmElement.dispatchEvent(new CustomEvent("click"));
event.preventDefault();
return;
}
// close tab
if (matchHotKey(window.siyuan.config.keymap.general.closeTab.custom, event) && !event.repeat) {
event.preventDefault();
let activeTabElement = document.querySelector(".layout__tab--active");
if (activeTabElement && activeTabElement.getBoundingClientRect().width > 0) {
let type: TDockType;
Array.from(activeTabElement.classList).find(item => {
if (item.startsWith("sy__")) {
type = item.replace("sy__", "") as TDockType;
return true;
}
});
if (type) {
getDockByType(type).toggleModel(type, false, true);
}
return;
}
activeTabElement = document.querySelector(".layout__wnd--active .item--focus");
if (activeTabElement) {
const tab = getInstanceById(activeTabElement.getAttribute("data-id")) as Tab;
tab.parent.removeTab(tab.id);
return;
}
getAllTabs().find(item => {
if (item.headElement?.classList.contains("item--focus")) {
item.parent.removeTab(item.id);
return true;
}
});
return;
}
if (matchHotKey(window.siyuan.config.keymap.general.stickSearch.custom, event)) {
if (getSelection().rangeCount > 0) {
const range = getSelection().getRangeAt(0);
openGlobalSearch(range.toString(), false);
} else {
openGlobalSearch("", false);
}
event.preventDefault();
return;
}
if (editKeydown(event)) {
return;
}
// 文件树的操作
if (fileTreeKeydown(event)) {
return;
}
// 面板的操作
if (panelTreeKeydown(event)) {
return;
}
let searchKey = "";
if (matchHotKey(window.siyuan.config.keymap.general.replace.custom, event)) {
searchKey = window.siyuan.config.keymap.general.replace.custom;
} else if (!hasClosestByClassName(target, "pdf__outer") && matchHotKey(window.siyuan.config.keymap.general.search.custom, event)) {
searchKey = window.siyuan.config.keymap.general.search.custom;
} else if (matchHotKey(window.siyuan.config.keymap.general.globalSearch.custom, event)) {
searchKey = window.siyuan.config.keymap.general.globalSearch.custom;
}
if (searchKey) {
if (getSelection().rangeCount > 0) {
const range = getSelection().getRangeAt(0);
openSearch(searchKey, range.toString());
} else {
openSearch(searchKey);
}
event.preventDefault();
return;
}
// https://github.com/siyuan-note/insider/issues/445
if (matchHotKey("⌘S", event)) {
event.preventDefault();
return true;
}
});
window.addEventListener("blur", () => {
window.siyuan.ctrlIsPressed = false;
window.siyuan.shiftIsPressed = false;
window.siyuan.altIsPressed = false;
});
window.addEventListener("click", (event: MouseEvent & { target: HTMLElement }) => {
if (!window.siyuan.menus.menu.element.contains(event.target) && !hasClosestByAttribute(event.target, "data-menu", "true")) {
if (getSelection().rangeCount > 0 && window.siyuan.menus.menu.element.contains(getSelection().getRangeAt(0).startContainer)) {
// https://ld246.com/article/1654567749834/comment/1654589171218#comments
} else {
window.siyuan.menus.menu.remove();
}
}
if (!hasClosestByClassName(event.target, "pdf__outer")) {
document.querySelectorAll(".pdf__util").forEach(item => {
item.classList.add("fn__none");
});
}
const copyElement = hasTopClosestByClassName(event.target, "protyle-action__copy");
if (copyElement) {
writeText(copyElement.parentElement.nextElementSibling.textContent.trimEnd());
showMessage(window.siyuan.languages.copied, 2000);
event.preventDefault();
}
// 点击空白,pdf 搜索、更多消失
if (hasClosestByAttribute(event.target, "id", "secondaryToolbarToggle") ||
hasClosestByAttribute(event.target, "id", "viewFind") ||
hasClosestByAttribute(event.target, "id", "findbar")) {
return;
}
let currentPDFViewerObject: any;
getAllModels().asset.find(item => {
if (item.pdfObject &&
!item.pdfObject.appConfig.appContainer.classList.contains("fn__none")) {
currentPDFViewerObject = item.pdfObject;
return true;
}
});
if (!currentPDFViewerObject) {
return;
}
if (currentPDFViewerObject.secondaryToolbar.isOpen) {
currentPDFViewerObject.secondaryToolbar.close();
}
if (
!currentPDFViewerObject.supportsIntegratedFind &&
currentPDFViewerObject.findBar.opened
) {
currentPDFViewerObject.findBar.close();
}
});
};
const editKeydown = (event: KeyboardEvent) => {
const activeTabElement = document.querySelector(".layout__wnd--active .item--focus");
let protyle: IProtyle;
if (activeTabElement) {
const tab = getInstanceById(activeTabElement.getAttribute("data-id")) as Tab;
if (!(tab.model instanceof Editor)) {
return false;
}
protyle = tab.model.editor.protyle;
} else {
const editor = getAllModels().editor.find(item => {
if (item.parent.headElement.classList.contains("item--focus")) {
return true;
}
});
if (!editor) {
return false;
}
protyle = editor.editor.protyle;
}
const activePanelElement = document.querySelector(".layout__tab--active");
let isFileFocus = false;
if (activePanelElement && activePanelElement.classList.contains("sy__file")) {
isFileFocus = true;
}
let searchKey = "";
if (matchHotKey(window.siyuan.config.keymap.general.replace.custom, event)) {
searchKey = window.siyuan.config.keymap.general.replace.custom;
} else if (matchHotKey(window.siyuan.config.keymap.general.search.custom, event)) {
searchKey = window.siyuan.config.keymap.general.search.custom;
}
if (!isFileFocus && searchKey) {
let range: Range;
if (getSelection().rangeCount > 0) {
range = getSelection().getRangeAt(0);
}
if (range && protyle.element.contains(range.startContainer)) {
openSearch(searchKey, range.toString(), protyle.notebookId, protyle.path);
} else {
openSearch(searchKey);
}
event.preventDefault();
return true;
}
if (!isFileFocus && matchHotKey(window.siyuan.config.keymap.general.move.custom, event)) {
let range: Range;
let nodeElement: false | HTMLElement;
if (getSelection().rangeCount > 0) {
range = getSelection().getRangeAt(0);
nodeElement = hasClosestBlock(range.startContainer);
}
if (protyle.title?.editElement.contains(range.startContainer)) {
movePathTo((toPath, toNotebook) => {
moveToPath([protyle.path], toNotebook[0], toPath[0]);
}, [protyle.path], range);
} else if (nodeElement && range && protyle.element.contains(range.startContainer)) {
let selectElements = Array.from(protyle.wysiwyg.element.querySelectorAll(".protyle-wysiwyg--select"));
if (selectElements.length === 0) {
selectElements = [nodeElement];
}
movePathTo((toPath) => {
hintMoveBlock(toPath[0], selectElements, protyle);
});
}
event.preventDefault();
return true;
}
const target = event.target as HTMLElement;
if (target.tagName === "INPUT" || target.tagName === "TEXTAREA" || hasClosestByAttribute(target, "contenteditable", null)) {
return false;
}
if (matchHotKey(window.siyuan.config.keymap.editor.general.preview.custom, event)) {
setEditMode(protyle, "preview");
event.preventDefault();
return true;
}
if (matchHotKey(window.siyuan.config.keymap.editor.general.wysiwyg.custom, event) && !protyle.options.backlinkData) {
setEditMode(protyle, "wysiwyg");
protyle.scroll.lastScrollTop = 0;
fetchPost("/api/filetree/getDoc", {
id: protyle.block.parentID,
size: window.siyuan.config.editor.dynamicLoadBlocks,
}, getResponse => {
onGet(getResponse, protyle);
});
event.preventDefault();
return true;
}
// 没有光标时,无法撤销 https://ld246.com/article/1624021111567
if (matchHotKey(window.siyuan.config.keymap.editor.general.undo.custom, event)) {
protyle.undo.undo(protyle);
event.preventDefault();
return true;
}
if (matchHotKey(window.siyuan.config.keymap.editor.general.redo.custom, event)) {
protyle.undo.redo(protyle);
event.preventDefault();
return true;
}
return false;
};
const fileTreeKeydown = (event: KeyboardEvent) => {
const dockFile = getDockByType("file");
if (!dockFile) {
return false;
}
const files = dockFile.data.file as Files;
if (matchHotKey(window.siyuan.config.keymap.general.selectOpen1.custom, event)) {
event.preventDefault();
const element = document.querySelector(".layout__wnd--active > .fn__flex > .layout-tab-bar > .item--focus") ||
document.querySelector(".layout-tab-bar > .item--focus");
if (element) {
const tab = getInstanceById(element.getAttribute("data-id")) as Tab;
if (tab && tab.model instanceof Editor) {
tab.model.editor.protyle.wysiwyg.element.blur();
tab.model.editor.protyle.title.editElement.blur();
files.selectItem(tab.model.editor.protyle.notebookId, tab.model.editor.protyle.path);
}
}
dockFile.toggleModel("file", true);
return;
}
if (!files.element.parentElement.classList.contains("layout__tab--active")) {
return false;
}
const liElements = Array.from(files.element.querySelectorAll(".b3-list-item--focus"));
if (liElements.length === 0) {
if (event.key.startsWith("Arrow")) {
const liElement = files.element.querySelector(".b3-list-item");
if (liElement) {
liElement.classList.add("b3-list-item--focus");
}
event.preventDefault();
}
return false;
}
const topULElement = hasTopClosestByTag(liElements[0], "UL");
if (!topULElement) {
return false;
}
const notebookId = topULElement.getAttribute("data-url");
const pathString = liElements[0].getAttribute("data-path");
const isFile = liElements[0].getAttribute("data-type") === "navigation-file";
if (matchHotKey(window.siyuan.config.keymap.editor.general.rename.custom, event)) {
window.siyuan.menus.menu.remove();
rename({
notebookId,
path: pathString,
name: isFile ? getDisplayName(liElements[0].getAttribute("data-name"), false, true) : getNotebookName(notebookId),
type: isFile ? "file" : "notebook",
});
event.preventDefault();
return true;
}
if (matchHotKey("⌘/", event)) {
const liRect = liElements[0].getBoundingClientRect();
if (isFile) {
initFileMenu(notebookId, pathString, liElements[0]).popup({
x: liRect.right - 15,
y: liRect.top + 15
});
} else {
initNavigationMenu(liElements[0] as HTMLElement).popup({x: liRect.right - 15, y: liRect.top + 15});
}
return true;
}
if (isFile && matchHotKey(window.siyuan.config.keymap.general.move.custom, event)) {
window.siyuan.menus.menu.remove();
const pathes = getTopPaths(liElements);
movePathTo((toPath, toNotebook) => {
moveToPath(pathes, toNotebook[0], toPath[0]);
}, pathes);
event.preventDefault();
return true;
}
let searchKey = "";
if (matchHotKey(window.siyuan.config.keymap.general.replace.custom, event)) {
searchKey = window.siyuan.config.keymap.general.replace.custom;
} else if (matchHotKey(window.siyuan.config.keymap.general.search.custom, event)) {
searchKey = window.siyuan.config.keymap.general.search.custom;
}
if (searchKey) {
window.siyuan.menus.menu.remove();
if (isFile) {
openSearch(searchKey, undefined, notebookId, getDisplayName(pathString, false, true));
} else {
openSearch(searchKey, undefined, notebookId);
}
event.preventDefault();
return true;
}
const target = event.target as HTMLElement;
if (target.tagName === "INPUT" || target.tagName === "TEXTAREA" || hasClosestByAttribute(target, "contenteditable", null)) {
return false;
}
if (bindMenuKeydown(event)) {
event.preventDefault();
return true;
}
if (event.shiftKey) {
if (event.key === "ArrowUp") {
const startEndElement = getStartEndElement(liElements);
let previousElement: Element;
if (startEndElement.startElement.getBoundingClientRect().top >= startEndElement.endElement.getBoundingClientRect().top) {
previousElement = getPreviousFileLi(startEndElement.endElement) as Element;
if (previousElement) {
previousElement.classList.add("b3-list-item--focus");
previousElement.setAttribute("select-end", "true");
startEndElement.endElement.removeAttribute("select-end");
}
} else {
startEndElement.endElement.classList.remove("b3-list-item--focus");
startEndElement.endElement.removeAttribute("select-end");
previousElement = getPreviousFileLi(startEndElement.endElement) as Element;
if (previousElement) {
previousElement.setAttribute("select-end", "true");
}
}
if (previousElement) {
const previousRect = previousElement.getBoundingClientRect();
const fileRect = files.element.getBoundingClientRect();
if (previousRect.top < fileRect.top || previousRect.bottom > fileRect.bottom) {
previousElement.scrollIntoView(previousRect.top < fileRect.top);
}
}
} else if (event.key === "ArrowDown") {
const startEndElement = getStartEndElement(liElements);
let nextElement: Element;
if (startEndElement.startElement.getBoundingClientRect().top <= startEndElement.endElement.getBoundingClientRect().top) {
nextElement = getNextFileLi(startEndElement.endElement) as Element;
if (nextElement) {
nextElement.classList.add("b3-list-item--focus");
nextElement.setAttribute("select-end", "true");
startEndElement.endElement.removeAttribute("select-end");
}
} else {
startEndElement.endElement.classList.remove("b3-list-item--focus");
startEndElement.endElement.removeAttribute("select-end");
nextElement = getNextFileLi(startEndElement.endElement) as Element;
if (nextElement) {
nextElement.setAttribute("select-end", "true");
}
}
if (nextElement) {
const nextRect = nextElement.getBoundingClientRect();
const fileRect = files.element.getBoundingClientRect();
if (nextRect.top < fileRect.top || nextRect.bottom > fileRect.bottom) {
nextElement.scrollIntoView(nextRect.top < fileRect.top);
}
}
}
return;
} else {
files.element.querySelector('[select-end="true"]')?.removeAttribute("select-end");
files.element.querySelector('[select-start="true"]')?.removeAttribute("select-start");
if ((event.key === "ArrowRight" && !liElements[0].querySelector(".b3-list-item__arrow--open") && !liElements[0].querySelector(".b3-list-item__toggle").classList.contains("fn__hidden")) ||
(event.key === "ArrowLeft" && liElements[0].querySelector(".b3-list-item__arrow--open"))) {
files.getLeaf(liElements[0], notebookId);
liElements.forEach((item, index) => {
if (index !== 0) {
item.classList.remove("b3-list-item--focus");
}
});
event.preventDefault();
return true;
}
if (event.key === "ArrowLeft") {
let parentElement = liElements[0].parentElement.previousElementSibling;
if (parentElement) {
if (parentElement.tagName !== "LI") {
parentElement = files.element.querySelector(".b3-list-item");
}
liElements.forEach((item) => {
item.classList.remove("b3-list-item--focus");
});
parentElement.classList.add("b3-list-item--focus");
const parentRect = parentElement.getBoundingClientRect();
const fileRect = files.element.getBoundingClientRect();
if (parentRect.top < fileRect.top || parentRect.bottom > fileRect.bottom) {
parentElement.scrollIntoView(parentRect.top < fileRect.top);
}
}
event.preventDefault();
return true;
}
if (event.key === "ArrowDown" || event.key === "ArrowRight") {
let nextElement = liElements[0];
while (nextElement) {
if (nextElement.nextElementSibling) {
if (nextElement.nextElementSibling.tagName === "UL") {
nextElement = nextElement.nextElementSibling.firstElementChild;
} else {
nextElement = nextElement.nextElementSibling;
}
break;
} else {
if (nextElement.parentElement.classList.contains("fn__flex-1")) {
break;
} else {
nextElement = nextElement.parentElement;
}
}
}
if (nextElement.classList.contains("b3-list-item")) {
liElements.forEach((item) => {
item.classList.remove("b3-list-item--focus");
});
nextElement.classList.add("b3-list-item--focus");
const nextRect = nextElement.getBoundingClientRect();
const fileRect = files.element.getBoundingClientRect();
if (nextRect.top < fileRect.top || nextRect.bottom > fileRect.bottom) {
nextElement.scrollIntoView(nextRect.top < fileRect.top);
}
}
event.preventDefault();
return true;
}
if (event.key === "ArrowUp") {
let previousElement = liElements[0];
while (previousElement) {
if (previousElement.previousElementSibling) {
if (previousElement.previousElementSibling.tagName === "LI") {
previousElement = previousElement.previousElementSibling;
} else {
const liElements = previousElement.previousElementSibling.querySelectorAll(".b3-list-item");
previousElement = liElements[liElements.length - 1];
}
break;
} else {
if (previousElement.parentElement.classList.contains("fn__flex-1")) {
break;
} else {
previousElement = previousElement.parentElement;
}
}
}
if (previousElement.classList.contains("b3-list-item")) {
liElements.forEach((item) => {
item.classList.remove("b3-list-item--focus");
});
previousElement.classList.add("b3-list-item--focus");
const previousRect = previousElement.getBoundingClientRect();
const fileRect = files.element.getBoundingClientRect();
if (previousRect.top < fileRect.top || previousRect.bottom > fileRect.bottom) {
previousElement.scrollIntoView(previousRect.top < fileRect.top);
}
}
event.preventDefault();
return true;
}
}
if (event.key === "Delete" || (event.key === "Backspace" && isMac())) {
window.siyuan.menus.menu.remove();
deleteFiles(liElements);
return true;
}
if (event.key === "Enter") {
window.siyuan.menus.menu.remove();
liElements.forEach(item => {
if (item.getAttribute("data-type") === "navigation-file") {
openFileById({id: item.getAttribute("data-node-id"), action: [Constants.CB_GET_FOCUS]});
} else {
const itemTopULElement = hasTopClosestByTag(item, "UL");
if (itemTopULElement) {
files.getLeaf(item, itemTopULElement.getAttribute("data-url"));
}
}
});
return true;
}
};
const panelTreeKeydown = (event: KeyboardEvent) => {
// 面板折叠展开操作
if (!matchHotKey(window.siyuan.config.keymap.editor.general.collapse.custom, event) &&
!matchHotKey(window.siyuan.config.keymap.editor.general.expand.custom, event) &&
!event.key.startsWith("Arrow") && event.key !== "Enter") {
return false;
}
let activePanelElement = document.querySelector(".layout__tab--active");
if (!activePanelElement) {
Array.from(document.querySelectorAll(".layout__wnd--active .layout-tab-container > div")).find(item => {
if (!item.classList.contains("fn__none") && item.className.indexOf("sy__") > -1) {
activePanelElement = item;
return true;
}
});
}
if (!activePanelElement) {
return false;
}
if (activePanelElement.className.indexOf("sy__") === -1) {
return false;
}
if (!event.repeat && matchHotKey(window.siyuan.config.keymap.editor.general.collapse.custom, event)) {
const collapseElement = activePanelElement.querySelector('.block__icon[data-type="collapse"]');
if (collapseElement) {
collapseElement.dispatchEvent(new CustomEvent("click"));
event.preventDefault();
return true;
}
}
if (!event.repeat && matchHotKey(window.siyuan.config.keymap.editor.general.expand.custom, event)) {
const expandElement = activePanelElement.querySelector('.block__icon[data-type="expand"]');
if (expandElement) {
expandElement.dispatchEvent(new CustomEvent("click"));
event.preventDefault();
return true;
}
}
if (activePanelElement.classList.contains("sy__inbox") ||
activePanelElement.classList.contains("sy__globalGraph") ||
activePanelElement.classList.contains("sy__graph")) {
return false;
}
const model = (getInstanceById(activePanelElement.getAttribute("data-id"), window.siyuan.layout.layout) as Tab)?.model;
if (!model) {
return false;
}
let activeItemElement = activePanelElement.querySelector(".b3-list-item--focus");
if (!activeItemElement) {
activeItemElement = activePanelElement.querySelector(".b3-list .b3-list-item");
if (activeItemElement) {
activeItemElement.classList.add("b3-list-item--focus");
}
return false;
}
let tree = (model as Backlink).tree;
if (activeItemElement.parentElement.parentElement.classList.contains("backlinkMList")) {
tree = (model as Backlink).mTree;
}
if (event.key === "Enter") {
tree.click(activeItemElement);
event.preventDefault();
return true;
}
const arrowElement = activeItemElement.querySelector(".b3-list-item__arrow");
if ((event.key === "ArrowRight" && !arrowElement.classList.contains("b3-list-item__arrow--open") && !arrowElement.parentElement.classList.contains("fn__hidden")) ||
(event.key === "ArrowLeft" && arrowElement.classList.contains("b3-list-item__arrow--open") && !arrowElement.parentElement.classList.contains("fn__hidden"))) {
tree.toggleBlocks(activeItemElement);
event.preventDefault();
return true;
}
const ulElement = hasClosestByClassName(activeItemElement, "b3-list");
if (!ulElement) {
return false;
}
if (event.key === "ArrowLeft") {
let parentElement = activeItemElement.parentElement.previousElementSibling;
if (parentElement) {
if (parentElement.tagName !== "LI") {
parentElement = ulElement.querySelector(".b3-list-item");
}
activeItemElement.classList.remove("b3-list-item--focus");
parentElement.classList.add("b3-list-item--focus");
const parentRect = parentElement.getBoundingClientRect();
const scrollRect = ulElement.parentElement.getBoundingClientRect();
if (parentRect.top < scrollRect.top || parentRect.bottom > scrollRect.bottom) {
parentElement.scrollIntoView(parentRect.top < scrollRect.top);
}
}
event.preventDefault();
return true;
}
if (event.key === "ArrowDown" || event.key === "ArrowRight") {
let nextElement = activeItemElement;
while (nextElement) {
if (nextElement.nextElementSibling) {
if (nextElement.nextElementSibling.tagName === "UL") {
if (nextElement.nextElementSibling.classList.contains("fn__none")) { // 遇到折叠内容
if (nextElement.nextElementSibling.nextElementSibling) {
nextElement = nextElement.nextElementSibling.nextElementSibling;
}
} else {
nextElement = nextElement.nextElementSibling.firstElementChild;
}
} else if (nextElement.nextElementSibling.classList.contains("protyle")) { // backlink
if (nextElement.nextElementSibling.nextElementSibling) {
nextElement = nextElement.nextElementSibling.nextElementSibling;
}
} else {
nextElement = nextElement.nextElementSibling;
}
break;
} else {
if (nextElement.parentElement.classList.contains("fn__flex-1")) {
break;
} else {
nextElement = nextElement.parentElement;
}
}
}
if (nextElement.classList.contains("b3-list-item") && !nextElement.classList.contains("b3-list-item--focus")) {
activeItemElement.classList.remove("b3-list-item--focus");
nextElement.classList.add("b3-list-item--focus");
const nextRect = nextElement.getBoundingClientRect();
const scrollRect = ulElement.parentElement.getBoundingClientRect();
if (nextRect.top < scrollRect.top || nextRect.bottom > scrollRect.bottom) {
nextElement.scrollIntoView(nextRect.top < scrollRect.top);
}
}
event.preventDefault();
return true;
}
if (event.key === "ArrowUp") {
let previousElement = activeItemElement;
while (previousElement) {
if (previousElement.previousElementSibling) {
if (previousElement.previousElementSibling.tagName === "LI") {
previousElement = previousElement.previousElementSibling;
} else if (previousElement.previousElementSibling.classList.contains("protyle")) {
if (previousElement.previousElementSibling.previousElementSibling) {
previousElement = previousElement.previousElementSibling.previousElementSibling;
}
} else if (previousElement.previousElementSibling.tagName === "UL" && previousElement.previousElementSibling.classList.contains("fn__none")) { // 遇到折叠内容
if (previousElement.previousElementSibling.previousElementSibling) {
previousElement = previousElement.previousElementSibling.previousElementSibling;
}
} else {
const liElements = previousElement.previousElementSibling.querySelectorAll(".b3-list-item");
previousElement = liElements[liElements.length - 1];
}
break;
} else {
if (previousElement.parentElement.classList.contains("fn__flex-1")) {
break;
} else {
previousElement = previousElement.parentElement;
}
}
}
if (previousElement.classList.contains("b3-list-item") && !previousElement.classList.contains("b3-list-item--focus")) {
activeItemElement.classList.remove("b3-list-item--focus");
previousElement.classList.add("b3-list-item--focus");
const previousRect = previousElement.getBoundingClientRect();
const scrollRect = ulElement.parentElement.getBoundingClientRect();
if (previousRect.top < scrollRect.top || previousRect.bottom > scrollRect.bottom) {
previousElement.scrollIntoView(previousRect.top < scrollRect.top);
}
}
event.preventDefault();
return true;
}
return false;
};