| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307 |
- import { Menu, app, BrowserWindow, WebContentsView, ipcMain } from "electron";
- import { fileURLToPath } from "node:url";
- import path from "node:path";
- import fs from "node:fs";
- const __dirname$1 = path.dirname(fileURLToPath(import.meta.url));
- process.env.APP_ROOT = path.join(__dirname$1, "..");
- const VITE_DEV_SERVER_URL = process.env["VITE_DEV_SERVER_URL"];
- const MAIN_DIST = path.join(process.env.APP_ROOT, "dist-electron");
- const RENDERER_DIST = path.join(process.env.APP_ROOT, "dist");
- process.env.VITE_PUBLIC = VITE_DEV_SERVER_URL ? path.join(process.env.APP_ROOT, "public") : RENDERER_DIST;
- let mainWindow;
- let childView;
- let isSideOpen = true;
- let childViewAspectRatio = 0;
- const SIDE_WIDTH = 250;
- const EXPAND_VIEW_SIZE = 40;
- const LOADING_VIEW_WIDTH = 150;
- const LOADING_VIEW_HEIGHT = 100;
- function loadWindowPage(window, subPath) {
- if (VITE_DEV_SERVER_URL) {
- window.loadURL(VITE_DEV_SERVER_URL + "#" + subPath);
- } else {
- window.loadFile(path.join(RENDERER_DIST, "index.html") + "#" + subPath);
- }
- }
- function loadViewUrl(view, subPath) {
- if (!mainWindow) {
- return;
- }
- if (VITE_DEV_SERVER_URL) {
- view.webContents.loadURL(VITE_DEV_SERVER_URL + "#" + subPath);
- } else {
- view.webContents.loadFile(path.join(RENDERER_DIST, "index.html") + "#" + subPath);
- }
- }
- Menu.setApplicationMenu(null);
- function createWindow() {
- mainWindow = new BrowserWindow({
- icon: path.join(process.env.VITE_PUBLIC, "icon.ico"),
- webPreferences: {
- preload: path.join(__dirname$1, "preload.mjs"),
- contextIsolation: true,
- allowRunningInsecureContent: true,
- partition: "persist:minnan-demo-app"
- },
- width: 1200,
- height: 800
- });
- childView = new WebContentsView({
- webPreferences: {
- partition: "persist:minnan-demo-app",
- allowRunningInsecureContent: true,
- enableBlinkFeatures: "PasswordManager"
- }
- });
- const expandButtonView = new WebContentsView({
- webPreferences: {
- preload: path.join(__dirname$1, "preload.mjs"),
- contextIsolation: true
- }
- });
- const loadingView = new BrowserWindow({
- skipTaskbar: true,
- width: LOADING_VIEW_WIDTH,
- height: LOADING_VIEW_HEIGHT,
- parent: mainWindow,
- thickFrame: true,
- titleBarStyle: "hidden",
- webPreferences: {
- preload: path.join(__dirname$1, "preload.mjs"),
- contextIsolation: true
- }
- });
- mainWindow.contentView.addChildView(childView);
- mainWindow.contentView.addChildView(expandButtonView);
- expandButtonView.setVisible(false);
- childView.webContents.on("did-start-loading", () => {
- loadingView.show();
- });
- childView.webContents.on("did-stop-loading", () => {
- loadingView.hide();
- });
- childView.webContents.on("did-fail-load", (_, errorCode, errorDescription) => {
- loadingView.hide();
- loadWindowPage(loadingView, "/error?code=" + errorCode + "&message=" + errorDescription);
- });
- function updateChildWindowBounds() {
- const bounds = mainWindow.getBounds();
- expandButtonView.setBounds({
- x: 0,
- y: bounds.height - 100,
- width: EXPAND_VIEW_SIZE,
- height: EXPAND_VIEW_SIZE
- });
- loadingView.setBounds({
- x: bounds.x + (bounds.width - LOADING_VIEW_WIDTH) / 2,
- y: bounds.y + (bounds.height - LOADING_VIEW_HEIGHT) / 2,
- width: LOADING_VIEW_WIDTH,
- height: LOADING_VIEW_HEIGHT
- });
- if (childViewAspectRatio) {
- const rect = {
- x: isSideOpen ? SIDE_WIDTH : 0,
- y: 0,
- width: bounds.width - (isSideOpen ? SIDE_WIDTH : 0),
- height: bounds.height
- };
- const availableRatio = rect.width / rect.height;
- let childWidth, childHeight;
- if (availableRatio > childViewAspectRatio) {
- childHeight = rect.height;
- childWidth = childHeight * childViewAspectRatio;
- } else {
- childWidth = rect.width;
- childHeight = childWidth / childViewAspectRatio;
- }
- const childX = rect.x + (rect.width - childWidth) / 2;
- const childY = rect.y + (rect.height - childHeight) / 2;
- childView.setBounds({
- x: Math.round(childX),
- y: Math.round(childY),
- width: Math.round(childWidth),
- height: Math.round(childHeight)
- });
- } else {
- childView.setBounds({
- x: isSideOpen ? SIDE_WIDTH : 0,
- y: 0,
- width: bounds.width - (isSideOpen ? SIDE_WIDTH : 0),
- height: bounds.height
- });
- }
- }
- loadWindowPage(mainWindow, "/");
- loadWindowPage(loadingView, "/loading");
- loadViewUrl(childView, "/hello");
- loadViewUrl(expandButtonView, "/expand");
- updateChildWindowBounds();
- mainWindow.on("resize", () => {
- updateChildWindowBounds();
- });
- mainWindow.webContents.on("did-finish-load", () => {
- mainWindow == null ? void 0 : mainWindow.webContents.send("main-process-message", (/* @__PURE__ */ new Date()).toLocaleString());
- });
- function handleWindowFullScreenKeys(event, input) {
- if (input.key === "F11" && input.type === "keyDown") {
- event.preventDefault();
- mainWindow == null ? void 0 : mainWindow.setFullScreen(!(mainWindow == null ? void 0 : mainWindow.isFullScreen()));
- } else if (input.key === "F12" && input.type === "keyDown") {
- event.preventDefault();
- mainWindow == null ? void 0 : mainWindow.webContents.toggleDevTools();
- }
- }
- mainWindow.webContents.on("before-input-event", (event, input) => {
- handleWindowFullScreenKeys(event, input);
- });
- childView.webContents.on("before-input-event", (event, input) => {
- handleWindowFullScreenKeys(event, input);
- });
- ipcMain.on("exit-app", () => {
- app.quit();
- });
- ipcMain.on("toggle-fullscreen", (_event, isFullScreen) => {
- if (mainWindow) {
- if (isFullScreen) {
- mainWindow.setFullScreen(true);
- } else {
- mainWindow.setFullScreen(false);
- }
- }
- });
- ipcMain.on("load-child-url", (_event, url, aspectRatio) => {
- if (childView)
- childView.webContents.loadURL(url);
- childViewAspectRatio = aspectRatio;
- updateChildWindowBounds();
- });
- ipcMain.on("toggle-child-side", (_event, value) => {
- isSideOpen = value;
- expandButtonView.setVisible(!isSideOpen);
- mainWindow == null ? void 0 : mainWindow.webContents.send("main-side-state-changed", isSideOpen);
- updateChildWindowBounds();
- });
- ipcMain.handle("get-app-path", () => {
- return app.getAppPath();
- });
- ipcMain.on("open-window", (_event, url) => {
- const newWin = new BrowserWindow({
- icon: path.join(process.env.VITE_PUBLIC, "icon.ico"),
- webPreferences: {
- preload: path.join(__dirname$1, "preload.mjs"),
- contextIsolation: true,
- allowRunningInsecureContent: true
- },
- fullscreenable: true,
- maximizable: true,
- width: 1200,
- height: 800
- });
- newWin.loadURL(url);
- newWin.maximize();
- newWin.webContents.on("before-input-event", (event, input) => {
- if (input.key === "F11" && input.type === "keyDown") {
- event.preventDefault();
- newWin == null ? void 0 : newWin.setFullScreen(!(newWin == null ? void 0 : newWin.fullScreen));
- } else if (input.key === "F12" && input.type === "keyDown") {
- event.preventDefault();
- newWin == null ? void 0 : newWin.webContents.toggleDevTools();
- }
- });
- });
- ipcMain.handle("load-apps-json", async () => {
- const appPath = process.cwd();
- const appsJsonPath = path.join(appPath, "apps.json");
- try {
- if (fs.existsSync(appsJsonPath)) {
- const data = fs.readFileSync(appsJsonPath, "utf8");
- return JSON.parse(data);
- } else {
- const devAppsJsonPath = path.join(process.env.VITE_PUBLIC || "", "apps.json");
- if (fs.existsSync(devAppsJsonPath)) {
- const data = fs.readFileSync(devAppsJsonPath, "utf8");
- return JSON.parse(data);
- }
- throw new Error("apps.json not found");
- }
- } catch (error) {
- console.error("Error loading apps.json:", error);
- throw error;
- }
- });
- ipcMain.handle("load-default-apps-json", async () => {
- const devAppsJsonPath = path.join(process.env.VITE_PUBLIC || "", "apps.json");
- if (fs.existsSync(devAppsJsonPath)) {
- const data = fs.readFileSync(devAppsJsonPath, "utf8");
- return JSON.parse(data);
- }
- throw new Error("apps.json not found");
- });
- ipcMain.on("show-config", () => {
- const configWindow = new BrowserWindow({
- icon: path.join(process.env.VITE_PUBLIC, "icon.ico"),
- webPreferences: {
- preload: path.join(__dirname$1, "preload.mjs"),
- contextIsolation: true,
- allowRunningInsecureContent: true
- },
- title: "列表配置",
- parent: mainWindow || void 0,
- skipTaskbar: true,
- minimizable: false,
- maximizable: false,
- modal: true,
- width: 800,
- height: 600
- });
- loadWindowPage(configWindow, "/config");
- });
- ipcMain.on("save-apps-json", (_event, appsJson) => {
- const appPath = process.cwd();
- const appsJsonPath = path.join(appPath, "apps.json");
- try {
- fs.writeFileSync(appsJsonPath, appsJson);
- mainWindow == null ? void 0 : mainWindow.webContents.send("main-config-changed");
- } catch (error) {
- console.error("Error saving apps.json:", error);
- throw error;
- }
- });
- ipcMain.on("show-about", () => {
- const aboutWindow = new BrowserWindow({
- icon: path.join(process.env.VITE_PUBLIC, "icon.ico"),
- webPreferences: {
- preload: path.join(__dirname$1, "preload.mjs"),
- contextIsolation: true,
- allowRunningInsecureContent: true
- },
- parent: mainWindow || void 0,
- title: "关于程序",
- skipTaskbar: true,
- maximizable: false,
- minimizable: false,
- modal: true,
- width: 450,
- height: 470
- });
- loadWindowPage(aboutWindow, "/about");
- });
- }
- app.on("window-all-closed", () => {
- if (process.platform !== "darwin") {
- app.quit();
- mainWindow = null;
- }
- });
- app.on("activate", () => {
- if (BrowserWindow.getAllWindows().length === 0) {
- createWindow();
- }
- });
- app.whenReady().then(createWindow);
- export {
- MAIN_DIST,
- RENDERER_DIST,
- VITE_DEV_SERVER_URL
- };
|