diff --git a/.gitignore b/.gitignore index e8775eb..5d3f789 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ node_modules/ dist/ -build/ \ No newline at end of file +build/ +settings.json \ No newline at end of file diff --git a/main-process/AppMenu.ts b/main-process/AppMenu.ts index 3bf3c78..3498e35 100644 --- a/main-process/AppMenu.ts +++ b/main-process/AppMenu.ts @@ -1,84 +1,88 @@ import { BrowserView, Menu, app, shell, dialog, BrowserWindow, MenuItem } from 'electron'; import MainEventType from '../common/MainEventType'; +import { MainProcess } from './main'; -export function initMenu(mainWindow: BrowserWindow) { - const menu: Menu = new Menu(); - const fileMenu: MenuItem = new MenuItem({ - label: "行为树", - submenu: [ - { - label: "打开文件", - accelerator: "Ctrl+O", - click: () => { - (async () => { - const res = await dialog.showOpenDialog({ - properties: ['openFile'], - filters: [ - {name: "Json", extensions:['json']} - ] - }); - mainWindow.webContents.send(MainEventType.OPEN_FILE, res.filePaths[0]); - })(); +export default class AppMenu { + constructor(mainProcess: MainProcess) { + const mainWindow = mainProcess.mainWindow; + const menu: Menu = new Menu(); + const fileMenu: MenuItem = new MenuItem({ + label: "行为树", + submenu: [ + { + label: "打开文件", + accelerator: "Ctrl+O", + click: () => { + (async () => { + const res = await dialog.showOpenDialog({ + properties: ['openFile'], + filters: [ + { name: "Json", extensions: ['json'] } + ] + }); + mainWindow.webContents.send(MainEventType.OPEN_FILE, res.filePaths[0]); + })(); + } + }, + { + label: "打开目录", + accelerator: "Ctrl+Shift+O", + click: () => { + (async () => { + const res = await dialog.showOpenDialog({ + properties: ['openDirectory'] + }); + if (res.filePaths.length > 0) { + mainWindow.webContents.send(MainEventType.OPEN_WORKSPACE, res.filePaths[0]); + } + })(); + } + }, + { type: 'separator' }, + { + label: "最近打开", + submenu: [] + }, + { + label: "最近目录", + submenu: [ + { label: "master" }, + { label: "分支0908" }, + ] + }, + { type: 'separator' }, + { + label: "关闭", + click: () => { + app.quit(); + } } - }, - { - label: "打开目录", - accelerator: "Ctrl+Shift+O", - click: () => { - (async () => { - const res = await dialog.showOpenDialog({ - properties: ['openDirectory'] - }); - if (res.filePaths.length > 0) { - mainWindow.webContents.send(MainEventType.OPEN_WORKSPACE, res.filePaths[0]); - } - })(); - } - }, - { type: 'separator' }, - { - label: "最近打开", - submenu: [] - }, - { - label: "最近目录", - submenu: [ - { label: "master" }, - { label: "分支0908" }, - ] - }, - { type: 'separator' }, - { - label: "关闭", - click: () => { - app.quit(); - } - } - ] - }); + ] + }); - const toolsMenu: MenuItem = new MenuItem({ - label: "开发工具", - submenu: [ - { - label: "重载", - accelerator: "Ctrl+R", - click: (_, browserWindow) => { - browserWindow.reload(); + const toolsMenu: MenuItem = new MenuItem({ + label: "开发工具", + submenu: [ + { + label: "重载", + accelerator: "Ctrl+R", + click: (_, browserWindow) => { + browserWindow.reload(); + } + }, + { + label: "打开控制台", + accelerator: "Ctrl+Shift+I", + click: (_, browserWindow) => { + browserWindow.webContents.toggleDevTools(); + } } - }, - { - label: "打开控制台", - accelerator: "Ctrl+Shift+I", - click: (_, browserWindow) => { - browserWindow.webContents.toggleDevTools(); - } - } - ] - }); + ] + }); - menu.append(fileMenu); - menu.append(toolsMenu); + menu.append(fileMenu); + menu.append(toolsMenu); - Menu.setApplicationMenu(menu); -} + Menu.setApplicationMenu(menu); + } +} \ No newline at end of file diff --git a/main-process/Settings.ts b/main-process/Settings.ts new file mode 100644 index 0000000..2359667 --- /dev/null +++ b/main-process/Settings.ts @@ -0,0 +1,38 @@ +import * as fs from 'fs'; + +const settingPath = 'settings.json'; + +export interface SettingsModel { + recentWorkspaces: string[]; + recentFiles: string[]; + nodeConfigPath: string; // 节点配置路径 +} + +export default class Settings { + private settings: SettingsModel; + constructor() { + if(fs.existsSync(settingPath)) { + const str = fs.readFileSync(settingPath, 'utf8'); + this.settings = JSON.parse(str); + } else { + this.settings = { + recentWorkspaces: [], + recentFiles: [], + nodeConfigPath: '' + }; + this.save(); + } + } + + set(config: any) { + this.settings = { + ...this.settings, + ...config + }; + this.save(); + } + + save() { + fs.writeFileSync(settingPath, JSON.stringify(this.settings, null, 2)); + } +} \ No newline at end of file diff --git a/main-process/main.tsx b/main-process/main.tsx index d081cfd..5ac486f 100644 --- a/main-process/main.tsx +++ b/main-process/main.tsx @@ -1,34 +1,46 @@ import { app, BrowserWindow, Menu, MenuItem, dialog, nativeTheme } from 'electron'; -import {initMenu} from './AppMenu' +import AppMenu from './AppMenu' +import Settings from './Settings'; -let mainWindow: BrowserWindow = null; -nativeTheme.themeSource = 'dark'; -let createWindow = function () { - mainWindow = new BrowserWindow({ - width: 1280, - height: 800, - webPreferences: { - nodeIntegration: true - } - // fullscreenable:false, - // maximizable:false - }); - // mainWindow.webContents.openDevTools(); - mainWindow.loadFile('index.html'); - mainWindow.on('closed', function () { - mainWindow = null - }); - initMenu(mainWindow); +export class MainProcess { + mainWindow: BrowserWindow; + appMenu: AppMenu; + settings: Settings; + constructor() { + nativeTheme.themeSource = 'dark'; + app.on('ready', () => { + this.createWindow(); + }) + app.on('window-all-closed', () => { + if (process.platform !== 'darwin') { + app.quit() + } + }) + app.on('activate', () => { + if (this.mainWindow === null) { + this.createWindow() + } + }); + } + + createWindow (){ + this.settings = new Settings(); + this.mainWindow = new BrowserWindow({ + width: 1280, + height: 800, + webPreferences: { + nodeIntegration: true + } + // fullscreenable:false, + // maximizable:false + }); + // mainWindow.webContents.openDevTools(); + this.mainWindow.loadFile('index.html'); + this.mainWindow.on('closed', function () { + this.mainWindow = null + }); + this.appMenu = new AppMenu(this); + } } -app.on('ready', createWindow) -app.on('window-all-closed', () => { - if (process.platform !== 'darwin') { - app.quit() - } -}) -app.on('activate', () => { - if (mainWindow === null) { - createWindow() - } -}); \ No newline at end of file +new MainProcess(); \ No newline at end of file