diff --git a/simpliplay/main.js b/simpliplay/main.js index b1fd8d9..3e415c4 100644 --- a/simpliplay/main.js +++ b/simpliplay/main.js @@ -11,15 +11,22 @@ app.on('open-file', (event, filePath) => { openFile(filePath); }); -// Open files using the existing window (or create a new one if needed) const openFile = (filePath) => { - if (mainWindow) { - mainWindow.webContents.send("play-media", filePath); - } else { - createWindow(() => { - mainWindow.webContents.send("play-media", filePath); - }); - } + app.whenReady().then(() => { + if (mainWindow) { + if (mainWindow.webContents.isLoading()) { + mainWindow.webContents.once("did-finish-load", () => { + mainWindow.webContents.send("play-media", filePath); + }); + } else { + mainWindow.webContents.send("play-media", filePath); + } + } else { + createWindow(() => { + mainWindow.webContents.send("play-media", filePath); + }); + } + }); }; const takeSnapshot = async () => { @@ -33,7 +40,7 @@ const takeSnapshot = async () => { const filePath = path.join(snapshotsDir, `snapshot-${Date.now()}.png`); fs.writeFileSync(filePath, png); - const { response } = await dialog.showMessageBox({ + const { response } = await dialog.showMessageBox(mainWindow, { type: 'info', title: 'Snapshot Saved', message: `Snapshot saved to:\n${filePath}`, @@ -41,112 +48,108 @@ const takeSnapshot = async () => { defaultId: 0, }); - if (response === 1) { - shell.openPath(filePath); - } + if (response === 1) shell.openPath(filePath); } catch (error) { - console.error("Error capturing snapshot:", error); dialog.showErrorBox("Snapshot Error", `Failed to capture snapshot: ${error.message}`); } }; const createWindow = (onReadyCallback) => { - if (mainWindow) { - mainWindow.close(); - mainWindow = null; + if (!app.isReady()) { + app.whenReady().then(() => createWindow(onReadyCallback)); + return; } + if (mainWindow) mainWindow.close(); + mainWindow = new BrowserWindow({ width: 1920, height: 1080, webPreferences: { - preload: path.join(__dirname, 'preload.js'), + preload: path.join(__dirname, "preload.js"), contextIsolation: true, }, }); mainWindow.loadFile("index.html"); - mainWindow.on("closed", () => { - mainWindow = null; - }); - - mainWindow.webContents.once("did-finish-load", () => { + mainWindow.once("ready-to-show", () => { if (onReadyCallback) onReadyCallback(); }); - // Register global shortcuts - globalShortcut.register('CommandOrControl+Shift+S', takeSnapshot); - globalShortcut.register('CommandOrControl+Shift+I', () => { - mainWindow.webContents.openDevTools(); - }); + setupContextMenu(); +}; - // Modify the default menu - const menu = Menu.getApplicationMenu(); - if (menu) { - const fileMenu = menu.items.find(item => item.label === 'File'); - if (fileMenu && !fileMenu.submenu.items.some(item => item.label === 'Take a Snapshot')) { - fileMenu.submenu.append(new MenuItem({ - label: 'Take a Snapshot', - accelerator: 'CommandOrControl+Shift+S', - click: takeSnapshot - })); - } +// Set up context menu (prevents errors if `mainWindow` is undefined) +const setupContextMenu = () => { + if (!mainWindow) return; - const helpMenu = menu.items.find(item => item.label === 'Help'); - if (helpMenu) { - const existingLabels = helpMenu.submenu.items.map(item => item.label); - - const addMenuItem = (label, url) => { - if (!existingLabels.includes(label)) { - helpMenu.submenu.append(new MenuItem({ - label, - click: () => shell.openExternal(url) - })); - } - }; - - addMenuItem('Source Code', 'https://github.com/A-Star100/simpliplay-desktop'); - addMenuItem('Website', 'https://simpliplay.netlify.app'); - addMenuItem('Help Center', 'https://simpliplay.netlify.app/help'); - - if (!existingLabels.includes('Quit')) { - helpMenu.submenu.append(new MenuItem({ type: 'separator' })); - helpMenu.submenu.append(new MenuItem({ - label: 'Quit', - click: () => app.quit(), - })); - } - } - } - - // Create context menu const contextMenu = new Menu(); - if (!contextMenu.items.some(item => item.label === 'Take a Snapshot')) { - contextMenu.append(new MenuItem({ - label: 'Take a Snapshot', - click: takeSnapshot - })); - } + contextMenu.append(new MenuItem({ label: 'Take a Snapshot', click: takeSnapshot })); + contextMenu.append(new MenuItem({ type: 'separator' })); + contextMenu.append(new MenuItem({ label: 'Inspect', click: () => mainWindow.webContents.openDevTools() })); - if (!contextMenu.items.some(item => item.label === 'Inspect')) { - contextMenu.append(new MenuItem({ type: 'separator' })); - contextMenu.append(new MenuItem({ - label: 'Inspect', - click: () => mainWindow.webContents.openDevTools() - })); - } - - mainWindow.webContents.on('context-menu', (event, params) => { + mainWindow.webContents.on('context-menu', (event) => { event.preventDefault(); contextMenu.popup({ window: mainWindow }); }); +}; + +// Set up application menu +const setupMenu = () => { + const menu = Menu.getApplicationMenu(); + if (!menu) return; + + const fileMenu = menu.items.find(item => item.label === 'File'); + if (fileMenu && !fileMenu.submenu.items.some(item => item.label === 'Take a Snapshot')) { + fileMenu.submenu.append(new MenuItem({ label: 'Take a Snapshot', accelerator: 'CommandOrControl+Shift+S', click: takeSnapshot })); + } + + const helpMenu = menu.items.find(item => item.label === 'Help'); + if (helpMenu) { + const addMenuItem = (label, url) => { + if (!helpMenu.submenu.items.some(item => item.label === label)) { + helpMenu.submenu.append(new MenuItem({ label, click: () => shell.openExternal(url) })); + } + }; + + addMenuItem('Source Code', 'https://github.com/A-Star100/simpliplay-desktop'); + addMenuItem('Website', 'https://simpliplay.netlify.app'); + addMenuItem('Help Center', 'https://simpliplay.netlify.app/help'); + + if (!helpMenu.submenu.items.some(item => item.label === 'Quit')) { + helpMenu.submenu.append(new MenuItem({ type: 'separator' })); + helpMenu.submenu.append(new MenuItem({ label: 'Quit', click: () => app.quit() })); + } + } Menu.setApplicationMenu(menu); }; +// Quit Confirmation on CommandOrControl+Q +const setupShortcuts = () => { + globalShortcut.register('CommandOrControl+Q', () => { + if (mainWindow) { + dialog.showMessageBox(mainWindow, { + type: 'question', + buttons: ['Cancel', 'Quit'], + defaultId: 1, + title: 'Quit?', + message: 'Are you sure you want to quit SimpliPlay?', + }).then(({ response }) => { + if (response === 1) app.quit(); + }); + } + }); + + globalShortcut.register('CommandOrControl+Shift+S', takeSnapshot); +}; + +// App lifecycle management app.whenReady().then(() => { createWindow(); + setupMenu(); + setupShortcuts(); app.on("open-file", (event, filePath) => { event.preventDefault();