mirror of
https://github.com/hydralauncher/hydra.git
synced 2025-02-03 16:53:47 +03:00
110 lines
2.9 KiB
TypeScript
110 lines
2.9 KiB
TypeScript
|
import { BrowserWindow, Menu, Tray, app } from "electron";
|
||
|
import { electronApp, optimizer, is } from "@electron-toolkit/utils";
|
||
|
import { t } from "i18next";
|
||
|
import path from "node:path";
|
||
|
|
||
|
export class WindowManager {
|
||
|
public static mainWindow: Electron.BrowserWindow | null = null;
|
||
|
|
||
|
public static createMainWindow() {
|
||
|
// Create the browser window.
|
||
|
this.mainWindow = new BrowserWindow({
|
||
|
width: 1200,
|
||
|
height: 720,
|
||
|
minWidth: 1024,
|
||
|
minHeight: 540,
|
||
|
titleBarStyle: "hidden",
|
||
|
// icon: path.join(__dirname, "..", "..", "images", "icon.png"),
|
||
|
trafficLightPosition: { x: 16, y: 16 },
|
||
|
titleBarOverlay: {
|
||
|
symbolColor: "#DADBE1",
|
||
|
color: "#151515",
|
||
|
height: 34,
|
||
|
},
|
||
|
webPreferences: {
|
||
|
preload: path.join(__dirname, "../preload/index.mjs"),
|
||
|
sandbox: false,
|
||
|
},
|
||
|
});
|
||
|
|
||
|
this.mainWindow.removeMenu();
|
||
|
|
||
|
// HMR for renderer base on electron-vite cli.
|
||
|
// Load the remote URL for development or the local html file for production.
|
||
|
if (is.dev && process.env["ELECTRON_RENDERER_URL"]) {
|
||
|
this.mainWindow.loadURL(process.env["ELECTRON_RENDERER_URL"]);
|
||
|
} else {
|
||
|
this.mainWindow.loadFile(path.join(__dirname, "../renderer/index.html"));
|
||
|
}
|
||
|
|
||
|
this.mainWindow.webContents.on("did-finish-load", () => {
|
||
|
if (!app.isPackaged) {
|
||
|
// Open the DevTools.
|
||
|
this.mainWindow.webContents.openDevTools();
|
||
|
}
|
||
|
});
|
||
|
|
||
|
this.mainWindow.on("close", () => {
|
||
|
WindowManager.mainWindow.setProgressBar(-1);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
public static redirect(path: string) {
|
||
|
if (!this.mainWindow) this.createMainWindow();
|
||
|
this.mainWindow.loadURL(`${MAIN_WINDOW_WEBPACK_ENTRY}#${path}`);
|
||
|
|
||
|
if (this.mainWindow.isMinimized()) this.mainWindow.restore();
|
||
|
this.mainWindow.focus();
|
||
|
}
|
||
|
|
||
|
public static createSystemTray(language: string) {
|
||
|
const tray = new Tray(
|
||
|
app.isPackaged
|
||
|
? path.join(process.resourcesPath, "icon_tray.png")
|
||
|
: path.join(__dirname, "..", "..", "resources", "icon_tray.png")
|
||
|
);
|
||
|
|
||
|
const contextMenu = Menu.buildFromTemplate([
|
||
|
{
|
||
|
label: t("open", {
|
||
|
ns: "system_tray",
|
||
|
lng: language,
|
||
|
}),
|
||
|
type: "normal",
|
||
|
click: () => {
|
||
|
if (this.mainWindow) {
|
||
|
this.mainWindow.show();
|
||
|
} else {
|
||
|
this.createMainWindow();
|
||
|
}
|
||
|
},
|
||
|
},
|
||
|
{
|
||
|
label: t("quit", {
|
||
|
ns: "system_tray",
|
||
|
lng: language,
|
||
|
}),
|
||
|
type: "normal",
|
||
|
click: () => app.quit(),
|
||
|
},
|
||
|
]);
|
||
|
|
||
|
tray.setToolTip("Hydra");
|
||
|
tray.setContextMenu(contextMenu);
|
||
|
|
||
|
if (process.platform === "win32") {
|
||
|
tray.addListener("click", () => {
|
||
|
if (this.mainWindow) {
|
||
|
if (WindowManager.mainWindow.isMinimized())
|
||
|
WindowManager.mainWindow.restore();
|
||
|
|
||
|
WindowManager.mainWindow.focus();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
this.createMainWindow();
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
}
|