implement Cmd-W to close blocks and tabs

This commit is contained in:
sawka 2024-07-31 19:22:15 -07:00
parent a92fd2e2d5
commit c87caef473
2 changed files with 42 additions and 2 deletions

View File

@ -588,6 +588,7 @@ function makeAppMenu() {
}, },
{ {
role: "close", role: "close",
accelerator: "", // clear the accelerator
click: () => { click: () => {
electron.BrowserWindow.getFocusedWindow()?.close(); electron.BrowserWindow.getFocusedWindow()?.close();
}, },

View File

@ -9,7 +9,11 @@ import * as keyutil from "@/util/keyutil";
import * as layoututil from "@/util/layoututil"; import * as layoututil from "@/util/layoututil";
import * as util from "@/util/util"; import * as util from "@/util/util";
import * as csstree from "css-tree"; import * as csstree from "css-tree";
import { getLayoutStateAtomForTab, globalLayoutTransformsMap } from "frontend/layout/lib/layoutAtom"; import {
deleteLayoutStateAtomForTab,
getLayoutStateAtomForTab,
globalLayoutTransformsMap,
} from "frontend/layout/lib/layoutAtom";
import * as jotai from "jotai"; import * as jotai from "jotai";
import * as React from "react"; import * as React from "react";
import { DndProvider } from "react-dnd"; import { DndProvider } from "react-dnd";
@ -17,6 +21,8 @@ import { HTML5Backend } from "react-dnd-html5-backend";
import { CenteredDiv } from "./element/quickelems"; import { CenteredDiv } from "./element/quickelems";
import { useWaveObjectValue } from "@/app/store/wos"; import { useWaveObjectValue } from "@/app/store/wos";
import { LayoutTreeActionType, LayoutTreeDeleteNodeAction } from "@/layout/index";
import { layoutTreeStateReducer } from "@/layout/lib/layoutState";
import { getWebServerEndpoint } from "@/util/endpoints"; import { getWebServerEndpoint } from "@/util/endpoints";
import clsx from "clsx"; import clsx from "clsx";
import Color from "color"; import Color from "color";
@ -81,7 +87,6 @@ function handleContextMenu(e: React.MouseEvent<HTMLDivElement>) {
} }
function switchTab(offset: number) { function switchTab(offset: number) {
console.log("switch tab!", offset);
const ws = globalStore.get(atoms.workspace); const ws = globalStore.get(atoms.workspace);
const activeTabId = globalStore.get(atoms.tabAtom).oid; const activeTabId = globalStore.get(atoms.tabAtom).oid;
let tabIdx = -1; let tabIdx = -1;
@ -298,6 +303,35 @@ function AppBackground() {
return <div className="app-background" style={style} />; return <div className="app-background" style={style} />;
} }
function genericClose(tabId: string) {
const tabORef = WOS.makeORef("tab", tabId);
const tabAtom = WOS.getWaveObjectAtom<Tab>(tabORef);
const tabData = globalStore.get(tabAtom);
if (tabData == null) {
return;
}
if (tabData.blockids == null || tabData.blockids.length == 0) {
// close tab
services.WindowService.CloseTab(tabId);
deleteLayoutStateAtomForTab(tabId);
return;
}
// close block
const activeBlockId = globalStore.get(atoms.waveWindow)?.activeblockid;
if (activeBlockId == null) {
return;
}
const layoutStateAtom = getLayoutStateAtomForTab(tabId, tabAtom);
const layoutTreeState = globalStore.get(layoutStateAtom);
const curBlockLeafId = layoututil.findLeafIdFromBlockId(layoutTreeState, activeBlockId);
const deleteAction: LayoutTreeDeleteNodeAction = {
type: LayoutTreeActionType.DeleteNode,
nodeId: curBlockLeafId,
};
globalStore.set(layoutStateAtom, layoutTreeStateReducer(layoutTreeState, deleteAction));
services.ObjectService.DeleteBlock(activeBlockId);
}
const AppInner = () => { const AppInner = () => {
const client = jotai.useAtomValue(atoms.client); const client = jotai.useAtomValue(atoms.client);
const windowData = jotai.useAtomValue(atoms.waveWindow); const windowData = jotai.useAtomValue(atoms.waveWindow);
@ -337,6 +371,11 @@ const AppInner = () => {
switchBlock(tabId, 1, 0); switchBlock(tabId, 1, 0);
return true; return true;
} }
if (keyutil.checkKeyPressed(waveEvent, "Cmd:w")) {
// close block, if no more blocks, close tab
genericClose(tabId);
return true;
}
return false; return false;
} }
React.useEffect(() => { React.useEffect(() => {