diff --git a/src/main/code-launchpad/code-launchpad.ts b/src/main/code-launchpad/code-launchpad.ts new file mode 100644 index 0000000..4b2bf75 --- /dev/null +++ b/src/main/code-launchpad/code-launchpad.ts @@ -0,0 +1,93 @@ +import { BrowserWindow, screen, shell, Tray } from 'electron' +import { settingsManager } from '../settings' +import { codeLaunchpadIcon } from '../resources' +import path from 'path' +import { is } from '@electron-toolkit/utils' + +/** + * 创建代码启动台窗口。 + * @return 布尔值,表明创建是否成功 + */ +export function createCodeLaunchpadWindow(closeOnBlur: boolean): boolean { + // 不允许重复创建 + if (global.codeLaunchpadWindow !== null) { + return false + } + + const windowWidth = settingsManager._settings?.codeLaunchpadWidth + ? settingsManager._settings?.codeLaunchpadWidth + : 460 + const windowHeight = settingsManager._settings?.codeLaunchpadHeight + ? settingsManager._settings?.codeLaunchpadHeight + : 760 + const position = settingsManager._settings?.codeLaunchpadPosition + ? settingsManager._settings.codeLaunchpadPosition + : 'left top' + + const codeLaunchpadWindow = new BrowserWindow({ + width: windowWidth, + height: windowHeight, + x: + position === 'left top' || position === 'left bottom' + ? 0 + : screen.getPrimaryDisplay().workArea.width - windowWidth, + y: + position === 'left top' || position === 'right top' + ? 0 + : screen.getPrimaryDisplay().workArea.height - windowHeight, + frame: false, + show: false, + autoHideMenuBar: true, + // 代码启动台需要置顶 + alwaysOnTop: true, + resizable: false, + backgroundColor: '#1f1f1f', + icon: codeLaunchpadIcon, + webPreferences: { + preload: path.join(__dirname, '../preload/index.mjs'), + sandbox: false + } + }) + + codeLaunchpadWindow.on('ready-to-show', () => { + codeLaunchpadWindow.show() + }) + + // 如有必要,失去焦点时自动关闭 + if (closeOnBlur) { + codeLaunchpadWindow.on('blur', () => { + codeLaunchpadWindow.close() + }) + } + + // 关闭代码启动台时 + codeLaunchpadWindow.on('close', () => { + global.codeLaunchpadWindow = null + }) + + codeLaunchpadWindow.webContents.setWindowOpenHandler((details) => { + shell.openExternal(details.url) + return { action: 'deny' } + }) + + // 开发和生产环境的各自设置 + if (is.dev && process.env['ELECTRON_RENDERER_URL']) { + codeLaunchpadWindow.loadURL(process.env['ELECTRON_RENDERER_URL'] + '#/codeLaunchpad/IDEs') + } else { + codeLaunchpadWindow.loadFile(path.join(__dirname, '../renderer/index.html'), { + hash: '/codeLaunchpad/IDEs' + }) + } + + global.codeLaunchpadWindow = codeLaunchpadWindow + + return true +} + +export function createCodeLaunchpadTray(): Tray { + const tray = new Tray(codeLaunchpadIcon) + + tray.on('click', () => createCodeLaunchpadWindow(true)) + + return tray +} diff --git a/src/main/code-launchpad/ide-versions-check.ts b/src/main/code-launchpad/ide-versions-check.ts index 51a76df..dab87ff 100644 --- a/src/main/code-launchpad/ide-versions-check.ts +++ b/src/main/code-launchpad/ide-versions-check.ts @@ -6,8 +6,6 @@ import type { IDECode } from '@my-type/settings' import { execSync } from 'node:child_process' -import { BrowserWindow, screen, shell, Tray } from 'electron' -import { is } from '@electron-toolkit/utils' import path from 'path' import { loadJsonFile } from 'load-json-file' import os from 'os' @@ -17,7 +15,6 @@ import { JetBrainsStateDto } from '@my-type/jetbrains-state-tools' import { settingsManager } from '../settings' -import { codeLaunchpadIcon } from '../resources' import { isNodeError } from '@my-type/node-error' import { JetBrainsDataProductDto } from '@my-type/jetbrains-data-products' @@ -233,91 +230,3 @@ export async function checkIDEsVersion(): Promise { global.installedIDEsVersion = result return result } - -/** - * 创建代码启动台窗口。 - * @return 布尔值,表明创建是否成功 - */ -export function createCodeLaunchpadWindow(closeOnBlur: boolean): boolean { - // 不允许重复创建 - if (global.codeLaunchpadWindow !== null) { - return false - } - - const windowWidth = settingsManager._settings?.codeLaunchpadWidth - ? settingsManager._settings?.codeLaunchpadWidth - : 460 - const windowHeight = settingsManager._settings?.codeLaunchpadHeight - ? settingsManager._settings?.codeLaunchpadHeight - : 760 - const position = settingsManager._settings?.codeLaunchpadPosition - ? settingsManager._settings.codeLaunchpadPosition - : 'left top' - - const codeLaunchpadWindow = new BrowserWindow({ - width: windowWidth, - height: windowHeight, - x: - position === 'left top' || position === 'left bottom' - ? 0 - : screen.getPrimaryDisplay().workArea.width - windowWidth, - y: - position === 'left top' || position === 'right top' - ? 0 - : screen.getPrimaryDisplay().workArea.height - windowHeight, - frame: false, - show: false, - autoHideMenuBar: true, - // 代码启动台需要置顶 - alwaysOnTop: true, - resizable: false, - backgroundColor: '#1f1f1f', - icon: codeLaunchpadIcon, - webPreferences: { - preload: path.join(__dirname, '../preload/index.mjs'), - sandbox: false - } - }) - - codeLaunchpadWindow.on('ready-to-show', () => { - codeLaunchpadWindow.show() - }) - - // 如有必要,失去焦点时自动关闭 - if (closeOnBlur) { - codeLaunchpadWindow.on('blur', () => { - codeLaunchpadWindow.close() - }) - } - - // 关闭代码启动台时 - codeLaunchpadWindow.on('close', () => { - global.codeLaunchpadWindow = null - }) - - codeLaunchpadWindow.webContents.setWindowOpenHandler((details) => { - shell.openExternal(details.url) - return { action: 'deny' } - }) - - // 开发和生产环境的各自设置 - if (is.dev && process.env['ELECTRON_RENDERER_URL']) { - codeLaunchpadWindow.loadURL(process.env['ELECTRON_RENDERER_URL'] + '#/codeLaunchpad/IDEs') - } else { - codeLaunchpadWindow.loadFile(path.join(__dirname, '../renderer/index.html'), { - hash: '/codeLaunchpad/IDEs' - }) - } - - global.codeLaunchpadWindow = codeLaunchpadWindow - - return true -} - -export function createCodeLaunchpadTray(): Tray { - const tray = new Tray(codeLaunchpadIcon) - - tray.on('click', () => createCodeLaunchpadWindow(true)) - - return tray -} diff --git a/src/main/index.ts b/src/main/index.ts index 10a66c1..525d08c 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -4,14 +4,14 @@ import { saveSettingsToLocal, updateSettingsFromLocal } from './settings' import { checkIDEs, checkIDEsVersion, - createCodeLaunchpadTray, - createCodeLaunchpadWindow, getIDEs, getIDEsVersion } from './code-launchpad/ide-versions-check' import { fanToolsIcon } from './resources' import path from 'path' import { getJetBrainsProjects, getVscodeProjects, openProject } from './code-launchpad/ide-projects' +import { createCodeLaunchpadTray, createCodeLaunchpadWindow } from './code-launchpad/code-launchpad' +import type { IDECode } from '@my-type/settings' let mainWindow: BrowserWindow | null = null // @ts-ignore 保存引用,禁用报错 @@ -131,7 +131,7 @@ app.whenReady().then(async () => { ipcMain.handle('codeLaunchpad:checkIDEsVersion', checkIDEsVersion) ipcMain.handle('codeLaunchpad:getVSCodeProjects', getVscodeProjects) ipcMain.handle('codeLaunchpad:getJetBrainsProjects', getJetBrainsProjects) - ipcMain.handle('codeLaunchpad:openProject', (_, ide: string, path: string) => { + ipcMain.handle('codeLaunchpad:openProject', (_, ide: IDECode, path: string) => { return openProject(ide, path) })