2022-06-30 18:15:13 +08:00
|
|
|
/// #if !MOBILE
|
2022-05-26 15:18:53 +08:00
|
|
|
import {getInstanceById} from "../layout/util";
|
|
|
|
|
import {Tab} from "../layout/Tab";
|
|
|
|
|
import {initSearchMenu} from "./search";
|
|
|
|
|
import {initDockMenu} from "./dock";
|
2022-06-30 18:15:13 +08:00
|
|
|
import {initNavigationMenu, initFileMenu} from "./navigation";
|
|
|
|
|
import {initTabMenu} from "./tab";
|
|
|
|
|
/// #endif
|
2022-05-26 15:18:53 +08:00
|
|
|
import {Menu} from "./Menu";
|
2024-04-10 22:38:48 +08:00
|
|
|
import {hasClosestByClassName, hasTopClosestByTag} from "../protyle/util/hasClosest";
|
2023-05-10 00:01:47 +08:00
|
|
|
import {App} from "../index";
|
2022-06-30 18:15:13 +08:00
|
|
|
|
2022-05-26 15:18:53 +08:00
|
|
|
|
|
|
|
|
export class Menus {
|
|
|
|
|
public menu: Menu;
|
|
|
|
|
|
2023-05-10 00:01:47 +08:00
|
|
|
constructor(app: App) {
|
2022-05-26 15:18:53 +08:00
|
|
|
this.menu = new Menu();
|
2022-06-30 18:15:13 +08:00
|
|
|
/// #if !MOBILE
|
2022-05-26 15:18:53 +08:00
|
|
|
window.addEventListener("contextmenu", (event) => {
|
2023-08-02 21:35:49 +08:00
|
|
|
if (event.shiftKey) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
2022-05-26 15:18:53 +08:00
|
|
|
let target = event.target as HTMLElement;
|
2023-11-15 18:40:01 +08:00
|
|
|
while (target && target.parentElement // ⌃⇥ 后点击会为空
|
|
|
|
|
&& !target.parentElement.isEqualNode(document.querySelector("body"))) {
|
2022-05-26 15:18:53 +08:00
|
|
|
event.preventDefault();
|
|
|
|
|
const dataType = target.getAttribute("data-type");
|
|
|
|
|
if (dataType === "tab-header") {
|
|
|
|
|
this.unselect();
|
2023-05-10 00:01:47 +08:00
|
|
|
initTabMenu(app, (getInstanceById(target.getAttribute("data-id")) as Tab)).popup({
|
2022-05-26 15:18:53 +08:00
|
|
|
x: event.clientX,
|
|
|
|
|
y: event.clientY
|
|
|
|
|
});
|
|
|
|
|
event.stopPropagation();
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (dataType === "navigation-root" && !window.siyuan.config.readonly) {
|
|
|
|
|
if (target.querySelector(".b3-list-item__text").classList.contains("ft__on-surface")) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
this.unselect();
|
|
|
|
|
// navigation 根上:新建文档/文件夹/取消挂在/打开文件位置
|
2023-05-18 19:27:21 +08:00
|
|
|
initNavigationMenu(app, target).popup({x: event.clientX, y: event.clientY});
|
2022-05-26 15:18:53 +08:00
|
|
|
event.stopPropagation();
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (dataType === "navigation-file") {
|
|
|
|
|
this.unselect();
|
|
|
|
|
// navigation 文件上:删除/重命名/打开文件位置/导出
|
2023-05-18 19:27:21 +08:00
|
|
|
initFileMenu(app, this.getDir(target), target.getAttribute("data-path"), target).popup({
|
2022-05-26 15:18:53 +08:00
|
|
|
x: event.clientX,
|
|
|
|
|
y: event.clientY
|
|
|
|
|
});
|
|
|
|
|
event.stopPropagation();
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (dataType === "search-item") {
|
2023-08-15 20:37:16 +08:00
|
|
|
const nodeId = target.getAttribute("data-node-id");
|
|
|
|
|
if (nodeId) {
|
|
|
|
|
initSearchMenu(nodeId).popup({x: event.clientX, y: event.clientY});
|
|
|
|
|
}
|
2022-05-26 15:18:53 +08:00
|
|
|
event.stopPropagation();
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
2023-02-11 21:21:13 +08:00
|
|
|
if (target.classList.contains("dock__item") && target.getAttribute("data-type")) {
|
2022-05-26 15:18:53 +08:00
|
|
|
initDockMenu(target).popup({x: event.clientX, y: event.clientY});
|
|
|
|
|
event.stopPropagation();
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
2024-04-10 22:38:48 +08:00
|
|
|
if (hasClosestByClassName(target, "av__panel") && !hasClosestByClassName(target, "b3-menu")) {
|
|
|
|
|
document.querySelector(".av__panel").dispatchEvent(new CustomEvent("click", {detail: "close"}))
|
|
|
|
|
event.stopPropagation();
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
2022-05-26 15:18:53 +08:00
|
|
|
target = target.parentElement;
|
|
|
|
|
}
|
|
|
|
|
}, false);
|
2022-06-30 18:15:13 +08:00
|
|
|
/// #endif
|
2022-05-26 15:18:53 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private getDir(target: HTMLElement) {
|
|
|
|
|
const rootElement = hasTopClosestByTag(target, "UL");
|
|
|
|
|
if (rootElement) {
|
|
|
|
|
return rootElement.getAttribute("data-url");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private unselect() {
|
|
|
|
|
if (getSelection().rangeCount > 0) {
|
|
|
|
|
getSelection().getRangeAt(0).collapse(true);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|