From d3d5270889dc425c0ac6d1d707e85734029666e2 Mon Sep 17 00:00:00 2001 From: michalcourson Date: Tue, 3 Mar 2026 17:47:45 -0500 Subject: [PATCH] closes #6 --- electron-ui/src/ipc/{audio => }/channels.ts | 0 electron-ui/src/ipc/{audio => }/main.ts | 4 +- electron-ui/src/ipc/settings/channels.ts | 8 ---- electron-ui/src/ipc/{audio => }/types.ts | 0 electron-ui/src/main/main.ts | 29 ++++++++++++-- electron-ui/src/main/preload.ts | 4 +- electron-ui/src/renderer/Settings.tsx | 44 ++++++++++++++------- 7 files changed, 60 insertions(+), 29 deletions(-) rename electron-ui/src/ipc/{audio => }/channels.ts (100%) rename electron-ui/src/ipc/{audio => }/main.ts (91%) delete mode 100644 electron-ui/src/ipc/settings/channels.ts rename electron-ui/src/ipc/{audio => }/types.ts (100%) diff --git a/electron-ui/src/ipc/audio/channels.ts b/electron-ui/src/ipc/channels.ts similarity index 100% rename from electron-ui/src/ipc/audio/channels.ts rename to electron-ui/src/ipc/channels.ts diff --git a/electron-ui/src/ipc/audio/main.ts b/electron-ui/src/ipc/main.ts similarity index 91% rename from electron-ui/src/ipc/audio/main.ts rename to electron-ui/src/ipc/main.ts index 5def87a..60c0dbd 100644 --- a/electron-ui/src/ipc/audio/main.ts +++ b/electron-ui/src/ipc/main.ts @@ -1,8 +1,8 @@ -import { ipcMain } from 'electron'; +import { dialog, ipcMain } from 'electron'; import fs from 'fs'; import AudioChannels from './channels'; import { LoadAudioBufferArgs, LoadAudioBufferResult } from './types'; -import PythonSubprocessManager from '../../main/service'; +import PythonSubprocessManager from '../main/service'; export default function registerAudioIpcHandlers() { ipcMain.handle( diff --git a/electron-ui/src/ipc/settings/channels.ts b/electron-ui/src/ipc/settings/channels.ts deleted file mode 100644 index 6ff9c0b..0000000 --- a/electron-ui/src/ipc/settings/channels.ts +++ /dev/null @@ -1,8 +0,0 @@ -const SettingsChannels = { - GET_DEFAULTS: 'settings:get-defaults', - GET_SETTINGS: 'settings:get-settings', - SET_SETTINGS: 'settings:set-settings', - GET_INPUT_DEVICES: 'settings:get-input-devices', -} as const; - -export default SettingsChannels; diff --git a/electron-ui/src/ipc/audio/types.ts b/electron-ui/src/ipc/types.ts similarity index 100% rename from electron-ui/src/ipc/audio/types.ts rename to electron-ui/src/ipc/types.ts diff --git a/electron-ui/src/main/main.ts b/electron-ui/src/main/main.ts index c8d7915..ed95749 100644 --- a/electron-ui/src/main/main.ts +++ b/electron-ui/src/main/main.ts @@ -10,12 +10,20 @@ */ import fs from 'fs'; import path from 'path'; -import { app, BrowserWindow, shell, ipcMain, Tray, Menu } from 'electron'; +import { + app, + BrowserWindow, + shell, + ipcMain, + Tray, + Menu, + dialog, +} from 'electron'; import { autoUpdater } from 'electron-updater'; import log from 'electron-log'; import MenuBuilder from './menu'; import { resolveHtmlPath } from './util'; -import registerFileIpcHandlers from '../ipc/audio/main'; +import registerFileIpcHandlers from '../ipc/main'; import PythonSubprocessManager from './service'; const pythonManager = new PythonSubprocessManager('src/main.py'); @@ -110,6 +118,21 @@ const createWindow = async () => { menuBuilder.buildMenu(); registerFileIpcHandlers(); + ipcMain.handle('select-directory', async () => { + try { + const result = await dialog.showOpenDialog(mainWindow, { + properties: ['openDirectory'], // Key property to select a folder + }); + if (!result.canceled && result.filePaths.length > 0) { + // Send the selected directory path back to the renderer process + return result.filePaths[0]; + } + return null; + } catch (err: any) { + return { error: err.message }; + } + }); + // Open urls in the user's browser mainWindow.webContents.setWindowOpenHandler((edata) => { shell.openExternal(edata.url); @@ -164,7 +187,7 @@ app .whenReady() .then(() => { // if (app.isPackaged) { - // pythonManager.start(); + pythonManager.start(); // } createWindow(); app.on('activate', () => { diff --git a/electron-ui/src/main/preload.ts b/electron-ui/src/main/preload.ts index 1487c23..2e2faa2 100644 --- a/electron-ui/src/main/preload.ts +++ b/electron-ui/src/main/preload.ts @@ -1,8 +1,8 @@ // Disable no-unused-vars, broken for spread args /* eslint no-unused-vars: off */ import { contextBridge, ipcRenderer, IpcRendererEvent } from 'electron'; -import { LoadAudioBufferArgs } from '../ipc/audio/types'; -import AudioChannels from '../ipc/audio/channels'; +import { LoadAudioBufferArgs } from '../ipc/types'; +import AudioChannels from '../ipc/channels'; // import '../ipc/file/preload'; // Import file API preload to ensure it runs and exposes the API export type Channels = 'ipc-example'; diff --git a/electron-ui/src/renderer/Settings.tsx b/electron-ui/src/renderer/Settings.tsx index 716c58b..01da631 100644 --- a/electron-ui/src/renderer/Settings.tsx +++ b/electron-ui/src/renderer/Settings.tsx @@ -1,10 +1,13 @@ import React, { useEffect, useState } from 'react'; +// import { ipcRenderer } from 'electron'; import { useNavigate } from 'react-router-dom'; import './App.css'; import TextField from '@mui/material/TextField'; import Select from '@mui/material/Select'; import MenuItem from '@mui/material/MenuItem'; +import { IconButton } from '@mui/material'; +import MoreHorizIcon from '@mui/icons-material/MoreHoriz'; import { apiFetch } from './api'; type AudioDevice = { @@ -123,18 +126,22 @@ export default function SettingsPage() { }; const handleFolderChange = async () => { - // Replace with actual folder picker - // Example: const folder = await window.api.selectFolder(); - // const folder = window.prompt( - // 'Enter output folder path:', - // settings.outputFolder, - // ); - // if (folder !== null) { - // setSettings((prev) => ({ - // ...prev, - // outputFolder: folder, - // })); - // } + await window.electron.ipcRenderer + .invoke('select-directory') + .then((result) => { + if (result) { + setSettings((prev) => ({ + ...prev, + save_path: result, + })); + sendSettingsToBackend({ + ...settings, + save_path: result, + }); + } + return null; + }); + return null; }; return ( @@ -259,13 +266,22 @@ export default function SettingsPage() { value={settings.save_path} className="ml-2 w-[300px]" /> - + */}