mirror of
https://github.com/A-Star100/simpliplay-desktop.git
synced 2025-09-17 22:29:38 +00:00

Small workaround to fix warnings on Mac that prevented the app from opening once closed, this bug will be fully fixed soon, but for now, when you close the app, it will fully close and not remain active anymore as a process.
169 lines
4.8 KiB
JavaScript
169 lines
4.8 KiB
JavaScript
const { app, BrowserWindow, Menu, MenuItem, shell, dialog, globalShortcut } = require('electron');
|
|
const path = require('path');
|
|
const fs = require('fs');
|
|
const os = require('os');
|
|
|
|
let mainWindow;
|
|
|
|
// Handle file opening from Finder or File Explorer
|
|
app.on('open-file', (event, filePath) => {
|
|
event.preventDefault();
|
|
openFile(filePath);
|
|
});
|
|
|
|
const openFile = (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 () => {
|
|
if (!mainWindow) return;
|
|
|
|
try {
|
|
const image = await mainWindow.webContents.capturePage();
|
|
const png = image.toPNG();
|
|
const snapshotsDir = path.join(os.homedir(), 'simpliplay-snapshots');
|
|
fs.mkdirSync(snapshotsDir, { recursive: true });
|
|
const filePath = path.join(snapshotsDir, `snapshot-${Date.now()}.png`);
|
|
fs.writeFileSync(filePath, png);
|
|
|
|
const { response } = await dialog.showMessageBox(mainWindow, {
|
|
type: 'info',
|
|
title: 'Snapshot Saved',
|
|
message: `Snapshot saved to:\n${filePath}`,
|
|
buttons: ['OK', 'Open File'],
|
|
defaultId: 0,
|
|
});
|
|
|
|
if (response === 1) shell.openPath(filePath);
|
|
} catch (error) {
|
|
dialog.showErrorBox("Snapshot Error", `Failed to capture snapshot: ${error.message}`);
|
|
}
|
|
};
|
|
|
|
const createWindow = (onReadyCallback) => {
|
|
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"),
|
|
contextIsolation: true,
|
|
},
|
|
});
|
|
|
|
mainWindow.loadFile("index.html");
|
|
|
|
mainWindow.once("ready-to-show", () => {
|
|
if (onReadyCallback) onReadyCallback();
|
|
});
|
|
|
|
setupContextMenu();
|
|
};
|
|
|
|
// Set up context menu (prevents errors if `mainWindow` is undefined)
|
|
const setupContextMenu = () => {
|
|
if (!mainWindow) return;
|
|
|
|
const contextMenu = new Menu();
|
|
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() }));
|
|
|
|
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();
|
|
openFile(filePath);
|
|
});
|
|
|
|
app.on("activate", () => {
|
|
if (BrowserWindow.getAllWindows().length === 0) createWindow();
|
|
});
|
|
});
|
|
|
|
app.on("window-all-closed", () => {
|
|
app.quit();
|
|
/* once bug fixed replace above with:
|
|
if (process.platform !== 'darwin') app.quit() */
|
|
});
|