From f2b77a114ed2e1d4e28a3ca6c2d1ceaed08cbac2 Mon Sep 17 00:00:00 2001 From: hello8693 <1320998105@qq.com> Date: Fri, 21 Mar 2025 20:48:12 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=A4=9A=E4=B8=AA=E7=AA=97?= =?UTF-8?q?=E5=8F=A3=E5=88=9B=E5=BB=BA=E5=8A=9F=E8=83=BD=EF=BC=8C=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E7=BC=96=E8=BE=91=E5=99=A8=E5=92=8C=E6=92=AD=E6=94=BE?= =?UTF-8?q?=E5=99=A8=E7=AA=97=E5=8F=A3=EF=BC=8C=E5=B9=B6=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E9=80=89=E6=8B=A9=E5=AF=B9=E8=AF=9D=E6=A1=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/index.ts | 129 +++++++++++++++++++++++++++++++++++++++---- src/preload/index.ts | 5 +- 2 files changed, 123 insertions(+), 11 deletions(-) diff --git a/src/main/index.ts b/src/main/index.ts index 3536b95..478bc73 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -1,20 +1,24 @@ -import { app, shell, BrowserWindow, ipcMain } from 'electron' -import { join } from 'path' +import { app, shell, BrowserWindow, ipcMain, dialog } from 'electron' +import * as path from 'path' +// const path = require('path') +// import { path.join } from 'path' import { electronApp, optimizer, is } from '@electron-toolkit/utils' import icon from '../../resources/icon.png?asset' +import * as fs from 'fs' function createWindow(): void { // Create the browser window. const mainWindow = new BrowserWindow({ - width: 960, - height: 700, + width: 720, + height: 480, show: false, autoHideMenuBar: true, ...(process.platform === 'linux' ? { icon } : {}), webPreferences: { - preload: join(__dirname, '../preload/index.js'), - sandbox: false - }, + preload: path.join(__dirname, '../preload/index.js'), + sandbox: false, + nodeIntegration: true + } // titleBarStyle: 'hidden', // titleBarOverlay: { // color: 'rgba(0,0,0,0)', @@ -23,6 +27,9 @@ function createWindow(): void { // } }) + mainWindow.setAspectRatio(720 / 480) // 固定宽高比 + mainWindow.setMinimumSize(720, 480) // 最小尺寸 + mainWindow.on('ready-to-show', () => { mainWindow.show() }) @@ -32,21 +39,102 @@ function createWindow(): void { return { action: 'deny' } }) + const route = 'mainpage' + // 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']) { - mainWindow.loadURL(process.env['ELECTRON_RENDERER_URL']) + // 🚧 Use ['ENV_NAME'] avoid vite:define plugin + const url = process.env['ELECTRON_RENDERER_URL'] + + mainWindow.loadURL(`${url}#/${route}`) } else { - mainWindow.loadFile(join(__dirname, '../renderer/index.html#')) + mainWindow.loadFile(path.resolve(__dirname, '../renderer/index.html'), { hash: route }) } } +function createEditorWindow(): void { + const editorWindow = new BrowserWindow({ + width: 920, + height: 700, + show: false, + autoHideMenuBar: true, + titleBarStyle: 'default', + webPreferences: { + preload: path.join(__dirname, '../preload/index.js'), + sandbox: false + } + }) + + editorWindow.on('ready-to-show', () => { + editorWindow.show() + }) + + editorWindow.webContents.setWindowOpenHandler((details) => { + shell.openExternal(details.url) + return { action: 'deny' } + }) + + const route = 'editor' + + if (is.dev && process.env['ELECTRON_RENDERER_URL']) { + const url = process.env['ELECTRON_RENDERER_URL'] + editorWindow.loadURL(`${url}#/${route}`) + } else { + editorWindow.loadFile(path.resolve(__dirname, '../renderer/index.html'), { hash: route }) + } +} + +function createPlayerWindow(configPath: string): void { + const playerWindow = new BrowserWindow({ + width: 1920, + height: 1080, + fullscreen: true, + autoHideMenuBar: true, + webPreferences: { + preload: path.join(__dirname, '../preload/index.js'), + sandbox: false + } + }) + + playerWindow.on('ready-to-show', () => { + playerWindow.show() + }) + + playerWindow.webContents.setWindowOpenHandler((details) => { + shell.openExternal(details.url) + return { action: 'deny' } + }) + + const route = 'playerview' + + if (is.dev && process.env['ELECTRON_RENDERER_URL']) { + const url = process.env['ELECTRON_RENDERER_URL'] + playerWindow.loadURL(`${url}#/${route}`) + } else { + playerWindow.loadFile(path.resolve(__dirname, '../renderer/index.html'), { hash: route }) + } + + // 读取配置文件并发送给渲染进程 + fs.readFile(configPath, 'utf-8', (err, data) => { + if (err) { + console.error('Failed to read config file:', err) + return + } + // 延迟发送事件,确保渲染进程有足够时间挂载组件 + setTimeout(() => { + playerWindow.webContents.send('load-config', data) + console.log('Config file loaded:', data) + }, 1000) // 延迟1秒 + }) +} + // This method will be called when Electron has finished // initialization and is ready to create browser windows. // Some APIs can only be used after this event occurs. app.whenReady().then(() => { // Set app user model id for windows - electronApp.setAppUserModelId('com.electron') + electronApp.setAppUserModelId('org.examaware') // Default open or close DevTools by F12 in development // and ignore CommandOrControl + R in production. @@ -58,6 +146,27 @@ app.whenReady().then(() => { // IPC test ipcMain.on('ping', () => console.log('pong')) + // Handle open editor window request + ipcMain.on('open-editor-window', () => { + createEditorWindow() + }) + + ipcMain.on('open-player-window', (event, configPath) => { + createPlayerWindow(configPath) + }) + + ipcMain.handle('select-file', async () => { + const result = await dialog.showOpenDialog({ + properties: ['openFile'], + filters: [{ name: 'JSON Files', extensions: ['json'] }] + }) + if (result.canceled) { + return null + } else { + return result.filePaths[0] + } + }) + createWindow() app.on('activate', function () { diff --git a/src/preload/index.ts b/src/preload/index.ts index 2d18524..e0d9b25 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -1,8 +1,11 @@ import { contextBridge } from 'electron' import { electronAPI } from '@electron-toolkit/preload' +import { fileApi } from '../main/fileUtils' // Custom APIs for renderer -const api = {} +const api = { + fileApi +} // Use `contextBridge` APIs to expose Electron APIs to // renderer only if context isolation is enabled, otherwise