fix(storage): Datenverlust bei Ladefehlern, neuen Seiten und Löschen verhindern

- Beschädigte Seiten werden als page_<id>.json.corrupt-<zeit> gesichert statt
  leer überschrieben; bei I/O-Fehlern wird die Ersatzseite als load_failed
  markiert und nie gespeichert
- Autosave gleicht das Manifest (page_ids, Zähler) mit dem Notizbuch ab, damit
  neu angelegte Seiten nach einem Neustart nicht verloren gehen
- Start: nicht ladbares Notizbuch bleibt unverändert, stattdessen wird ein
  neues angelegt
- Aktuelles Notizbuch löschen: ausstehende Schreibvorgänge vorher abarbeiten,
  damit der Ordner nicht wieder angelegt wird
- PDF-Export lädt nicht geöffnete Seiten nach und verweigert unvollständige
  Exporte; Ergebnis wird per Kanal an die UI gemeldet
- Strg+S speichert alle geladenen Seiten und meldet Schreibfehler; flush()
  liefert Fehler zurück statt immer "Gespeichert"

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
haraldandClaude Opus 5.5 committed 2026-10-06 19:43:16 +02:00
1 parent f9b39c6fe3
commit d61e1819ed
5 files changed
+527 -172

No files matched your search

+5
View File
@@ -314,6 +314,9 @@ pub struct Page {
pub stroke_ranges: Vec<Range<u32>>,
pub is_dirty: bool,
pub is_loaded: bool,
/// Laden von der Festplatte ist fehlgeschlagen; die Seite ist ein leerer Ersatz und
/// darf niemals gespeichert werden, damit die Originaldatei nicht überschrieben wird.
pub load_failed: bool,
pub history: HistoryStack,
}
@@ -327,6 +330,7 @@ impl Page {
stroke_ranges: Vec::new(),
is_dirty: false,
is_loaded: true,
load_failed: false,
history: HistoryStack::new(),
}
}
@@ -341,6 +345,7 @@ impl Page {
stroke_ranges: Vec::new(),
is_dirty: false,
is_loaded: false,
load_failed: false,
history: HistoryStack::new(),
}
}