Adds condition immunities to the monster editor.
This commit is contained in:
		| @@ -46,6 +46,8 @@ | |||||||
| 		E2CB0DC526086E5F00142591 /* SizeType.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2CB0DC426086E5F00142591 /* SizeType.swift */; }; | 		E2CB0DC526086E5F00142591 /* SizeType.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2CB0DC426086E5F00142591 /* SizeType.swift */; }; | ||||||
| 		E2CB0DCA26086E8300142591 /* ArmorType.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2CB0DC926086E8300142591 /* ArmorType.swift */; }; | 		E2CB0DCA26086E8300142591 /* ArmorType.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2CB0DC926086E8300142591 /* ArmorType.swift */; }; | ||||||
| 		E2CB0DD72608720000142591 /* StringHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2CB0DD62608720000142591 /* StringHelper.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 */; }; | 		E2D473FD25B532C900CB36D7 /* Color+Hex.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2D473FC25B532C900CB36D7 /* Color+Hex.swift */; }; | ||||||
| /* End PBXBuildFile section */ | /* End PBXBuildFile section */ | ||||||
|  |  | ||||||
| @@ -112,6 +114,8 @@ | |||||||
| 		E2CB0DC426086E5F00142591 /* SizeType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SizeType.swift; sourceTree = "<group>"; }; | 		E2CB0DC426086E5F00142591 /* SizeType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SizeType.swift; sourceTree = "<group>"; }; | ||||||
| 		E2CB0DC926086E8300142591 /* ArmorType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArmorType.swift; sourceTree = "<group>"; }; | 		E2CB0DC926086E8300142591 /* ArmorType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArmorType.swift; sourceTree = "<group>"; }; | ||||||
| 		E2CB0DD62608720000142591 /* StringHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringHelper.swift; sourceTree = "<group>"; }; | 		E2CB0DD62608720000142591 /* StringHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringHelper.swift; sourceTree = "<group>"; }; | ||||||
|  | 		E2CB0DE0260887ED00142591 /* DamageTypesViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DamageTypesViewModel.swift; sourceTree = "<group>"; }; | ||||||
|  | 		E2CB0DE526088CE400142591 /* EditDamageTypes.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditDamageTypes.swift; sourceTree = "<group>"; }; | ||||||
| 		E2D473FC25B532C900CB36D7 /* Color+Hex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Color+Hex.swift"; sourceTree = "<group>"; }; | 		E2D473FC25B532C900CB36D7 /* Color+Hex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Color+Hex.swift"; sourceTree = "<group>"; }; | ||||||
| /* End PBXFileReference section */ | /* End PBXFileReference section */ | ||||||
|  |  | ||||||
| @@ -224,6 +228,7 @@ | |||||||
| 				E24ACE5F2607F45E009BF703 /* EditAbilityScores.swift */, | 				E24ACE5F2607F45E009BF703 /* EditAbilityScores.swift */, | ||||||
| 				E24ACE552607EE94009BF703 /* EditArmor.swift */, | 				E24ACE552607EE94009BF703 /* EditArmor.swift */, | ||||||
| 				E24ACE4F2607326E009BF703 /* EditBasicInfo.swift */, | 				E24ACE4F2607326E009BF703 /* EditBasicInfo.swift */, | ||||||
|  | 				E2CB0DE526088CE400142591 /* EditDamageTypes.swift */, | ||||||
| 				E2B5285825B3028700AAA69E /* EditMonster.swift */, | 				E2B5285825B3028700AAA69E /* EditMonster.swift */, | ||||||
| 				E24ACE642607F55D009BF703 /* EditSavingThrows.swift */, | 				E24ACE642607F55D009BF703 /* EditSavingThrows.swift */, | ||||||
| 				E2CB0DB226080C0500142591 /* EditSkill.swift */, | 				E2CB0DB226080C0500142591 /* EditSkill.swift */, | ||||||
| @@ -246,6 +251,7 @@ | |||||||
| 		E257101225B1B2790055B23B /* Models */ = { | 		E257101225B1B2790055B23B /* Models */ = { | ||||||
| 			isa = PBXGroup; | 			isa = PBXGroup; | ||||||
| 			children = ( | 			children = ( | ||||||
|  | 				E2CB0DE0260887ED00142591 /* DamageTypesViewModel.swift */, | ||||||
| 				E20209E625D8DEB600EFE733 /* Enums */, | 				E20209E625D8DEB600EFE733 /* Enums */, | ||||||
| 				E2182E6225B22F8A00DFAEF8 /* Monster+CoreDataClass.swift */, | 				E2182E6225B22F8A00DFAEF8 /* Monster+CoreDataClass.swift */, | ||||||
| 				E20209FA25D8E19100EFE733 /* MonsterViewModel.swift */, | 				E20209FA25D8E19100EFE733 /* MonsterViewModel.swift */, | ||||||
| @@ -415,9 +421,11 @@ | |||||||
| 				E20209FC25D8E19100EFE733 /* MonsterViewModel.swift in Sources */, | 				E20209FC25D8E19100EFE733 /* MonsterViewModel.swift in Sources */, | ||||||
| 				E2570FFF25B1AE180055B23B /* Library.swift in Sources */, | 				E2570FFF25B1AE180055B23B /* Library.swift in Sources */, | ||||||
| 				E2BD703125B3BBB90058ED69 /* MCStepperField.swift in Sources */, | 				E2BD703125B3BBB90058ED69 /* MCStepperField.swift in Sources */, | ||||||
|  | 				E2CB0DE626088CE400142591 /* EditDamageTypes.swift in Sources */, | ||||||
| 				E2CB0DB326080C0500142591 /* EditSkill.swift in Sources */, | 				E2CB0DB326080C0500142591 /* EditSkill.swift in Sources */, | ||||||
| 				E2CB0DCA26086E8300142591 /* ArmorType.swift in Sources */, | 				E2CB0DCA26086E8300142591 /* ArmorType.swift in Sources */, | ||||||
| 				E24ACE562607EE94009BF703 /* EditArmor.swift in Sources */, | 				E24ACE562607EE94009BF703 /* EditArmor.swift in Sources */, | ||||||
|  | 				E2CB0DE1260887ED00142591 /* DamageTypesViewModel.swift in Sources */, | ||||||
| 				E20209F425D8E04300EFE733 /* ProficiencyType.swift in Sources */, | 				E20209F425D8E04300EFE733 /* ProficiencyType.swift in Sources */, | ||||||
| 				E2CB0DC526086E5F00142591 /* SizeType.swift in Sources */, | 				E2CB0DC526086E5F00142591 /* SizeType.swift in Sources */, | ||||||
| 				E2570FFA25B1AE020055B23B /* Collections.swift in Sources */, | 				E2570FFA25B1AE020055B23B /* Collections.swift in Sources */, | ||||||
|   | |||||||
							
								
								
									
										24
									
								
								iOS/MonsterCards/Models/DamageTypesViewModel.swift
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								iOS/MonsterCards/Models/DamageTypesViewModel.swift
									
									
									
									
									
										Normal file
									
								
							| @@ -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 | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -51,6 +51,7 @@ class MonsterViewModel: ObservableObject { | |||||||
|     @Published var charismaSavingThrowProficiency: ProficiencyType |     @Published var charismaSavingThrowProficiency: ProficiencyType | ||||||
|     @Published var charismaSavingThrowAdvantage: AdvantageType |     @Published var charismaSavingThrowAdvantage: AdvantageType | ||||||
|     @Published var skills: [SkillViewModel] |     @Published var skills: [SkillViewModel] | ||||||
|  |     @Published var conditionImmunities: [DamageTypeViewModel] | ||||||
|      |      | ||||||
|     init(_ rawMonster: Monster?) { |     init(_ rawMonster: Monster?) { | ||||||
|         self.name = "" |         self.name = "" | ||||||
| @@ -92,6 +93,7 @@ class MonsterViewModel: ObservableObject { | |||||||
|         self.charismaSavingThrowAdvantage = .none |         self.charismaSavingThrowAdvantage = .none | ||||||
|         self.charismaSavingThrowProficiency = .none |         self.charismaSavingThrowProficiency = .none | ||||||
|         self.skills = [] |         self.skills = [] | ||||||
|  |         self.conditionImmunities = [] | ||||||
|  |  | ||||||
|         if (rawMonster != nil) { |         if (rawMonster != nil) { | ||||||
|             self.rawMonster = rawMonster |             self.rawMonster = rawMonster | ||||||
| @@ -139,6 +141,10 @@ class MonsterViewModel: ObservableObject { | |||||||
|         self.charismaSavingThrowAdvantage = monster.charismaSavingThrowAdvantageEnum |         self.charismaSavingThrowAdvantage = monster.charismaSavingThrowAdvantageEnum | ||||||
|         self.charismaSavingThrowProficiency = monster.charismaSavingThrowProficiencyEnum |         self.charismaSavingThrowProficiency = monster.charismaSavingThrowProficiencyEnum | ||||||
|         self.skills = (monster.skills?.allObjects.map {SkillViewModel(($0 as! Skill))})!.sorted() |         self.skills = (monster.skills?.allObjects.map {SkillViewModel(($0 as! Skill))})!.sorted() | ||||||
|  |          | ||||||
|  |         self.conditionImmunities = monster.conditionImmunitiesArray | ||||||
|  |             .map {DamageTypeViewModel($0)} | ||||||
|  |             .sorted() | ||||||
|     } |     } | ||||||
|      |      | ||||||
|     func copyToMonster(monster: Monster) { |     func copyToMonster(monster: Monster) { | ||||||
|   | |||||||
							
								
								
									
										54
									
								
								iOS/MonsterCards/Views/EditDamageTypes.swift
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								iOS/MonsterCards/Views/EditDamageTypes.swift
									
									
									
									
									
										Normal file
									
								
							| @@ -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<MonsterViewModel, [DamageTypeViewModel]> | ||||||
|  |      | ||||||
|  |     var body: some View { | ||||||
|  |         List { | ||||||
|  |             ForEach(viewModel[keyPath: path]) { damageType in | ||||||
|  |                 TextField( | ||||||
|  |                     "", | ||||||
|  |                     text: Binding<String>( | ||||||
|  |                         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) | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -43,6 +43,10 @@ struct EditMonster: View { | |||||||
|             NavigationLink( |             NavigationLink( | ||||||
|                 "Skills", |                 "Skills", | ||||||
|                 destination: EditSkills(monsterViewModel: monsterViewModel)) |                 destination: EditSkills(monsterViewModel: monsterViewModel)) | ||||||
|  |              | ||||||
|  |             NavigationLink( | ||||||
|  |                 "Condition Immunities", | ||||||
|  |                 destination: EditDamageTypes(viewModel: monsterViewModel, path: \.conditionImmunities)) | ||||||
|         } |         } | ||||||
|         .onAppear(perform: copyMonsterToLocal) |         .onAppear(perform: copyMonsterToLocal) | ||||||
|         .toolbar(content: { |         .toolbar(content: { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user