From 643bcbe3d0b9f5f755ec910f276c4b9d87812773 Mon Sep 17 00:00:00 2001 From: hello8693 <1320998105@qq.com> Date: Sat, 22 Mar 2025 17:46:01 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=E4=B8=BB=E8=BF=9B=E7=A8=8B?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=EF=BC=8C=E6=8B=86=E5=88=86=E7=AA=97=E5=8F=A3?= =?UTF-8?q?=E5=88=9B=E5=BB=BA=E9=80=BB=E8=BE=91=E5=B9=B6=E6=B3=A8=E5=86=8C?= =?UTF-8?q?=20IPC=20=E5=A4=84=E7=90=86=E7=A8=8B=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/index.ts | 177 ++----------------------------- src/main/ipcHandlers/index.ts | 29 +++++ src/main/windows/editorWindow.ts | 37 +++++++ src/main/windows/mainWindow.ts | 41 +++++++ src/main/windows/playerWindow.ts | 48 +++++++++ 5 files changed, 162 insertions(+), 170 deletions(-) create mode 100644 src/main/ipcHandlers/index.ts create mode 100644 src/main/windows/editorWindow.ts create mode 100644 src/main/windows/mainWindow.ts create mode 100644 src/main/windows/playerWindow.ts diff --git a/src/main/index.ts b/src/main/index.ts index 478bc73..a9dbf50 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -1,189 +1,26 @@ -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' +import { app, BrowserWindow } from 'electron' +import { electronApp, optimizer } from '@electron-toolkit/utils' +import { createMainWindow } from './windows/mainWindow' +import { registerIpcHandlers } from './ipcHandlers' -function createWindow(): void { - // Create the browser window. - const mainWindow = new BrowserWindow({ - width: 720, - height: 480, - show: false, - autoHideMenuBar: true, - ...(process.platform === 'linux' ? { icon } : {}), - webPreferences: { - preload: path.join(__dirname, '../preload/index.js'), - sandbox: false, - nodeIntegration: true - } - // titleBarStyle: 'hidden', - // titleBarOverlay: { - // color: 'rgba(0,0,0,0)', - // height: 35, - // symbolColor: 'white' - // } - }) - - mainWindow.setAspectRatio(720 / 480) // 固定宽高比 - mainWindow.setMinimumSize(720, 480) // 最小尺寸 - - mainWindow.on('ready-to-show', () => { - mainWindow.show() - }) - - mainWindow.webContents.setWindowOpenHandler((details) => { - shell.openExternal(details.url) - 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']) { - // 🚧 Use ['ENV_NAME'] avoid vite:define plugin - const url = process.env['ELECTRON_RENDERER_URL'] - - mainWindow.loadURL(`${url}#/${route}`) - } else { - 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('org.examaware') - // Default open or close DevTools by F12 in development - // and ignore CommandOrControl + R in production. - // see https://github.com/alex8088/electron-toolkit/tree/master/packages/utils app.on('browser-window-created', (_, window) => { optimizer.watchWindowShortcuts(window) }) - // IPC test - ipcMain.on('ping', () => console.log('pong')) + registerIpcHandlers() - // 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() + createMainWindow() app.on('activate', function () { - // On macOS it's common to re-create a window in the app when the - // dock icon is clicked and there are no other windows open. - if (BrowserWindow.getAllWindows().length === 0) createWindow() + if (BrowserWindow.getAllWindows().length === 0) createMainWindow() }) }) -// Quit when all windows are closed, except on macOS. There, it's common -// for applications and their menu bar to stay active until the user quits -// explicitly with Cmd + Q. app.on('window-all-closed', () => { if (process.platform !== 'darwin') { app.quit() } }) - -// In this file you can include the rest of your app"s specific main process -// code. You can also put them in separate files and require them here. diff --git a/src/main/ipcHandlers/index.ts b/src/main/ipcHandlers/index.ts new file mode 100644 index 0000000..e0946d4 --- /dev/null +++ b/src/main/ipcHandlers/index.ts @@ -0,0 +1,29 @@ +import { ipcMain, dialog } from 'electron' +import { createEditorWindow } from '../windows/editorWindow' +import { createPlayerWindow } from '../windows/playerWindow' + +export function registerIpcHandlers(): void { + // 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] + } + }) +} diff --git a/src/main/windows/editorWindow.ts b/src/main/windows/editorWindow.ts new file mode 100644 index 0000000..9a09d15 --- /dev/null +++ b/src/main/windows/editorWindow.ts @@ -0,0 +1,37 @@ +import { BrowserWindow, shell } from 'electron' +import * as path from 'path' +import { is } from '@electron-toolkit/utils' + +export function createEditorWindow(): BrowserWindow { + 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 }) + } + + return editorWindow +} diff --git a/src/main/windows/mainWindow.ts b/src/main/windows/mainWindow.ts new file mode 100644 index 0000000..79cd6ef --- /dev/null +++ b/src/main/windows/mainWindow.ts @@ -0,0 +1,41 @@ +import { BrowserWindow, shell } from 'electron' +import * as path from 'path' +import { is } from '@electron-toolkit/utils' + +export function createMainWindow(): BrowserWindow { + const mainWindow = new BrowserWindow({ + width: 720, + height: 480, + show: false, + autoHideMenuBar: true, + ...(process.platform === 'linux' ? { icon: path.join(__dirname, '../../resources/icon.png') } : {}), + webPreferences: { + preload: path.join(__dirname, '../preload/index.js'), + sandbox: false, + nodeIntegration: true + } + }) + + mainWindow.setAspectRatio(720 / 480) + mainWindow.setMinimumSize(720, 480) + + mainWindow.on('ready-to-show', () => { + mainWindow.show() + }) + + mainWindow.webContents.setWindowOpenHandler((details) => { + shell.openExternal(details.url) + return { action: 'deny' } + }) + + const route = 'mainpage' + + if (is.dev && process.env['ELECTRON_RENDERER_URL']) { + const url = process.env['ELECTRON_RENDERER_URL'] + mainWindow.loadURL(`${url}#/${route}`) + } else { + mainWindow.loadFile(path.resolve(__dirname, '../renderer/index.html'), { hash: route }) + } + + return mainWindow +} diff --git a/src/main/windows/playerWindow.ts b/src/main/windows/playerWindow.ts new file mode 100644 index 0000000..35d232a --- /dev/null +++ b/src/main/windows/playerWindow.ts @@ -0,0 +1,48 @@ +import { BrowserWindow, shell } from 'electron' +import * as path from 'path' +import * as fs from 'fs' +import { is } from '@electron-toolkit/utils' + +export function createPlayerWindow(configPath: string): BrowserWindow { + 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) + }) + + return playerWindow +}