X-Git-Url: https://git.r.bdr.sh/rbdr/map/blobdiff_plain/77d0155b661e813a85a7312ed809fc7e5a9f7440..75a0e4509a70055851b085f3f7293ae1cf48164c:/Map/Views/MapDetail.swift?ds=sidebyside diff --git a/Map/Views/MapDetail.swift b/Map/Views/MapDetail.swift index 6ba92bb..bebe3a1 100644 --- a/Map/Views/MapDetail.swift +++ b/Map/Views/MapDetail.swift @@ -5,9 +5,25 @@ // Created by Ruben Beltran del Rio on 2/1/21. // +import Combine import CoreData import SwiftUI +class SaveTimer { + let currentTimePublisher = Timer.TimerPublisher(interval: 1, runLoop: .main, mode: .default) + let cancellable: AnyCancellable? + + init() { + self.cancellable = currentTimePublisher.connect() as? AnyCancellable + } + + deinit { + self.cancellable?.cancel() + } +} + +let timer = SaveTimer() + struct MapDetailView: View { @Environment(\.managedObjectContext) private var viewContext @Environment(\.colorScheme) var colorScheme @@ -20,23 +36,8 @@ struct MapDetailView: View { MapColor.colorForScheme(colorScheme) } - private var title: Binding { - Binding( - get: { map.title ?? "" }, - set: { title in - map.title = title - } - ) - } - - private var content: Binding { - Binding( - get: { map.content ?? "" }, - set: { content in - map.content = content - } - ) - } + @State var title: String + @State var content: String var body: some View { if map.uuid != nil { @@ -44,10 +45,7 @@ struct MapDetailView: View { VStack { HStack { TextField( - "Title", text: title, - onCommit: { - try? viewContext.save() - } + "Title", text: $title ).font(.title2).textFieldStyle(PlainTextFieldStyle()).padding(.vertical, 4.0).padding( .leading, 4.0) Button(action: saveText) { @@ -60,25 +58,34 @@ struct MapDetailView: View { EvolutionPicker() ZStack(alignment: .topLeading) { - MapTextEditor(text: content, colorScheme: colorScheme).onChange(of: map.content) { _ in - try? viewContext.save() - } - .background(mapColor.background) - .foregroundColor(mapColor.foreground) - .frame(minHeight: 96.0) + MapTextEditor(text: $content, colorScheme: colorScheme) + .background(mapColor.background) + .foregroundColor(mapColor.foreground) + .frame(minHeight: 96.0) }.padding(.top, 8.0).padding(.leading, 8.0).background(mapColor.background).cornerRadius( 5.0) }.padding(.horizontal, 8.0) ScrollView([.horizontal, .vertical]) { - MapRenderView( - content: content.wrappedValue, evolution: Stage.stages(store.state.selectedEvolution)) + SlowMapRender( + content: content, evolution: Stage.stages(store.state.selectedEvolution), + colorScheme: colorScheme) }.background(mapColor.background) + }.onReceive(timer.currentTimePublisher) { _ in + saveModel() + }.onDisappear { + saveModel() } } else { DefaultMapView() } } + private func saveModel() { + map.content = content + map.title = title + try? viewContext.save() + } + private func saveText() { store.send(.exportMapAsText(map: map)) } @@ -90,7 +97,7 @@ struct MapDetailView: View { struct MapDetailView_Previews: PreviewProvider { static var previews: some View { - MapDetailView(map: Map()).environment( + MapDetailView(map: Map(), title: "", content: "").environment( \.managedObjectContext, PersistenceController.preview.container.viewContext) } }