diff --git a/Splits.xcodeproj/project.pbxproj b/Splits.xcodeproj/project.pbxproj index 56e89b4..ba68ed2 100644 --- a/Splits.xcodeproj/project.pbxproj +++ b/Splits.xcodeproj/project.pbxproj @@ -14,6 +14,10 @@ 850F8018284A83400094580D /* FeaturesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 850F8017284A83400094580D /* FeaturesView.swift */; }; 850F80202853F7790094580D /* LicenseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 850F801F2853F7790094580D /* LicenseView.swift */; }; 850F80222853F7E30094580D /* SecretView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 850F80212853F7E30094580D /* SecretView.swift */; }; + 850F8027285437500094580D /* caleb.bost.duo.heic in Resources */ = {isa = PBXBuildFile; fileRef = 850F8023285437500094580D /* caleb.bost.duo.heic */; }; + 850F8028285437500094580D /* aiden.moore.states.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 850F8024285437500094580D /* aiden.moore.states.jpg */; }; + 850F8029285437500094580D /* isaac.greene.clouds.heic in Resources */ = {isa = PBXBuildFile; fileRef = 850F8025285437500094580D /* isaac.greene.clouds.heic */; }; + 850F802A285437500094580D /* jake.zimmerman.group.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 850F8026285437500094580D /* jake.zimmerman.group.jpg */; }; 85AAA0D627FA2DD600F4B9A1 /* SplitsApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85AAA0D527FA2DD600F4B9A1 /* SplitsApp.swift */; }; 85AAA0D827FA2DD600F4B9A1 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85AAA0D727FA2DD600F4B9A1 /* ContentView.swift */; }; 85AAA0DA27FA2DDA00F4B9A1 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 85AAA0D927FA2DDA00F4B9A1 /* Assets.xcassets */; }; @@ -31,6 +35,10 @@ 850F8017284A83400094580D /* FeaturesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeaturesView.swift; sourceTree = ""; }; 850F801F2853F7790094580D /* LicenseView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LicenseView.swift; sourceTree = ""; }; 850F80212853F7E30094580D /* SecretView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecretView.swift; sourceTree = ""; }; + 850F8023285437500094580D /* caleb.bost.duo.heic */ = {isa = PBXFileReference; lastKnownFileType = file; name = caleb.bost.duo.heic; path = Assets.xcassets/caleb.bost.duo.heic; sourceTree = ""; }; + 850F8024285437500094580D /* aiden.moore.states.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; name = aiden.moore.states.jpg; path = Assets.xcassets/aiden.moore.states.jpg; sourceTree = ""; }; + 850F8025285437500094580D /* isaac.greene.clouds.heic */ = {isa = PBXFileReference; lastKnownFileType = file; name = isaac.greene.clouds.heic; path = Assets.xcassets/isaac.greene.clouds.heic; sourceTree = ""; }; + 850F8026285437500094580D /* jake.zimmerman.group.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; name = jake.zimmerman.group.jpg; path = Assets.xcassets/jake.zimmerman.group.jpg; sourceTree = ""; }; 85AAA0D227FA2DD600F4B9A1 /* Splits.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Splits.app; sourceTree = BUILT_PRODUCTS_DIR; }; 85AAA0D527FA2DD600F4B9A1 /* SplitsApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplitsApp.swift; sourceTree = ""; }; 85AAA0D727FA2DD600F4B9A1 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; @@ -83,6 +91,10 @@ 85AAA0E527FA2EB100F4B9A1 /* ModalView.swift */, 850F801F2853F7790094580D /* LicenseView.swift */, 85AAA0D927FA2DDA00F4B9A1 /* Assets.xcassets */, + 850F8025285437500094580D /* isaac.greene.clouds.heic */, + 850F8023285437500094580D /* caleb.bost.duo.heic */, + 850F8026285437500094580D /* jake.zimmerman.group.jpg */, + 850F8024285437500094580D /* aiden.moore.states.jpg */, 85AAA0DB27FA2DDA00F4B9A1 /* Preview Content */, ); path = Splits; @@ -162,6 +174,10 @@ files = ( 85AAA0DD27FA2DDA00F4B9A1 /* Preview Assets.xcassets in Resources */, 85AAA0DA27FA2DDA00F4B9A1 /* Assets.xcassets in Resources */, + 850F802A285437500094580D /* jake.zimmerman.group.jpg in Resources */, + 850F8028285437500094580D /* aiden.moore.states.jpg in Resources */, + 850F8027285437500094580D /* caleb.bost.duo.heic in Resources */, + 850F8029285437500094580D /* isaac.greene.clouds.heic in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Splits.xcodeproj/xcuserdata/ericgreene1.xcuserdatad/xcschemes/xcschememanagement.plist b/Splits.xcodeproj/xcuserdata/ericgreene1.xcuserdatad/xcschemes/xcschememanagement.plist index 5ebcdd9..dd6b82b 100644 --- a/Splits.xcodeproj/xcuserdata/ericgreene1.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/Splits.xcodeproj/xcuserdata/ericgreene1.xcuserdatad/xcschemes/xcschememanagement.plist @@ -49,7 +49,7 @@ Splits.xcscheme_^#shared#^_ orderHint - 1 + 0 SwiftRichString (Playground) 1.xcscheme diff --git a/Splits/Assets.xcassets/aiden.moore.states.imageset/Contents.json b/Splits/Assets.xcassets/aiden.moore.states.imageset/Contents.json new file mode 100644 index 0000000..3a67159 --- /dev/null +++ b/Splits/Assets.xcassets/aiden.moore.states.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "aiden.moore.states.jpg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Splits/Assets.xcassets/aiden.moore.states.imageset/aiden.moore.states.jpg b/Splits/Assets.xcassets/aiden.moore.states.imageset/aiden.moore.states.jpg new file mode 100644 index 0000000..5cb71c3 Binary files /dev/null and b/Splits/Assets.xcassets/aiden.moore.states.imageset/aiden.moore.states.jpg differ diff --git a/Splits/Assets.xcassets/aiden.moore.states.jpg b/Splits/Assets.xcassets/aiden.moore.states.jpg new file mode 100644 index 0000000..5cb71c3 Binary files /dev/null and b/Splits/Assets.xcassets/aiden.moore.states.jpg differ diff --git a/Splits/Assets.xcassets/caleb.bost.duo.heic b/Splits/Assets.xcassets/caleb.bost.duo.heic new file mode 100644 index 0000000..6213935 Binary files /dev/null and b/Splits/Assets.xcassets/caleb.bost.duo.heic differ diff --git a/Splits/Assets.xcassets/caleb.bost.duo.imageset/Contents.json b/Splits/Assets.xcassets/caleb.bost.duo.imageset/Contents.json new file mode 100644 index 0000000..031e6e7 --- /dev/null +++ b/Splits/Assets.xcassets/caleb.bost.duo.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "caleb.bost.duo.heic", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Splits/Assets.xcassets/caleb.bost.duo.imageset/caleb.bost.duo.heic b/Splits/Assets.xcassets/caleb.bost.duo.imageset/caleb.bost.duo.heic new file mode 100644 index 0000000..6213935 Binary files /dev/null and b/Splits/Assets.xcassets/caleb.bost.duo.imageset/caleb.bost.duo.heic differ diff --git a/Splits/Assets.xcassets/isaac.greene.clouds.heic b/Splits/Assets.xcassets/isaac.greene.clouds.heic new file mode 100644 index 0000000..c07fd40 Binary files /dev/null and b/Splits/Assets.xcassets/isaac.greene.clouds.heic differ diff --git a/Splits/Assets.xcassets/isaac.greene.clouds.imageset/Contents.json b/Splits/Assets.xcassets/isaac.greene.clouds.imageset/Contents.json new file mode 100644 index 0000000..a8c4a63 --- /dev/null +++ b/Splits/Assets.xcassets/isaac.greene.clouds.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "isaac.greene.clouds.heic", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Splits/Assets.xcassets/isaac.greene.clouds.imageset/isaac.greene.clouds.heic b/Splits/Assets.xcassets/isaac.greene.clouds.imageset/isaac.greene.clouds.heic new file mode 100644 index 0000000..c07fd40 Binary files /dev/null and b/Splits/Assets.xcassets/isaac.greene.clouds.imageset/isaac.greene.clouds.heic differ diff --git a/Splits/Assets.xcassets/jake.zimmerman.group.imageset/Contents.json b/Splits/Assets.xcassets/jake.zimmerman.group.imageset/Contents.json new file mode 100644 index 0000000..f37f4bd --- /dev/null +++ b/Splits/Assets.xcassets/jake.zimmerman.group.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "jake.zimmerman.group.jpg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Splits/Assets.xcassets/jake.zimmerman.group.imageset/jake.zimmerman.group.jpg b/Splits/Assets.xcassets/jake.zimmerman.group.imageset/jake.zimmerman.group.jpg new file mode 100644 index 0000000..785682d Binary files /dev/null and b/Splits/Assets.xcassets/jake.zimmerman.group.imageset/jake.zimmerman.group.jpg differ diff --git a/Splits/Assets.xcassets/jake.zimmerman.group.jpg b/Splits/Assets.xcassets/jake.zimmerman.group.jpg new file mode 100644 index 0000000..785682d Binary files /dev/null and b/Splits/Assets.xcassets/jake.zimmerman.group.jpg differ diff --git a/Splits/ChangeLogData.swift b/Splits/ChangeLogData.swift index 2203dae..a361571 100644 --- a/Splits/ChangeLogData.swift +++ b/Splits/ChangeLogData.swift @@ -17,11 +17,14 @@ struct June2022: View { VStack (alignment: .leading) { Text("2022-06-10") .font(.title2) - Text("Version 1.0.0 (LVSXT10a)\n") + Text("Version Release Candidate (LVSXT10a)\n") .font(.footnote) - Text("\u{2022} Got the conversion of paces to work, so a 5:00/km pace will also show as 8:03/mi\n\u{2022} This app is now considered \"Finished\" and will transition to Version Numbers") + Text("\u{2022} Got the conversion of paces to work, so a 5:00/km pace will also show as 8:03/mi\n\u{2022} This app is now considered \"Finished\" and will transition to Version Numbers\n\u{2022} FINALLY MADE A WAY TO DISMISS THE KEYBOARD\n\t\u{2022} (as with most of the other solutions I've had to use for other problems in this app, the fix was remarkably easy)\n\u{2022} Made several small quality-of-life improvements") } + Spacer() } + .padding(30) + //2022-06-09 HStack { VStack (alignment: .leading) { @@ -97,6 +100,8 @@ struct June2022: View { } .padding(30) } + .navigationTitle("June 2022 Log") + .navigationBarTitleDisplayMode(.inline) } } @@ -129,6 +134,8 @@ struct May2022: View { } .padding(30) } + .navigationTitle("May 2022 Log") + .navigationBarTitleDisplayMode(.inline) } } @@ -226,6 +233,8 @@ struct April2022: View { } .padding(30) } + .navigationTitle("April 2022 Log") + .navigationBarTitleDisplayMode(.inline) } } @@ -258,5 +267,7 @@ struct March2022: View { } .padding(30) } + .navigationTitle("March 2022 Log") + .navigationBarTitleDisplayMode(.inline) } } diff --git a/Splits/ContentView.swift b/Splits/ContentView.swift index 84af8e6..86290eb 100644 --- a/Splits/ContentView.swift +++ b/Splits/ContentView.swift @@ -9,6 +9,7 @@ import SwiftUI import Foundation struct ContentView: View { + @FocusState private var nameIsFocused: Bool var SISystem = ["km","mi"] @State var timeHours: String = "" @State var timeMinutes: String = "" @@ -18,11 +19,13 @@ struct ContentView: View { var body: some View { VStack { + Spacer() VStack { TextField("Enter distance here", text: $distance) .padding() .keyboardType(.decimalPad) .textFieldStyle(.roundedBorder) + .focused($nameIsFocused) } VStack { Text("Unit of measurement:") @@ -39,6 +42,7 @@ struct ContentView: View { TextField("Enter hours here", text: $timeHours) .keyboardType(.numberPad) .textFieldStyle(.roundedBorder) + .focused($nameIsFocused) } .frame(minWidth: 100) .padding(.trailing, -15) @@ -48,6 +52,7 @@ struct ContentView: View { TextField("Enter minutes here", text: $timeMinutes) .keyboardType(.numberPad) .textFieldStyle(.roundedBorder) + .focused($nameIsFocused) } .frame(minWidth: 100) .padding(.trailing, -15) @@ -58,6 +63,7 @@ struct ContentView: View { TextField("Enter seconds here", text: $timeSeconds) .keyboardType(.numberPad) .textFieldStyle(.roundedBorder) + .focused($nameIsFocused) } .frame(minWidth: 100) .padding(.leading, -15) @@ -65,6 +71,13 @@ struct ContentView: View { } PaceResults(timeHours: $timeHours, timeMinutes: $timeMinutes, timeSeconds: $timeSeconds, selectedSystem: $selectedSystem, distance: $distance) } + Spacer() + if nameIsFocused == true { + Button("Done") { + nameIsFocused = false + } + .padding() + } } } } @@ -164,11 +177,11 @@ struct PaceResults: View { HStack { VStack { Text("Distance: \(distance)\(selectedSystem)") - Text("Converted distance: \(convertedDistanceString)\(notSelectedSystem)") + Text("Distance: \(convertedDistanceString)\(notSelectedSystem)") } - Text("Total time: \(hoursFormatted):\(leadingZeros)") + Text("Total time\n\(hoursFormatted):\(leadingZeros)") .padding() - VStack { + VStack(alignment: .trailing) { Text("\(paceFormatted) per \(selectedSystem)") Text("\(paceFormattedOpposite) per \(notSelectedSystem)") } diff --git a/Splits/DocsView.swift b/Splits/DocsView.swift index ad2262d..dbb6208 100644 --- a/Splits/DocsView.swift +++ b/Splits/DocsView.swift @@ -11,12 +11,20 @@ import SwiftUI // human-readable without aid, as long as // the reader has a basic understanding of // Swift and/or SwiftUI. + let username = "admin" let password = "123" struct DocsView: View { - @State var pass: String = "" - @State var user: String = "" + enum Field: Hashable { + case username + case password + } + + @State private var pass: String = "" + @State private var user: String = "" + @FocusState private var focusedField: Field? + var body: some View { NavigationView { List { @@ -36,14 +44,22 @@ struct DocsView: View { } Section(header: Text("App Information")) { NavigationLink("Software License", destination: LicenseView()) - Text("Version: 1.0.0") + Text("Version: Release Candidate (1.0.0)") Text("Release date: 2022-06-10") Text("Start date: 2022-03-25") Link("Built with SwiftUI \(Image(systemName: "swift"))", destination: URL(string: "https://developer.apple.com/xcode/swiftui")!) } Section(header: Text("Login")) { SecureField("Username", text: $user) + .keyboardType(.alphabet) + .textContentType(.username) + .submitLabel(.next) + .focused($focusedField, equals: .username) SecureField("Password", text: $pass) + .keyboardType(.numbersAndPunctuation) + .textContentType(.password) + .submitLabel(.done) + .focused($focusedField, equals: .password) if (pass == password && user == username) { NavigationLink("Contacts", destination: SecretView()) } @@ -51,6 +67,14 @@ struct DocsView: View { } .navigationTitle("Docs") } + .onSubmit { + switch focusedField { + case .username: + focusedField = .password + default: + () + } + } } } diff --git a/Splits/FeaturesView.swift b/Splits/FeaturesView.swift index 0a02396..2a03e49 100644 --- a/Splits/FeaturesView.swift +++ b/Splits/FeaturesView.swift @@ -10,10 +10,6 @@ import SwiftUI struct NewFeatures: View { var body: some View { ScrollView { - Text("New Features\n") - .font(.largeTitle) - .bold() - .padding(.top, 40) VStack(alignment: .leading) { Text("\u{2022} Reformatted the Docs tabs and made the common things up at the top") Text("Implemented in Version Prerelease LVSXT10d.2\n") @@ -30,6 +26,7 @@ struct NewFeatures: View { } .padding(30) } + .navigationTitle("New Features") } } @@ -48,6 +45,7 @@ struct InProgressFeatures: View { } .padding(30) } + .navigationTitle("In Progress") } } @@ -66,6 +64,7 @@ struct DeprecatedFeatures: View { } .padding(30) } + .navigationTitle("Deprecated") } } diff --git a/Splits/KnownIssues.swift b/Splits/KnownIssues.swift index 4ce195e..6915b47 100644 --- a/Splits/KnownIssues.swift +++ b/Splits/KnownIssues.swift @@ -12,61 +12,49 @@ import SwiftUI struct RecentlyResolved: View { var body: some View { ScrollView { - Text("Recently Resolved Issues") - .font(.largeTitle) - .bold() - .padding(.top, 40) VStack(alignment: .leading) { - Text("\n\u{2022} None since the addition of this tab") + Text("\u{2022} Implemented an easy way to dismiss the keyboard in the main view of Calculator (it only took 2 1/2 months)") } .padding(30) } + .navigationTitle("Recently Resolved") } } struct HighPriority: View { var body: some View { ScrollView { - Text("High Priority Issues") - .font(.largeTitle) - .bold() - .padding(.top, 40) VStack(alignment: .leading) { - Text("\n\u{2022} You can not dismiss the keyboard on iPhone\n\t\u{2022} This hides the tab bar at the bottom so you can't navigate the app after bringing it up") + Text("Tapping on the Contacts tab after entering correct login details causes the app to crash") } .padding(30) } + .navigationTitle("High Priority") } } struct MediumPriority: View { var body: some View { ScrollView { - Text("Medium Priority Issues") - .font(.largeTitle) - .bold() - .padding(.top, 40) VStack(alignment: .leading) { Text("Wow. Such Empty.") .italic() } .padding(30) } + .navigationTitle("Medium Priority") } } struct LowPriority: View { var body: some View { ScrollView { - Text("Low Priority Issues") - .font(.largeTitle) - .bold() - .padding(.top, 40) VStack(alignment: .leading) { - Text("\n\u{2022} Space between the equation and explanation in the \"Help\" tab is too large\n\u{2022} App has no custom icon") + Text("\u{2022} Space between the equation and explanation in the \"Help\" tab is too large\n\u{2022} App has no custom icon") } .padding(30) } + .navigationTitle("Low Priority") } } diff --git a/Splits/LicenseView.swift b/Splits/LicenseView.swift index 7ae6f74..05aeef8 100644 --- a/Splits/LicenseView.swift +++ b/Splits/LicenseView.swift @@ -8,7 +8,7 @@ import SwiftUI struct LicenseView: View { - var fontSize:CGFloat {UIScreen.main.bounds.width > 700 ? 18 : 8} + var fontSize:CGFloat {UIScreen.main.bounds.width > 700 ? 18 : 9} // figuring out how to do this came partly from tinyurl.com/9snwkrzt // and also partly from stackoverflow.com/questions/57727107/ // then I remembered about ternary operators and I optimized it @@ -96,10 +96,13 @@ struct LicenseView: View { Text("Updated: 2022-06-09") } .navigationTitle("Software License Agreement") + .navigationBarTitleDisplayMode(.inline) // sets the top of the screen to this text which always // lets you know what page you're in .padding() .frame(maxWidth: .infinity) + // this just makes it so you can scroll anywhere on screen + // instead of only in the frame } } } diff --git a/Splits/SecretView.swift b/Splits/SecretView.swift index aecf99f..6878478 100644 --- a/Splits/SecretView.swift +++ b/Splits/SecretView.swift @@ -15,7 +15,7 @@ import SwiftUI struct SecretView: View { var body: some View { VStack { - HStack { + ScrollView { VStack { Image("jake.zimmerman.group") .resizable() @@ -59,8 +59,6 @@ Email: bostc@students.lakeviewspartans.org } .frame(minWidth: 350, minHeight: 175) .border(.primary) - } - HStack { VStack { Image("aiden.moore.states") .resizable() @@ -104,6 +102,8 @@ Email: greenei@students.lakeviewspartans.org .frame(minWidth: 350, minHeight: 175) .border(.primary) } + .navigationTitle("Contacts") } + .frame(minWidth: .infinity) } }