Loading settings...
;
}
+ const multiSystems = Object.entries(systemAssignments)
+ .filter(([, emus]) => emus.length > 1)
+ .sort(([a], [b]) => a.localeCompare(b));
+
return (
@@ -72,6 +153,47 @@ export function SettingsPage() {
/>
+
+
Emulator Assignments
+
+ Choose which emulator handles each system when multiple options exist.
+ Re-scan your ROMs after changing these preferences.
+
+ {multiSystems.length === 0 ? (
+
No systems with multiple emulator options available.
+ ) : (
+ multiSystems.map(([system, emus]) => (
+
+
+
+ {systemLabels[system] || system}
+
+
+ {emus.map((e) => emuNameMap[e] || e).join(', ')}
+
+
+
+
+ ))
+ )}
+
+
Appearance
@@ -82,9 +204,11 @@ export function SettingsPage() {
+
+
Updates
+
+
+
Check for updates
+
+ {updateInfo?.status === 'available' && `v${updateInfo.version} available`}
+ {updateInfo?.status === 'not-available' && `v${updateInfo.version} — up to date`}
+ {updateInfo?.status === 'downloaded' && 'Ready to install — restart the app to apply'}
+ {updateInfo?.status === 'error' && `Error: ${updateInfo.message}`}
+ {!updateInfo && 'Check GitHub for new releases'}
+
+
+ {updateInfo?.status !== 'downloaded' ? (
+
+ ) : (
+
+ )}
+
+ {updateInfo?.status === 'available' && (
+
+
+
+ {downloading ? `Downloading... ${downloadProgress}%` : 'Download update'}
+
+
+ {downloading
+ ? `Downloading v${updateInfo.version}`
+ : downloadProgress > 0
+ ? `Downloaded ${downloadProgress}%`
+ : `v${updateInfo.version} will be downloaded and installed on restart`}
+
+
+
+
+ )}
+ {updateInfo?.releaseNotes && (
+
+
+ Release notes
+
+
+ {typeof updateInfo.releaseNotes === 'string'
+ ? updateInfo.releaseNotes
+ : JSON.stringify(updateInfo.releaseNotes, null, 2)}
+
+
+ )}
+
+
About
- OmniEmu v0.1.1 · Cross-platform emulator manager
+ OmniEmu v{updateInfo?.version || '0.1.1'} · Cross-platform emulator manager
Built with Electron + React + TypeScript
diff --git a/src/renderer/pages/UtilitiesPage.tsx b/src/renderer/pages/UtilitiesPage.tsx
new file mode 100644
index 0000000..2a6dbed
--- /dev/null
+++ b/src/renderer/pages/UtilitiesPage.tsx
@@ -0,0 +1,36 @@
+import React, { useState } from 'react';
+
+export function UtilitiesPage() {
+ const [regenerating, setRegenerating] = useState(false);
+
+ const handleRecreate = async () => {
+ setRegenerating(true);
+ await window.omni.utilities.regenerateRomsStructure();
+ setTimeout(() => setRegenerating(false), 1500);
+ };
+
+ return (
+
+
+
ROM Folder Structure
+
+
+
+
Regenerate ROM folders
+
+ Recreate the ~/Documents/roms/ folder and all system
+ subdirectories if any were deleted.
+
+
+
+
+
+
+ );
+}
diff --git a/src/renderer/styles.css b/src/renderer/styles.css
index 6f9a50a..ef4b632 100644
--- a/src/renderer/styles.css
+++ b/src/renderer/styles.css
@@ -41,6 +41,25 @@
--transition: 150ms ease;
}
+[data-theme="light"] {
+ --bg-primary: #f5f5f8;
+ --bg-secondary: #ffffff;
+ --bg-tertiary: #eef0f5;
+ --bg-card: #ffffff;
+ --bg-hover: #e8e8f0;
+ --text-primary: #1a1a2e;
+ --text-secondary: #555577;
+ --text-muted: #9999bb;
+ --accent: #6c63ff;
+ --accent-hover: #5b52ee;
+ --accent-dim: rgba(108, 99, 255, 0.1);
+ --success: #22c55e;
+ --warning: #d97706;
+ --error: #dc2626;
+ --border: #d4d4e0;
+ --shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
+}
+
html, body, #root {
height: 100%;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
diff --git a/src/shared/types.ts b/src/shared/types.ts
index 9e9b2c3..cd37dc5 100644
--- a/src/shared/types.ts
+++ b/src/shared/types.ts
@@ -5,7 +5,7 @@ export interface EmulatorDownload {
url: string;
/** Archive type: 'exe' = direct installer, 'msi' = windows msi,
* 'dmg' = macOS disk image, 'appimage' = linux appimage,
- * 'tar.gz' | 'tar.bz2' | 'zip' = archive to extract,
+ * 'tar.gz' | 'tar.bz2' | 'tar.xz' | 'zip' = archive to extract,
* 'pkg' = macOS installer, '7z' = 7zip archive */
format: string;
/** Path inside archive to the executable (if archive format) */
@@ -14,6 +14,8 @@ export interface EmulatorDownload {
size?: number;
/** Only for this arch (omitted = all arches) */
arch?: Arch;
+ /** Installer type for exe format: 'nsis' (default), 'inno' */
+ installerType?: 'nsis' | 'inno';
}
export interface EmulatorConfig {
@@ -92,6 +94,8 @@ export interface AppSettings {
recentGames: GameEntry[];
/** Directory for BIOS files */
biosDirectory: string;
+ /** Per-system preferred emulator override: systemId -> emulatorId */
+ systemEmulators?: Record
;
}
export interface SystemInfo {
@@ -108,3 +112,14 @@ export interface EmulatorState {
config: EmulatorConfig;
configured: boolean;
}
+
+export interface UpdateInfo {
+ available: boolean;
+ latestVersion: string;
+ currentVersion: string;
+ releaseUrl: string;
+ assetName?: string;
+ assetUrl?: string;
+ assetSize?: number;
+ releaseNotes?: string;
+}