// Tray-Symbol mit Zustand (KONZEPT § 7): auf einen Blick, ob ein Rip // läuft und wie weit. Mit dem Tray ändert sich das Schließen-Verhalten: // Fenster zu heißt „im Hintergrund weiterarbeiten" (§ 4.1 Punkt 3) — // beendet wird über das Kontextmenü oder den Menüpunkt. import { Menu, nativeImage, Tray } from 'electron' import { join } from 'node:path' let tray: Tray | null = null export function trayErstellen(oeffnen: () => void, beenden: () => void): Tray | null { try { // Das Bau-Icon liegt neben dem Bundle: out/haupt → ../../bau/tray.png // im Quell-Lauf; im gepackten Programm über resourcesPath (W-6 legt es // per extraResources dorthin). const kandidaten = [ join(__dirname, '..', '..', 'bau', 'tray.png'), join(process.resourcesPath ?? '', 'bau', 'tray.png'), ] let bild = nativeImage.createEmpty() for (const kandidat of kandidaten) { const versuch = nativeImage.createFromPath(kandidat) if (!versuch.isEmpty()) { bild = versuch break } } tray = new Tray(bild) tray.setToolTip('Rippy — bereit') tray.setContextMenu( Menu.buildFromTemplate([ { label: 'Rippy öffnen', click: oeffnen }, { type: 'separator' }, { label: 'Beenden', click: beenden }, ]), ) tray.on('click', oeffnen) return tray } catch (fehler) { // R4: Ohne Tray läuft Rippy trotzdem — aber der Grund steht im Log. console.error(`[haupt] Tray nicht erstellt: ${String(fehler)}`) return null } } export function trayHinweis(text: string): void { tray?.setToolTip(text.length > 0 ? `Rippy — ${text}` : 'Rippy — bereit') } export function trayWeg(): void { tray?.destroy() tray = null }