ExamShowboard-Legacy/src/main/utils/windowManager.ts
2024-07-26 21:03:42 +08:00

80 lines
2.2 KiB
TypeScript

import { BrowserWindow, BrowserWindowConstructorOptions, shell } from 'electron';
import path from 'path';
import WindowName from '../types/WindowName';
import icon from '/resources/icon.png?asset';
import { join } from 'path';
import { is } from '@electron-toolkit/utils';
class WindowManager {
// 这些都设置成 private 了,要用这些窗口的时候用下面那些 create 的方法,会返回需要的窗口,这样保证它们都是存在的
private MainWindow?: BrowserWindow;
private createWindow(
route: string,
options: Partial<BrowserWindowConstructorOptions> = {},
onReadyToShow?: () => any
) {
const win = new BrowserWindow({
show: false,
autoHideMenuBar: true,
...(process.platform === 'linux' ? { icon } : {}),
webPreferences: {
preload: join(__dirname, '../preload/index.js'),
sandbox: false
},
...options
});
win.once('ready-to-show', () => {
onReadyToShow && onReadyToShow();
win.show();
});
if (is.dev && process.env['ELECTRON_RENDERER_URL']) {
// 🚧 Use ['ENV_NAME'] avoid vite:define plugin
const url = process.env['ELECTRON_RENDERER_URL'];
win.loadURL(`${url}#/${route}`);
} else {
win.loadFile(path.resolve(__dirname, '../renderer/index.html'), { hash: route });
}
// Make all links open with the browser, not with the application
win.webContents.setWindowOpenHandler(({ url }) => {
if (url.startsWith('https:')) shell.openExternal(url);
return { action: 'deny' };
});
return win;
}
public createMainWindow() {
if (this.MainWindow && !this.MainWindow.isDestroyed()) {
this.MainWindow.show();
return this.MainWindow;
}
this.MainWindow = this.createWindow('mainWindow', {
title: 'DSZ ExamComposer 制卷系统'
});
this.MainWindow.on('close', () => {
this.MainWindow = undefined;
});
return this.MainWindow;
}
public destroyAllWindows() {
if (this.MainWindow) {
this.MainWindow.destroy();
}
}
public createByName(name: WindowName) {
switch (name) {
case 'mainWindow':
return this.createMainWindow();
}
}
}
export default new WindowManager();