Adds importing a character from a share. You can now save the monster as previewed.

This commit is contained in:
2021-04-05 00:33:11 -07:00
parent e7ccc0e1ab
commit c7fdb7ecc5
2 changed files with 62 additions and 7 deletions

View File

@@ -42,8 +42,8 @@ struct ContentView: View {
} }
} }
.onOpenURL(perform: beginImportingMonster) .onOpenURL(perform: beginImportingMonster)
.sheet(isPresented: self.$isShowingImportDialog) { .sheet(isPresented: $isShowingImportDialog) {
ImportMonster(monster: $importInfo.monster) ImportMonster(monster: $importInfo.monster, isOpen: $isShowingImportDialog)
} }
} }
@@ -55,7 +55,6 @@ struct ContentView: View {
do { do {
let data = try Data(contentsOf: url) let data = try Data(contentsOf: url)
let monsterDTO = try decoder.decode(MonsterDTO.self, from: data) let monsterDTO = try decoder.decode(MonsterDTO.self, from: data)
print(String(format: "Loaded monster: %@", monsterDTO.name))
// TODO: check for some minimal set of properties to ensure this is the expected json schema // TODO: check for some minimal set of properties to ensure this is the expected json schema
self.importInfo.monster = MonsterImportHelper.import5ESBMonster(monsterDTO) self.importInfo.monster = MonsterImportHelper.import5ESBMonster(monsterDTO)
// TODO: throw or set an err here and don't set isShowingImportDialog to true if the file didn't match any of our supported monster schemas. // TODO: throw or set an err here and don't set isShowingImportDialog to true if the file didn't match any of our supported monster schemas.

View File

@@ -9,16 +9,72 @@ import SwiftUI
struct ImportMonster: View { struct ImportMonster: View {
@Binding var monster: MonsterViewModel @Binding var monster: MonsterViewModel
@Environment(\.managedObjectContext) private var viewContext
@Binding var isOpen: Bool
var body: some View { var body: some View {
VStack{
HStack {
Button("Cancel", action: cancelImport)
Spacer()
Button("Add to Library", action: saveNewMonster)
}
MonsterDetailView(viewModel: monster) MonsterDetailView(viewModel: monster)
} }
.padding()
}
func cancelImport() {
isOpen = false
}
func saveNewMonster() {
print("Saving monster: \(monster.name)")
withAnimation {
let newMonster = Monster(context: viewContext)
monster.copyToMonster(monster: newMonster)
do {
try viewContext.save()
isOpen = false
} catch {
// Replace this implementation with code to handle the error appropriately.
// fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
let nsError = error as NSError
fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
}
}
}
} }
struct ImportMonster_Previews: PreviewProvider { struct ImportMonster_Previews: PreviewProvider {
static var previews: some View { static var previews: some View {
ImportMonster( let monster = MonsterViewModel()
monster: .constant(MonsterViewModel()) monster.name = "Steve"
) monster.size = "Medium"
monster.type = "dwarf"
monster.alignment = "chaotic good"
monster.armorType = .none
monster.hasShield = true
monster.hitDice = 4
monster.strengthScore = 20
monster.dexterityScore = 14
monster.constitutionScore = 18
monster.intelligenceScore = 8
monster.wisdomScore = 8
monster.charismaScore = 15
monster.walkSpeed = 40
monster.challengeRating = .four
monster.languages = [LanguageViewModel("Common", true), LanguageViewModel("Giant", true)]
monster.actions = [AbilityViewModel("Greataxe, +3", "__Badass Attack:___ Hits the other dude on a _3_ or above and does a ton of damage")]
return
VStack{
Text("Hello, World!")
}
.sheet(isPresented: .constant(true)) {
ImportMonster(monster: .constant(monster), isOpen: .constant(true))
}
} }
} }