feat(electron): more desktop app related shortcuts (#9724)

fix AF-2126, AF-2124

- Add CMD+M for minimize the app.
- Enhance how CMD+W works. Close the following in order, stop if any one is closed:
  - peek view
  - split view
  - tab
  - otherwise, hide the app
This commit is contained in:
pengx17
2025-01-16 06:50:08 +00:00
parent 676f855564
commit 9f3a304885
6 changed files with 56 additions and 8 deletions

View File

@@ -14,6 +14,7 @@ export { WorkbenchRoot } from './view/workbench-root';
import { type Framework } from '@toeverything/infra';
import { DesktopApiService } from '../desktop-api';
import { PeekViewService } from '../peek-view';
import { GlobalStateService } from '../storage';
import { WorkspaceScope } from '../workspace';
import { SidebarTab } from './entities/sidebar-tab';
@@ -64,5 +65,9 @@ export function configureDesktopWorkbenchModule(services: Framework) {
.impl(WorkbenchNewTabHandler, DesktopWorkbenchNewTabHandler, [
DesktopApiService,
])
.service(DesktopStateSynchronizer, [WorkbenchService, DesktopApiService]);
.service(DesktopStateSynchronizer, [
WorkbenchService,
DesktopApiService,
PeekViewService,
]);
}

View File

@@ -1,6 +1,7 @@
import { LiveData, Service } from '@toeverything/infra';
import type { DesktopApiService } from '../../desktop-api';
import type { PeekViewService } from '../../peek-view';
import type { WorkbenchService } from '../../workbench';
/**
@@ -9,7 +10,8 @@ import type { WorkbenchService } from '../../workbench';
export class DesktopStateSynchronizer extends Service {
constructor(
private readonly workbenchService: WorkbenchService,
private readonly electronApi: DesktopApiService
private readonly electronApi: DesktopApiService,
private readonly peekViewService: PeekViewService
) {
super();
this.startSync();
@@ -52,6 +54,30 @@ export class DesktopStateSynchronizer extends Service {
}
});
this.electronApi.events.ui.onCloseView(() => {
(async () => {
if (await this.electronApi.handler.ui.isActiveTab()) {
// close current view. stop if any one is successful
// 1. peek view
// 2. split view
// 3. tab
// 4. otherwise, hide the window
if (this.peekViewService.peekView.show$.value?.value) {
this.peekViewService.peekView.close();
} else if (workbench.views$.value.length > 1) {
workbench.close(workbench.activeView$.value);
} else {
const tabs = await this.electronApi.handler.ui.getTabsStatus();
if (tabs.length > 1) {
await this.electronApi.handler.ui.closeTab();
} else {
await this.electronApi.handler.ui.handleHideApp();
}
}
}
})().catch(console.error);
});
this.electronApi.events.ui.onToggleRightSidebar(tabId => {
if (tabId === appInfo?.viewId) {
workbench.sidebarOpen$.next(!workbench.sidebarOpen$.value);