Adds condition immunities to the monster editor.

This commit is contained in:
2021-03-22 18:00:05 -07:00
parent e23b35f75e
commit c8f18a00dd
5 changed files with 97 additions and 1 deletions

View File

@@ -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 */,

View 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
}
}

View File

@@ -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) {

View 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)
}
}

View File

@@ -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: {