// // ContentView.swift // Map // // Created by Ruben Beltran del Rio on 2/1/21. // import CoreData import SwiftUI struct MapDetailView: View { @Environment(\.managedObjectContext) private var viewContext @Environment(\.colorScheme) var colorScheme @EnvironmentObject var store: AppStore @ObservedObject var map: Map private var mapColor: MapColor { 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 private var selectedEvolution = StageType.general var body: some View { if map.uuid != nil { VSplitView { VStack { HStack { TextField( "Title", text: title, onCommit: { try? viewContext.save() } ).font(.title2).textFieldStyle(PlainTextFieldStyle()).padding(.vertical, 4.0).padding( .leading, 4.0) Button(action: saveText) { Image(systemName: "doc.text") }.padding(.vertical, 4.0).padding(.leading, 4.0) Button(action: saveImage) { Image(systemName: "photo") }.padding(.vertical, 4.0).padding(.leading, 4.0).padding(.trailing, 8.0) } Picker("Evolution", selection: $selectedEvolution) { ForEach(StageType.allCases) { stage in Text(Stage.title(stage)).tag(stage).padding(4.0) } }.padding(.horizontal, 8.0).padding(.vertical, 4.0) ZStack(alignment: .topLeading) { MapTextEditor(text: content).onChange(of: map.content) { _ in try? viewContext.save() } .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(map: map, evolution: Stage.stages(selectedEvolution)) }.background(mapColor.background) } } else { DefaultMapView() } } private func saveText() { store.send(.exportMapAsText(map: map)) } private func saveImage() { store.send(.exportMapAsImage(map: map, evolution: selectedEvolution)) } } struct MapDetailView_Previews: PreviewProvider { static var previews: some View { MapDetailView(map: Map()).environment( \.managedObjectContext, PersistenceController.preview.container.viewContext) } }