What am I even doing

This commit is contained in:
Isaac Greene 2025-10-03 00:06:35 -04:00
commit 4f9924cea5
Signed by: isaac
SSH key fingerprint: SHA256:Jr4CSXfwzXSuwhYRd3vX12Wt/v8vkvq0hOJ0NLwubH8
97 changed files with 3990 additions and 764 deletions

2
.mailmap Normal file
View file

@ -0,0 +1,2 @@
isaac <git@xtzws.com> <isaacgreene4209@icloud.com>
isaac <git@xtzws.com> <irgreene@icloud.com>

View file

@ -0,0 +1,14 @@
for i in 1...100 {
if i.isMultiple(of: 3) && i.isMultiple(of: 5){
print("FizzBuzz")
}
else if i.isMultiple(of: 3) {
print("Fizz")
}
else if i.isMultiple(of: 5) {
print("Buzz")
}
else{
print(i)
}
}

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<playground version='5.0' target-platform='ios' buildActiveScheme='true' importAppTypes='true'>
<timeline fileName='timeline.xctimeline'/>
</playground>

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:">
</FileRef>
</Workspace>

View file

@ -0,0 +1,27 @@
let distanceDub = Double(distance) ?? 1.0
let convertedSeconds:Double = (Double(timeSeconds) ?? 0) * (1.666666666666666666666666)
let timeSecondsInt:Int = Int(timeSeconds) ?? 0
let timeSecondsUnderSixty:Int = (timeSecondsInt % 60)
let timeSecondsToMinutes:Int = (timeSecondsInt - timeSecondsUnderSixty) / 60
let timeMinutesDouble:Double = Double(timeMinutes) ?? 0.0
let timeMinutesInt:Int = (Int(timeMinutes) ?? 0) + (timeSecondsToMinutes)
let timeMinutesUnderSixty:Int = timeMinutesInt % 60
let timeMinutesToHours:Int = (timeMinutesInt - timeMinutesUnderSixty) / 60
let totalHours:Double = Double(timeMinutesToHours) + (Double(timeHours) ?? 0)
let leadingZeros:String = String(format: "%02d:%02d", timeMinutesUnderSixty, timeSecondsUnderSixty)
let actualTime:Double = timeMinutesDouble + (convertedSeconds / 100) + ((Double(timeHours) ?? 0) * 60)
let pace = actualTime / distanceDub
let paceWhole = (pace.rounded(.down))
let paceMinutes = paceWhole % 60
let paceHours = (paceWhole - paceMinutes) / 60
let paceString:String = String(format: "%.2f", pace)
let hoursFormatted:String = String(format: "%.0f", totalHours)

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<playground version='5.0' target-platform='ios' buildActiveScheme='true' importAppTypes='true'>
<timeline fileName='timeline.xctimeline'/>
</playground>

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:">
</FileRef>
</Workspace>

View file

@ -0,0 +1,777 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 56;
objects = {
/* Begin PBXBuildFile section */
6A0FD2502875F944006DF79D /* PacesUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A0FD24F2875F944006DF79D /* PacesUITests.swift */; };
6A0FD2522875F944006DF79D /* PacesUITestsLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A0FD2512875F944006DF79D /* PacesUITestsLaunchTests.swift */; };
6A0FD25F2875FA14006DF79D /* PacesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A0FD25E2875FA14006DF79D /* PacesTests.swift */; };
6A5CEC52287691BE003D876C /* ChangeLogView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A5CEC51287691BE003D876C /* ChangeLogView.swift */; };
6AAC23DE2ACA05840055BB5F /* iosMath in Frameworks */ = {isa = PBXBuildFile; productRef = 6AAC23DD2ACA05840055BB5F /* iosMath */; };
6ADBE40228D4DFF000821AA3 /* ComingSoonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6ADBE40128D4DFF000821AA3 /* ComingSoonView.swift */; };
6AEEF9632975D53F000E0B48 /* LaTeXView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AEEF9622975D53F000E0B48 /* LaTeXView.swift */; };
850062C92802328F0095F121 /* TabViewData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 850062C82802328F0095F121 /* TabViewData.swift */; };
8502250E27FA5D0800FE8E95 /* ChangeLogData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8502250D27FA5D0800FE8E95 /* ChangeLogData.swift */; };
850F8014284A7F6A0094580D /* DocsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 850F8013284A7F6A0094580D /* DocsView.swift */; };
850F8016284A815C0094580D /* KnownIssues.swift in Sources */ = {isa = PBXBuildFile; fileRef = 850F8015284A815C0094580D /* KnownIssues.swift */; };
850F8018284A83400094580D /* FeaturesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 850F8017284A83400094580D /* FeaturesView.swift */; };
850F80202853F7790094580D /* LicenseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 850F801F2853F7790094580D /* LicenseView.swift */; };
859298C928592F1F00D9D6CB /* Documentation.docc in Sources */ = {isa = PBXBuildFile; fileRef = 859298C828592F1F00D9D6CB /* Documentation.docc */; };
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 */; };
85AAA0DD27FA2DDA00F4B9A1 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 85AAA0DC27FA2DDA00F4B9A1 /* Preview Assets.xcassets */; };
85AAA0E627FA2EB100F4B9A1 /* HelpView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85AAA0E527FA2EB100F4B9A1 /* HelpView.swift */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
6A0FD2532875F944006DF79D /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 85AAA0CA27FA2DD600F4B9A1 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 85AAA0D127FA2DD600F4B9A1;
remoteInfo = Paces;
};
6A0FD2602875FA14006DF79D /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 85AAA0CA27FA2DD600F4B9A1 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 85AAA0D127FA2DD600F4B9A1;
remoteInfo = Paces;
};
6A105B822A44E8C900D55423 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 6A105B7B2A44E8C900D55423 /* iosMath.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 49965EFC17CBBA2700A555C5;
remoteInfo = iosMathExample;
};
6A105B842A44E8C900D55423 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 6A105B7B2A44E8C900D55423 /* iosMath.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 49965F1C17CBBA2700A555C5;
remoteInfo = iosMathTests;
};
6A105B862A44E8C900D55423 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 6A105B7B2A44E8C900D55423 /* iosMath.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 4987307517D546800041B02B;
remoteInfo = IosMath;
};
6A105B882A44E8C900D55423 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 6A105B7B2A44E8C900D55423 /* iosMath.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 49A27B0118EBF5B30030B7EF;
remoteInfo = MathFontBundle;
};
/* End PBXContainerItemProxy section */
/* Begin PBXFileReference section */
6A0FD24D2875F944006DF79D /* PacesUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = PacesUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
6A0FD24F2875F944006DF79D /* PacesUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PacesUITests.swift; sourceTree = "<group>"; };
6A0FD2512875F944006DF79D /* PacesUITestsLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PacesUITestsLaunchTests.swift; sourceTree = "<group>"; };
6A0FD25C2875FA14006DF79D /* PacesTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = PacesTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
6A0FD25E2875FA14006DF79D /* PacesTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PacesTests.swift; sourceTree = "<group>"; };
6A105B7B2A44E8C900D55423 /* iosMath.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = iosMath.xcodeproj; path = "../../../Downloads/iosMath-master/iosMath.xcodeproj"; sourceTree = "<group>"; };
6A5CEC51287691BE003D876C /* ChangeLogView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChangeLogView.swift; sourceTree = "<group>"; };
6AB17201286EB414005DED42 /* Splits.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Splits.entitlements; sourceTree = "<group>"; };
6ADBE40128D4DFF000821AA3 /* ComingSoonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComingSoonView.swift; sourceTree = "<group>"; };
6AEEF95C2975CEB1000E0B48 /* Paces-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Paces-Bridging-Header.h"; sourceTree = "<group>"; };
6AEEF9622975D53F000E0B48 /* LaTeXView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LaTeXView.swift; sourceTree = "<group>"; };
850062C82802328F0095F121 /* TabViewData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabViewData.swift; sourceTree = "<group>"; };
8502250D27FA5D0800FE8E95 /* ChangeLogData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChangeLogData.swift; sourceTree = "<group>"; };
850F8013284A7F6A0094580D /* DocsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DocsView.swift; sourceTree = "<group>"; };
850F8015284A815C0094580D /* KnownIssues.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KnownIssues.swift; sourceTree = "<group>"; };
850F8017284A83400094580D /* FeaturesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeaturesView.swift; sourceTree = "<group>"; };
850F801F2853F7790094580D /* LicenseView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LicenseView.swift; sourceTree = "<group>"; };
859298C828592F1F00D9D6CB /* Documentation.docc */ = {isa = PBXFileReference; lastKnownFileType = folder.documentationcatalog; path = Documentation.docc; sourceTree = "<group>"; };
85AAA0D227FA2DD600F4B9A1 /* Paces.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Paces.app; sourceTree = BUILT_PRODUCTS_DIR; };
85AAA0D527FA2DD600F4B9A1 /* SplitsApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplitsApp.swift; sourceTree = "<group>"; };
85AAA0D727FA2DD600F4B9A1 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };
85AAA0D927FA2DDA00F4B9A1 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
85AAA0DC27FA2DDA00F4B9A1 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = "<group>"; };
85AAA0E527FA2EB100F4B9A1 /* HelpView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HelpView.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
6A0FD24A2875F944006DF79D /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
6A0FD2592875FA14006DF79D /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
85AAA0CF27FA2DD600F4B9A1 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
6AAC23DE2ACA05840055BB5F /* iosMath in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
6A0FD24E2875F944006DF79D /* PacesUITests */ = {
isa = PBXGroup;
children = (
6A0FD24F2875F944006DF79D /* PacesUITests.swift */,
6A0FD2512875F944006DF79D /* PacesUITestsLaunchTests.swift */,
);
path = PacesUITests;
sourceTree = "<group>";
};
6A0FD25D2875FA14006DF79D /* PacesTests */ = {
isa = PBXGroup;
children = (
6A0FD25E2875FA14006DF79D /* PacesTests.swift */,
);
path = PacesTests;
sourceTree = "<group>";
};
6A105B7C2A44E8C900D55423 /* Products */ = {
isa = PBXGroup;
children = (
6A105B832A44E8C900D55423 /* iosMathExample.app */,
6A105B852A44E8C900D55423 /* iosMathTests.xctest */,
6A105B872A44E8C900D55423 /* libIosMath.a */,
6A105B892A44E8C900D55423 /* MathFontBundle.bundle */,
);
name = Products;
sourceTree = "<group>";
};
6AEEF9532973A5B6000E0B48 /* Frameworks */ = {
isa = PBXGroup;
children = (
6A105B7B2A44E8C900D55423 /* iosMath.xcodeproj */,
);
name = Frameworks;
sourceTree = "<group>";
};
85AAA0C927FA2DD600F4B9A1 = {
isa = PBXGroup;
children = (
85AAA0D427FA2DD600F4B9A1 /* Splits */,
6A0FD24E2875F944006DF79D /* PacesUITests */,
6A0FD25D2875FA14006DF79D /* PacesTests */,
85AAA0D327FA2DD600F4B9A1 /* Products */,
6AEEF9532973A5B6000E0B48 /* Frameworks */,
);
sourceTree = "<group>";
};
85AAA0D327FA2DD600F4B9A1 /* Products */ = {
isa = PBXGroup;
children = (
85AAA0D227FA2DD600F4B9A1 /* Paces.app */,
6A0FD24D2875F944006DF79D /* PacesUITests.xctest */,
6A0FD25C2875FA14006DF79D /* PacesTests.xctest */,
);
name = Products;
sourceTree = "<group>";
};
85AAA0D427FA2DD600F4B9A1 /* Splits */ = {
isa = PBXGroup;
children = (
859298C828592F1F00D9D6CB /* Documentation.docc */,
6AB17201286EB414005DED42 /* Splits.entitlements */,
85AAA0D527FA2DD600F4B9A1 /* SplitsApp.swift */,
6A5CEC51287691BE003D876C /* ChangeLogView.swift */,
8502250D27FA5D0800FE8E95 /* ChangeLogData.swift */,
85AAA0D727FA2DD600F4B9A1 /* ContentView.swift */,
850062C82802328F0095F121 /* TabViewData.swift */,
850F8017284A83400094580D /* FeaturesView.swift */,
850F8013284A7F6A0094580D /* DocsView.swift */,
6ADBE40128D4DFF000821AA3 /* ComingSoonView.swift */,
6AEEF9622975D53F000E0B48 /* LaTeXView.swift */,
850F8015284A815C0094580D /* KnownIssues.swift */,
85AAA0E527FA2EB100F4B9A1 /* HelpView.swift */,
850F801F2853F7790094580D /* LicenseView.swift */,
85AAA0D927FA2DDA00F4B9A1 /* Assets.xcassets */,
85AAA0DB27FA2DDA00F4B9A1 /* Preview Content */,
6AEEF95C2975CEB1000E0B48 /* Paces-Bridging-Header.h */,
);
path = Splits;
sourceTree = "<group>";
};
85AAA0DB27FA2DDA00F4B9A1 /* Preview Content */ = {
isa = PBXGroup;
children = (
85AAA0DC27FA2DDA00F4B9A1 /* Preview Assets.xcassets */,
);
path = "Preview Content";
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
6A0FD24C2875F944006DF79D /* PacesUITests */ = {
isa = PBXNativeTarget;
buildConfigurationList = 6A0FD2572875F944006DF79D /* Build configuration list for PBXNativeTarget "PacesUITests" */;
buildPhases = (
6A0FD2492875F944006DF79D /* Sources */,
6A0FD24A2875F944006DF79D /* Frameworks */,
6A0FD24B2875F944006DF79D /* Resources */,
);
buildRules = (
);
dependencies = (
6A0FD2542875F944006DF79D /* PBXTargetDependency */,
);
name = PacesUITests;
productName = PacesUITests;
productReference = 6A0FD24D2875F944006DF79D /* PacesUITests.xctest */;
productType = "com.apple.product-type.bundle.ui-testing";
};
6A0FD25B2875FA14006DF79D /* PacesTests */ = {
isa = PBXNativeTarget;
buildConfigurationList = 6A0FD2622875FA14006DF79D /* Build configuration list for PBXNativeTarget "PacesTests" */;
buildPhases = (
6A0FD2582875FA14006DF79D /* Sources */,
6A0FD2592875FA14006DF79D /* Frameworks */,
6A0FD25A2875FA14006DF79D /* Resources */,
);
buildRules = (
);
dependencies = (
6A0FD2612875FA14006DF79D /* PBXTargetDependency */,
);
name = PacesTests;
productName = PacesTests;
productReference = 6A0FD25C2875FA14006DF79D /* PacesTests.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
};
85AAA0D127FA2DD600F4B9A1 /* Paces */ = {
isa = PBXNativeTarget;
buildConfigurationList = 85AAA0E027FA2DDA00F4B9A1 /* Build configuration list for PBXNativeTarget "Paces" */;
buildPhases = (
85AAA0CE27FA2DD600F4B9A1 /* Sources */,
85AAA0CF27FA2DD600F4B9A1 /* Frameworks */,
85AAA0D027FA2DD600F4B9A1 /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = Paces;
packageProductDependencies = (
6AAC23DD2ACA05840055BB5F /* iosMath */,
);
productName = Splits;
productReference = 85AAA0D227FA2DD600F4B9A1 /* Paces.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
85AAA0CA27FA2DD600F4B9A1 /* Project object */ = {
isa = PBXProject;
attributes = {
BuildIndependentTargetsInParallel = 1;
LastSwiftUpdateCheck = 1340;
LastUpgradeCheck = 1330;
TargetAttributes = {
6A0FD24C2875F944006DF79D = {
CreatedOnToolsVersion = 13.4.1;
TestTargetID = 85AAA0D127FA2DD600F4B9A1;
};
6A0FD25B2875FA14006DF79D = {
CreatedOnToolsVersion = 13.4.1;
TestTargetID = 85AAA0D127FA2DD600F4B9A1;
};
85AAA0D127FA2DD600F4B9A1 = {
CreatedOnToolsVersion = 13.3;
LastSwiftMigration = 1400;
};
};
};
buildConfigurationList = 85AAA0CD27FA2DD600F4B9A1 /* Build configuration list for PBXProject "Paces" */;
compatibilityVersion = "Xcode 14.0";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = 85AAA0C927FA2DD600F4B9A1;
packageReferences = (
6AAC23DC2ACA05840055BB5F /* XCRemoteSwiftPackageReference "iosMath" */,
);
productRefGroup = 85AAA0D327FA2DD600F4B9A1 /* Products */;
projectDirPath = "";
projectReferences = (
{
ProductGroup = 6A105B7C2A44E8C900D55423 /* Products */;
ProjectRef = 6A105B7B2A44E8C900D55423 /* iosMath.xcodeproj */;
},
);
projectRoot = "";
targets = (
85AAA0D127FA2DD600F4B9A1 /* Paces */,
6A0FD24C2875F944006DF79D /* PacesUITests */,
6A0FD25B2875FA14006DF79D /* PacesTests */,
);
};
/* End PBXProject section */
/* Begin PBXReferenceProxy section */
6A105B832A44E8C900D55423 /* iosMathExample.app */ = {
isa = PBXReferenceProxy;
fileType = wrapper.application;
path = iosMathExample.app;
remoteRef = 6A105B822A44E8C900D55423 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
6A105B852A44E8C900D55423 /* iosMathTests.xctest */ = {
isa = PBXReferenceProxy;
fileType = wrapper.cfbundle;
path = iosMathTests.xctest;
remoteRef = 6A105B842A44E8C900D55423 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
6A105B872A44E8C900D55423 /* libIosMath.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = libIosMath.a;
remoteRef = 6A105B862A44E8C900D55423 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
6A105B892A44E8C900D55423 /* MathFontBundle.bundle */ = {
isa = PBXReferenceProxy;
fileType = wrapper.cfbundle;
path = MathFontBundle.bundle;
remoteRef = 6A105B882A44E8C900D55423 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
/* End PBXReferenceProxy section */
/* Begin PBXResourcesBuildPhase section */
6A0FD24B2875F944006DF79D /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
6A0FD25A2875FA14006DF79D /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
85AAA0D027FA2DD600F4B9A1 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
85AAA0DD27FA2DDA00F4B9A1 /* Preview Assets.xcassets in Resources */,
85AAA0DA27FA2DDA00F4B9A1 /* Assets.xcassets in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
6A0FD2492875F944006DF79D /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
6A0FD2502875F944006DF79D /* PacesUITests.swift in Sources */,
6A0FD2522875F944006DF79D /* PacesUITestsLaunchTests.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
6A0FD2582875FA14006DF79D /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
6A0FD25F2875FA14006DF79D /* PacesTests.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
85AAA0CE27FA2DD600F4B9A1 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
6A5CEC52287691BE003D876C /* ChangeLogView.swift in Sources */,
85AAA0D827FA2DD600F4B9A1 /* ContentView.swift in Sources */,
6ADBE40228D4DFF000821AA3 /* ComingSoonView.swift in Sources */,
85AAA0D627FA2DD600F4B9A1 /* SplitsApp.swift in Sources */,
850062C92802328F0095F121 /* TabViewData.swift in Sources */,
8502250E27FA5D0800FE8E95 /* ChangeLogData.swift in Sources */,
850F8014284A7F6A0094580D /* DocsView.swift in Sources */,
850F8016284A815C0094580D /* KnownIssues.swift in Sources */,
6AEEF9632975D53F000E0B48 /* LaTeXView.swift in Sources */,
859298C928592F1F00D9D6CB /* Documentation.docc in Sources */,
85AAA0E627FA2EB100F4B9A1 /* HelpView.swift in Sources */,
850F80202853F7790094580D /* LicenseView.swift in Sources */,
850F8018284A83400094580D /* FeaturesView.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
6A0FD2542875F944006DF79D /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 85AAA0D127FA2DD600F4B9A1 /* Paces */;
targetProxy = 6A0FD2532875F944006DF79D /* PBXContainerItemProxy */;
};
6A0FD2612875FA14006DF79D /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 85AAA0D127FA2DD600F4B9A1 /* Paces */;
targetProxy = 6A0FD2602875FA14006DF79D /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin XCBuildConfiguration section */
6A0FD2552875F944006DF79D /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = D6M5W5BC5A;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = Brandlar.PacesUITests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_EMIT_LOC_STRINGS = NO;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
TEST_TARGET_NAME = Paces;
};
name = Debug;
};
6A0FD2562875F944006DF79D /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = D6M5W5BC5A;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = Brandlar.PacesUITests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_EMIT_LOC_STRINGS = NO;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
TEST_TARGET_NAME = Paces;
};
name = Release;
};
6A0FD2632875FA14006DF79D /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = D6M5W5BC5A;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = Brandlar.PacesTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_EMIT_LOC_STRINGS = NO;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Paces.app/Paces";
};
name = Debug;
};
6A0FD2642875FA14006DF79D /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = D6M5W5BC5A;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = Brandlar.PacesTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_EMIT_LOC_STRINGS = NO;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Paces.app/Paces";
};
name = Release;
};
85AAA0DE27FA2DDA00F4B9A1 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
RUN_DOCUMENTATION_COMPILER = YES;
SDKROOT = iphoneos;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
};
name = Debug;
};
85AAA0DF27FA2DDA00F4B9A1 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
RUN_DOCUMENTATION_COMPILER = YES;
SDKROOT = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
SWIFT_VERSION = 5.0;
VALIDATE_PRODUCT = YES;
};
name = Release;
};
85AAA0E127FA2DDA00F4B9A1 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Splits/Splits.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_ASSET_PATHS = "\"Splits/Preview Content\"";
DEVELOPMENT_TEAM = D6M5W5BC5A;
ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = Splits/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = Paces;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.reference";
INFOPLIST_KEY_NSFaceIDUsageDescription = "We'll need authentication before we can show sensitive data";
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
INFOPLIST_KEY_UIRequiresFullScreen = NO;
INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.0.0;
PRODUCT_BUNDLE_IDENTIFIER = Brandlar.Paces;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
RUN_DOCUMENTATION_COMPILER = YES;
SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_OBJC_BRIDGING_HEADER = "Splits/Paces-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
85AAA0E227FA2DDA00F4B9A1 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Splits/Splits.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_ASSET_PATHS = "\"Splits/Preview Content\"";
DEVELOPMENT_TEAM = D6M5W5BC5A;
ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = Splits/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = Paces;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.reference";
INFOPLIST_KEY_NSFaceIDUsageDescription = "We'll need authentication before we can show sensitive data";
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
INFOPLIST_KEY_UIRequiresFullScreen = NO;
INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.0.0;
PRODUCT_BUNDLE_IDENTIFIER = Brandlar.Paces;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
RUN_DOCUMENTATION_COMPILER = YES;
SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_OBJC_BRIDGING_HEADER = "Splits/Paces-Bridging-Header.h";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
6A0FD2572875F944006DF79D /* Build configuration list for PBXNativeTarget "PacesUITests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
6A0FD2552875F944006DF79D /* Debug */,
6A0FD2562875F944006DF79D /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
6A0FD2622875FA14006DF79D /* Build configuration list for PBXNativeTarget "PacesTests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
6A0FD2632875FA14006DF79D /* Debug */,
6A0FD2642875FA14006DF79D /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
85AAA0CD27FA2DD600F4B9A1 /* Build configuration list for PBXProject "Paces" */ = {
isa = XCConfigurationList;
buildConfigurations = (
85AAA0DE27FA2DDA00F4B9A1 /* Debug */,
85AAA0DF27FA2DDA00F4B9A1 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
85AAA0E027FA2DDA00F4B9A1 /* Build configuration list for PBXNativeTarget "Paces" */ = {
isa = XCConfigurationList;
buildConfigurations = (
85AAA0E127FA2DDA00F4B9A1 /* Debug */,
85AAA0E227FA2DDA00F4B9A1 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
/* Begin XCRemoteSwiftPackageReference section */
6AAC23DC2ACA05840055BB5F /* XCRemoteSwiftPackageReference "iosMath" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/tophatmonocle/iosMath";
requirement = {
kind = upToNextMajorVersion;
minimumVersion = 1.1.2;
};
};
/* End XCRemoteSwiftPackageReference section */
/* Begin XCSwiftPackageProductDependency section */
6AAC23DD2ACA05840055BB5F /* iosMath */ = {
isa = XCSwiftPackageProductDependency;
package = 6AAC23DC2ACA05840055BB5F /* XCRemoteSwiftPackageReference "iosMath" */;
productName = iosMath;
};
/* End XCSwiftPackageProductDependency section */
};
rootObject = 85AAA0CA27FA2DD600F4B9A1 /* Project object */;
}

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:">
</FileRef>
</Workspace>

View file

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PreviewsEnabled</key>
<false/>
</dict>
</plist>

View file

@ -0,0 +1,14 @@
{
"pins" : [
{
"identity" : "iosmath",
"kind" : "remoteSourceControl",
"location" : "https://github.com/tophatmonocle/iosMath",
"state" : {
"revision" : "8c65dab2295100c02d9d844f6dc5646ab9d57b42",
"version" : "1.1.2"
}
}
],
"version" : 2
}

View file

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>BuildLocationStyle</key>
<string>UseAppPreferences</string>
<key>CustomBuildLocationType</key>
<string>RelativeToDerivedData</string>
<key>DerivedDataLocationStyle</key>
<string>Default</string>
<key>IssueFilterStyle</key>
<string>ShowActiveSchemeOnly</string>
<key>LiveSourceIssuesEnabled</key>
<true/>
<key>ShowSharedSchemesAutomaticallyEnabled</key>
<true/>
</dict>
</plist>

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Bucket
uuid = "F6072BD7-2ADA-480D-8857-F3DEF54EA1A4"
type = "1"
version = "2.0">
</Bucket>

View file

@ -9,21 +9,42 @@
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>5</integer>
<integer>6</integer>
</dict>
<key>SnapKitPlayground (Playground) 2.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>6</integer>
<integer>7</integer>
</dict>
<key>SnapKitPlayground (Playground) 3.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>5</integer>
</dict>
<key>SnapKitPlayground (Playground) 4.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>8</integer>
</dict>
<key>SnapKitPlayground (Playground) 5.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>9</integer>
</dict>
<key>SnapKitPlayground (Playground).xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>4</integer>
<integer>0</integer>
</dict>
<key>Splits.xcscheme_^#shared#^_</key>
<dict>
@ -35,21 +56,42 @@
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>2</integer>
<integer>3</integer>
</dict>
<key>SwiftRichString (Playground) 2.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>3</integer>
<integer>4</integer>
</dict>
<key>SwiftRichString (Playground) 3.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>10</integer>
</dict>
<key>SwiftRichString (Playground) 4.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>11</integer>
</dict>
<key>SwiftRichString (Playground) 5.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>12</integer>
</dict>
<key>SwiftRichString (Playground).xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>1</integer>
<integer>2</integer>
</dict>
</dict>
</dict>

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Bucket
uuid = "4995A92E-038F-4E17-B8CF-057F8CC0FDA9"
type = "1"
version = "2.0">
</Bucket>

View file

@ -0,0 +1,103 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>SchemeUserState</key>
<dict>
<key>Paces.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>0</integer>
</dict>
<key>SnapKitPlayground (Playground) 1.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>5</integer>
</dict>
<key>SnapKitPlayground (Playground) 2.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>6</integer>
</dict>
<key>SnapKitPlayground (Playground) 3.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>10</integer>
</dict>
<key>SnapKitPlayground (Playground) 4.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>11</integer>
</dict>
<key>SnapKitPlayground (Playground) 5.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>12</integer>
</dict>
<key>SnapKitPlayground (Playground).xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>0</integer>
</dict>
<key>Splits.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>0</integer>
</dict>
<key>SwiftRichString (Playground) 1.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>2</integer>
</dict>
<key>SwiftRichString (Playground) 2.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>3</integer>
</dict>
<key>SwiftRichString (Playground) 3.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>7</integer>
</dict>
<key>SwiftRichString (Playground) 4.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>8</integer>
</dict>
<key>SwiftRichString (Playground) 5.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>9</integer>
</dict>
<key>SwiftRichString (Playground).xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>1</integer>
</dict>
</dict>
</dict>
</plist>

View file

@ -0,0 +1,35 @@
//
// PacesTests.swift
// PacesTests
//
// Created by Isaac Greene on 7/6/22.
//
import XCTest
class PacesTests: XCTestCase {
override func setUpWithError() throws {
// Put setup code here. This method is called before the invocation of each test method in the class.
}
override func tearDownWithError() throws {
// Put teardown code here. This method is called after the invocation of each test method in the class.
}
func testExample() throws {
// This is an example of a functional test case.
// Use XCTAssert and related functions to verify your tests produce the correct results.
// Any test you write for XCTest can be annotated as throws and async.
// Mark your test throws to produce an unexpected failure when your test encounters an uncaught error.
// Mark your test async to allow awaiting for asynchronous code to complete. Check the results with assertions afterwards.
}
func testPerformanceExample() throws {
// This is an example of a performance test case.
measure {
// Put the code you want to measure the time of here.
}
}
}

View file

@ -0,0 +1,41 @@
//
// PacesUITests.swift
// PacesUITests
//
// Created by Isaac Greene on 7/6/22.
//
import XCTest
class PacesUITests: XCTestCase {
override func setUpWithError() throws {
// Put setup code here. This method is called before the invocation of each test method in the class.
// In UI tests it is usually best to stop immediately when a failure occurs.
continueAfterFailure = false
// In UI tests its important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.
}
override func tearDownWithError() throws {
// Put teardown code here. This method is called after the invocation of each test method in the class.
}
func testExample() throws {
// UI tests must launch the application that they test.
let app = XCUIApplication()
app.launch()
// Use XCTAssert and related functions to verify your tests produce the correct results.
}
func testLaunchPerformance() throws {
if #available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 7.0, *) {
// This measures how long it takes to launch your application.
measure(metrics: [XCTApplicationLaunchMetric()]) {
XCUIApplication().launch()
}
}
}
}

View file

@ -0,0 +1,32 @@
//
// PacesUITestsLaunchTests.swift
// PacesUITests
//
// Created by Isaac Greene on 7/6/22.
//
import XCTest
class PacesUITestsLaunchTests: XCTestCase {
override class var runsForEachTargetApplicationUIConfiguration: Bool {
true
}
override func setUpWithError() throws {
continueAfterFailure = false
}
func testLaunch() throws {
let app = XCUIApplication()
app.launch()
// Insert steps here to perform after app launch but before taking a screenshot,
// such as logging into a test account or navigating somewhere in the app
let attachment = XCTAttachment(screenshot: app.screenshot())
attachment.name = "Launch Screen"
attachment.lifetime = .keepAlways
add(attachment)
}
}

View file

@ -1,397 +0,0 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 55;
objects = {
/* Begin PBXBuildFile section */
850062C92802328F0095F121 /* TabViewData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 850062C82802328F0095F121 /* TabViewData.swift */; };
8502250E27FA5D0800FE8E95 /* ChangeLogData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8502250D27FA5D0800FE8E95 /* ChangeLogData.swift */; };
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 */; };
85AAA0DD27FA2DDA00F4B9A1 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 85AAA0DC27FA2DDA00F4B9A1 /* Preview Assets.xcassets */; };
85AAA0E627FA2EB100F4B9A1 /* ModalView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85AAA0E527FA2EB100F4B9A1 /* ModalView.swift */; };
85AAA0E827FA2F1600F4B9A1 /* ChangeLogView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85AAA0E727FA2F1600F4B9A1 /* ChangeLogView.swift */; };
85AAA0EB27FA2F7000F4B9A1 /* RichTextView in Frameworks */ = {isa = PBXBuildFile; productRef = 85AAA0EA27FA2F7000F4B9A1 /* RichTextView */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
850062C82802328F0095F121 /* TabViewData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabViewData.swift; sourceTree = "<group>"; };
8502250D27FA5D0800FE8E95 /* ChangeLogData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChangeLogData.swift; sourceTree = "<group>"; };
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 = "<group>"; };
85AAA0D727FA2DD600F4B9A1 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };
85AAA0D927FA2DDA00F4B9A1 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
85AAA0DC27FA2DDA00F4B9A1 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = "<group>"; };
85AAA0E527FA2EB100F4B9A1 /* ModalView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModalView.swift; sourceTree = "<group>"; };
85AAA0E727FA2F1600F4B9A1 /* ChangeLogView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChangeLogView.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
85AAA0CF27FA2DD600F4B9A1 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
85AAA0EB27FA2F7000F4B9A1 /* RichTextView in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
85AAA0C927FA2DD600F4B9A1 = {
isa = PBXGroup;
children = (
85AAA0D427FA2DD600F4B9A1 /* Splits */,
85AAA0D327FA2DD600F4B9A1 /* Products */,
);
sourceTree = "<group>";
};
85AAA0D327FA2DD600F4B9A1 /* Products */ = {
isa = PBXGroup;
children = (
85AAA0D227FA2DD600F4B9A1 /* Splits.app */,
);
name = Products;
sourceTree = "<group>";
};
85AAA0D427FA2DD600F4B9A1 /* Splits */ = {
isa = PBXGroup;
children = (
85AAA0D527FA2DD600F4B9A1 /* SplitsApp.swift */,
8502250D27FA5D0800FE8E95 /* ChangeLogData.swift */,
85AAA0D727FA2DD600F4B9A1 /* ContentView.swift */,
850062C82802328F0095F121 /* TabViewData.swift */,
85AAA0E727FA2F1600F4B9A1 /* ChangeLogView.swift */,
85AAA0E527FA2EB100F4B9A1 /* ModalView.swift */,
85AAA0D927FA2DDA00F4B9A1 /* Assets.xcassets */,
85AAA0DB27FA2DDA00F4B9A1 /* Preview Content */,
);
path = Splits;
sourceTree = "<group>";
};
85AAA0DB27FA2DDA00F4B9A1 /* Preview Content */ = {
isa = PBXGroup;
children = (
85AAA0DC27FA2DDA00F4B9A1 /* Preview Assets.xcassets */,
);
path = "Preview Content";
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
85AAA0D127FA2DD600F4B9A1 /* Splits */ = {
isa = PBXNativeTarget;
buildConfigurationList = 85AAA0E027FA2DDA00F4B9A1 /* Build configuration list for PBXNativeTarget "Splits" */;
buildPhases = (
85AAA0CE27FA2DD600F4B9A1 /* Sources */,
85AAA0CF27FA2DD600F4B9A1 /* Frameworks */,
85AAA0D027FA2DD600F4B9A1 /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = Splits;
packageProductDependencies = (
85AAA0EA27FA2F7000F4B9A1 /* RichTextView */,
);
productName = Splits;
productReference = 85AAA0D227FA2DD600F4B9A1 /* Splits.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
85AAA0CA27FA2DD600F4B9A1 /* Project object */ = {
isa = PBXProject;
attributes = {
BuildIndependentTargetsInParallel = 1;
LastSwiftUpdateCheck = 1330;
LastUpgradeCheck = 1330;
TargetAttributes = {
85AAA0D127FA2DD600F4B9A1 = {
CreatedOnToolsVersion = 13.3;
};
};
};
buildConfigurationList = 85AAA0CD27FA2DD600F4B9A1 /* Build configuration list for PBXProject "Splits" */;
compatibilityVersion = "Xcode 13.0";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = 85AAA0C927FA2DD600F4B9A1;
packageReferences = (
85AAA0E927FA2F7000F4B9A1 /* XCRemoteSwiftPackageReference "RichTextView" */,
);
productRefGroup = 85AAA0D327FA2DD600F4B9A1 /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
85AAA0D127FA2DD600F4B9A1 /* Splits */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
85AAA0D027FA2DD600F4B9A1 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
85AAA0DD27FA2DDA00F4B9A1 /* Preview Assets.xcassets in Resources */,
85AAA0DA27FA2DDA00F4B9A1 /* Assets.xcassets in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
85AAA0CE27FA2DD600F4B9A1 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
85AAA0D827FA2DD600F4B9A1 /* ContentView.swift in Sources */,
85AAA0D627FA2DD600F4B9A1 /* SplitsApp.swift in Sources */,
850062C92802328F0095F121 /* TabViewData.swift in Sources */,
8502250E27FA5D0800FE8E95 /* ChangeLogData.swift in Sources */,
85AAA0E827FA2F1600F4B9A1 /* ChangeLogView.swift in Sources */,
85AAA0E627FA2EB100F4B9A1 /* ModalView.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin XCBuildConfiguration section */
85AAA0DE27FA2DDA00F4B9A1 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 15.4;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
RUN_DOCUMENTATION_COMPILER = YES;
SDKROOT = iphoneos;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
};
name = Debug;
};
85AAA0DF27FA2DDA00F4B9A1 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 15.4;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
RUN_DOCUMENTATION_COMPILER = YES;
SDKROOT = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
VALIDATE_PRODUCT = YES;
};
name = Release;
};
85AAA0E127FA2DDA00F4B9A1 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_ASSET_PATHS = "\"Splits/Preview Content\"";
DEVELOPMENT_TEAM = UQJ7U8R2CV;
ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
INFOPLIST_KEY_UIRequiresFullScreen = NO;
INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeRight UIInterfaceOrientationLandscapeLeft";
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = Brandlar.Splits;
PRODUCT_NAME = "$(TARGET_NAME)";
RUN_DOCUMENTATION_COMPILER = YES;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
85AAA0E227FA2DDA00F4B9A1 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_ASSET_PATHS = "\"Splits/Preview Content\"";
DEVELOPMENT_TEAM = UQJ7U8R2CV;
ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
INFOPLIST_KEY_UIRequiresFullScreen = NO;
INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeRight UIInterfaceOrientationLandscapeLeft";
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = Brandlar.Splits;
PRODUCT_NAME = "$(TARGET_NAME)";
RUN_DOCUMENTATION_COMPILER = YES;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
85AAA0CD27FA2DD600F4B9A1 /* Build configuration list for PBXProject "Splits" */ = {
isa = XCConfigurationList;
buildConfigurations = (
85AAA0DE27FA2DDA00F4B9A1 /* Debug */,
85AAA0DF27FA2DDA00F4B9A1 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
85AAA0E027FA2DDA00F4B9A1 /* Build configuration list for PBXNativeTarget "Splits" */ = {
isa = XCConfigurationList;
buildConfigurations = (
85AAA0E127FA2DDA00F4B9A1 /* Debug */,
85AAA0E227FA2DDA00F4B9A1 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
/* Begin XCRemoteSwiftPackageReference section */
85AAA0E927FA2F7000F4B9A1 /* XCRemoteSwiftPackageReference "RichTextView" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/tophat/RichTextView.git";
requirement = {
branch = master;
kind = branch;
};
};
/* End XCRemoteSwiftPackageReference section */
/* Begin XCSwiftPackageProductDependency section */
85AAA0EA27FA2F7000F4B9A1 /* RichTextView */ = {
isa = XCSwiftPackageProductDependency;
package = 85AAA0E927FA2F7000F4B9A1 /* XCRemoteSwiftPackageReference "RichTextView" */;
productName = RichTextView;
};
/* End XCSwiftPackageProductDependency section */
};
rootObject = 85AAA0CA27FA2DD600F4B9A1 /* Project object */;
}

View file

@ -1,50 +0,0 @@
{
"pins" : [
{
"identity" : "down",
"kind" : "remoteSourceControl",
"location" : "https://github.com/johnxnguyen/Down",
"state" : {
"revision" : "f34b166be1f1db4aa8f573067e901d72f2a6be57",
"version" : "0.11.0"
}
},
{
"identity" : "iosmath",
"kind" : "remoteSourceControl",
"location" : "https://github.com/tophatmonocle/iosMath",
"state" : {
"revision" : "8c65dab2295100c02d9d844f6dc5646ab9d57b42",
"version" : "1.1.2"
}
},
{
"identity" : "richtextview",
"kind" : "remoteSourceControl",
"location" : "https://github.com/tophat/RichTextView.git",
"state" : {
"branch" : "master",
"revision" : "c34d4d8a45b9635ec65237b484180d8611d1f8cf"
}
},
{
"identity" : "snapkit",
"kind" : "remoteSourceControl",
"location" : "https://github.com/SnapKit/SnapKit",
"state" : {
"revision" : "d458564516e5676af9c70b4f4b2a9178294f1bc6",
"version" : "5.0.1"
}
},
{
"identity" : "swiftrichstring",
"kind" : "remoteSourceControl",
"location" : "https://github.com/tophatmonocle/SwiftRichString",
"state" : {
"branch" : "master",
"revision" : "e0b72d5c96968d7802856d2be096202c9798e8d1"
}
}
],
"version" : 2
}

View file

@ -1,98 +0,0 @@
{
"images" : [
{
"idiom" : "iphone",
"scale" : "2x",
"size" : "20x20"
},
{
"idiom" : "iphone",
"scale" : "3x",
"size" : "20x20"
},
{
"idiom" : "iphone",
"scale" : "2x",
"size" : "29x29"
},
{
"idiom" : "iphone",
"scale" : "3x",
"size" : "29x29"
},
{
"idiom" : "iphone",
"scale" : "2x",
"size" : "40x40"
},
{
"idiom" : "iphone",
"scale" : "3x",
"size" : "40x40"
},
{
"idiom" : "iphone",
"scale" : "2x",
"size" : "60x60"
},
{
"idiom" : "iphone",
"scale" : "3x",
"size" : "60x60"
},
{
"idiom" : "ipad",
"scale" : "1x",
"size" : "20x20"
},
{
"idiom" : "ipad",
"scale" : "2x",
"size" : "20x20"
},
{
"idiom" : "ipad",
"scale" : "1x",
"size" : "29x29"
},
{
"idiom" : "ipad",
"scale" : "2x",
"size" : "29x29"
},
{
"idiom" : "ipad",
"scale" : "1x",
"size" : "40x40"
},
{
"idiom" : "ipad",
"scale" : "2x",
"size" : "40x40"
},
{
"idiom" : "ipad",
"scale" : "1x",
"size" : "76x76"
},
{
"idiom" : "ipad",
"scale" : "2x",
"size" : "76x76"
},
{
"idiom" : "ipad",
"scale" : "2x",
"size" : "83.5x83.5"
},
{
"idiom" : "ios-marketing",
"scale" : "1x",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View file

@ -0,0 +1,38 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "1.000",
"green" : "1.000",
"red" : "1.000"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0.000",
"green" : "0.000",
"red" : "0.000"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View file

@ -0,0 +1,22 @@
{
"images" : [
{
"filename" : "launch screen dark.svg",
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"filename" : "launch screen light.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View file

@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg width="100%" height="100%" viewBox="0 0 1039 649" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"><g transform="matrix(390.216,0,0,390.216,1054.42,366.742)"></g><text x="-30.105px" y="366.742px" style="font-family:'ArialMT', 'Arial', sans-serif;font-size:390.216px;fill:#fff;">Paces</text><g transform="matrix(1,0,0,1,1.13687e-13,-64.5689)"><text x="38.874px" y="533.801px" style="font-family:'ArialMT', 'Arial', sans-serif;font-size:50px;fill:#fff;">A<tspan x="69.465px 83.357px " y="533.801px 533.801px "> r</tspan>evolutionary new app from Isaac Greene</text><text x="134.724px" y="585.437px" style="font-family:'ArialMT', 'Arial', sans-serif;font-size:50px;fill:#fff;">representing thousands of years of</text><g transform="matrix(50,0,0,50,997.773,637.073)"></g><text x="41.597px" y="637.073px" style="font-family:'ArialMT', 'Arial', sans-serif;font-size:50px;fill:#fff;">development brought to you free of charge.</text></g></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View file

@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg width="100%" height="100%" viewBox="0 0 1039 649" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"><g transform="matrix(390.216,0,0,390.216,1054.42,366.742)"></g><text x="-30.105px" y="366.742px" style="font-family:'ArialMT', 'Arial', sans-serif;font-size:390.216px;">Paces</text><g transform="matrix(1,0,0,1,1.13687e-13,-64.5689)"><text x="38.874px" y="533.801px" style="font-family:'ArialMT', 'Arial', sans-serif;font-size:50px;">A<tspan x="69.465px 83.357px " y="533.801px 533.801px "> r</tspan>evolutionary new app from Isaac Greene</text><text x="134.724px" y="585.437px" style="font-family:'ArialMT', 'Arial', sans-serif;font-size:50px;">representing thousands of years of</text><g transform="matrix(50,0,0,50,997.773,637.073)"></g><text x="41.597px" y="637.073px" style="font-family:'ArialMT', 'Arial', sans-serif;font-size:50px;">development brought to you free of charge.</text></g></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View file

@ -2,64 +2,456 @@
// ChangeLogData.swift
// Splits
//
// Created by Isaac Greene on 4/3/22.
// Created by Isaac Greene on 2022-04-03.
//
import SwiftUI
struct June2023: View {
var body: some View {
ScrollView {
//2023-06-06
HStack {
VStack (alignment: .leading) {
Text("2023-06-06")
.font(.title2)
Text("Version Prerelease Build LVSXT11x\n")
.font(.footnote)
Text("\u{2022} Started working on custom launch screen but now it's not working")
}
Spacer()
}
.padding(30)
//2023-06-05
HStack {
VStack (alignment: .leading) {
Text("2023-06-05")
.font(.title2)
Text("Version Prerelease Build LVSXT11y\n")
.font(.footnote)
Text("\u{2022} Made internal changes, like reducing app size by about six MB.\n \u{2022} Trying to figure out a better way to make these changelogs than handwriting\n\u{2022} Changed the look of the \"See our math\" button\n\u{2022} Started work on visual enhancements. kinda ugly right now")
}
Spacer()
}
.padding(30)
//2023-06-04
HStack {
VStack (alignment: .leading) {
Text("2023-06-04")
.font(.title2)
Text("Version 1.0.0b\n")
.font(.footnote)
Text("\u{2022} Reimplemented the math equation with LaTeX")
}
Spacer()
}
.padding(30)
}
.navigationTitle("June 2023 Log")
.navigationBarTitleDisplayMode(.inline)
}
}
struct September2022: View {
var body: some View {
ScrollView {
//2022-09-16
HStack {
VStack (alignment: .leading) {
Text("2022-09-16")
.font(.title2)
Text("Version 1.0.0\n")
.font(.footnote)
Text("\u{2022} Removed contacts tab")
}
Spacer()
}
.padding(30)
}
.navigationTitle("September 2022 Log")
.navigationBarTitleDisplayMode(.inline)
}
}
struct July2022: View {
var body: some View {
ScrollView {
//2022-07-19
HStack {
VStack (alignment: .leading) {
Text("2022-07-19")
.font(.title2)
Text("Version 1.0.0\n")
.font(.footnote)
Text("\u{2022} Added required software licenses for the libraries I use, and changed the app's license from proprietary to 4-clause BSD")
}
Spacer()
}
.padding(30)
//2022-07-06
HStack {
VStack (alignment: .leading) {
Text("2022-07-06")
.font(.title2)
Text("Version Prerelease Build LVSXT10a.4\n")
.font(.footnote)
Text("\u{2022} Stored the logins as cryptographically-secure hashes\n\u{2022} Fixed a few small formatting issues")
}
Spacer()
}
.padding(30)
}
.navigationTitle("July 2022 Log")
.navigationBarTitleDisplayMode(.inline)
}
}
struct June2022: View {
var body: some View {
ScrollView {
//2022-06-17
HStack {
VStack (alignment: .leading) {
Text("2022-06-17")
.font(.title2)
Text("Version Release Candidate 4\n")
.font(.footnote)
Text("\u{2022} Added km/hr and mi/hr\n\u{2022} Did some formatting with the stuff\n\u{2022} Added Back and Next buttons")
}
Spacer()
}
.padding(30)
//2022-06-16
HStack {
VStack (alignment: .leading) {
Text("2022-06-16")
.font(.title2)
Text("Version Release Candidate 3\n")
.font(.footnote)
Text("\u{2022} You can now enter any distance you want without the app crashing\n\u{2022} Formatted the primary distance to three decimal places")
}
Spacer()
}
.padding(30)
// has ten days of logs
VStack {
//2022-06-15
HStack {
VStack (alignment: .leading) {
Text("2022-06-15")
.font(.title2)
Text("Version Prerelease Build LVSXT10a.3\n")
.font(.footnote)
Text("\u{2022} Fixed an issue where typing zero for the distance caused the app to crash\n\u{2022} Implemented a way to navigate between text fields and redid the Done button to make it fit better")
}
Spacer()
}
.padding(30)
//2022-06-14
HStack {
VStack (alignment: .leading) {
Text("2022-06-14")
.font(.title2)
Text("Version Prerelease Build LVSXT10a.3\n")
.font(.footnote)
Text("\u{2022} Optimized some code to allow for future development\n\u{2022} Starting on fixing an issue where putting a zero as the first number in the Distance field causes the app to crash\n\u{2022} Started work on more robust app documentation")
}
Spacer()
}
.padding(30)
//2022-06-11
// LVSXT10a.2
HStack {
VStack (alignment: .leading) {
Text("2022-06-11")
.font(.title2)
Text("Version Release Candidate 2\n")
.font(.footnote)
Text("\u{2022} Added biometrics to sign in along with option for username/password")
}
Spacer()
}
.padding(30)
//2022-06-10
// LVSXT10a
HStack {
VStack (alignment: .leading) {
Text("2022-06-10")
.font(.title2)
Text("Version Release Candidate\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\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) {
Text("2022-06-09")
.font(.title2)
Text("Version Prerelease Build LVSXT10c.2\n")
.font(.footnote)
Text("\u{2022} Worked on a simple login page to view contact info\n\t\u{2022} Spent *way* too long on it")
}
Spacer()
}
.padding(30)
//2022-06-08
HStack {
VStack (alignment: .leading) {
Text("2022-06-08")
.font(.title2)
Text("Version Prerelease Build LVSXT10c\n")
.font(.footnote)
Text("\u{2022} Finished with a conversion of the pace to be a more readable format (i.e. 5:45 instead of 5.75)!\n\t\u{2022} This is probably one of the biggest things to increase readability in the app\n\u{2022} Installed a Software License")
}
Spacer()
}
.padding(30)
//2022-06-05
HStack {
VStack (alignment: .leading) {
Text("2022-06-05")
.font(.title2)
Text("Version Prerelease Build LVSXT10d.3\n")
.font(.footnote)
Text("\u{2022} Started work on converting the pace to a more understandable format")
}
Spacer()
}
.padding(30)
//2022-06-04
HStack {
VStack (alignment: .leading) {
Text("2022-06-04")
.font(.title2)
Text("Version Prerelease Build LVSXT10d.2\n")
.font(.footnote)
Text("\u{2022} Reformatted some tabs, and added the Recently Resolved issues tab\n\u{2022} Moved the Help tab into Docs")
}
Spacer()
}
.padding(30)
//2022-06-03
HStack {
VStack (alignment: .leading) {
Text("2022-06-03")
.font(.title2)
Text("Version Prerelease Build LVSXT10d\n")
.font(.footnote)
Text("\u{2022} Finished hours input.\n\u{2022} Moved some things around and the \"Change log\" tab is now \"Docs\" which holds info on features, the change log, and known issues, with a few other things.")
}
Spacer()
}
.padding(30)
//2022-06-01
//gay
HStack {
VStack (alignment: .leading) {
Text("2022-06-01")
.font(.title2)
Text("Version Prerelease Build LVSXT10g.3\n")
.font(.footnote)
Text("\u{2022} Partially implemented an easier way to input hours. Mostly working on formatting issues, but it shows up somewhat like it's supposed to.")
}
Spacer()
}
.padding(30)
}
}
.navigationTitle("June 2022 Log")
.navigationBarTitleDisplayMode(.inline)
}
}
// done adding content to these
struct May2022: View {
var body: some View {
ScrollView {
//2022-05-25
HStack {
VStack (alignment: .leading) {
Text("2022-05-25")
.font(.title2)
Text("Version Prerelease Build LVSXT10g.2\n")
.font(.footnote)
Text("\u{2022} I'm at a stalemate with Swift")
}
Spacer()
}
.padding(30)
//2022-05-22
HStack {
VStack (alignment: .leading) {
Text("2022-05-22")
.font(.title2)
Text("Version Prerelease Build LVSXT10g\n")
.font(.footnote)
Text("\u{2022} Undid changes made in Build LVSXT10j.\n\u{2022} Failed to implement a way to dismiss the keyboard.\n\u{2022} Started work on a conversion process of paces to the opposite selected system of measurement. (does not currently work)")
}
Spacer()
}
.padding(30)
}
.navigationTitle("May 2022 Log")
.navigationBarTitleDisplayMode(.inline)
}
}
struct April2022: View {
var body: some View {
ScrollView {
//2022-04-13
HStack {
VStack (alignment: .leading) {
Text("2022-04-13")
.font(.title2)
Text("Version Prerelease Build LVSXT10j\n")
.font(.footnote)
Text("\u{2022} Started work on optimizing code. Made no other changes and left the code with errors.")
}
Spacer()
}
.padding(30)
//2022-04-11
HStack {
VStack (alignment: .leading) {
Text("2022-04-11")
.font(.title2)
Text("Version Prerelease Build LVSXT10k\n")
.font(.footnote)
Text("\u{2022} Fixed total time display so now 300 seconds properly wraps to 5 minutes and minutes now also wrap when seconds equates to an amount that equals more than 60 minutes\n\u{2022} Forced all text in change log to left side of screen")
}
Spacer()
}
.padding(30)
//2022-04-10
<<<<<<< HEAD
VStack (alignment: .leading) {
Text("2022-04-10")
.font(.title2)
Text("Version Prerelease Build LVSXT10m\n")
.font(.footnote)
Text("\u{2022} Added known issues view.\n\t\u{2022} Might add this to the change log navigation at the bottom in the future")
=======
HStack {
VStack (alignment: .leading) {
Text("2022-04-10")
.font(.title2)
Text("Version Prerelease Build LVSXT10m\n")
.font(.footnote)
Text("\u{2022} Added known issues view\n\t\u{2022} Might add this to the change log navigation at the bottom in the future\n\u{2022} Reverted to a different commit in Git so that the app can be used")
}
Spacer()
>>>>>>> the-app-i-guess
}
.padding(30)
//2022-04-09
VStack (alignment: .leading) {
Text("2022-04-09:")
.font(.title2)
Text("Version Prerelease Build LVSXT10n\n")
.font(.footnote)
Text("\u{2022} Fixed the math with seconds so now you can actually use them! YEAH BABY!\n\u{2022} Rounded pace so that you don't get values like 4.999999999999996 minutes per km\n\t\u{2022} Working on getting the seconds to change into minutes like 340 seconds will show as 5 minutes 40 seconds or \"0:05:40\"\n\u{2022} Removed warning about not using seconds (because they work now!)\n\u{2022} Got math color right. Issue was I had my colors switched so it showed black text in dark mode, and white text in light mode.\n\u{2022} Fixed distance between time boxes\n\u{2022} Removed text about not using seconds greater than 59 in text field\n\u{2022} Properly implemented tab view so that each view gets ONE (1) tab\n\u{2022} Added Git which I should've done long ago\n\u{2022} Tweaked various visual elements. For some reason, SF Symbols doesn't have a calculator??? So instead I'm using \"candybarphone\" but \"building\" looked good, too\n\u{2022} Got overflow of minutes working so now 100 minutes will show as 1 hour 40 minutes.\n\t\u{2022} Seconds overflow does not work (see known issues)")
HStack {
VStack (alignment: .leading) {
Text("2022-04-09")
.font(.title2)
Text("Version Prerelease Build LVSXT10n\n")
.font(.footnote)
Text("\u{2022} Fixed the math with seconds so now you can actually use them! YEAH BABY!\n\u{2022} Rounded pace so that you don't get values like 4.999999999999996 minutes per km\n\t\u{2022} Working on getting the seconds to change into minutes like 340 seconds will show as 5 minutes 40 seconds or \"0:05:40\"\n\u{2022} Removed warning about not using seconds (because they work now!)\n\u{2022} Got math color right. Issue was I had my colors switched so it showed black text in dark mode, and white text in light mode.\n\u{2022} Fixed distance between time boxes\n\u{2022} Removed text about not using seconds greater than 59 in text field\n\u{2022} Properly implemented tab view so that each view gets ONE (1) tab\n\u{2022} Added Git which I should've done long ago\n\u{2022} Tweaked various visual elements. For some reason, SF Symbols doesn't have a calculator??? So instead I'm using \"candybarphone\" but \"building\" looked good, too\n\u{2022} Got overflow of minutes working so now 100 minutes will show as 1 hour 40 minutes.\n\t\u{2022} Seconds overflow does not work (see known issues)")
}
Spacer()
}
.padding(30)
//2022-04-08
VStack (alignment: .leading) {
Text("2022-04-08:")
.font(.title2)
Text("Version Prerelease Build LVSXT10r\n")
.font(.footnote)
Text("\u{2022} Added bullet points to change log\n\u{2022} Changed text in \"Help\" section about using seconds (ended up not working)\n\u{2022} Tried unsuccessfully to dynamically change the color of the pace formula whether in dark or light mode\n\u{2022} Temporarily removed change log in Build t\n\u{2022} Fixed positioning of minutes and seconds text boxes\n\u{2022} Total time now shows correct minute/hour time (minutes and hours are no longer equal)\n\t\u{2022} Seconds still don't work properly")
HStack {
VStack (alignment: .leading) {
Text("2022-04-08")
.font(.title2)
Text("Version Prerelease Build LVSXT10r\n")
.font(.footnote)
Text("\u{2022} Added bullet points to change log\n\u{2022} Changed text in \"Help\" section about using seconds (ended up not working)\n\u{2022} Tried unsuccessfully to dynamically change the color of the pace formula whether in dark or light mode\n\u{2022} Temporarily removed change log in Build t\n\u{2022} Fixed positioning of minutes and seconds text boxes\n\u{2022} Total time now shows correct minute/hour time (minutes and hours are no longer equal)\n\t\u{2022} Seconds still don't work properly")
}
Spacer()
}
.padding(30)
//2022-04-05
VStack (alignment: .leading) {
Text("2022-04-05:")
.font(.title2)
Text("Version Prerelease Build LVSXT10u.2\n")
.font(.footnote)
Text("\u{2022} Reformatted change log to include better navigation and clearer notice of changes")
HStack {
VStack (alignment: .leading) {
Text("2022-04-05")
.font(.title2)
Text("Version Prerelease Build LVSXT10u.2\n")
.font(.footnote)
Text("\u{2022} Reformatted change log to include better navigation and clearer notice of changes")
}
Spacer()
}
.padding(30)
//2022-04-03
VStack (alignment: .leading) {
Text("2022-04-03:")
.font(.title2)
Text("Version Prerelease Build LVSXT10u\n")
.font(.footnote)
Text("\u{2022} Fixed math\n\u{2022} Implemented change log view\n\u{2022} Restructured code so it gave fewer errors\n\u{2022} Added correct pace data\n\t\u{2022} At this time, the seconds functionality is entirely broken\n\u{2022} Implemented total time view\n\t\u{2022} For some reason, the view for the minutes automatically fills in for the hours as well")
HStack {
VStack (alignment: .leading) {
Text("2022-04-03")
.font(.title2)
Text("Version Prerelease Build LVSXT10u\n")
.font(.footnote)
Text("\u{2022} Moved app production over from Swift Playgrounds on iPad to Xcode on Mac\n\u{2022} Fixed math\n\u{2022} Implemented change log view\n\u{2022} Restructured code so it gave fewer errors\n\u{2022} Added correct pace data\n\t\u{2022} At this time, the seconds functionality is entirely broken\n\u{2022} Implemented total time view\n\t\u{2022} For some reason, the view for the minutes automatically fills in for the hours as well")
}
Spacer()
}
.padding(30)
}
.navigationTitle("April 2022 Log")
.navigationBarTitleDisplayMode(.inline)
}
}
struct March2022: View {
var body: some View {
ScrollView {
//2022-03-26
HStack {
VStack (alignment: .leading) {
Text("2022-03-26:2022-03-31")
.font(.title2)
Text("Version [UNNAMED]\n")
.font(.footnote)
Text("Things were made, fixed, broken, removed, etc. I don't know what happened because I had no system in place to track changes")
}
Spacer()
}
.padding(30)
//2022-03-25
HStack {
VStack (alignment: .leading) {
Text("2022-03-25")
.font(.title2)
Text("Version [UNNAMED]\n")
.font(.footnote)
Text("App production started. Textfields were mostly implemented but didn't do anything. Also started on the help page.")
}
Spacer()
}
.padding(30)
}
.navigationTitle("March 2022 Log")
.navigationBarTitleDisplayMode(.inline)
}
}

View file

@ -2,22 +2,28 @@
// ChangeLogView.swift
// Splits
//
// Created by Isaac Greene on 4/3/22.
// Created by Isaac Greene on 2022-04-03.
//
import SwiftUI
struct ChangeLog: View {
var body: some View {
NavigationView {
List {
Section(header: Text("2022")) {
NavigationLink("April", destination: April2022())
}
}
.listStyle(.insetGrouped)
.navigationTitle("Change log")
List {
Section(header: Text("2023")) {
NavigationLink("June", destination: June2023())
}
Section(header: Text("2022")) {
NavigationLink("September", destination: September2022())
NavigationLink("July", destination: July2022())
NavigationLink("June", destination: June2022())
NavigationLink("May", destination: May2022())
NavigationLink("April", destination: April2022())
NavigationLink("March", destination: March2022())
}
}
.listStyle(.insetGrouped)
.navigationTitle("Change Log")
}
}
struct ChangeLog_Previews: PreviewProvider {

View file

@ -0,0 +1,25 @@
//
// ComingSoonView.swift
// Paces
//
// Created by Isaac Greene on 2022-09-16.
//
import SwiftUI
import UIKit
struct ComingSoonView: View {
var body: some View {
VStack {
Image(systemName: "clock.arrow.circlepath")
.frame(maxWidth: 100)
Text("Coming soon!")
}
}
}
struct ComingSoonView_Previews: PreviewProvider {
static var previews: some View {
ComingSoonView()
}
}

View file

@ -2,91 +2,281 @@
// ContentView.swift
// Splits
//
// Created by Isaac Greene on 4/3/22.
// Created by Isaac Greene on 2022-04-03.
//
import SwiftUI
import Foundation
/// Creates the primary tab of ``SplitsApp``
///
/// This view holds
struct ContentView: View {
enum Field {
case distance
case hours
case minutes
case seconds
}
@FocusState private var nameIsFocused: Bool
@FocusState private var focusedField: Field?
var SISystem = ["km","mi"]
var minutes = Array(0...300)
var times = Array(0...300).map { String($0) }
@State var timeHours: String = ""
@State var timeMinutes: String = ""
@State var timeSeconds: String = ""
@State var selectedSystem: String = "km"
@State var distance: String = ""
var body: some View {
VStack {
NavigationView {
VStack {
TextField("Enter distance here", text: $distance)
.padding()
.keyboardType(.decimalPad)
.textFieldStyle(.roundedBorder)
}
VStack {
Text("Unit of measurement:")
Picker("System of measurement", selection: $selectedSystem, content: {
ForEach(SISystem, id: \.self, content: { unit in
Text(unit)
VStack {
TextField("Enter distance", text: $distance)
.padding()
.keyboardType(.decimalPad)
.textFieldStyle(.roundedBorder)
.focused($nameIsFocused)
.focused($focusedField, equals: .distance)
.toolbar {
ToolbarItemGroup(placement: .keyboard) {
Button("Done") {
nameIsFocused = false
}
Button("Clear") {
distance = ""
timeHours = ""
timeMinutes = ""
timeSeconds = ""
}
Spacer()
Button("Back") {
if focusedField == .distance {
focusedField = nil
} else if focusedField == .hours {
focusedField = .distance
} else if focusedField == .minutes {
focusedField = .hours
} else {
focusedField = .minutes
}
}
Button("Next") {
if focusedField == .distance {
focusedField = .hours
} else if focusedField == .hours {
focusedField = .minutes
} else if focusedField == .minutes {
focusedField = .seconds
} else {
focusedField = nil
}
}
}
}
}
VStack {
Text("Unit of measurement:")
Picker("System of measurement", selection: $selectedSystem, content: {
ForEach(SISystem, id: \.self, content: { unit in
Text(unit)
})
})
})
.pickerStyle(.segmented)
.frame(minWidth: 60, maxWidth: 300)
HStack {
VStack {
Text("Total Minutes")
TextField("Enter minutes here", text: $timeMinutes)
.pickerStyle(.segmented)
.frame(minWidth: 60, maxWidth: 300)
HStack {
VStack {
Text("Hours")
TextField("Enter hours", text: $timeHours)
.keyboardType(.numberPad)
.textFieldStyle(.roundedBorder)
.focused($nameIsFocused)
.focused($focusedField, equals: .hours)
}
.frame(minWidth: 100)
.padding(.trailing, -15)
.padding()
VStack {
Text("Minutes")
TextField("Enter minutes", text: $timeMinutes)
.keyboardType(.numberPad)
.textFieldStyle(.roundedBorder)
.focused($nameIsFocused)
.focused($focusedField, equals: .minutes)
}
.frame(minWidth: 100)
.padding(.trailing, -15)
.padding(.leading, -15)
.padding()
VStack {
Text("Seconds")
TextField("Enter seconds", text: $timeSeconds)
.keyboardType(.decimalPad)
.textFieldStyle(.roundedBorder)
.focused($nameIsFocused)
.focused($focusedField, equals: .seconds)
}
.frame(minWidth: 100)
.padding(.leading, -15)
.padding()
}
.frame(minWidth: 100)
.padding(.trailing, -15)
.padding()
VStack {
Text("Total Seconds")
TextField("Enter seconds here", text: $timeSeconds)
.keyboardType(.numberPad)
.textFieldStyle(.roundedBorder)
}
.frame(minWidth: 100)
.padding(.leading, -15)
.padding()
}
PaceResults(timeMinutes: $timeMinutes, timeSeconds: $timeSeconds, selectedSystem: $selectedSystem, distance: $distance)
PaceResults(timeHours: $timeHours, timeMinutes: $timeMinutes, timeSeconds: $timeSeconds, selectedSystem: $selectedSystem, distance: $distance)
}
.frame(maxWidth: 700)
}
}
}
struct PaceResults: View {
@Binding var timeHours: String
@Binding var timeMinutes: String
@Binding var timeSeconds: String
@Binding var selectedSystem: String
@Binding var distance: String
var body: some View {
let timeMinutesDouble = Double(timeMinutes) ?? 0.0
let timeHours = String(Int(timeMinutesDouble / 60))
let distanceDub:Double = ((Double(distance) != 0 ? Double(removeLeadingZeros(distance: &distance)) ?? 1.0 : 1.0))
// because of some conversions I have to do,
// this constant is a double just to make things easier.
// this has to be one because the pace is calculated
// by time / distance, and you can't divide by 0.
// I could just make the TextField have a default value
// but then my message would disappear to let you know
// what to enter in that box
let convertedSeconds = (Double(timeSeconds) ?? 0) * (1+(2/3))
let timeSecondsInt = Int(timeSeconds) ?? 0
let timeSecondsUnderSixty = (timeSecondsInt > 60 ? Int(timeSecondsInt / 60) : timeSecondsInt)
let multiplier = (selectedSystem == "mi" ? 1.609344 : 0.6213711922)
let notSelectedSystem = (selectedSystem == "km" ? "mi" : "km")
let convertedDistanceString:String = {
let convertedDistance = distanceDub * multiplier
return (distance == "" ? "0" : String(format: "%.3f", convertedDistance))
}()
let timeMinutesInt = (Int(timeMinutes) ?? 0) + (Int(timeSecondsUnderSixty))
let timeMinutesUnderSixty = timeMinutesInt - ((Int(timeHours) ?? 0) * 60)
let convertedSeconds:Double = (Double(timeSeconds) ?? 0) * (1.6666666666666666666666666)
let timeSecondsInt:Int = Int(timeSeconds) ?? 0
let timeSecondsUnderSixty:Int = (timeSecondsInt % 60)
// this section takes the seconds and multiplies it by 1.66
// so that 60 seconds becomes 100 (as in 100% of a minute)
// and this means that 30 seconds becomes 50 (as in 50% of a minute)
// which allows us to to calculate our pace. Without this
// the pace would be all wrong.
let leadingZeros = String(format: "%02d:%02d", timeMinutesUnderSixty, timeSecondsInt)
let timeSecondsToMinutes:Int = (timeSecondsInt - timeSecondsUnderSixty) / 60
// this takes the seconde and converts it to minutes so 78
// seconds will turn into 1 minute and 18 seconds leftover
// with the minutes saved in this value and the seconds
// disregarded because they're saved in timeSecondsUnderSixty
let actualTime = timeMinutesDouble + (convertedSeconds / 100)
let pace = actualTime / (Double(distance) ?? 1)
let paceString = String(format: "%.2f", pace)
let timeMinutesInt:Int = (Int(timeMinutes) ?? 0) + (timeSecondsToMinutes)
let timeMinutesUnderSixty:Int = timeMinutesInt % 60
let timeMinutesToHours:Int = (timeMinutesInt - timeMinutesUnderSixty) / 60
// this section takes the minutes (which it combines the
// minutes with the timeSecondsToMinutes) then finds out how
// many hours (multiples of 60) are in the minutes value
// and saves the hours in timeMinutesToHours and the remaining
// minutes in `timeMinutesUnderSixty`
let timeMinutesDouble:Double = Double(timeMinutes) ?? 0.0
// this line of code takes the binding $timeMinutes which
// is a string and turns it into a number of type Double.
// while the TextField is a number pad, on iPads, Mac computers
// and using copy/paste you can get other characters.
// if the text field contains anything other than a number
// or a single decimal, this value instantly becomes 0.0
let pace:Double = {
let actualTime:Double = timeMinutesDouble + (convertedSeconds / 100) + ((Double(timeHours) ?? 0) * 60)
// adds the minutes, hours, and seconds all together to get
// a single value in terms of minutes, so that 1:08:45
// becomes 68.75 which is a nice number we can do math on
// and this number is never directly seen by the user
return actualTime / distanceDub
}()
let paceOpposite = (selectedSystem == "km" ? (pace * 1.609344) : (pace * 0.6213711922))
let paceFormatted:String = {
let paceSeconds = pace.truncatingRemainder(dividingBy: 1.0)
let paceMinutes = (pace.truncatingRemainder(dividingBy: 60.0) - paceSeconds)
let paceHours = String(format: "%.0f", ((pace - paceMinutes) / 60))
let reConvertedSeconds = (paceSeconds / 1.666666666666666666) * 100
let properTimeMS = String(format: "%02d:%02d", Int(paceMinutes), Int(reConvertedSeconds.rounded()))
return (pace >= 60 ? "\(paceHours):\(properTimeMS)" : "\(properTimeMS)")
}()
let paceFormattedOpposite:String = {
let paceSecondsOpposite = paceOpposite.truncatingRemainder(dividingBy: 1.0)
let paceMinutesOpposite = (paceOpposite.truncatingRemainder(dividingBy: 60.0) - paceSecondsOpposite)
let paceHoursOpposite = String(format: "%.0f", ((paceOpposite - paceMinutesOpposite) / 60))
let reConvertedSecondsOpposite = (paceSecondsOpposite / 1.666666666666666666) * 100
let properTimeMSOpposite = String(format: "%02d:%02d", Int(paceMinutesOpposite), Int(reConvertedSecondsOpposite.rounded()))
return (paceOpposite >= 60 ? "\(paceHoursOpposite):\(properTimeMSOpposite)" : "\(properTimeMSOpposite)")
}()
let hoursFormatted:String = {
let totalHours:Double = Double(timeMinutesToHours) + (Double(timeHours) ?? 0)
// this takes the number of hours in the binding $timeHours
// and the hours calculated in the previous section
// and adds them together to get our total number of hours.
return String(format: "%.0f", totalHours)
}()
let leadingZeros:String = String(format: "%02d:%02d", timeMinutesUnderSixty, timeSecondsUnderSixty)
// this takes the minutes and the seconds and adds leading
// zeros to them, so that 5 minutes 7 seconds will show
// as 05:07 which is a format most people, and certainly
// the people this app is intended for, will understand
let pacePerHour: String = {
let pph = 60 / pace
return (pace != 0 ? String(format: "%.2f", pph) : "0")
}()
let pacePerHourOpposite: String = {
let npph = 60 / paceOpposite
return (pace != 0 ? String(format: "%.2f", npph) : "0")
}()
VStack {
Text("Distance: \(distance)\(selectedSystem)")
Text("Total time: \(timeHours):\(leadingZeros)")
Text("\(paceString) minutes per \(selectedSystem)")
HStack {
Text("\(hoursFormatted):\(leadingZeros)")
.padding()
.frame(minWidth: 100)
VStack (alignment: .trailing) {
Text("\(roundString(Double(removeLeadingZeros(distance: &distance)) ?? 0))\(selectedSystem)")
Text("\(convertedDistanceString)\(notSelectedSystem)")
}
.frame(minWidth: 100)
}
HStack {
VStack(alignment: .leading) {
Text("\(paceFormatted)/\(selectedSystem)")
Text("\(paceFormattedOpposite)/\(notSelectedSystem)")
}
.frame(minWidth: 100)
VStack(alignment: .trailing) {
Text("\(pacePerHour) \(selectedSystem)/hr")
Text("\(pacePerHourOpposite) \(notSelectedSystem)/hr")
}
.frame(minWidth: 100)
}
}
.padding()
}
func removeLeadingZeros(distance: inout String) -> String {
while distance.starts(with: "0") {
distance.removeFirst()
}
return distance
}
func roundString(_ variable: Double) -> String {
if distance.contains(".") {
let formattedString = String(format: "%.3f", variable)
return formattedString
} else {
return distance
}
}
}

174
Splits/DocsView.swift Normal file
View file

@ -0,0 +1,174 @@
//
// DocsView.swift
// Splits
//
// Created by Isaac Greene on 2022-06-03.
//
import SwiftUI
import LocalAuthentication
import CryptoKit
/// The system username SHA512 hash for the app
let username = "c7ad44cbad762a5da0a452f9e854fdc1e0e7a52a38015f23f3eab1d80b931dd472634dfac71cd34ebc35d16ab7fb8a90c81f975113d6c7538dc69dd8de9077ec".utf8
/// The system password SHA512 hash associated with ``username``
let password = "3c9909afec25354d551dae21590bb26e38d53f2173b8d3dc3eee4c047e7ab1c1eb8b85103e3be7ba613b31bb5c9c36214dc9f14a42fd7a2fdb84856bca5c44c2".utf8
/// Holds the views and login for the Docs
///
/// Mostly just a long list of sections and calling views
/// - Note: New views are best called in this `struct`
/// and added to their respective categories
struct DocsView: View {
enum Field: Hashable {
case username
case password
}
/// Makes a SHA512 hash of any `String` passed as input
///
/// Specifically, this function is suited towards checking if
/// the username and password provided by the user
/// match the hashes of the correct ``username`` and ``password``
///
/// - Note: The results of this hash are not seen by the user, so they shouldn't even know
/// this is taking place
///
/// - Returns: A `String` of the computed SHA512 hash
func hashSHA512(login: String) -> String {
let loginAsData = Data(login.utf8)
let loginHashHex = SHA512.hash(data: loginAsData)
let loginHash = loginHashHex.compactMap { String(format: "%02x", $0) }.joined()
return String(loginHash)
}
@State private var pass: String = ""
@State private var user: String = ""
@State private var isUnlocked = false
@FocusState private var focusedField: Field?
var body: some View {
NavigationView {
List {
NavigationLink("Help", destination: HelpView())
NavigationLink("Change Log", destination: ChangeLog())
NavigationLink("Software Licenses", destination: LicenseView())
Section(header: Text("Features")) {
NavigationLink("New", destination: NewFeatures())
NavigationLink("In Progress", destination: InProgressFeatures())
NavigationLink("Deprecated", destination: DeprecatedFeatures())
}
Section(header: Text("Known Issues")) {
NavigationLink("Recently Resolved", destination: RecentlyResolved())
NavigationLink("High Priority", destination: HighPriority())
NavigationLink("Medium Priority", destination: MediumPriority())
NavigationLink("Low Priority", destination: LowPriority())
}
Section(header: Text("App Information")) {
Text("Version: Prerelease ")
Text("Release date: 2023-06-05")
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")) {
if (isUnlocked) {
NavigationLink("Coming soon", destination: ComingSoonView())
Button("Log out") {
pass = ""
user = ""
isUnlocked = false
}
} else {
Button("Log in with biometrics") {
authenticate()
}
SecureField("Username", text: $user)
.keyboardType(.alphabet)
.textContentType(.username)
.submitLabel(.next)
.focused($focusedField, equals: .username)
.textContentType(.username)
SecureField("Password", text: $pass)
.keyboardType(.numbersAndPunctuation)
.textContentType(.password)
.submitLabel(.done)
.focused($focusedField, equals: .password)
.textContentType(.password)
if checkPassword() {
NavigationLink("Coming soon", destination: ComingSoonView())
}
}
}
}
.navigationTitle("Docs")
}
.onSubmit {
switch focusedField {
case .username:
focusedField = .password
default:
()
}
if checkPassword() {
isUnlocked = true
}
}
}
/// Compares the `user` SecureField and the `pass` SecureField against ``username`` and ``password``
///
/// - Note: come back to this
///
///
/// - Returns: `true` if `user` equals `username` *and* `pass` equals `password`, `false` if one or both checks return false.
func checkPassword() -> Bool {
if (hashSHA512(login: pass) == String(password) && hashSHA512(login: user) == String(username)) {
return true
} else {
return false
}
}
/// Checks wether the user can use biometrics to sign in
/// and (if true) prompts the user to sign with either FaceID or TouchID
/// depending on the device.
///
/// If the prompt was shown, and the user authenticated correctly
/// `isUnlocked` is set to `true`
///
/// - Note: `authenticate()` has to be called to show the sign-in sheet
func authenticate() {
let context = LAContext()
var error: NSError?
// check whether biometric authentication is possible
if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) {
// it's possible, so go ahead and use it
let reason = "We need authentication before we can show you sensitive data"
context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: reason) { success, authenticationError in
// authentication has now completed
if success {
isUnlocked = true
} else {
()
}
}
} else {
()
}
}
// getting this to work came from
// https://www.hackingwithswift.com/books/ios-swiftui/using-touch-id-and-face-id-with-swiftui
// a truly epic website and it's helped me with
// just about all of my code questions
}
struct DocsView_Previews: PreviewProvider {
static var previews: some View {
DocsView()
}
}

View file

@ -0,0 +1,14 @@
# Splits
Splits is a revolutionary new app to calculate paces.
It takes a value, in kilometers or miles, and converts
## Overview
<!--@START_MENU_TOKEN@-->Text<!--@END_MENU_TOKEN@-->
## Topics
### Getting Started

75
Splits/FeaturesView.swift Normal file
View file

@ -0,0 +1,75 @@
//
// FeaturesView.swift
// Splits
//
// Created by Isaac Greene on 2022-06-03.
//
import SwiftUI
struct NewFeatures: View {
var body: some View {
ScrollView {
VStack(alignment: .leading) {
Text("\u{2022} Added TouchID and FaceID to sign in")
Text("Implemented in Version Release Candidate 2\n")
.font(.footnote)
.italic()
Text("\u{2022} Implemented a way to dismiss the keyboard")
Text("Implemented in Version Release Candidate\n")
.font(.footnote)
.italic()
Text("\u{2022} Reformatted the Docs tabs and made the common things up at the top")
Text("Implemented in Version Prerelease LVSXT10d.2\n")
.font(.footnote)
.italic()
Text("\u{2022} Added the Features, Known Issues, and moved the Change Log for better navigation")
Text("Implemented in Version Prerelease LVSXT10d\n")
.font(.footnote)
.italic()
Text("\u{2022} Total time now shows the time in a way we humans can understand")
Text("Implemented in Version Prerelease LVSXT10k\n")
.font(.footnote)
.italic()
}
.padding(30)
}
.navigationTitle("New Features")
}
}
struct InProgressFeatures: View {
var body: some View {
ScrollView {
Text("Note: this does not include things I have to fix\n")
.font(.footnote)
.italic()
VStack(alignment: .leading) {
Text("\u{2022} Adding a better-formatted Contacts tab on iPad\n")
}
.padding(30)
}
.navigationTitle("In Progress")
}
}
struct DeprecatedFeatures: View {
var body: some View {
ScrollView {
VStack(alignment: .leading) {
Text("\n\u{2022} Removed the picker wheel to enter total time (a truly horrible system)")
Text("Stricken before recorded history\n")
.font(.footnote)
.italic()
}
.padding(30)
}
.navigationTitle("Deprecated")
}
}
struct FeaturesView_Previews: PreviewProvider {
static var previews: some View {
NewFeatures()
}
}

84
Splits/HelpView.swift Normal file
View file

@ -0,0 +1,84 @@
//
// ModalView.swift
// Splits
//
// Created by Isaac Greene on 2022-04-03.
//
import SwiftUI
struct HelpView: View {
@State var mathSheet = false
@State var problemSheet = false
var body: some View {
ScrollView {
VStack {
Text("Help")
.font(.largeTitle)
.bold()
.padding(.top, 40)
Text("Due to limitations in the system, you can only use kilometers and miles at this time. \nSmaller units like meters and feet are not supported. \nYou can, however, use decimals, such as .2km or .8mi.\n\nI apologize for any inconvenience. In the future, I hope to make our app easier to use.\n\nI'm currently looking to add help articles about running to this page and it'll have loads of stuff about running and pace and all that stuff to actually help you with running. If I do, the purpose of this app might change.")
.padding()
Button("See our math", action: {
self.mathSheet.toggle()
})
.frame(width: 130, height: 40, alignment: .center)
.background(Color.blue)
.foregroundColor(.white)
.cornerRadius(12)
.padding(30)
.sheet(isPresented: self.$mathSheet, content: {
algorithmView()
})
}
}
}
}
struct algorithmView: View {
var body: some View {
Text("The Algorithm")
.font(.largeTitle)
.bold()
VStack(alignment: .leading, spacing: 0) {
Text("Calculating pace is fairly straightforward, and does not change with increased complexity. The standard formula is simply this:\n")
mathView()
Text("\nWhere:\n")
HStack {
Text("\"t\"")
.font(.custom("Charter", size: 18))
Text("is total time")
}
HStack{
Text("\"d\"")
.font(.custom("Charter", size: 18))
Text("is distance")
}
HStack {
Text("\"p\"")
.font(.custom("Charter", size: 18))
Text("is the resulting pace")
}
}
.padding()
}
}
struct mathView: View {
var body: some View {
HStack {
Spacer()
MathView(latex: "\\frac{t}{d} = p")
.frame(width: 200, height: 50)
}
}
}
struct HelpView_Previews: PreviewProvider {
static var previews: some View {
HelpView()
}
}

13
Splits/Info.plist Normal file
View file

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>UILaunchScreen</key>
<dict>
<key>UIColorName</key>
<string>launchScreenBackground</string>
<key>UIImageRespectsSafeAreaInsets</key>
<true/>
</dict>
</dict>
</plist>

72
Splits/KnownIssues.swift Normal file
View file

@ -0,0 +1,72 @@
//
// KnownIssues.swift
// Splits
//
// Created by Isaac Greene on 2022-06-03.
//
import SwiftUI
// this file will not have comments.
// it is considered self-explanatory and best viewed in-app
struct RecentlyResolved: View {
var body: some View {
ScrollView {
VStack(alignment: .leading) {
Text("\u{2022} Opening the contacts tab no longer causes the app to crash\n\u{2022} Typing zero as the first number for the distance no longer causes the app to crash\n\u{2022} Having a distance of less than .1 no longer causes the app to crash")
}
.padding(30)
}
.navigationTitle("Recently Resolved")
}
}
struct HighPriority: View {
var body: some View {
ScrollView {
VStack {
Image(systemName: "checkmark.shield.fill")
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 70)
}
.padding(30)
.frame(maxWidth: .infinity)
}
.navigationTitle("High Priority")
}
}
struct MediumPriority: View {
var body: some View {
ScrollView {
VStack {
Image(systemName: "checkmark.shield.fill")
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 70)
}
.padding(30)
.frame(maxWidth: .infinity)
}
.navigationTitle("Medium Priority")
}
}
struct LowPriority: View {
var body: some View {
ScrollView {
VStack(alignment: .leading) {
Text("\u{2022} Space between the equation and explanation in the \"Help\" tab is too large\n\u{2022} App has no custom icon\n\u{2022} In some circumstances, the pace will show xx:60/unit as a pace, when the 60 should equal one minute")
}
.padding(30)
}
.navigationTitle("Low Priority")
}
}
struct KnownIssues_Previews: PreviewProvider {
static var previews: some View {
HighPriority()
}
}

34
Splits/LaTeXView.swift Normal file
View file

@ -0,0 +1,34 @@
//
// LaTeXView.swift
// Paces
//
// Created by Isaac Greene on 2023-01-16.
//
import SwiftUI
import UIKit
import iosMath
struct MathView: UIViewRepresentable {
var latex: String
@Environment(\.colorScheme) var colorScheme
func makeUIView(context: Context) -> MTMathUILabel {
let label = MTMathUILabel()
label.latex = latex
label.textColor = textColor(for: colorScheme)
return label
}
func updateUIView(_ uiView: MTMathUILabel, context: Context) {
uiView.latex = latex
uiView.textColor = textColor(for: colorScheme)
}
private func textColor(for colorScheme: ColorScheme) -> UIColor {
return colorScheme == .dark ? .white : .black
}
}

62
Splits/LicenseView.swift Normal file
View file

@ -0,0 +1,62 @@
//
// LicenseView.swift
// Splits
//
// Created by Isaac Greene on 2022-06-08.
//
import SwiftUI
struct LicenseView: View {
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
// This allows the license to be properly formatted
// on any screen size by getting the resolution then
// setting fontSize to a value based on that where the whole
// line can be viewed without scrolling horizontally
// or with wrapped text, ruining the required formatting I have.
var body: some View {
ScrollView {
VStack (alignment: .leading) {
Text("""
Copyright © 2022, Isaac Greene
All rights reserved. Source code may be made available upon request.
This application makes use of certain third-party open-source software.
Legal notices:
----------
MathChat ( iosMath )
The MIT License (MIT)
Copyright (c) 2013 MathChat
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
----------
Created: 2022-06-08
Updated: 2023-01-17
""")
.font(.custom("Menlo", size: fontSize))
}
.navigationTitle("Licenses")
.navigationBarTitleDisplayMode(.inline)
.padding()
.frame(maxWidth: .infinity)
}
}
}
struct LicenseProvider_Previews: PreviewProvider {
static var previews: some View {
LicenseView()
}
}

View file

@ -1,123 +0,0 @@
//
// ModalView.swift
// Splits
//
// Created by Isaac Greene on 4/3/22.
//
import SwiftUI
import RichTextView
struct ModalView: View {
@State var mathSheet = false
@State var problemSheet = false
var body: some View {
VStack {
Text("Help")
.font(.largeTitle)
.bold()
.padding(.top, 40)
Text("Due to limitations in our system, you can only use kilometers and miles at this time. \nSmaller units like meters and feet are not supported. \nYou can, however, use decimals, such as .2km or .8mi.\n\nWe apologize for any inconvenience. In the future, we hope to make our app easier to use.")
.padding()
Button("See our math", action: {
self.mathSheet.toggle()
})
.padding(30)
.sheet(isPresented: self.$mathSheet, content: {
algorithmView()
})
Button("Known issues", action: {
self.problemSheet.toggle()
})
.padding(30)
.padding(.top, -30)
.sheet(isPresented: self.$problemSheet, content: {
problemView()
})
}
}
}
struct algorithmView: View {
var body: some View {
Text("The Algorithm")
.font(.largeTitle)
.bold()
VStack(alignment: .leading, spacing: 0) {
Text("Calculating pace is fairly straightforward, and does not change with increased complexity. The standard formula is simply this:\n")
mathView()
.frame(maxHeight: 300)
Text("\nWhere:\n")
HStack {
Text("\"t\"")
.font(.custom("Charter", size: 18))
Text("is total time")
}
HStack{
Text("\"d\"")
.font(.custom("Charter", size: 18))
Text("is distance")
}
HStack {
Text("\"p\"")
.font(.custom("Charter", size: 18))
Text("is the resulting pace")
}
}
.padding()
}
}
struct mathView: View {
@State var mathString:String = "[math] \\frac{t}{d} &= p [/math]"
var body: some View {
mathLaTeX_inator(mathString: $mathString)
.padding(30)
}
}
struct mathLaTeX_inator: UIViewRepresentable {
@Environment(\.colorScheme) var colorScheme
@Binding var mathString:String
func makeUIView(context: Context) -> RichTextView {
let richTextView = RichTextView(
input: mathString,
latexParser: LatexParser(),
font: UIFont.systemFont(ofSize: UIFont.systemFontSize),
textColor: (colorScheme == .dark ? UIColor.white : UIColor.black),
frame: CGRect.zero,
completion: nil
)
return richTextView
}
func updateUIView(_ uiView: RichTextView, context: Context) {
uiView.update(
input: mathString,
latexParser: LatexParser(),
font: UIFont.systemFont(ofSize: UIFont.systemFontSize),
textColor: (colorScheme == .dark ? UIColor.white : UIColor.black),
completion: nil
)
}
}
struct problemView: View {
var body: some View {
VStack {
Text("Known issues")
.font(.largeTitle)
.bold()
.padding(.top, 40)
Text("\n\u{2022} You can not dismiss the keyboard\n\t\u{2022} This hides the tab bar at the bottom\n\u{2022} Visually displayed seconds and total time are incorrect\n\t\u{2022} This DOES NOT affect pace. That is still correct.")
}
}
}

View file

@ -0,0 +1,4 @@
//
// Use this file to import your target's public headers that you would like to expose to Swift.
//

View file

@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

View file

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CachedManifest</key>
<dict>
<key>manifestData</key>
<data>
eyJkZXBlbmRlbmNpZXMiOltdLCJkaXNwbGF5TmFtZSI6IlNwbGl0cyAoeGNv
ZGUpIiwicGFja2FnZUtpbmQiOnsicm9vdCI6e319LCJwbGF0Zm9ybXMiOlt7
Im9wdGlvbnMiOltdLCJwbGF0Zm9ybU5hbWUiOiJpb3MiLCJ2ZXJzaW9uIjoi
MTUuMiJ9XSwicHJvZHVjdHMiOlt7Im5hbWUiOiJTcGxpdHMgKHhjb2RlKSIs
InNldHRpbmdzIjpbeyJkaXNwbGF5VmVyc2lvbiI6WyIxLjAiXX0seyJidW5k
bGVWZXJzaW9uIjpbIjEiXX0seyJpT1NBcHBJbmZvIjpbeyJhY2NlbnRDb2xv
ciI6eyJwcmVzZXRDb2xvciI6eyJwcmVzZXRDb2xvciI6eyJyYXdWYWx1ZSI6
ImJsdWUifX19LCJhcHBDYXRlZ29yeSI6eyJyYXdWYWx1ZSI6InB1YmxpYy5h
cHAtY2F0ZWdvcnkucmVmZXJlbmNlIn0sImFwcEljb24iOnsiYXNzZXQiOnsi
bmFtZSI6IkFwcEljb24ifX0sImNhcGFiaWxpdGllcyI6W10sInN1cHBvcnRl
ZERldmljZUZhbWlsaWVzIjpbInBhZCIsInBob25lIl0sInN1cHBvcnRlZElu
dGVyZmFjZU9yaWVudGF0aW9ucyI6W3sicG9ydHJhaXQiOnt9fSx7ImxhbmRz
Y2FwZVJpZ2h0Ijp7fX0seyJsYW5kc2NhcGVMZWZ0Ijp7fX0seyJwb3J0cmFp
dFVwc2lkZURvd24iOnsiY29uZGl0aW9uIjp7ImRldmljZUZhbWlsaWVzIjpb
InBhZCJdfX19XX1dfV0sInRhcmdldHMiOlsiQXBwTW9kdWxlIl0sInR5cGUi
OnsiZXhlY3V0YWJsZSI6bnVsbH19XSwidGFyZ2V0TWFwIjp7IkFwcE1vZHVs
ZSI6eyJkZXBlbmRlbmNpZXMiOltdLCJleGNsdWRlIjpbXSwibmFtZSI6IkFw
cE1vZHVsZSIsInBhdGgiOiIuIiwicmVzb3VyY2VzIjpbeyJwYXRoIjoiUmVz
b3VyY2VzIiwicnVsZSI6InByb2Nlc3MifV0sInNldHRpbmdzIjpbXSwidHlw
ZSI6ImV4ZWN1dGFibGUifX0sInRhcmdldHMiOlt7ImRlcGVuZGVuY2llcyI6
W10sImV4Y2x1ZGUiOltdLCJuYW1lIjoiQXBwTW9kdWxlIiwicGF0aCI6Ii4i
LCJyZXNvdXJjZXMiOlt7InBhdGgiOiJSZXNvdXJjZXMiLCJydWxlIjoicHJv
Y2VzcyJ9XSwic2V0dGluZ3MiOltdLCJ0eXBlIjoiZXhlY3V0YWJsZSJ9XSwi
dG9vbHNWZXJzaW9uIjp7Il92ZXJzaW9uIjoiNS42LjAifX0=
</data>
<key>manifestHash</key>
<data>
WgKmeoWf+Bj+Qu+O7UzxUM8NfKQ05KkxTrSCpMujqwc=
</data>
<key>schemaVersion</key>
<integer>4</integer>
<key>swiftPMVersionString</key>
<string>5.6.0-dev</string>
</dict>
</dict>
</plist>

View file

@ -0,0 +1,12 @@
{
"data" : [
{
"filename" : "CachedManifest.plist",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View file

@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

View file

@ -0,0 +1,12 @@
{
"data" : [
{
"filename" : "DocumentThumbnail.plist",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>DocumentThumbnailConfiguration</key>
<dict>
<key>accentColorHash</key>
<data>
Fkd2iMDgBpnGz6RJejYS1+g8UyBitkslD+2JCBKO1Ug=
</data>
<key>appIconHash</key>
<data>
/IWi/U3c/c470W/iOzj/qVpABAg9zSo+v3Y0wtHy9TY=
</data>
<key>thumbnailIsPrerendered</key>
<false/>
</dict>
</dict>
</plist>

View file

@ -0,0 +1,21 @@
{
"images" : [
{
"filename" : "DocumentThumbnail.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 487 KiB

View file

@ -0,0 +1,12 @@
{
"data" : [
{
"filename" : "Workspace.plist",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View file

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>AppSettings</key>
<dict>
<key>appIconPlaceholderGlyphName</key>
<string>cloud</string>
<key>appSettingsVersion</key>
<integer>1</integer>
</dict>
</dict>
</plist>

View file

@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

View file

@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

View file

@ -0,0 +1,12 @@
{
"data" : [
{
"filename" : "contents.xcworkspacedata",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:">
</FileRef>
</Workspace>

View file

@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

View file

@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

View file

@ -0,0 +1,12 @@
{
"data" : [
{
"filename" : "UserInterfaceState.xcuserstate",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View file

@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

View file

@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

View file

@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

View file

@ -0,0 +1,12 @@
{
"data" : [
{
"filename" : "xcschememanagement.plist",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View file

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>SchemeUserState</key>
<dict>
<key>Splits (xcode).xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>0</integer>
</dict>
</dict>
</dict>
</plist>

View file

@ -0,0 +1,264 @@
//
// ChangeLogData.swift
// Splits
//
// Created by Isaac Greene on 4/3/22.
//
import SwiftUI
// this file will not have comments.
// it is considered self-explanatory and best viewed in-app
struct June2022: View {
var body: some View {
ScrollView {
//2022-06-09
HStack {
VStack (alignment: .leading) {
Text("2022-06-09")
.font(.title2)
Text("Version Prerelease LVSXT10c.2\n")
.font(.footnote)
Text("u{2022} Worked on a simple login page to view contact info\n\t\u{2022} Spent *way* too long on it")
}
Spacer()
}
.padding(30)
//2022-06-08
HStack {
VStack (alignment: .leading) {
Text("2022-06-08")
.font(.title2)
Text("Version Prerelease Build LVSXT10c\n")
.font(.footnote)
Text("\u{2022} Finished with a conversion of the pace to be a more readable format (i.e. 5:45 instead of 5.75)!\n\t\u{2022} This is probably one of the biggest things to increase readability in the app\n\u{2022} Installed a Software License")
}
Spacer()
}
.padding(30)
//2022-06-05
HStack {
VStack (alignment: .leading) {
Text("2022-06-05")
.font(.title2)
Text("Version Prerelease Build LVSXT10d.3\n")
.font(.footnote)
Text("\u{2022} Started work on converting the pace to a more understandable format")
}
Spacer()
}
.padding(30)
//2022-06-04
HStack {
VStack (alignment: .leading) {
Text("2022-06-04")
.font(.title2)
Text("Version Prerelease Build LVSXT10d.2\n")
.font(.footnote)
Text("\u{2022} Reformatted some tabs, and added the Recently Resolved issues tab\n\u{2022} Moved the Help tab into Docs")
}
Spacer()
}
.padding(30)
//2022-06-03
HStack {
VStack (alignment: .leading) {
Text("2022-06-03")
.font(.title2)
Text("Version Prerelease Build LVSXT10d\n")
.font(.footnote)
Text("\u{2022} Finished hours input.\n\u{2022} Moved some things around and the \"Change log\" tab is now \"Docs\" which holds info on features, the change log, and known issues, with a few other things.")
}
Spacer()
}
.padding(30)
//2022-06-01
//gay
HStack {
VStack (alignment: .leading) {
Text("2022-06-01")
.font(.title2)
Text("Version Prerelease Build LVSXT10g.3\n")
.font(.footnote)
Text("\u{2022} Partially implemented an easier way to input hours. Mostly working on formatting issues, but it shows up somewhat like it's supposed to.")
}
Spacer()
}
.padding(30)
}
.navigationTitle("June 2022 Log")
.navigationBarTitleDisplayMode(.inline)
}
}
struct May2022: View {
var body: some View {
ScrollView {
//2022-05-25
HStack {
VStack (alignment: .leading) {
Text("2022-05-25")
.font(.title2)
Text("Version Prerelease Build LVSXT10g.2\n")
.font(.footnote)
Text("\u{2022} I'm at a stalemate with Swift")
}
Spacer()
}
.padding(30)
//2022-05-22
HStack {
VStack (alignment: .leading) {
Text("2022-05-22")
.font(.title2)
Text("Version Prerelease Build LVSXT10g\n")
.font(.footnote)
Text("\u{2022} Undid changes made in Build LVSXT10j.\n\u{2022} Failed to implement a way to dismiss the keyboard.\n\u{2022} Started work on a conversion process of paces to the opposite selected system of measurement. (does not currently work)")
}
Spacer()
}
.padding(30)
}
.navigationTitle("May 2022 Log")
.navigationBarTitleDisplayMode(.inline)
}
}
struct April2022: View {
var body: some View {
ScrollView {
//2022-04-13
HStack {
VStack (alignment: .leading) {
Text("2022-04-13")
.font(.title2)
Text("Version Prerelease Build LVSXT10j\n")
.font(.footnote)
Text("\u{2022} Started work on optimizing code. Made no other changes and left the code with errors.")
}
Spacer()
}
.padding(30)
//2022-04-11
HStack {
VStack (alignment: .leading) {
Text("2022-04-11")
.font(.title2)
Text("Version Prerelease Build LVSXT10k\n")
.font(.footnote)
Text("\u{2022} Fixed total time display so now 300 seconds properly wraps to 5 minutes and minutes now also wrap when seconds equates to an amount that equals more than 60 minutes\n\u{2022} Forced all text in change log to left side of screen")
}
Spacer()
}
.padding(30)
//2022-04-10
HStack {
VStack (alignment: .leading) {
Text("2022-04-10")
.font(.title2)
Text("Version Prerelease Build LVSXT10m\n")
.font(.footnote)
Text("\u{2022} Added known issues view\n\t\u{2022} Might add this to the change log navigation at the bottom in the future\n\u{2022} Reverted to a different commit in Git so that the app can be used")
}
Spacer()
}
.padding(30)
//2022-04-09
HStack {
VStack (alignment: .leading) {
Text("2022-04-09")
.font(.title2)
Text("Version Prerelease Build LVSXT10n\n")
.font(.footnote)
Text("\u{2022} Fixed the math with seconds so now you can actually use them! YEAH BABY!\n\u{2022} Rounded pace so that you don't get values like 4.999999999999996 minutes per km\n\t\u{2022} Working on getting the seconds to change into minutes like 340 seconds will show as 5 minutes 40 seconds or \"0:05:40\"\n\u{2022} Removed warning about not using seconds (because they work now!)\n\u{2022} Got math color right. Issue was I had my colors switched so it showed black text in dark mode, and white text in light mode.\n\u{2022} Fixed distance between time boxes\n\u{2022} Removed text about not using seconds greater than 59 in text field\n\u{2022} Properly implemented tab view so that each view gets ONE (1) tab\n\u{2022} Added Git which I should've done long ago\n\u{2022} Tweaked various visual elements. For some reason, SF Symbols doesn't have a calculator??? So instead I'm using \"candybarphone\" but \"building\" looked good, too\n\u{2022} Got overflow of minutes working so now 100 minutes will show as 1 hour 40 minutes.\n\t\u{2022} Seconds overflow does not work (see known issues)")
}
Spacer()
}
.padding(30)
//2022-04-08
HStack {
VStack (alignment: .leading) {
Text("2022-04-08")
.font(.title2)
Text("Version Prerelease Build LVSXT10r\n")
.font(.footnote)
Text("\u{2022} Added bullet points to change log\n\u{2022} Changed text in \"Help\" section about using seconds (ended up not working)\n\u{2022} Tried unsuccessfully to dynamically change the color of the pace formula whether in dark or light mode\n\u{2022} Temporarily removed change log in Build t\n\u{2022} Fixed positioning of minutes and seconds text boxes\n\u{2022} Total time now shows correct minute/hour time (minutes and hours are no longer equal)\n\t\u{2022} Seconds still don't work properly")
}
Spacer()
}
.padding(30)
//2022-04-05
HStack {
VStack (alignment: .leading) {
Text("2022-04-05")
.font(.title2)
Text("Version Prerelease Build LVSXT10u.2\n")
.font(.footnote)
Text("\u{2022} Reformatted change log to include better navigation and clearer notice of changes")
}
Spacer()
}
.padding(30)
//2022-04-03
HStack {
VStack (alignment: .leading) {
Text("2022-04-03")
.font(.title2)
Text("Version Prerelease Build LVSXT10u\n")
.font(.footnote)
Text("\u{2022} Moved app production over from Swift Playgrounds on iPad to Xcode on Mac\n\u{2022} Fixed math\n\u{2022} Implemented change log view\n\u{2022} Restructured code so it gave fewer errors\n\u{2022} Added correct pace data\n\t\u{2022} At this time, the seconds functionality is entirely broken\n\u{2022} Implemented total time view\n\t\u{2022} For some reason, the view for the minutes automatically fills in for the hours as well")
}
Spacer()
}
.padding(30)
}
.navigationTitle("April 2022 Log")
.navigationBarTitleDisplayMode(.inline)
}
}
struct March2022: View {
var body: some View {
ScrollView {
//2022-03-26
HStack {
VStack (alignment: .leading) {
Text("2022-03-26:2022-03-31")
.font(.title2)
Text("Version [UNNAMED]\n")
.font(.footnote)
Text("\u{2022} Things were made, fixed, broken, removed, etc. I don't know what happened because I had no system in place to track changes")
}
Spacer()
}
.padding(30)
//2022-03-25
HStack {
VStack (alignment: .leading) {
Text("2022-03-25")
.font(.title2)
Text("Version [UNNAMED]\n")
.font(.footnote)
Text("\u{2022} App production started. Textfields were mostly implemented but didn't do anything. Also started on the help page.")
}
Spacer()
}
.padding(30)
}
.navigationTitle("March 2022 Log")
.navigationBarTitleDisplayMode(.inline)
}
}

View file

@ -0,0 +1,12 @@
{
"data" : [
{
"filename" : "ChangeLogData.swift",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View file

@ -0,0 +1,33 @@
//
// ChangeLogView.swift
// Splits
//
// Created by Isaac Greene on 4/3/22.
//
import SwiftUI
// this file will not have comments.
// this code is considered simple enough to be
// human-readable without aid, as long as
// the reader has a basic understanding of
// Swift and/or SwiftUI.
struct ChangeLog: View {
var body: some View {
List {
Section(header: Text("2022")) {
NavigationLink("June", destination: June2022())
NavigationLink("May", destination: May2022())
NavigationLink("April", destination: April2022())
NavigationLink("March", destination: March2022())
}
}
.listStyle(.insetGrouped)
.navigationTitle("Change Log")
}
}
struct ChangeLog_Previews: PreviewProvider {
static var previews: some View {
ChangeLog()
}
}

View file

@ -0,0 +1,12 @@
{
"data" : [
{
"filename" : "ChangeLogView.swift",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View file

@ -0,0 +1,184 @@
//
// ContentView.swift
// Splits
//
// Created by Isaac Greene on 4/3/22.
//
import SwiftUI
import Foundation
struct ContentView: View {
var SISystem = ["km","mi"]
@State var timeHours: String = ""
@State var timeMinutes: String = ""
@State var timeSeconds: String = ""
@State var selectedSystem: String = "km"
@State var distance: String = ""
var body: some View {
VStack {
VStack {
TextField("Enter distance here", text: $distance)
.padding()
.keyboardType(.decimalPad)
.textFieldStyle(.roundedBorder)
}
VStack {
Text("Unit of measurement:")
Picker("System of measurement", selection: $selectedSystem, content: {
ForEach(SISystem, id: \.self, content: { unit in
Text(unit)
})
})
.pickerStyle(.segmented)
.frame(minWidth: 60, maxWidth: 300)
HStack {
VStack {
Text("Hours")
TextField("Enter hours here", text: $timeHours)
.keyboardType(.numberPad)
.textFieldStyle(.roundedBorder)
}
.frame(minWidth: 100)
.padding(.trailing, -15)
.padding()
VStack {
Text("Minutes")
TextField("Enter minutes here", text: $timeMinutes)
.keyboardType(.numberPad)
.textFieldStyle(.roundedBorder)
}
.frame(minWidth: 100)
.padding(.trailing, -15)
.padding(.leading, -15)
.padding()
VStack {
Text("Seconds")
TextField("Enter seconds here", text: $timeSeconds)
.keyboardType(.asciiCapableNumberPad)
.textFieldStyle(.roundedBorder)
}
.frame(minWidth: 100)
.padding(.leading, -15)
.padding()
}
PaceResults(timeHours: $timeHours, timeMinutes: $timeMinutes, timeSeconds: $timeSeconds, selectedSystem: $selectedSystem, distance: $distance)
}
}
}
}
struct PaceResults: View {
@Binding var timeHours: String
@Binding var timeMinutes: String
@Binding var timeSeconds: String
@Binding var selectedSystem: String
@Binding var distance: String
var body: some View {
let distanceDub = Double(distance) ?? 1.0
// because of some conversions I have to do,
// this constant is a double just to make things easier.
// this has to be one because the pace is calculated
// by time / distance, and you can't divide by 0.
// I could just make the TextField have a default value
// but then my message would disappear to let you know
// what to enter in that box
let multiplier = {selectedSystem == "mi" ? 1.609344 : 0.6213711922}()
let notSelectedSystem = {selectedSystem == "km" ? "mi" : "km"}()
let convertedDistance = distanceDub * multiplier
let convertedDistanceString = {distance == "" ? "" : String(format: "%.2f", convertedDistance)}()
let convertedSeconds:Double = (Double(timeSeconds) ?? 0) * (1.6666666666666666666666666)
let timeSecondsInt:Int = Int(timeSeconds) ?? 0
let timeSecondsUnderSixty:Int = (timeSecondsInt % 60)
// this section takes the seconds and multiplies it by 1.66
// so that 60 seconds becomes 100 (as in 100% of a minute)
// and this means that 30 seconds becomes 50 (as in 50% of a minute)
// which allows us to to calculate our pace. Without this
// the pace would be all wrong.
let timeSecondsToMinutes:Int = (timeSecondsInt - timeSecondsUnderSixty) / 60
// this takes the seconde and converts it to minutes so 78
// seconds will turn into 1 minute and 18 seconds leftover
// with the minutes saved in this value and the seconds
// disregarded because they're saved in timeSecondsUnderSixty
let timeMinutesInt:Int = (Int(timeMinutes) ?? 0) + (timeSecondsToMinutes)
let timeMinutesUnderSixty:Int = timeMinutesInt % 60
let timeMinutesToHours:Int = (timeMinutesInt - timeMinutesUnderSixty) / 60
// this section tales the minutes (which it combines the
// minutes with the timeSecondsToMinutes) then finds out how
// many hours (multiples of 60) are in the minutes value
// and saves the hours in timeMinutesToHours and the remaining
// minutes in timeMinutesUnderSixty
let timeMinutesDouble:Double = Double(timeMinutes) ?? 0.0
// this line of code takes the binding $timeMinutes which
// is a string and turns it into a number of type Double.
// while the TextField is a number pad, on iPads, Mac computers
// and using copy/paste you can get other characters.
// if the text field contains anything other than a number
// or a single decimal, this value instantly becomes 0.0
let actualTime:Double = timeMinutesDouble + (convertedSeconds / 100) + ((Double(timeHours) ?? 0) * 60)
// adds the minutes, hours, and seconds all together to get
// a single value in terms of minutes, so that 1:08:45
// becomes 68.75 which is a nice number we can do math on
// and this number is never directly seen by the user
let pace = actualTime / distanceDub
let paceOpposite = (selectedSystem == "km" ? (pace * 1.609344) : (pace * 0.6213711922))
let paceSeconds = pace.truncatingRemainder(dividingBy: 1.0)
let paceMinutes = (pace.truncatingRemainder(dividingBy: 60.0) - paceSeconds)
let paceHours = String(format: "%.0f", ((pace - paceMinutes) / 60))
let reConvertedSeconds = (paceSeconds / 1.666666666666666666) * 100
let properTimeMS = String(format: "%02d:%02d", Int(paceMinutes), Int(reConvertedSeconds.rounded()))
let paceSecondsOpposite = paceOpposite.truncatingRemainder(dividingBy: 1.0)
let paceMinutesOpposite = (paceOpposite.truncatingRemainder(dividingBy: 60.0) - paceSecondsOpposite)
let paceHoursOpposite = String(format: "%.0f", ((paceOpposite - paceMinutesOpposite) / 60))
let reConvertedSecondsOpposite = (paceSecondsOpposite / 1.666666666666666666) * 100
let properTimeMSOpposite = String(format: "%02d:%02d", Int(paceMinutesOpposite), Int(reConvertedSecondsOpposite.rounded()))
//let paceString:String = String(format: "%.2f", pace)
let totalHours:Double = Double(timeMinutesToHours) + (Double(timeHours) ?? 0)
// this takes the number of hours in the binding $timeHours
// and the hours calculated in the previous section
// and adds them together to get our total number of hours.
let hoursFormatted:String = String(format: "%.0f", totalHours)
let paceFormatted:String = {pace >= 60 ? "\(paceHours):\(properTimeMS)" : "\(properTimeMS)"}()
let paceFormattedOpposite:String = {paceOpposite >= 60 ? "\(paceHoursOpposite):\(properTimeMSOpposite)" : "\(properTimeMSOpposite)"}()
let leadingZeros:String = String(format: "%02d:%02d", timeMinutesUnderSixty, timeSecondsUnderSixty)
// this takes the minutes and the seconds and adds leading
// zeros to them, so that 5 minutes 7 seconds will show
// as 05:07 which is a format most people, and certainly
// the people this app is intended for, will understand
HStack {
VStack {
Text("Distance: \(distance)\(selectedSystem)")
Text("Converted distance: \(convertedDistanceString)\(notSelectedSystem)")
}
Text("Total time: \(hoursFormatted):\(leadingZeros)")
.padding()
VStack {
Text("\(paceFormatted) per \(selectedSystem)")
Text("\(paceFormattedOpposite) per \(notSelectedSystem)")
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}

View file

@ -0,0 +1,12 @@
{
"data" : [
{
"filename" : "ContentView.swift",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View file

@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

View file

@ -0,0 +1,12 @@
{
"data" : [
{
"filename" : "DocsView.swift",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View file

@ -0,0 +1,61 @@
//
// DocsView.swift
// Splits
//
// Created by Isaac Greene on 6/3/22.
//
import SwiftUI
// this file will not have comments.
// this code is considered simple enough to be
// 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 = ""
var body: some View {
NavigationView {
List {
NavigationLink("Help", destination: HelpView())
NavigationLink("Change Log", destination: ChangeLog())
Section(header: Text("Features")) {
NavigationLink("New", destination: NewFeatures())
NavigationLink("In Progress", destination: InProgressFeatures())
NavigationLink("Deprecated", destination: DeprecatedFeatures())
}
Section(header: Text("Known Issues")) {
NavigationLink("Recently Resolved", destination: RecentlyResolved())
NavigationLink("High Priority", destination: HighPriority())
NavigationLink("Medium Priority", destination: MediumPriority())
NavigationLink("Low Priority", destination: LowPriority())
}
Section(header: Text("App Information")) {
NavigationLink("Software License", destination: LicenseView())
Text("Version: Prerelease LVSXT10c.2")
Text("Release date: 2022-06-09")
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)
SecureField("Password", text: $pass)
if (pass == password && user == username) {
NavigationLink("Contacts", destination: SecretView())
}
}
}
.navigationTitle("Docs")
}
}
}
struct DocsView_Previews: PreviewProvider {
static var previews: some View {
DocsView()
}
}

View file

@ -0,0 +1,12 @@
{
"data" : [
{
"filename" : "FeaturesView.swift",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View file

@ -0,0 +1,77 @@
//
// FeaturesView.swift
// Splits
//
// Created by Isaac Greene on 6/3/22.
//
import SwiftUI
// this file will not have comments.
// it is considered self-explanatory and best viewed in-app
struct NewFeatures: View {
var body: some View {
ScrollView {
VStack(alignment: .leading) {
Text("\u{2022} Added the most barebones login page possible")
Text("Implemented in Version Prerelease LVSXT10c.2\n")
.font(.footnote)
.italic()
Text("\u{2022} Reformatted the Docs tabs and made the common things up at the top")
Text("Implemented in Version Prerelease LVSXT10d.2\n")
.font(.footnote)
.italic()
Text("\u{2022} Added the Features, Known Issues, and moved the Change Log for better navigation")
Text("Implemented in Version Prerelease LVSXT10d\n")
.font(.footnote)
.italic()
Text("\u{2022} Total time now shows the time in a way we humans can understand")
Text("Implemented in Version Prerelease LVSXT10k\n")
.font(.footnote)
.italic()
}
.padding(30)
}
.frame(maxWidth: .infinity)
.navigationTitle("New Features")
}
}
struct InProgressFeatures: View {
var body: some View {
ScrollView {
VStack(alignment: .leading) {
Text("Note: this does not include things I have to fix\n")
.font(.footnote)
.italic()
.padding(-30)
Text("\u{2022} Working on a conversion between measurements for pace and distance\n")
}
.padding(30)
}
.frame(maxWidth: .infinity)
.navigationTitle("In Progress")
}
}
struct DeprecatedFeatures: View {
var body: some View {
ScrollView {
VStack(alignment: .leading) {
Text("\n\u{2022} Removed the picker wheel to enter total time (a truly horrible system)")
Text("Stricken before recorded history\n")
.font(.footnote)
.italic()
}
.padding(30)
}
.frame(maxWidth: .infinity)
.navigationTitle("Deprecated")
}
}
struct FeaturesView_Previews: PreviewProvider {
static var previews: some View {
NewFeatures()
}
}

View file

@ -0,0 +1,12 @@
{
"data" : [
{
"filename" : "KnownIssues.swift",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View file

@ -0,0 +1,65 @@
//
// KnownIssues.swift
// Splits
//
// Created by Isaac Greene on 6/3/22.
//
import SwiftUI
// this file will not have comments.
// it is considered self-explanatory and best viewed in-app
struct RecentlyResolved: View {
var body: some View {
ScrollView {
VStack(alignment: .leading) {
Text("\n\u{2022} None since the addition of this tab")
}
.padding(30)
}
.navigationTitle("Recently Resolved")
}
}
struct HighPriority: View {
var body: some View {
ScrollView {
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")
}
.padding(30)
}
.navigationTitle("High Priority")
}
}
struct MediumPriority: View {
var body: some View {
ScrollView {
VStack(alignment: .leading) {
Text("Wow. Such Empty.")
.italic()
}
.padding(30)
}
.navigationTitle("Medium Priority")
}
}
struct LowPriority: View {
var body: some View {
ScrollView {
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")
}
.padding(30)
}
.navigationTitle("Low Priority")
}
}
struct KnownIssues_Previews: PreviewProvider {
static var previews: some View {
HighPriority()
}
}

View file

@ -0,0 +1,12 @@
{
"data" : [
{
"filename" : "LicenseView.swift",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View file

@ -0,0 +1,111 @@
//
// LicenseView.swift
// Splits
//
// Created by Isaac Greene on 6/9/22.
//
import SwiftUI
struct LicenseView: View {
var fontSize:CGFloat {UIScreen.main.bounds.width > 700 ? 18 : 8}
// 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
// This allows the license to be properly formatted
// on any screen size by getting the resolution then
// setting fontSize to a value based on that where the whole
// line can be viewed without scrolling horizontally
// or with wrapped text, ruining the required formatting I have.
// As of 2022-06-08, I have not tested this on a phone.
var body: some View {
ScrollView {
VStack (alignment: .leading) {
Text("""
--------------------------------------------------------------------
| THIS WORK, AND ALL SUBSEQUENT RELEASES, VERSIONS, MODIFICATIONS, |
| AND UPDATES ARE COPYRIGHT © ISAAC GREENE, AND MAY BE RELEASED |
| UNDER THIS LICENSE. |
| |
| COPIES OF THIS SOURCE CODE MAY BE MADE AVAILABLE BY WRITTEN |
| REQUEST TO ISAAC GREENE. ISAAC GREENE IS GIVEN FULL DISCRETION |
| TO APPROVE OR DENY THESE REQUESTS. |
| CHANGES MAY BE MADE TO THIS LICENSE AT ANY TIME WITHOUT |
| NOTICE OR WARNING. |
| |
| BY ANY USE OF THIS SOFTWARE AND/OR LICENSE YOU AGREE THAT: |
| 1. YOU ARE SUBJECT TO THE TERMS PUT FORTH IN THIS LICENSE. |
| 2. YOU HAVE NO GUARANTEED RIGHTS REGARDING THE USE OF THIS |
| APPLICATION OR LICENSE. |
| 3. YOUR ACCESS TO THIS SOFTWARE MAY BE REVOKED AT ANY TIME |
| 3A. IF YOUR ACCESS IS REVOKED, YOU MAY CONTINUE TO USE |
| AND KEEP YOUR CURRENT COPY OF THIS SOFTWARE AND THIS |
| LICENSE MAY BE REPLACED WITH AN UPDATED VERSION FOR YOU |
| TO USE |
| |
| Under the terms of this license, you agree that you may: |
| - view source code and files contained in this package |
| upon request |
| - make copies of this code, in whole or in part, for |
| personal use |
| - share copies of this license and/or code, provided this |
| work is never publicly available |
| - test this code on your personal systems |
| |
| Under the terms of this license, you agree that may not: |
| - use this code for commercial purposes |
| - modify this code or license |
| |
| ANY RIGHTS NOT EXPLICITLY GRANTED TO YOU IN THIS LICENSE ARE |
| AUTOMATICALLY UNDER CONTROL OF ISAAC GREENE. |
| ALL PROVISIONS IN THIS LICENSE MAY BE MODIFIED ON A PER-CASE |
| BASIS ON REQUEST, SUBJECT TO APPROVAL. |
| Permission to distribute, modify, publish, monetize, or otherwise|
| go against the preset terms of this license may be granted, in |
| writing and by request, by Isaac Greene. |
| |
| ANY AND ALL REDISTRIBUTIONS OF THIS WORK(S) MUST INLCLUDE A COPY |
| OF THIS LICENSE IN THE ABOVE FORM AND THE FOLLOWING DISCLAIMER |
| IN THE DOCUMENTATION AND/OR OTHER MATERIALS PROVIDED. |
| |
| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND |
| CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES |
| INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
| MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
| DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR |
| CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF |
| USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED |
| AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
| LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING |
| IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF |
| THE POSSIBILITY OF SUCH DAMAGE. |
--------------------------------------------------------------------
""")
// this part's kind of self explanatory.
// this is the Software License for all of the
// code in this application.
.font(.custom("Menlo", size: fontSize))
.textSelection(.enabled)
.multilineTextAlignment(.leading)
// these modifiers simply change the default font
// font size, and allows you to select this text
Text("\nCreated: 2022-06-08")
Text("Updated: 2022-06-09")
}
.navigationTitle("Software License Agreement")
// sets the top of the screen to this text which always
// lets you know what page you're in
.padding()
.frame(maxWidth: .infinity)
}
}
}
struct LicenseProvider_Previews: PreviewProvider {
static var previews: some View {
LicenseView()
}
}

View file

@ -0,0 +1,12 @@
{
"data" : [
{
"filename" : "ModalView.swift",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View file

@ -0,0 +1,105 @@
//
// ModalView.swift
// Splits
//
// Created by Isaac Greene on 4/3/22.
//
import SwiftUI
//import RichTextView
struct HelpView: View {
@State var mathSheet = false
@State var problemSheet = false
var body: some View {
VStack {
Text("Help")
.font(.largeTitle)
.bold()
.padding(.top, 40)
Text("Due to limitations in the system, you can only use kilometers and miles at this time. \nSmaller units like meters and feet are not supported. \nYou can, however, use decimals, such as .2km or .8mi.\n\nI apologize for any inconvenience. In the future, I hope to make our app easier to use.\n\nI'm currently looking to add help articles about running to this page and it'll have loads of stuff about running and pace and all that stuff to actually help you with running. If I do, the purpose of this app might change.")
.padding()
Button("See our math", action: {
self.mathSheet.toggle()
})
.padding(30)
.sheet(isPresented: self.$mathSheet, content: {
algorithmView()
})
}
}
}
struct algorithmView: View {
var body: some View {
Text("The Algorithm")
.font(.largeTitle)
.bold()
VStack(alignment: .leading, spacing: 0) {
Text("Calculating pace is fairly straightforward, and does not change with increased complexity. The standard formula is simply this:\n")
//mathView()
Text("t/d = p")
.font(.custom("Charter", size: 30))
Text("\nWhere:\n")
HStack {
Text("\"t\"")
.font(.custom("Charter", size: 18))
Text("is total time")
}
HStack{
Text("\"d\"")
.font(.custom("Charter", size: 18))
Text("is distance")
}
HStack {
Text("\"p\"")
.font(.custom("Charter", size: 18))
Text("is the resulting pace")
}
}
.padding()
}
}
/*
struct mathView: View {
@State var mathString:String = "[math] \\frac{t}{d} &= p [/math]"
var body: some View {
mathLaTeX_inator(mathString: $mathString)
.padding(30)
.frame(maxHeight: 300)
}
}
struct mathLaTeX_inator: UIViewRepresentable {
@Environment(\.colorScheme) var colorScheme
@Binding var mathString:String
func makeUIView(context: Context) -> RichTextView {
let richTextView = RichTextView(
input: mathString,
latexParser: LatexParser(),
font: UIFont.systemFont(ofSize: UIFont.systemFontSize),
textColor: (colorScheme == .dark ? UIColor.white : UIColor.black),
frame: CGRect.zero,
completion: nil
)
return richTextView
}
func updateUIView(_ uiView: RichTextView, context: Context) {
uiView.update(
input: mathString,
latexParser: LatexParser(),
font: UIFont.systemFont(ofSize: UIFont.systemFontSize),
textColor: (colorScheme == .dark ? UIColor.white : UIColor.black),
completion: nil
)
}
}
*/

View file

@ -0,0 +1,12 @@
{
"data" : [
{
"filename" : "Package.swift",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View file

@ -0,0 +1,45 @@
// swift-tools-version: 5.6
// WARNING:
// This file is automatically generated.
// Do not edit it by hand because the contents will be replaced.
import PackageDescription
import AppleProductTypes
let package = Package(
name: "Splits (xcode)",
platforms: [
.iOS("15.2")
],
products: [
.iOSApplication(
name: "Splits (xcode)",
targets: ["AppModule"],
displayVersion: "1.0",
bundleVersion: "1",
appIcon: .asset("AppIcon"),
accentColor: .presetColor(.blue),
supportedDeviceFamilies: [
.pad,
.phone
],
supportedInterfaceOrientations: [
.portrait,
.landscapeRight,
.landscapeLeft,
.portraitUpsideDown(.when(deviceFamilies: [.pad]))
],
appCategory: .reference
)
],
targets: [
.executableTarget(
name: "AppModule",
path: ".",
resources: [
.process("Resources")
]
)
]
)

View file

@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

View file

@ -0,0 +1,12 @@
{
"data" : [
{
"filename" : "SecretView.swift",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View file

@ -0,0 +1,97 @@
import SwiftUI
struct SecretView: View {
var body: some View {
VStack {
HStack {
VStack {
Image("jake.zimmerman.group")
.resizable()
.interpolation(.high)
.frame(width: 75, height: 75)
.clipShape(Circle())
Text("Zim")
.font(.title2)
VStack (alignment: .leading) {
Text("""
Name: Jake Zimmerman
Email: jzimmerman@lakeviewspartans.org
""")
HStack {
Text("Phone:")
Link("(269) 753-5620", destination: URL(string: "tel:2697535620")!)
}
}
}
.frame(minWidth: 350, minHeight: 175)
.border(.primary)
VStack {
Image("caleb.bost.duo")
.resizable()
.interpolation(.high)
.frame(width: 75, height: 75)
.clipShape(Circle())
Text("Caleb")
.font(.title2)
VStack (alignment: .leading) {
Text("""
Name: Caleb Bost
Email: bostc@students.lakeviewspartans.org
""")
HStack {
Text("Phone:")
Link("(269) 578-6148", destination: URL(string: "tel:2695786148")!)
}
}
}
.frame(minWidth: 350, minHeight: 175)
.border(.primary)
}
HStack {
VStack {
Image("aiden.moore.states")
.resizable()
.interpolation(.high)
.frame(width: 75, height: 75)
.clipShape(Circle())
Text("Aiden")
.font(.title2)
VStack (alignment: .leading) {
Text("""
Name: Aiden Moore
Email: moorea8@students.lakeviewspartans.org
""")
HStack {
Text("Phone:")
Link("(269) 579-3882", destination: URL(string: "tel:2695793882")!)
}
}
}
.frame(minWidth: 350, minHeight: 175)
.border(.primary)
VStack {
Image("isaac.greene.clouds")
.resizable()
.interpolation(.high)
.frame(width: 75, height: 75)
.clipShape(Circle())
Text("Isaac")
.font(.title2)
VStack (alignment: .leading) {
Text("""
Name: Isaac Greene
Email: greenei@students.lakeviewspartans.org
""")
HStack {
Text("Phone:")
Link("(269) 282-2280", destination: URL(string: "tel:2692822280")!)
}
}
}
.frame(minWidth: 350, minHeight: 175)
.border(.primary)
}
}
}
}

View file

@ -0,0 +1,12 @@
{
"data" : [
{
"filename" : "SplitsApp.swift",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View file

@ -0,0 +1,22 @@
//
// SplitsApp.swift
// Splits
//
// Created by Isaac Greene on 4/3/22.
//
import SwiftUI
// this file will not have comments.
// this code is considered simple enough to be
// human-readable without aid, as long as
// the reader has a basic understanding of
// Swift and/or SwiftUI.
@main
struct SplitsApp: App {
var body: some Scene {
WindowGroup {
TabViewData()
}
}
}

View file

@ -0,0 +1,12 @@
{
"data" : [
{
"filename" : "TabViewData.swift",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View file

@ -0,0 +1,34 @@
//
// TabViewData.swift
// Splits
//
// Created by Isaac Greene on 4/9/22.
//
import SwiftUI
// this file will not have comments.
// this code is considered simple enough to be
// human-readable without aid, as long as
// the reader has a basic understanding of
// Swift and/or SwiftUI.
struct TabViewData: View {
var body: some View {
TabView {
ContentView()
.tabItem {
Label("Calculator", systemImage: "candybarphone")
}
DocsView()
.tabItem {
Label("Docs", systemImage: "doc.text.fill")
}
}
}
}
struct TabViewData_Previews: PreviewProvider {
static var previews: some View {
TabViewData()
}
}

View file

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.network.client</key>
<true/>
</dict>
</plist>

View file

@ -2,12 +2,13 @@
// SplitsApp.swift
// Splits
//
// Created by Isaac Greene on 4/3/22.
// Created by Isaac Greene on 2022-04-03.
//
import SwiftUI
@main
/// Builds the main view of the app (``TabViewData``)
struct SplitsApp: App {
var body: some Scene {
WindowGroup {

View file

@ -2,7 +2,7 @@
// TabViewData.swift
// Splits
//
// Created by Isaac Greene on 4/9/22.
// Created by Isaac Greene on 2022-04-09.
//
import SwiftUI
@ -14,13 +14,9 @@ struct TabViewData: View {
.tabItem {
Label("Calculator", systemImage: "candybarphone")
}
ModalView()
DocsView()
.tabItem {
Label("Help", systemImage: "info.circle")
}
ChangeLog()
.tabItem {
Label("Change log", systemImage: "doc.text.fill")
Label("Docs", systemImage: "doc.text.fill")
}
}
}

View file

@ -0,0 +1,6 @@
import UIKit
var selectedSystem = "mi"
let multiplier = (selectedSystem == "mi" ? 1.609344 : 0.6213711922)
print(multiplier)

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<playground version='5.0' target-platform='ios' buildActiveScheme='true' importAppTypes='true'>
<timeline fileName='timeline.xctimeline'/>
</playground>

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:">
</FileRef>
</Workspace>

View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<Timeline
version = "3.0">
<TimelineItems>
<LoggerValueHistoryTimelineItem
documentLocation = "file:///Users/ericgreene1/Desktop/IsaacSchool/Xcode/Splits/Splits/qerberymjthnrgbefvdcs.playground#CharacterRangeLen=17&amp;CharacterRangeLoc=110&amp;EndingColumnNumber=0&amp;EndingLineNumber=6&amp;StartingColumnNumber=1&amp;StartingLineNumber=5&amp;Timestamp=676683411.20383"
selectedRepresentationIndex = "0"
shouldTrackSuperviewWidth = "NO">
</LoggerValueHistoryTimelineItem>
</TimelineItems>
</Timeline>