diff --git a/iOS/MonsterCards.xcodeproj/project.pbxproj b/iOS/MonsterCards.xcodeproj/project.pbxproj index 90965a7..4edd970 100644 --- a/iOS/MonsterCards.xcodeproj/project.pbxproj +++ b/iOS/MonsterCards.xcodeproj/project.pbxproj @@ -13,6 +13,7 @@ E20209F525D8E04300EFE733 /* AdvantageType.swift in Sources */ = {isa = PBXBuildFile; fileRef = E20209F325D8E04300EFE733 /* AdvantageType.swift */; }; E20209FB25D8E19100EFE733 /* SkillViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = E20209F925D8E19100EFE733 /* SkillViewModel.swift */; }; E20209FC25D8E19100EFE733 /* MonsterViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = E20209FA25D8E19100EFE733 /* MonsterViewModel.swift */; }; + E20CEFEC261FEA2100B55D72 /* MonsterDetailWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = E20CEFEB261FEA2100B55D72 /* MonsterDetailWrapper.swift */; }; E210B83A25B42D980083EAC5 /* MCProficiencyPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = E210B83925B42D980083EAC5 /* MCProficiencyPicker.swift */; }; E210B83F25B42DAB0083EAC5 /* MCAdvantagePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = E210B83E25B42DAB0083EAC5 /* MCAdvantagePicker.swift */; }; E21661D12616E9A800117782 /* ImportMonster.swift in Sources */ = {isa = PBXBuildFile; fileRef = E21661D02616E9A800117782 /* ImportMonster.swift */; }; @@ -56,7 +57,7 @@ E2570FFA25B1AE020055B23B /* Collections.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2570FF925B1AE020055B23B /* Collections.swift */; }; E2570FFF25B1AE180055B23B /* Library.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2570FFE25B1AE180055B23B /* Library.swift */; }; E257100425B1AF4A0055B23B /* SearchBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = E257100325B1AF4A0055B23B /* SearchBar.swift */; }; - E257100925B1B2480055B23B /* MonsterDetail.swift in Sources */ = {isa = PBXBuildFile; fileRef = E257100825B1B2470055B23B /* MonsterDetail.swift */; }; + E257100925B1B2480055B23B /* MonsterDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E257100825B1B2470055B23B /* MonsterDetailView.swift */; }; E26CDA2B25CFB38E00E3F50D /* MCArmorTypePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = E26CDA2A25CFB38E00E3F50D /* MCArmorTypePicker.swift */; }; E2B5285925B3028700AAA69E /* EditMonster.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2B5285825B3028700AAA69E /* EditMonster.swift */; }; E2BD702C25B3A8D70058ED69 /* MCTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2BD702B25B3A8D70058ED69 /* MCTextField.swift */; }; @@ -96,6 +97,7 @@ E20209F325D8E04300EFE733 /* AdvantageType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AdvantageType.swift; sourceTree = ""; }; E20209F925D8E19100EFE733 /* SkillViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SkillViewModel.swift; sourceTree = ""; }; E20209FA25D8E19100EFE733 /* MonsterViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MonsterViewModel.swift; sourceTree = ""; }; + E20CEFEB261FEA2100B55D72 /* MonsterDetailWrapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MonsterDetailWrapper.swift; sourceTree = ""; }; E210B83925B42D980083EAC5 /* MCProficiencyPicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MCProficiencyPicker.swift; sourceTree = ""; }; E210B83E25B42DAB0083EAC5 /* MCAdvantagePicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MCAdvantagePicker.swift; sourceTree = ""; }; E21661D02616E9A800117782 /* ImportMonster.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImportMonster.swift; sourceTree = ""; }; @@ -144,7 +146,7 @@ E2570FF925B1AE020055B23B /* Collections.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Collections.swift; sourceTree = ""; }; E2570FFE25B1AE180055B23B /* Library.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Library.swift; sourceTree = ""; }; E257100325B1AF4A0055B23B /* SearchBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchBar.swift; sourceTree = ""; }; - E257100825B1B2470055B23B /* MonsterDetail.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MonsterDetail.swift; sourceTree = ""; }; + E257100825B1B2470055B23B /* MonsterDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MonsterDetailView.swift; sourceTree = ""; }; E26CDA2A25CFB38E00E3F50D /* MCArmorTypePicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MCArmorTypePicker.swift; sourceTree = ""; }; E2B5285825B3028700AAA69E /* EditMonster.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditMonster.swift; sourceTree = ""; }; E2BD702B25B3A8D70058ED69 /* MCTextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MCTextField.swift; sourceTree = ""; }; @@ -290,7 +292,8 @@ E210B83925B42D980083EAC5 /* MCProficiencyPicker.swift */, E2BD703025B3BBB90058ED69 /* MCStepperField.swift */, E2BD702B25B3A8D70058ED69 /* MCTextField.swift */, - E257100825B1B2470055B23B /* MonsterDetail.swift */, + E257100825B1B2470055B23B /* MonsterDetailView.swift */, + E20CEFEB261FEA2100B55D72 /* MonsterDetailWrapper.swift */, E2570FEF25B1ADC10055B23B /* Search.swift */, E257100325B1AF4A0055B23B /* SearchBar.swift */, ); @@ -481,7 +484,7 @@ E216B791260C1FE800FB205F /* LanguageViewModel.swift in Sources */, E210B83A25B42D980083EAC5 /* MCProficiencyPicker.swift in Sources */, E2570FF025B1ADC10055B23B /* Search.swift in Sources */, - E257100925B1B2480055B23B /* MonsterDetail.swift in Sources */, + E257100925B1B2480055B23B /* MonsterDetailView.swift in Sources */, E219248526198A1200C84E12 /* SkillDTO.swift in Sources */, E2D473FD25B532C900CB36D7 /* Color+Hex.swift in Sources */, E2B5285925B3028700AAA69E /* EditMonster.swift in Sources */, @@ -523,6 +526,7 @@ E20209E825D8DEC100EFE733 /* AbilityScore.swift in Sources */, E219248A26198A5400C84E12 /* TraitDTO.swift in Sources */, E210B83F25B42DAB0083EAC5 /* MCAdvantagePicker.swift in Sources */, + E20CEFEC261FEA2100B55D72 /* MonsterDetailWrapper.swift in Sources */, E216B7C1260C6B6000FB205F /* MCChallengeRatingPicker.swift in Sources */, E26CDA2B25CFB38E00E3F50D /* MCArmorTypePicker.swift in Sources */, ); diff --git a/iOS/MonsterCards/Views/MonsterDetail.swift b/iOS/MonsterCards/Views/MonsterDetailView.swift similarity index 83% rename from iOS/MonsterCards/Views/MonsterDetail.swift rename to iOS/MonsterCards/Views/MonsterDetailView.swift index 1dda0df..b9ae5d6 100644 --- a/iOS/MonsterCards/Views/MonsterDetail.swift +++ b/iOS/MonsterCards/Views/MonsterDetailView.swift @@ -324,41 +324,13 @@ struct MonsterDetailView: View { } } -struct MonsterDetailWrapper: View { - // TODO: Add display for when the monster is blind - let kTextColor: Color = Color(hex: 0x982818) - - @ObservedObject var monster: Monster - @StateObject private var viewModel = MonsterViewModel() - - var body: some View { - - MonsterDetailView(viewModel: viewModel) - .onAppear(perform: { - viewModel.copyFromMonster(monster: monster) - }) - .toolbar(content: { - ToolbarItem(placement: .primaryAction) { - NavigationLink("Edit", destination: EditMonster(monster: monster)) - } - }) - .navigationTitle(monster.name ?? "") - .navigationBarTitleDisplayMode(.inline) - } - - private func editMonster() { - print("Edit Monster pressed") - } -} - -struct MonsterDetailWrapper_Previews: PreviewProvider { +struct MonsterDetailView_Previews: PreviewProvider { static var previews: some View { - let context = PersistenceController.preview.container.viewContext - let monster = Monster.init(context: context) + let monster = MonsterViewModel.init() monster.name = "Steve" monster.size = "Medium" monster.type = "humanoid" - monster.subtype = "human" + monster.subType = "human" monster.alignment = "LG" monster.hitDice = 6 monster.hasCustomHP = true @@ -377,18 +349,18 @@ struct MonsterDetailWrapper_Previews: PreviewProvider { monster.intelligenceScore = 14 monster.wisdomScore = 16 monster.charismaScore = 18 - monster.strengthSavingThrowAdvantageEnum = AdvantageType.none - monster.strengthSavingThrowProficiencyEnum = ProficiencyType.none - monster.dexteritySavingThrowAdvantageEnum = AdvantageType.advantage - monster.dexteritySavingThrowProficiencyEnum = ProficiencyType.proficient - monster.constitutionSavingThrowAdvantageEnum = AdvantageType.disadvantage - monster.constitutionSavingThrowProficiencyEnum = ProficiencyType.expertise - monster.intelligenceSavingThrowAdvantageEnum = AdvantageType.none - monster.intelligenceSavingThrowProficiencyEnum = ProficiencyType.expertise - monster.wisdomSavingThrowAdvantageEnum = AdvantageType.advantage - monster.wisdomSavingThrowProficiencyEnum = ProficiencyType.proficient - monster.charismaSavingThrowAdvantageEnum = AdvantageType.disadvantage - monster.charismaSavingThrowProficiencyEnum = ProficiencyType.none + monster.strengthSavingThrowAdvantage = AdvantageType.none + monster.strengthSavingThrowProficiency = ProficiencyType.none + monster.dexteritySavingThrowAdvantage = AdvantageType.advantage + monster.dexteritySavingThrowProficiency = ProficiencyType.proficient + monster.constitutionSavingThrowAdvantage = AdvantageType.disadvantage + monster.constitutionSavingThrowProficiency = ProficiencyType.expertise + monster.intelligenceSavingThrowAdvantage = AdvantageType.none + monster.intelligenceSavingThrowProficiency = ProficiencyType.expertise + monster.wisdomSavingThrowAdvantage = AdvantageType.advantage + monster.wisdomSavingThrowProficiency = ProficiencyType.proficient + monster.charismaSavingThrowAdvantage = AdvantageType.disadvantage + monster.charismaSavingThrowProficiency = ProficiencyType.none monster.telepathy = 1 monster.languages = [ LanguageViewModel("English", true), @@ -396,12 +368,7 @@ struct MonsterDetailWrapper_Previews: PreviewProvider { ] return Group { - MonsterDetailWrapper(monster: monster) - .environment(\.managedObjectContext, context) - .previewDevice("iPod touch (7th generation)") - MonsterDetailWrapper(monster: monster) - .environment(\.managedObjectContext, context) - .previewDevice("iPad Pro (11-inch) (2nd generation)") + MonsterDetailView(viewModel: monster) } } } diff --git a/iOS/MonsterCards/Views/MonsterDetailWrapper.swift b/iOS/MonsterCards/Views/MonsterDetailWrapper.swift new file mode 100644 index 0000000..e24123b --- /dev/null +++ b/iOS/MonsterCards/Views/MonsterDetailWrapper.swift @@ -0,0 +1,89 @@ +// +// MonsterDetailWrapper.swift +// MonsterCards +// +// Created by Tom Hicks on 4/7/21. +// + +import SwiftUI + +struct MonsterDetailWrapper: View { + let kTextColor = Color(hex: 0x982818) + + @ObservedObject var monster: Monster + @StateObject private var viewModel = MonsterViewModel() + + var body: some View { + + MonsterDetailView(viewModel: viewModel) + .onAppear(perform: { + viewModel.copyFromMonster(monster: monster) + }) + .toolbar(content: { + ToolbarItem(placement: .primaryAction) { + NavigationLink("Edit", destination: EditMonster(monster: monster)) + } + }) + .navigationTitle(monster.name ?? "") + .navigationBarTitleDisplayMode(.inline) + } + + private func editMonster() { + print("Edit Monster pressed") + } +} + +struct MonsterDetailWrapper_Previews: PreviewProvider { + static var previews: some View { + let context = PersistenceController.preview.container.viewContext + let monster = Monster.init(context: context) + monster.name = "Steve" + monster.size = "Medium" + monster.type = "humanoid" + monster.subtype = "human" + monster.alignment = "LG" + monster.hitDice = 6 + monster.hasCustomHP = true + monster.customHP = "12 (1d10)+2" + monster.walkSpeed = 5 + monster.burrowSpeed = 10 + monster.climbSpeed = 15 + monster.flySpeed = 20 + monster.swimSpeed = 25 + monster.canHover = true + monster.hasCustomSpeed = false + monster.customSpeed = "walk: 5 ft." + monster.strengthScore = 8 + monster.dexterityScore = 10 + monster.constitutionScore = 12 + monster.intelligenceScore = 14 + monster.wisdomScore = 16 + monster.charismaScore = 18 + monster.strengthSavingThrowAdvantageEnum = AdvantageType.none + monster.strengthSavingThrowProficiencyEnum = ProficiencyType.none + monster.dexteritySavingThrowAdvantageEnum = AdvantageType.advantage + monster.dexteritySavingThrowProficiencyEnum = ProficiencyType.proficient + monster.constitutionSavingThrowAdvantageEnum = AdvantageType.disadvantage + monster.constitutionSavingThrowProficiencyEnum = ProficiencyType.expertise + monster.intelligenceSavingThrowAdvantageEnum = AdvantageType.none + monster.intelligenceSavingThrowProficiencyEnum = ProficiencyType.expertise + monster.wisdomSavingThrowAdvantageEnum = AdvantageType.advantage + monster.wisdomSavingThrowProficiencyEnum = ProficiencyType.proficient + monster.charismaSavingThrowAdvantageEnum = AdvantageType.disadvantage + monster.charismaSavingThrowProficiencyEnum = ProficiencyType.none + monster.telepathy = 1 + monster.languages = [ + LanguageViewModel("English", true), + LanguageViewModel("French", false) + ] + + return Group { + MonsterDetailWrapper(monster: monster) + .environment(\.managedObjectContext, context) + .previewDevice("iPod touch (7th generation)") + MonsterDetailWrapper(monster: monster) + .environment(\.managedObjectContext, context) + .previewDevice("iPad Pro (11-inch) (2nd generation)") + } + } +}