From c11fd4068120c783387b5229b92882a88b65a576 Mon Sep 17 00:00:00 2001 From: MasterAcnolo <68693319+MasterAcnolo@users.noreply.github.com> Date: Sat, 20 Dec 2025 09:53:17 +0100 Subject: [PATCH] feat: Implement topbar with custom window controls and actions --- main.js | 32 ++++++++ preload.js | 11 +++ public/assets/icon/close.svg | 1 + public/assets/icon/maximize.svg | 1 + public/assets/icon/minimize.svg | 1 + public/index.html | 15 ++++ public/script/topbar.js | 24 ++++++ public/styles/components/themebutton.css | 2 +- public/styles/layout/topbar.css | 95 ++++++++++++++++++++++++ 9 files changed, 181 insertions(+), 1 deletion(-) create mode 100644 public/assets/icon/close.svg create mode 100644 public/assets/icon/maximize.svg create mode 100644 public/assets/icon/minimize.svg create mode 100644 public/script/topbar.js create mode 100644 public/styles/layout/topbar.css diff --git a/main.js b/main.js index b6b7d41..7e697e8 100644 --- a/main.js +++ b/main.js @@ -77,6 +77,7 @@ async function createMainWindow() { height: 800, minWidth: 750, minHeight: 800, + frame:false, webPreferences: { nodeIntegration: false, contextIsolation: true, @@ -118,6 +119,37 @@ ipcMain.on("set-progress", (event, percent) => { if (mainWindow) mainWindow.setProgressBar(percent / 100); // Electron attend 0 → 1 }); +// Topbar window controls +ipcMain.on("window-minimize", () => { + if (mainWindow) mainWindow.minimize(); +}); +ipcMain.on("window-maximize", () => { + if (mainWindow) { + if (mainWindow.isMaximized()) { + mainWindow.unmaximize(); + } else { + mainWindow.maximize(); + } + } +}); +ipcMain.on("window-close", () => { + if (mainWindow) mainWindow.close(); +}); + +// Topbar custom actions +ipcMain.on("open-devtools", () => { + if (mainWindow) mainWindow.webContents.openDevTools({ mode: 'detach' }); +}); +ipcMain.on("open-logs", () => { + if (logsFolderPath) shell.openPath(logsFolderPath); +}); +ipcMain.on("open-website", () => { + shell.openExternal("https://masteracnolo.github.io/FreedomLoader/index.html"); +}); +ipcMain.on("open-wiki", () => { + shell.openExternal("https://masteracnolo.github.io/FreedomLoader/pages/wiki.html"); +}); + // Menu function setupMenu() { const menuTemplate = [ diff --git a/preload.js b/preload.js index a1f3787..2f0e8e8 100644 --- a/preload.js +++ b/preload.js @@ -5,3 +5,14 @@ contextBridge.exposeInMainWorld("electronAPI", { selectDownloadFolder: () => ipcRenderer.invoke("select-download-folder"), setProgress: (percent) => ipcRenderer.send("set-progress", percent) }); + +// Contrôles de fenêtre et outils custom pour la topbar +contextBridge.exposeInMainWorld("topbarAPI", { + minimize: () => ipcRenderer.send("window-minimize"), + maximize: () => ipcRenderer.send("window-maximize"), + close: () => ipcRenderer.send("window-close"), + openDevTools: () => ipcRenderer.send("open-devtools"), + openLogs: () => ipcRenderer.send("open-logs"), + openWebsite: () => ipcRenderer.send("open-website"), + openWiki: () => ipcRenderer.send("open-wiki") +}); diff --git a/public/assets/icon/close.svg b/public/assets/icon/close.svg new file mode 100644 index 0000000..1d747f8 --- /dev/null +++ b/public/assets/icon/close.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/assets/icon/maximize.svg b/public/assets/icon/maximize.svg new file mode 100644 index 0000000..24dc937 --- /dev/null +++ b/public/assets/icon/maximize.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/assets/icon/minimize.svg b/public/assets/icon/minimize.svg new file mode 100644 index 0000000..f5d42a4 --- /dev/null +++ b/public/assets/icon/minimize.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/index.html b/public/index.html index f0eafd9..d68b91f 100644 --- a/public/index.html +++ b/public/index.html @@ -12,9 +12,23 @@