feat(v5): Etappe W-5 — Oberflaeche: Tray, Toasts, Taskleiste, Einstellungen, Bibliothek
Ampel / ampel (push) Successful in 1m23s
Ampel / ampel (push) Successful in 1m23s
haupt/: tray.ts (Symbol mit Zustand, Kontextmenue, Fenster zu = weiter- laufen, Beenden nur noch gewollt), Windows-Toasts bei Disc erkannt / fertig / Fehler (Klick holt das Fenster), Taskleisten-Fortschritt (setProgressBar, Fehlermodus), echter Windows-Ordnerdialog per IPC. Eigenes Icon (bau/icon.png + tray.png, Disc-Optik). Kern: Einstellungen lesen/schreiben NUR ueber die eine Quelle (§ 6.7, Whitelist der Schluessel), Werkzeug-Auskunft (Katalog + gemessene HandBrake-Presets/Backends), Bibliothek in db.ts (Schema v2 — fingerprint, Titel, Groesse, Ort, Dauer), Duplikat-Erkennung beim Einlegen (§ 6.6: 'schon einmal gerippt am …' als disc-info + Toast), Pipeline traegt fertige Vorgaenge ein. Fenster: drei Bereiche (Uebersicht / Einstellungen / Bibliothek). Einstellungen: Ablage mit Durchsuchen-Dialog, Kompression je Disc-Typ (Preset-Liste VOM eigenen HandBrake gemessen, 'NICHT komprimieren' waehlbar), Sprachlisten, TMDb/OMDb-Keys, Medienserver, Werkzeug-Stand mit Klartext (gefunden/fehlt + Folgen). Bibliothek als Tabelle. Der Smoke-Screenshot zeigt nebenbei den Ernstfall in schoen: Das Laufwerk ist nach dem rc11-Vorfall inzwischen auch am Storage-Stack in 'unknown' gekippt — und die Kachel zeigt den ZUGRIFFS_GRUENDE-Klartext samt Abhilfe statt eines stummen Zustands. 165 Tests gruen, Smoke gruen. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
a9fa8fa2d8
commit
c78ff22ab7
@@ -0,0 +1,52 @@
|
||||
// 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
|
||||
}
|
||||
Reference in New Issue
Block a user