mirror of
https://github.com/siyuan-note/siyuan.git
synced 2026-01-07 01:08:49 +01:00
130 lines
6.1 KiB
TypeScript
130 lines
6.1 KiB
TypeScript
import {matchHotKey} from "../../util/hotKey";
|
|
import {selectRow} from "./row";
|
|
import {cellScrollIntoView, popTextCell} from "./cell";
|
|
|
|
export const avKeydown = (event: KeyboardEvent, nodeElement: HTMLElement, protyle: IProtyle) => {
|
|
if (!nodeElement.classList.contains("av")) {
|
|
return false;
|
|
}
|
|
if (event.isComposing) {
|
|
event.stopPropagation();
|
|
return true;
|
|
}
|
|
// 避免浏览器默认快捷键
|
|
if (matchHotKey("⌘B", event) || matchHotKey("⌘I", event) || matchHotKey("⌘U", event)) {
|
|
event.preventDefault();
|
|
return true;
|
|
}
|
|
const selectCellElement = nodeElement.querySelector(".av__cell--select") as HTMLElement;
|
|
if (selectCellElement) {
|
|
if (event.key === "Escape") {
|
|
selectCellElement.classList.remove("av__cell--select");
|
|
selectRow(selectCellElement.parentElement.querySelector(".av__firstcol"), "select");
|
|
event.preventDefault();
|
|
return true;
|
|
}
|
|
if (event.key === "Enter") {
|
|
popTextCell(protyle, [selectCellElement]);
|
|
event.preventDefault();
|
|
return true;
|
|
}
|
|
let newCellElement
|
|
if (event.key === "ArrowLeft") {
|
|
const previousRowElement = selectCellElement.parentElement.previousElementSibling
|
|
if (selectCellElement.previousElementSibling && selectCellElement.previousElementSibling.classList.contains("av__cell")) {
|
|
newCellElement = selectCellElement.previousElementSibling
|
|
} else if (previousRowElement && !previousRowElement.classList.contains("av__row--header")) {
|
|
newCellElement = previousRowElement.lastElementChild.previousElementSibling
|
|
}
|
|
if (newCellElement) {
|
|
selectCellElement.classList.remove("av__cell--select");
|
|
newCellElement.classList.add("av__cell--select");
|
|
cellScrollIntoView(nodeElement, newCellElement.getBoundingClientRect());
|
|
}
|
|
event.preventDefault();
|
|
return true;
|
|
}
|
|
if (event.key === "ArrowRight") {
|
|
const nextRowElement = selectCellElement.parentElement.nextElementSibling
|
|
if (selectCellElement.nextElementSibling && selectCellElement.nextElementSibling.classList.contains("av__cell")) {
|
|
newCellElement = selectCellElement.nextElementSibling
|
|
} else if (nextRowElement && !nextRowElement.classList.contains("av__row--footer")) {
|
|
newCellElement = nextRowElement.querySelector(".av__cell")
|
|
}
|
|
if (newCellElement) {
|
|
selectCellElement.classList.remove("av__cell--select");
|
|
newCellElement.classList.add("av__cell--select");
|
|
cellScrollIntoView(nodeElement, newCellElement.getBoundingClientRect());
|
|
}
|
|
event.preventDefault();
|
|
return true;
|
|
}
|
|
if (event.key === "ArrowUp") {
|
|
const previousRowElement = selectCellElement.parentElement.previousElementSibling
|
|
if (previousRowElement && !previousRowElement.classList.contains("av__row--header")) {
|
|
newCellElement = previousRowElement.querySelector(`.av__cell[data-col-id="${selectCellElement.dataset.colId}"]`)
|
|
}
|
|
if (newCellElement) {
|
|
selectCellElement.classList.remove("av__cell--select");
|
|
newCellElement.classList.add("av__cell--select");
|
|
cellScrollIntoView(nodeElement, newCellElement.getBoundingClientRect());
|
|
}
|
|
event.preventDefault();
|
|
return true;
|
|
}
|
|
if (event.key === "ArrowDown") {
|
|
const nextRowElement = selectCellElement.parentElement.nextElementSibling
|
|
if (nextRowElement && !nextRowElement.classList.contains("av__row--footer")) {
|
|
newCellElement = nextRowElement.querySelector(`.av__cell[data-col-id="${selectCellElement.dataset.colId}"]`)
|
|
}
|
|
if (newCellElement) {
|
|
selectCellElement.classList.remove("av__cell--select");
|
|
newCellElement.classList.add("av__cell--select");
|
|
cellScrollIntoView(nodeElement, newCellElement.getBoundingClientRect());
|
|
}
|
|
event.preventDefault();
|
|
return true;
|
|
}
|
|
}
|
|
|
|
const selectRowElements = nodeElement.querySelectorAll(".av__row--select:not(.av__row--header)");
|
|
if (selectRowElements.length > 0) {
|
|
if (event.key === "Escape") {
|
|
selectRow(selectRowElements[0].querySelector(".av__firstcol"), "unselectAll");
|
|
return true;
|
|
}
|
|
if (event.key === "Enter") {
|
|
selectRow(selectRowElements[0].querySelector(".av__firstcol"), "unselectAll");
|
|
popTextCell(protyle, [selectRowElements[0].querySelector(".av__cell")]);
|
|
event.preventDefault();
|
|
return true;
|
|
}
|
|
// event.shiftKey
|
|
if (event.key === "ArrowUp") {
|
|
const previousRowElement = selectRowElements[0].previousElementSibling
|
|
selectRow(selectRowElements[0].querySelector(".av__firstcol"), "unselectAll");
|
|
if (previousRowElement && !previousRowElement.classList.contains("av__row--header")) {
|
|
selectRow(previousRowElement.querySelector(".av__firstcol"), "select");
|
|
event.preventDefault();
|
|
return true;
|
|
} else {
|
|
nodeElement.classList.add("protyle-wysiwyg--select")
|
|
return false
|
|
}
|
|
}
|
|
if (event.key === "ArrowDown") {
|
|
const nextRowElement = selectRowElements[selectRowElements.length - 1].nextElementSibling
|
|
selectRow(selectRowElements[0].querySelector(".av__firstcol"), "unselectAll");
|
|
if (nextRowElement && !nextRowElement.classList.contains("av__row--add")) {
|
|
selectRow(nextRowElement.querySelector(".av__firstcol"), "select");
|
|
event.preventDefault();
|
|
return true;
|
|
} else {
|
|
nodeElement.classList.add("protyle-wysiwyg--select")
|
|
return false
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|