siyuan/app/src/menus/tab.ts
2022-06-29 20:48:06 +08:00

194 lines
7.6 KiB
TypeScript

import {Tab} from "../layout/Tab";
import {MenuItem} from "./Menu";
import {Editor} from "../editor";
import {copyTab} from "../layout/util";
import {copySubMenu} from "./commonMenuItem";
import {Model} from "../layout/Model";
const closeMenu = (model: Model) => {
const currentTab = model.parent;
const allTabs: Tab[] = [];
const unmodifiedTabs: Tab[] = [];
const leftTabs: Tab[] = [];
const rightTabs: Tab[] = [];
let midIndex = -1;
currentTab.parent.children.forEach((item: Tab, index: number) => {
const editor = item.model as Editor;
if (editor.editor?.protyle && !editor.editor?.protyle.updated) {
unmodifiedTabs.push(item);
}
if (item.id === currentTab.id) {
midIndex = index;
}
if (midIndex === -1) {
leftTabs.push(item);
} else if (index > midIndex) {
rightTabs.push(item);
}
allTabs.push(item);
});
window.siyuan.menus.menu.append(new MenuItem({
icon: "iconClose",
label: window.siyuan.languages.close,
accelerator: window.siyuan.config.keymap.general.closeTab.custom,
click: () => {
currentTab.parent.removeTab(currentTab.id);
}
}).element);
if (allTabs.length > 1) {
window.siyuan.menus.menu.append(new MenuItem({
label: window.siyuan.languages.closeOthers,
click: async () => {
for (let index = 0; index < allTabs.length; index++) {
if (allTabs[index].id !== currentTab.id && !allTabs[index].headElement.classList.contains("item--pin")) {
await allTabs[index].parent.removeTab(allTabs[index].id, true);
}
}
if (!currentTab.headElement.parentElement.querySelector(".item--focus")) {
currentTab.parent.switchTab(currentTab.headElement, true);
}
}
}).element);
window.siyuan.menus.menu.append(new MenuItem({
label: window.siyuan.languages.closeAll,
click: async () => {
for (let index = 0; index < allTabs.length; index++) {
if (!allTabs[index].headElement.classList.contains("item--pin")) {
await allTabs[index].parent.removeTab(allTabs[index].id, true);
}
}
if (allTabs[0].headElement.parentElement) {
allTabs[0].parent.switchTab(allTabs[0].headElement, true);
}
}
}).element);
if (leftTabs.length > 0) {
window.siyuan.menus.menu.append(new MenuItem({
label: window.siyuan.languages.closeLeft,
click: async () => {
for (let index = 0; index < leftTabs.length; index++) {
if (!leftTabs[index].headElement.classList.contains("item--pin")) {
await leftTabs[index].parent.removeTab(leftTabs[index].id);
}
}
if (!currentTab.headElement.parentElement.querySelector(".item--focus")) {
currentTab.parent.switchTab(currentTab.headElement, true);
}
}
}).element);
}
if (rightTabs.length > 0) {
window.siyuan.menus.menu.append(new MenuItem({
label: window.siyuan.languages.closeRight,
click: async () => {
for (let index = 0; index < rightTabs.length; index++) {
if (!rightTabs[index].headElement.classList.contains("item--pin")) {
await rightTabs[index].parent.removeTab(rightTabs[index].id);
}
}
if (!currentTab.headElement.parentElement.querySelector(".item--focus")) {
currentTab.parent.switchTab(currentTab.headElement, true);
}
}
}).element);
}
if (unmodifiedTabs.length > 0) {
window.siyuan.menus.menu.append(new MenuItem({
label: window.siyuan.languages.closeUnmodified,
click: async () => {
for (let index = 0; index < unmodifiedTabs.length; index++) {
if (!unmodifiedTabs[index].headElement.classList.contains("item--pin")) {
await unmodifiedTabs[index].parent.removeTab(unmodifiedTabs[index].id);
}
}
if (currentTab.headElement.parentElement && !currentTab.headElement.parentElement.querySelector(".item--focus")) {
currentTab.parent.switchTab(currentTab.headElement, true);
} else if (allTabs[0].headElement.parentElement) {
allTabs[0].parent.switchTab(allTabs[0].headElement, true);
}
}
}).element);
}
}
window.siyuan.menus.menu.append(new MenuItem({type: "separator"}).element);
};
const splitSubMenu = (model: Model) => {
const subMenus: IMenu[] = [{
icon: "iconSplitLR",
label: window.siyuan.languages.splitLR,
click: () => {
const currentTab = model.parent;
currentTab.parent.split("lr").addTab(copyTab(currentTab));
}
}];
const currentTab = model.parent;
if (currentTab.parent.children.length > 1) {
subMenus.push({
icon: "iconRight",
label: window.siyuan.languages.splitMoveR,
click: () => {
const newWnd = currentTab.parent.split("lr");
newWnd.headersElement.append(currentTab.headElement);
newWnd.moveTab(currentTab);
}
});
}
subMenus.push({
icon: "iconSplitTB",
label: window.siyuan.languages.splitTB,
click: () => {
const currentTab = model.parent;
currentTab.parent.split("tb").addTab(copyTab(currentTab));
}
});
if (currentTab.parent.children.length > 1) {
subMenus.push({
icon: "iconDown",
label: window.siyuan.languages.splitMoveB,
click: () => {
const newWnd = currentTab.parent.split("tb");
newWnd.headersElement.append(currentTab.headElement);
newWnd.moveTab(currentTab);
}
});
}
return subMenus;
};
export const initTabMenu = (type: string, model: Model) => {
window.siyuan.menus.menu.remove();
closeMenu(model);
window.siyuan.menus.menu.append(new MenuItem({
label: window.siyuan.languages.split,
submenu: splitSubMenu(model)
}).element);
if (model instanceof Editor) {
window.siyuan.menus.menu.append(new MenuItem({
label: window.siyuan.languages.copy,
icon: "iconCopy",
type: "submenu",
submenu: copySubMenu(model.editor.protyle.block.rootID, "", false)
}).element);
}
if (model.parent.headElement.classList.contains("item--pin")) {
window.siyuan.menus.menu.append(new MenuItem({
label: window.siyuan.languages.unpin,
icon: "iconPin",
click: () => {
model.parent.unpin();
}
}).element);
} else {
window.siyuan.menus.menu.append(new MenuItem({
label: window.siyuan.languages.pin,
icon: "iconPin",
click: () => {
model.parent.pin();
}
}).element);
}
return window.siyuan.menus.menu;
};