aboutsummaryrefslogtreecommitdiff
path: root/Map/Views/MapDetail.swift
diff options
context:
space:
mode:
authorRuben Beltran del Rio <ruben@unlimited.pizza>2021-02-06 00:55:04 +0100
committerRuben Beltran del Rio <ruben@unlimited.pizza>2021-02-06 00:55:04 +0100
commit75a0e4509a70055851b085f3f7293ae1cf48164c (patch)
treeb2933b23235b83cb9f5f2d9fd42c8028650ad1d6 /Map/Views/MapDetail.swift
parent91fd86189477e6c690c6487d51d80bc58c8ecb63 (diff)
Fix performance and undo1.2.0
Diffstat (limited to 'Map/Views/MapDetail.swift')
-rw-r--r--Map/Views/MapDetail.swift67
1 files changed, 37 insertions, 30 deletions
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<String> {
- Binding(
- get: { map.title ?? "" },
- set: { title in
- map.title = title
- }
- )
- }
-
- private var content: Binding<String> {
- 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)
}
}