91 lines
2.1 KiB
Swift
91 lines
2.1 KiB
Swift
import Foundation
|
|
import Combine
|
|
|
|
class AppState: ObservableObject {
|
|
@Published var documentText: String = "" {
|
|
didSet {
|
|
if documentText != oldValue {
|
|
modified = true
|
|
bridge.setText(currentNoteID, text: documentText)
|
|
}
|
|
}
|
|
}
|
|
@Published var evalResults: [Int: String] = [:]
|
|
@Published var noteList: [NoteInfo] = []
|
|
@Published var currentNoteID: UUID
|
|
@Published var modified: Bool = false
|
|
|
|
private let bridge = RustBridge.shared
|
|
|
|
init() {
|
|
let id = bridge.newDocument()
|
|
self.currentNoteID = id
|
|
refreshNoteList()
|
|
}
|
|
|
|
func newNote() {
|
|
saveCurrentIfNeeded()
|
|
let id = bridge.newDocument()
|
|
currentNoteID = id
|
|
documentText = ""
|
|
evalResults = [:]
|
|
modified = false
|
|
refreshNoteList()
|
|
}
|
|
|
|
func loadNote(_ id: UUID) {
|
|
saveCurrentIfNeeded()
|
|
if bridge.cacheLoad(id) {
|
|
currentNoteID = id
|
|
documentText = bridge.getText(id)
|
|
modified = false
|
|
evaluate()
|
|
}
|
|
}
|
|
|
|
func saveNote() {
|
|
bridge.setText(currentNoteID, text: documentText)
|
|
let _ = bridge.cacheSave(currentNoteID)
|
|
modified = false
|
|
refreshNoteList()
|
|
}
|
|
|
|
func saveNoteToFile(_ url: URL) {
|
|
let _ = bridge.saveNote(currentNoteID, path: url.path)
|
|
modified = false
|
|
}
|
|
|
|
func loadNoteFromFile(_ url: URL) {
|
|
if let (id, text) = bridge.loadNote(path: url.path) {
|
|
currentNoteID = id
|
|
documentText = text
|
|
modified = false
|
|
let _ = bridge.cacheSave(id)
|
|
evaluate()
|
|
refreshNoteList()
|
|
}
|
|
}
|
|
|
|
func deleteNote(_ id: UUID) {
|
|
bridge.deleteNote(id)
|
|
if id == currentNoteID {
|
|
newNote()
|
|
}
|
|
refreshNoteList()
|
|
}
|
|
|
|
func evaluate() {
|
|
evalResults = bridge.evaluate(currentNoteID)
|
|
}
|
|
|
|
func refreshNoteList() {
|
|
noteList = bridge.listNotes()
|
|
}
|
|
|
|
private func saveCurrentIfNeeded() {
|
|
if modified {
|
|
saveNote()
|
|
}
|
|
}
|
|
}
|