|
|
|
@ -112,10 +112,38 @@ function showConfirm( |
|
|
|
}); |
|
|
|
}); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// --- Persistence -------------------------------------------------------------
|
|
|
|
|
|
|
|
const STORAGE_KEY = "monodisplay_autosave"; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function saveToStorage() { |
|
|
|
|
|
|
|
try { |
|
|
|
|
|
|
|
const buf = file.toBuffer(); |
|
|
|
|
|
|
|
const b64 = btoa(String.fromCharCode(...buf)); |
|
|
|
|
|
|
|
localStorage.setItem(STORAGE_KEY, JSON.stringify({ filename: currentFilename, data: b64 })); |
|
|
|
|
|
|
|
} catch {} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function loadFromStorage() { |
|
|
|
|
|
|
|
try { |
|
|
|
|
|
|
|
const raw = localStorage.getItem(STORAGE_KEY); |
|
|
|
|
|
|
|
if (!raw) return; |
|
|
|
|
|
|
|
const { filename, data } = JSON.parse(raw); |
|
|
|
|
|
|
|
const bytes = Uint8Array.from(atob(data), c => c.charCodeAt(0)); |
|
|
|
|
|
|
|
const parsed = new MonoDisplay.MonoDisplayParser().parse(bytes.buffer); |
|
|
|
|
|
|
|
file = new MonoDisplayFile(parsed.sections); |
|
|
|
|
|
|
|
currentFilename = filename; |
|
|
|
|
|
|
|
const filenameEl = document.getElementById("filename"); |
|
|
|
|
|
|
|
if (filenameEl) filenameEl.textContent = filename; |
|
|
|
|
|
|
|
isDirty = true; |
|
|
|
|
|
|
|
document.getElementById("filename")?.classList.add("dirty"); |
|
|
|
|
|
|
|
} catch {} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// --- Dirty tracking ----------------------------------------------------------
|
|
|
|
// --- Dirty tracking ----------------------------------------------------------
|
|
|
|
function markDirty() { |
|
|
|
function markDirty() { |
|
|
|
isDirty = true; |
|
|
|
isDirty = true; |
|
|
|
document.getElementById("filename")?.classList.add("dirty"); |
|
|
|
document.getElementById("filename")?.classList.add("dirty"); |
|
|
|
|
|
|
|
saveToStorage(); |
|
|
|
} |
|
|
|
} |
|
|
|
function markClean() { |
|
|
|
function markClean() { |
|
|
|
isDirty = false; |
|
|
|
isDirty = false; |
|
|
|
@ -797,4 +825,5 @@ window.addEventListener("beforeunload", (e) => { |
|
|
|
if (isDirty) e.preventDefault(); |
|
|
|
if (isDirty) e.preventDefault(); |
|
|
|
}); |
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
loadFromStorage(); |
|
|
|
triggerPreview(); |
|
|
|
triggerPreview(); |
|
|
|
|