diff --git a/MonsterCards.xcodeproj/project.pbxproj b/MonsterCards.xcodeproj/project.pbxproj index 6478340..31591b6 100644 --- a/MonsterCards.xcodeproj/project.pbxproj +++ b/MonsterCards.xcodeproj/project.pbxproj @@ -46,6 +46,8 @@ E2CB0DC526086E5F00142591 /* SizeType.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2CB0DC426086E5F00142591 /* SizeType.swift */; }; E2CB0DCA26086E8300142591 /* ArmorType.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2CB0DC926086E8300142591 /* ArmorType.swift */; }; E2CB0DD72608720000142591 /* StringHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2CB0DD62608720000142591 /* StringHelper.swift */; }; + E2CB0DE1260887ED00142591 /* DamageTypesViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2CB0DE0260887ED00142591 /* DamageTypesViewModel.swift */; }; + E2CB0DE626088CE400142591 /* EditDamageTypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2CB0DE526088CE400142591 /* EditDamageTypes.swift */; }; E2D473FD25B532C900CB36D7 /* Color+Hex.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2D473FC25B532C900CB36D7 /* Color+Hex.swift */; }; /* End PBXBuildFile section */ @@ -112,6 +114,8 @@ E2CB0DC426086E5F00142591 /* SizeType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SizeType.swift; sourceTree = ""; }; E2CB0DC926086E8300142591 /* ArmorType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArmorType.swift; sourceTree = ""; }; E2CB0DD62608720000142591 /* StringHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringHelper.swift; sourceTree = ""; }; + E2CB0DE0260887ED00142591 /* DamageTypesViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DamageTypesViewModel.swift; sourceTree = ""; }; + E2CB0DE526088CE400142591 /* EditDamageTypes.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditDamageTypes.swift; sourceTree = ""; }; E2D473FC25B532C900CB36D7 /* Color+Hex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Color+Hex.swift"; sourceTree = ""; }; /* End PBXFileReference section */ @@ -224,6 +228,7 @@ E24ACE5F2607F45E009BF703 /* EditAbilityScores.swift */, E24ACE552607EE94009BF703 /* EditArmor.swift */, E24ACE4F2607326E009BF703 /* EditBasicInfo.swift */, + E2CB0DE526088CE400142591 /* EditDamageTypes.swift */, E2B5285825B3028700AAA69E /* EditMonster.swift */, E24ACE642607F55D009BF703 /* EditSavingThrows.swift */, E2CB0DB226080C0500142591 /* EditSkill.swift */, @@ -246,6 +251,7 @@ E257101225B1B2790055B23B /* Models */ = { isa = PBXGroup; children = ( + E2CB0DE0260887ED00142591 /* DamageTypesViewModel.swift */, E20209E625D8DEB600EFE733 /* Enums */, E2182E6225B22F8A00DFAEF8 /* Monster+CoreDataClass.swift */, E20209FA25D8E19100EFE733 /* MonsterViewModel.swift */, @@ -415,9 +421,11 @@ E20209FC25D8E19100EFE733 /* MonsterViewModel.swift in Sources */, E2570FFF25B1AE180055B23B /* Library.swift in Sources */, E2BD703125B3BBB90058ED69 /* MCStepperField.swift in Sources */, + E2CB0DE626088CE400142591 /* EditDamageTypes.swift in Sources */, E2CB0DB326080C0500142591 /* EditSkill.swift in Sources */, E2CB0DCA26086E8300142591 /* ArmorType.swift in Sources */, E24ACE562607EE94009BF703 /* EditArmor.swift in Sources */, + E2CB0DE1260887ED00142591 /* DamageTypesViewModel.swift in Sources */, E20209F425D8E04300EFE733 /* ProficiencyType.swift in Sources */, E2CB0DC526086E5F00142591 /* SizeType.swift in Sources */, E2570FFA25B1AE020055B23B /* Collections.swift in Sources */, diff --git a/MonsterCards/Models/DamageTypesViewModel.swift b/MonsterCards/Models/DamageTypesViewModel.swift new file mode 100644 index 0000000..207e9da --- /dev/null +++ b/MonsterCards/Models/DamageTypesViewModel.swift @@ -0,0 +1,24 @@ +// +// DamageTypesViewModel.swift +// MonsterCards +// +// Created by Tom Hicks on 3/22/21. +// + +import Foundation + +class DamageTypeViewModel: ObservableObject, Comparable, Identifiable { + static func < (lhs: DamageTypeViewModel, rhs: DamageTypeViewModel) -> Bool { + lhs.name < rhs.name + } + + static func == (lhs: DamageTypeViewModel, rhs: DamageTypeViewModel) -> Bool { + lhs.name == rhs.name + } + + @Published var name: String + + init(_ name: String) { + self.name = name + } +} diff --git a/MonsterCards/Models/MonsterViewModel.swift b/MonsterCards/Models/MonsterViewModel.swift index 05aa1fe..181624d 100644 --- a/MonsterCards/Models/MonsterViewModel.swift +++ b/MonsterCards/Models/MonsterViewModel.swift @@ -51,6 +51,7 @@ class MonsterViewModel: ObservableObject { @Published var charismaSavingThrowProficiency: ProficiencyType @Published var charismaSavingThrowAdvantage: AdvantageType @Published var skills: [SkillViewModel] + @Published var conditionImmunities: [DamageTypeViewModel] init(_ rawMonster: Monster?) { self.name = "" @@ -92,7 +93,8 @@ class MonsterViewModel: ObservableObject { self.charismaSavingThrowAdvantage = .none self.charismaSavingThrowProficiency = .none self.skills = [] - + self.conditionImmunities = [] + if (rawMonster != nil) { self.rawMonster = rawMonster self.copyFromMonster(monster: rawMonster!) @@ -139,6 +141,10 @@ class MonsterViewModel: ObservableObject { self.charismaSavingThrowAdvantage = monster.charismaSavingThrowAdvantageEnum self.charismaSavingThrowProficiency = monster.charismaSavingThrowProficiencyEnum self.skills = (monster.skills?.allObjects.map {SkillViewModel(($0 as! Skill))})!.sorted() + + self.conditionImmunities = monster.conditionImmunitiesArray + .map {DamageTypeViewModel($0)} + .sorted() } func copyToMonster(monster: Monster) { diff --git a/MonsterCards/Views/EditDamageTypes.swift b/MonsterCards/Views/EditDamageTypes.swift new file mode 100644 index 0000000..257b71b --- /dev/null +++ b/MonsterCards/Views/EditDamageTypes.swift @@ -0,0 +1,54 @@ +// +// EditDamageTypes.swift +// MonsterCards +// +// Created by Tom Hicks on 3/22/21. +// + +import SwiftUI + +struct EditDamageTypes: View { + @ObservedObject var viewModel: MonsterViewModel + var path: ReferenceWritableKeyPath + + var body: some View { + List { + ForEach(viewModel[keyPath: path]) { damageType in + TextField( + "", + text: Binding( + get: {damageType.name}, + set: {damageType.name = $0} + ) + ) + } + .onDelete(perform: { indexSet in + for index in indexSet { + viewModel[keyPath: path].remove(at: index) + } + }) + } + .toolbar(content: { + Button( + action: { + let newDamageType = DamageTypeViewModel("New Type") + viewModel[keyPath: path].append(newDamageType) + viewModel[keyPath: path] = viewModel[keyPath: path].sorted() + }, + label: { + Image(systemName: "plus") + } + ) + }) + .onAppear(perform: { + viewModel[keyPath: path] = viewModel[keyPath: path].sorted() + }) + } +} + +struct EditDamageTypes_Previews: PreviewProvider { + static var previews: some View { + let viewModel = MonsterViewModel(nil) + EditDamageTypes(viewModel: viewModel, path: \.damageImmunities) + } +} diff --git a/MonsterCards/Views/EditMonster.swift b/MonsterCards/Views/EditMonster.swift index b126b01..de708b2 100644 --- a/MonsterCards/Views/EditMonster.swift +++ b/MonsterCards/Views/EditMonster.swift @@ -43,6 +43,10 @@ struct EditMonster: View { NavigationLink( "Skills", destination: EditSkills(monsterViewModel: monsterViewModel)) + + NavigationLink( + "Condition Immunities", + destination: EditDamageTypes(viewModel: monsterViewModel, path: \.conditionImmunities)) } .onAppear(perform: copyMonsterToLocal) .toolbar(content: {