diff --git a/HandsWidth.xcodeproj/project.pbxproj b/HandsRuler.xcodeproj/project.pbxproj similarity index 70% rename from HandsWidth.xcodeproj/project.pbxproj rename to HandsRuler.xcodeproj/project.pbxproj index be6ab6f..a76e85a 100644 --- a/HandsWidth.xcodeproj/project.pbxproj +++ b/HandsRuler.xcodeproj/project.pbxproj @@ -18,17 +18,64 @@ 165ADB512B4B71B0008A756F /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 165ADB502B4B71B0008A756F /* ContentView.swift */; }; 165ADB532B4B71B2008A756F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 165ADB522B4B71B2008A756F /* Assets.xcassets */; }; 16688DE62B59F35F004CE12B /* 🥽AppModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16688DE52B59F35F004CE12B /* 🥽AppModel.swift */; }; + 166F7E442B7DBBE5005F70D5 /* 🌐AboutApp.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 166F7E422B7DBBE4005F70D5 /* 🌐AboutApp.xcstrings */; }; + 166F7E452B7DBBE5005F70D5 /* 🌐Timeline.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 166F7E432B7DBBE5005F70D5 /* 🌐Timeline.xcstrings */; }; + 166F7E492B7DBD08005F70D5 /* 🌐VersionHistory.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 166F7E472B7DBD06005F70D5 /* 🌐VersionHistory.xcstrings */; }; + 166F7E4A2B7DBD08005F70D5 /* 🌐AppStoreDescription.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 166F7E482B7DBD08005F70D5 /* 🌐AppStoreDescription.xcstrings */; }; + 166F7E4C2B7DC36C005F70D5 /* App.swift in CopyFiles */ = {isa = PBXBuildFile; fileRef = 165ADB4E2B4B71B0008A756F /* App.swift */; }; + 166F7E4D2B7DC36C005F70D5 /* ContentView.swift in CopyFiles */ = {isa = PBXBuildFile; fileRef = 165ADB502B4B71B0008A756F /* ContentView.swift */; }; + 166F7E4E2B7DC36C005F70D5 /* 🥽AppModel.swift in CopyFiles */ = {isa = PBXBuildFile; fileRef = 16688DE52B59F35F004CE12B /* 🥽AppModel.swift */; }; + 166F7E4F2B7DC36C005F70D5 /* 🌐RealityView.swift in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1642FAB82B4D6CAA0084F9ED /* 🌐RealityView.swift */; }; + 166F7E502B7DC36C005F70D5 /* 🧩Entity.swift in CopyFiles */ = {isa = PBXBuildFile; fileRef = 164C78022B5746AD008FF872 /* 🧩Entity.swift */; }; + 166F7E512B7DC36C005F70D5 /* 🧩Name.swift in CopyFiles */ = {isa = PBXBuildFile; fileRef = 16EE5E982B576DA800D354ED /* 🧩Name.swift */; }; + 166F7E522B7DC36C005F70D5 /* 🧩Model.swift in CopyFiles */ = {isa = PBXBuildFile; fileRef = 16EE5E9A2B576DB000D354ED /* 🧩Model.swift */; }; + 166F7E532B7DC36C005F70D5 /* 🧑HeadTrackingComponent&System.swift in CopyFiles */ = {isa = PBXBuildFile; fileRef = 160ED7972B4B74C5002AD987 /* 🧑HeadTrackingComponent&System.swift */; }; + 166F7E542B7DC36C005F70D5 /* 📏Unit.swift in CopyFiles */ = {isa = PBXBuildFile; fileRef = 16253CFA2B4E2FCB0028F0E2 /* 📏Unit.swift */; }; + 166F7E552B7DC36C005F70D5 /* 🛠️MenuTop.swift in CopyFiles */ = {isa = PBXBuildFile; fileRef = 16C95AE42B5E762400CF0FED /* 🛠️MenuTop.swift */; }; + 166F7E562B7DC36C005F70D5 /* 🛠️Panel.swift in CopyFiles */ = {isa = PBXBuildFile; fileRef = 16C95AE22B5E75D800CF0FED /* 🛠️Panel.swift */; }; + 166F7E572B7DC36C005F70D5 /* 🛠️SettingPanel.swift in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1642FAB42B4D54A60084F9ED /* 🛠️SettingPanel.swift */; }; + 166F7E582B7DC36C005F70D5 /* 🛠️AboutPanel.swift in CopyFiles */ = {isa = PBXBuildFile; fileRef = 16C95AE62B5E7BFF00CF0FED /* 🛠️AboutPanel.swift */; }; + 166F7E592B7DC36C005F70D5 /* 🗒️StaticInfo.swift in CopyFiles */ = {isa = PBXBuildFile; fileRef = 16891ED72B7B2F8C00C6F0B3 /* 🗒️StaticInfo.swift */; }; + 166F7E5A2B7DC36C005F70D5 /* ℹ️AboutApp.swift in CopyFiles */ = {isa = PBXBuildFile; fileRef = 16891ED82B7B2F8D00C6F0B3 /* ℹ️AboutApp.swift */; }; + 16891ED92B7B2F8D00C6F0B3 /* 🗒️StaticInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16891ED72B7B2F8C00C6F0B3 /* 🗒️StaticInfo.swift */; }; + 16891EDA2B7B2F8D00C6F0B3 /* ℹ️AboutApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16891ED82B7B2F8D00C6F0B3 /* ℹ️AboutApp.swift */; }; + 16891EDC2B7B2FB800C6F0B3 /* Developer_Publisher.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 16891EDB2B7B2FB800C6F0B3 /* Developer_Publisher.xcassets */; }; 169D84AF2B5A319500BB5606 /* sound2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = 169D84AD2B5A319000BB5606 /* sound2.m4a */; }; 169D84B02B5A319500BB5606 /* sound1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = 169D84AE2B5A319400BB5606 /* sound1.m4a */; }; 16C95AE32B5E75D800CF0FED /* 🛠️Panel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16C95AE22B5E75D800CF0FED /* 🛠️Panel.swift */; }; 16C95AE52B5E762400CF0FED /* 🛠️MenuTop.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16C95AE42B5E762400CF0FED /* 🛠️MenuTop.swift */; }; 16C95AE72B5E7BFF00CF0FED /* 🛠️AboutPanel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16C95AE62B5E7BFF00CF0FED /* 🛠️AboutPanel.swift */; }; - 16EA6A612B68629100A3A740 /* screenshot1280w3.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 16EA6A5E2B68629100A3A740 /* screenshot1280w3.jpg */; }; - 16EA6A632B68629200A3A740 /* screenshot1280w2.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 16EA6A602B68629100A3A740 /* screenshot1280w2.jpg */; }; 16EE5E992B576DA800D354ED /* 🧩Name.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16EE5E982B576DA800D354ED /* 🧩Name.swift */; }; 16EE5E9B2B576DB000D354ED /* 🧩Model.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16EE5E9A2B576DB000D354ED /* 🧩Model.swift */; }; /* End PBXBuildFile section */ +/* Begin PBXCopyFilesBuildPhase section */ + 166F7E4B2B7DC35C005F70D5 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = "📁SourceCode"; + dstSubfolderSpec = 7; + files = ( + 166F7E4C2B7DC36C005F70D5 /* App.swift in CopyFiles */, + 166F7E4D2B7DC36C005F70D5 /* ContentView.swift in CopyFiles */, + 166F7E4E2B7DC36C005F70D5 /* 🥽AppModel.swift in CopyFiles */, + 166F7E4F2B7DC36C005F70D5 /* 🌐RealityView.swift in CopyFiles */, + 166F7E502B7DC36C005F70D5 /* 🧩Entity.swift in CopyFiles */, + 166F7E512B7DC36C005F70D5 /* 🧩Name.swift in CopyFiles */, + 166F7E522B7DC36C005F70D5 /* 🧩Model.swift in CopyFiles */, + 166F7E532B7DC36C005F70D5 /* 🧑HeadTrackingComponent&System.swift in CopyFiles */, + 166F7E542B7DC36C005F70D5 /* 📏Unit.swift in CopyFiles */, + 166F7E552B7DC36C005F70D5 /* 🛠️MenuTop.swift in CopyFiles */, + 166F7E562B7DC36C005F70D5 /* 🛠️Panel.swift in CopyFiles */, + 166F7E572B7DC36C005F70D5 /* 🛠️SettingPanel.swift in CopyFiles */, + 166F7E582B7DC36C005F70D5 /* 🛠️AboutPanel.swift in CopyFiles */, + 166F7E592B7DC36C005F70D5 /* 🗒️StaticInfo.swift in CopyFiles */, + 166F7E5A2B7DC36C005F70D5 /* ℹ️AboutApp.swift in CopyFiles */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + /* Begin PBXFileReference section */ 160ED7972B4B74C5002AD987 /* 🧑HeadTrackingComponent&System.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "🧑HeadTrackingComponent&System.swift"; sourceTree = ""; }; 160F46BB2B5A57AF001FE696 /* icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon.png; sourceTree = ""; }; @@ -41,13 +88,20 @@ 1642FAB42B4D54A60084F9ED /* 🛠️SettingPanel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "🛠️SettingPanel.swift"; sourceTree = ""; }; 1642FAB82B4D6CAA0084F9ED /* 🌐RealityView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "🌐RealityView.swift"; sourceTree = ""; }; 164C78022B5746AD008FF872 /* 🧩Entity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "🧩Entity.swift"; sourceTree = ""; }; - 165ADB472B4B71B0008A756F /* HandsWidth.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = HandsWidth.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 165ADB472B4B71B0008A756F /* HandsRuler.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = HandsRuler.app; sourceTree = BUILT_PRODUCTS_DIR; }; 165ADB4E2B4B71B0008A756F /* App.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = App.swift; sourceTree = ""; }; 165ADB502B4B71B0008A756F /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; 165ADB522B4B71B2008A756F /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 165ADB572B4B71B2008A756F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 16688DE52B59F35F004CE12B /* 🥽AppModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "🥽AppModel.swift"; sourceTree = ""; }; + 166F7E422B7DBBE4005F70D5 /* 🌐AboutApp.xcstrings */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json.xcstrings; path = "🌐AboutApp.xcstrings"; sourceTree = ""; }; + 166F7E432B7DBBE5005F70D5 /* 🌐Timeline.xcstrings */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json.xcstrings; path = "🌐Timeline.xcstrings"; sourceTree = ""; }; + 166F7E472B7DBD06005F70D5 /* 🌐VersionHistory.xcstrings */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json.xcstrings; path = "🌐VersionHistory.xcstrings"; sourceTree = ""; }; + 166F7E482B7DBD08005F70D5 /* 🌐AppStoreDescription.xcstrings */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json.xcstrings; path = "🌐AppStoreDescription.xcstrings"; sourceTree = ""; }; 167817E02B61FABE00BE0067 /* screenshot1280w.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = screenshot1280w.jpg; sourceTree = ""; }; + 16891ED72B7B2F8C00C6F0B3 /* 🗒️StaticInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "🗒️StaticInfo.swift"; sourceTree = ""; }; + 16891ED82B7B2F8D00C6F0B3 /* ℹ️AboutApp.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "ℹ️AboutApp.swift"; sourceTree = ""; }; + 16891EDB2B7B2FB800C6F0B3 /* Developer_Publisher.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Developer_Publisher.xcassets; sourceTree = ""; }; 169D84AD2B5A319000BB5606 /* sound2.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = sound2.m4a; sourceTree = ""; }; 169D84AE2B5A319400BB5606 /* sound1.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = sound1.m4a; sourceTree = ""; }; 16C95AE22B5E75D800CF0FED /* 🛠️Panel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "🛠️Panel.swift"; sourceTree = ""; }; @@ -86,12 +140,9 @@ 16267B4E2B57D148000CA8AD /* Supporting files */ = { isa = PBXGroup; children = ( - 165ADB522B4B71B2008A756F /* Assets.xcassets */, - 169D84AE2B5A319400BB5606 /* sound1.m4a */, - 169D84AD2B5A319000BB5606 /* sound2.m4a */, 165ADB572B4B71B2008A756F /* Info.plist */, - 16267B4F2B57D172000CA8AD /* Localizable.xcstrings */, - 16267B512B57D362000CA8AD /* InfoPlist.xcstrings */, + 166F7E462B7DBBF6005F70D5 /* Assets */, + 166F7E412B7DBBDB005F70D5 /* 🌐Localization */, 160F46BA2B5A5613001FE696 /* README assets */, 1638F80B2B50BC8800E0CAD2 /* Archive */, ); @@ -111,7 +162,7 @@ isa = PBXGroup; children = ( 16267B532B57D387000CA8AD /* README.md */, - 165ADB492B4B71B0008A756F /* HandsWidth */, + 165ADB492B4B71B0008A756F /* HandsRuler */, 165ADB482B4B71B0008A756F /* Products */, ); sourceTree = ""; @@ -119,12 +170,12 @@ 165ADB482B4B71B0008A756F /* Products */ = { isa = PBXGroup; children = ( - 165ADB472B4B71B0008A756F /* HandsWidth.app */, + 165ADB472B4B71B0008A756F /* HandsRuler.app */, ); name = Products; sourceTree = ""; }; - 165ADB492B4B71B0008A756F /* HandsWidth */ = { + 165ADB492B4B71B0008A756F /* HandsRuler */ = { isa = PBXGroup; children = ( 165ADB4E2B4B71B0008A756F /* App.swift */, @@ -139,7 +190,31 @@ 16C95ADF2B5E74FD00CF0FED /* 🛠️Menu */, 16267B4E2B57D148000CA8AD /* Supporting files */, ); - path = HandsWidth; + path = HandsRuler; + sourceTree = ""; + }; + 166F7E412B7DBBDB005F70D5 /* 🌐Localization */ = { + isa = PBXGroup; + children = ( + 16267B4F2B57D172000CA8AD /* Localizable.xcstrings */, + 16267B512B57D362000CA8AD /* InfoPlist.xcstrings */, + 166F7E482B7DBD08005F70D5 /* 🌐AppStoreDescription.xcstrings */, + 166F7E472B7DBD06005F70D5 /* 🌐VersionHistory.xcstrings */, + 166F7E422B7DBBE4005F70D5 /* 🌐AboutApp.xcstrings */, + 166F7E432B7DBBE5005F70D5 /* 🌐Timeline.xcstrings */, + ); + path = "🌐Localization"; + sourceTree = ""; + }; + 166F7E462B7DBBF6005F70D5 /* Assets */ = { + isa = PBXGroup; + children = ( + 165ADB522B4B71B2008A756F /* Assets.xcassets */, + 16891EDB2B7B2FB800C6F0B3 /* Developer_Publisher.xcassets */, + 169D84AE2B5A319400BB5606 /* sound1.m4a */, + 169D84AD2B5A319000BB5606 /* sound2.m4a */, + ); + path = Assets; sourceTree = ""; }; 16C95ADF2B5E74FD00CF0FED /* 🛠️Menu */ = { @@ -148,31 +223,42 @@ 16C95AE42B5E762400CF0FED /* 🛠️MenuTop.swift */, 16C95AE22B5E75D800CF0FED /* 🛠️Panel.swift */, 1642FAB42B4D54A60084F9ED /* 🛠️SettingPanel.swift */, - 16C95AE62B5E7BFF00CF0FED /* 🛠️AboutPanel.swift */, + 16D833122B7CB57F00409943 /* 🛠️About */, ); path = "🛠️Menu"; sourceTree = ""; }; + 16D833122B7CB57F00409943 /* 🛠️About */ = { + isa = PBXGroup; + children = ( + 16C95AE62B5E7BFF00CF0FED /* 🛠️AboutPanel.swift */, + 16891ED72B7B2F8C00C6F0B3 /* 🗒️StaticInfo.swift */, + 16891ED82B7B2F8D00C6F0B3 /* ℹ️AboutApp.swift */, + ); + path = "🛠️About"; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ - 165ADB462B4B71B0008A756F /* HandsWidth */ = { + 165ADB462B4B71B0008A756F /* HandsRuler */ = { isa = PBXNativeTarget; - buildConfigurationList = 165ADB5A2B4B71B2008A756F /* Build configuration list for PBXNativeTarget "HandsWidth" */; + buildConfigurationList = 165ADB5A2B4B71B2008A756F /* Build configuration list for PBXNativeTarget "HandsRuler" */; buildPhases = ( 165ADB432B4B71B0008A756F /* Sources */, 165ADB442B4B71B0008A756F /* Frameworks */, 165ADB452B4B71B0008A756F /* Resources */, + 166F7E4B2B7DC35C005F70D5 /* CopyFiles */, ); buildRules = ( ); dependencies = ( ); - name = HandsWidth; + name = HandsRuler; packageProductDependencies = ( ); productName = HandsWidth; - productReference = 165ADB472B4B71B0008A756F /* HandsWidth.app */; + productReference = 165ADB472B4B71B0008A756F /* HandsRuler.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ @@ -190,7 +276,7 @@ }; }; }; - buildConfigurationList = 165ADB422B4B71B0008A756F /* Build configuration list for PBXProject "HandsWidth" */; + buildConfigurationList = 165ADB422B4B71B0008A756F /* Build configuration list for PBXProject "HandsRuler" */; compatibilityVersion = "Xcode 14.0"; developmentRegion = en; hasScannedForEncodings = 0; @@ -204,7 +290,7 @@ projectDirPath = ""; projectRoot = ""; targets = ( - 165ADB462B4B71B0008A756F /* HandsWidth */, + 165ADB462B4B71B0008A756F /* HandsRuler */, ); }; /* End PBXProject section */ @@ -215,11 +301,14 @@ buildActionMask = 2147483647; files = ( 169D84B02B5A319500BB5606 /* sound1.m4a in Resources */, + 166F7E492B7DBD08005F70D5 /* 🌐VersionHistory.xcstrings in Resources */, + 166F7E442B7DBBE5005F70D5 /* 🌐AboutApp.xcstrings in Resources */, 169D84AF2B5A319500BB5606 /* sound2.m4a in Resources */, - 16EA6A612B68629100A3A740 /* screenshot1280w3.jpg in Resources */, + 16891EDC2B7B2FB800C6F0B3 /* Developer_Publisher.xcassets in Resources */, 16267B522B57D362000CA8AD /* InfoPlist.xcstrings in Resources */, - 16EA6A632B68629200A3A740 /* screenshot1280w2.jpg in Resources */, + 166F7E4A2B7DBD08005F70D5 /* 🌐AppStoreDescription.xcstrings in Resources */, 16267B502B57D172000CA8AD /* Localizable.xcstrings in Resources */, + 166F7E452B7DBBE5005F70D5 /* 🌐Timeline.xcstrings in Resources */, 165ADB532B4B71B2008A756F /* Assets.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -241,6 +330,8 @@ 16EE5E9B2B576DB000D354ED /* 🧩Model.swift in Sources */, 164C78032B5746AD008FF872 /* 🧩Entity.swift in Sources */, 16688DE62B59F35F004CE12B /* 🥽AppModel.swift in Sources */, + 16891ED92B7B2F8D00C6F0B3 /* 🗒️StaticInfo.swift in Sources */, + 16891EDA2B7B2F8D00C6F0B3 /* ℹ️AboutApp.swift in Sources */, 165ADB4F2B4B71B0008A756F /* App.swift in Sources */, 16C95AE52B5E762400CF0FED /* 🛠️MenuTop.swift in Sources */, 16C95AE32B5E75D800CF0FED /* 🛠️Panel.swift in Sources */, @@ -386,7 +477,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0; + MARKETING_VERSION = 1.0.1; PRODUCT_BUNDLE_IDENTIFIER = net.aaaakkkkssssttttnnnn.HandsWidth; PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTED_PLATFORMS = "xros xrsimulator"; @@ -413,7 +504,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0; + MARKETING_VERSION = 1.0.1; PRODUCT_BUNDLE_IDENTIFIER = net.aaaakkkkssssttttnnnn.HandsWidth; PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTED_PLATFORMS = "xros xrsimulator"; @@ -426,7 +517,7 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 165ADB422B4B71B0008A756F /* Build configuration list for PBXProject "HandsWidth" */ = { + 165ADB422B4B71B0008A756F /* Build configuration list for PBXProject "HandsRuler" */ = { isa = XCConfigurationList; buildConfigurations = ( 165ADB582B4B71B2008A756F /* Debug */, @@ -435,7 +526,7 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 165ADB5A2B4B71B2008A756F /* Build configuration list for PBXNativeTarget "HandsWidth" */ = { + 165ADB5A2B4B71B2008A756F /* Build configuration list for PBXNativeTarget "HandsRuler" */ = { isa = XCConfigurationList; buildConfigurations = ( 165ADB5B2B4B71B2008A756F /* Debug */, diff --git a/HandsWidth.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/HandsRuler.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 55% rename from HandsWidth.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to HandsRuler.xcodeproj/project.xcworkspace/contents.xcworkspacedata index 919434a..3a7669a 100644 --- a/HandsWidth.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/HandsRuler.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -2,6 +2,6 @@ + location = "self:/Users/account2309/Documents/HandsWidth/HandsRuler.xcodeproj"> diff --git a/HandsWidth.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/HandsRuler.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from HandsWidth.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to HandsRuler.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/HandsWidth.xcodeproj/xcshareddata/xcschemes/HandsWidth.xcscheme b/HandsRuler.xcodeproj/xcshareddata/xcschemes/HandsRuler.xcscheme similarity index 84% rename from HandsWidth.xcodeproj/xcshareddata/xcschemes/HandsWidth.xcscheme rename to HandsRuler.xcodeproj/xcshareddata/xcschemes/HandsRuler.xcscheme index 119ed4a..9f1487a 100644 --- a/HandsWidth.xcodeproj/xcshareddata/xcschemes/HandsWidth.xcscheme +++ b/HandsRuler.xcodeproj/xcshareddata/xcschemes/HandsRuler.xcscheme @@ -15,9 +15,9 @@ + BuildableName = "HandsRuler.app" + BlueprintName = "HandsRuler" + ReferencedContainer = "container:HandsRuler.xcodeproj"> @@ -45,9 +45,9 @@ + BuildableName = "HandsRuler.app" + BlueprintName = "HandsRuler" + ReferencedContainer = "container:HandsRuler.xcodeproj"> @@ -62,9 +62,9 @@ + BuildableName = "HandsRuler.app" + BlueprintName = "HandsRuler" + ReferencedContainer = "container:HandsRuler.xcodeproj"> diff --git a/HandsWidth.xcodeproj/xcuserdata/account2309.xcuserdatad/xcschemes/xcschememanagement.plist b/HandsRuler.xcodeproj/xcuserdata/account2309.xcuserdatad/xcschemes/xcschememanagement.plist similarity index 90% rename from HandsWidth.xcodeproj/xcuserdata/account2309.xcuserdatad/xcschemes/xcschememanagement.plist rename to HandsRuler.xcodeproj/xcuserdata/account2309.xcuserdatad/xcschemes/xcschememanagement.plist index 417550b..6313678 100644 --- a/HandsWidth.xcodeproj/xcuserdata/account2309.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/HandsRuler.xcodeproj/xcuserdata/account2309.xcuserdatad/xcschemes/xcschememanagement.plist @@ -4,7 +4,7 @@ SchemeUserState - HandsWidth.xcscheme_^#shared#^_ + HandsRuler.xcscheme_^#shared#^_ orderHint 0 diff --git a/HandsWidth/App.swift b/HandsRuler/App.swift similarity index 92% rename from HandsWidth/App.swift rename to HandsRuler/App.swift index 70a81c7..ffbb253 100644 --- a/HandsWidth/App.swift +++ b/HandsRuler/App.swift @@ -1,7 +1,7 @@ import SwiftUI @main -struct HandsWidthApp: App { +struct HandsRulerApp: App { var body: some Scene { WindowGroup { ContentView() diff --git a/HandsRuler/ContentView.swift b/HandsRuler/ContentView.swift new file mode 100644 index 0000000..96c6c0b --- /dev/null +++ b/HandsRuler/ContentView.swift @@ -0,0 +1,53 @@ +import SwiftUI + +struct ContentView: View { + @Environment(\.openImmersiveSpace) var openImmersiveSpace + @Environment(\.dismissWindow) var dismissWindow + var body: some View { + NavigationStack { + VStack { + Spacer() + HStack(spacing: 28) { + Image(.graph1) + .resizable() + .aspectRatio(contentMode: .fit) + .frame(width: 300) + .clipShape(.rect(cornerRadius: 16, style: .continuous)) + Image(.graph2) + .resizable() + .aspectRatio(contentMode: .fit) + .frame(width: 300) + .clipShape(.rect(cornerRadius: 16, style: .continuous)) + } + .padding(.horizontal, 8) + Spacer() + Button { + Task { + await self.openImmersiveSpace(id: "immersiveSpace") + self.dismissWindow() + } + } label: { + Text("Start") + .font(.largeTitle) + .padding(.vertical, 12) + .padding(.horizontal, 4) + } + Spacer() + } + .navigationTitle("HandsRuler") + .toolbar { + NavigationLink { + List { + ℹ️AboutAppContent() + } + } label: { + Label("About App", systemImage: "info") + .padding(14) + } + .buttonBorderShape(.circle) + .buttonStyle(.plain) + } + } + .frame(width: 700, height: 450) + } +} diff --git a/HandsWidth/Supporting files/Archive/DebugView.md b/HandsRuler/Supporting files/Archive/DebugView.md similarity index 100% rename from HandsWidth/Supporting files/Archive/DebugView.md rename to HandsRuler/Supporting files/Archive/DebugView.md diff --git a/HandsWidth/Supporting files/Archive/HandToGround.md b/HandsRuler/Supporting files/Archive/HandToGround.md similarity index 100% rename from HandsWidth/Supporting files/Archive/HandToGround.md rename to HandsRuler/Supporting files/Archive/HandToGround.md diff --git a/HandsWidth/Supporting files/Assets.xcassets/AccentColor.colorset/Contents.json b/HandsRuler/Supporting files/Assets/Assets.xcassets/AccentColor.colorset/Contents.json similarity index 100% rename from HandsWidth/Supporting files/Assets.xcassets/AccentColor.colorset/Contents.json rename to HandsRuler/Supporting files/Assets/Assets.xcassets/AccentColor.colorset/Contents.json diff --git a/HandsWidth/Supporting files/Assets.xcassets/AppIcon.solidimagestack/Back.solidimagestacklayer/Content.imageset/Background.png b/HandsRuler/Supporting files/Assets/Assets.xcassets/AppIcon.solidimagestack/Back.solidimagestacklayer/Content.imageset/Background.png similarity index 100% rename from HandsWidth/Supporting files/Assets.xcassets/AppIcon.solidimagestack/Back.solidimagestacklayer/Content.imageset/Background.png rename to HandsRuler/Supporting files/Assets/Assets.xcassets/AppIcon.solidimagestack/Back.solidimagestacklayer/Content.imageset/Background.png diff --git a/HandsWidth/Supporting files/Assets.xcassets/AppIcon.solidimagestack/Back.solidimagestacklayer/Content.imageset/Contents.json b/HandsRuler/Supporting files/Assets/Assets.xcassets/AppIcon.solidimagestack/Back.solidimagestacklayer/Content.imageset/Contents.json similarity index 100% rename from HandsWidth/Supporting files/Assets.xcassets/AppIcon.solidimagestack/Back.solidimagestacklayer/Content.imageset/Contents.json rename to HandsRuler/Supporting files/Assets/Assets.xcassets/AppIcon.solidimagestack/Back.solidimagestacklayer/Content.imageset/Contents.json diff --git a/HandsWidth/Supporting files/Assets.xcassets/AppIcon.solidimagestack/Back.solidimagestacklayer/Contents.json b/HandsRuler/Supporting files/Assets/Assets.xcassets/AppIcon.solidimagestack/Back.solidimagestacklayer/Contents.json similarity index 100% rename from HandsWidth/Supporting files/Assets.xcassets/AppIcon.solidimagestack/Back.solidimagestacklayer/Contents.json rename to HandsRuler/Supporting files/Assets/Assets.xcassets/AppIcon.solidimagestack/Back.solidimagestacklayer/Contents.json diff --git a/HandsWidth/Supporting files/Assets.xcassets/AppIcon.solidimagestack/Contents.json b/HandsRuler/Supporting files/Assets/Assets.xcassets/AppIcon.solidimagestack/Contents.json similarity index 100% rename from HandsWidth/Supporting files/Assets.xcassets/AppIcon.solidimagestack/Contents.json rename to HandsRuler/Supporting files/Assets/Assets.xcassets/AppIcon.solidimagestack/Contents.json diff --git a/HandsWidth/Supporting files/Assets.xcassets/AppIcon.solidimagestack/Front.solidimagestacklayer/Content.imageset/Contents.json b/HandsRuler/Supporting files/Assets/Assets.xcassets/AppIcon.solidimagestack/Front.solidimagestacklayer/Content.imageset/Contents.json similarity index 100% rename from HandsWidth/Supporting files/Assets.xcassets/AppIcon.solidimagestack/Front.solidimagestacklayer/Content.imageset/Contents.json rename to HandsRuler/Supporting files/Assets/Assets.xcassets/AppIcon.solidimagestack/Front.solidimagestacklayer/Content.imageset/Contents.json diff --git a/HandsWidth/Supporting files/Assets.xcassets/AppIcon.solidimagestack/Front.solidimagestacklayer/Content.imageset/Front.png b/HandsRuler/Supporting files/Assets/Assets.xcassets/AppIcon.solidimagestack/Front.solidimagestacklayer/Content.imageset/Front.png similarity index 100% rename from HandsWidth/Supporting files/Assets.xcassets/AppIcon.solidimagestack/Front.solidimagestacklayer/Content.imageset/Front.png rename to HandsRuler/Supporting files/Assets/Assets.xcassets/AppIcon.solidimagestack/Front.solidimagestacklayer/Content.imageset/Front.png diff --git a/HandsWidth/Supporting files/Assets.xcassets/AppIcon.solidimagestack/Front.solidimagestacklayer/Contents.json b/HandsRuler/Supporting files/Assets/Assets.xcassets/AppIcon.solidimagestack/Front.solidimagestacklayer/Contents.json similarity index 100% rename from HandsWidth/Supporting files/Assets.xcassets/AppIcon.solidimagestack/Front.solidimagestacklayer/Contents.json rename to HandsRuler/Supporting files/Assets/Assets.xcassets/AppIcon.solidimagestack/Front.solidimagestacklayer/Contents.json diff --git a/HandsWidth/Supporting files/Assets.xcassets/AppIcon.solidimagestack/Middle.solidimagestacklayer/Content.imageset/Contents.json b/HandsRuler/Supporting files/Assets/Assets.xcassets/AppIcon.solidimagestack/Middle.solidimagestacklayer/Content.imageset/Contents.json similarity index 100% rename from HandsWidth/Supporting files/Assets.xcassets/AppIcon.solidimagestack/Middle.solidimagestacklayer/Content.imageset/Contents.json rename to HandsRuler/Supporting files/Assets/Assets.xcassets/AppIcon.solidimagestack/Middle.solidimagestacklayer/Content.imageset/Contents.json diff --git a/HandsWidth/Supporting files/Assets.xcassets/AppIcon.solidimagestack/Middle.solidimagestacklayer/Content.imageset/Middle.png b/HandsRuler/Supporting files/Assets/Assets.xcassets/AppIcon.solidimagestack/Middle.solidimagestacklayer/Content.imageset/Middle.png similarity index 100% rename from HandsWidth/Supporting files/Assets.xcassets/AppIcon.solidimagestack/Middle.solidimagestacklayer/Content.imageset/Middle.png rename to HandsRuler/Supporting files/Assets/Assets.xcassets/AppIcon.solidimagestack/Middle.solidimagestacklayer/Content.imageset/Middle.png diff --git a/HandsWidth/Supporting files/Assets.xcassets/AppIcon.solidimagestack/Middle.solidimagestacklayer/Contents.json b/HandsRuler/Supporting files/Assets/Assets.xcassets/AppIcon.solidimagestack/Middle.solidimagestacklayer/Contents.json similarity index 100% rename from HandsWidth/Supporting files/Assets.xcassets/AppIcon.solidimagestack/Middle.solidimagestacklayer/Contents.json rename to HandsRuler/Supporting files/Assets/Assets.xcassets/AppIcon.solidimagestack/Middle.solidimagestacklayer/Contents.json diff --git a/HandsWidth/Supporting files/Assets.xcassets/Contents.json b/HandsRuler/Supporting files/Assets/Assets.xcassets/Contents.json similarity index 100% rename from HandsWidth/Supporting files/Assets.xcassets/Contents.json rename to HandsRuler/Supporting files/Assets/Assets.xcassets/Contents.json diff --git a/HandsRuler/Supporting files/Assets/Assets.xcassets/aboutAppIcon.imageset/Contents.json b/HandsRuler/Supporting files/Assets/Assets.xcassets/aboutAppIcon.imageset/Contents.json new file mode 100644 index 0000000..117b2d7 --- /dev/null +++ b/HandsRuler/Supporting files/Assets/Assets.xcassets/aboutAppIcon.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "aboutAppIcon.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/HandsWidth/Supporting files/README assets/icon.png b/HandsRuler/Supporting files/Assets/Assets.xcassets/aboutAppIcon.imageset/aboutAppIcon.png similarity index 100% rename from HandsWidth/Supporting files/README assets/icon.png rename to HandsRuler/Supporting files/Assets/Assets.xcassets/aboutAppIcon.imageset/aboutAppIcon.png diff --git a/HandsWidth/Supporting files/Assets.xcassets/graph1.imageset/Contents.json b/HandsRuler/Supporting files/Assets/Assets.xcassets/graph1.imageset/Contents.json similarity index 100% rename from HandsWidth/Supporting files/Assets.xcassets/graph1.imageset/Contents.json rename to HandsRuler/Supporting files/Assets/Assets.xcassets/graph1.imageset/Contents.json diff --git a/HandsWidth/Supporting files/Assets.xcassets/graph1.imageset/graph 1.heic b/HandsRuler/Supporting files/Assets/Assets.xcassets/graph1.imageset/graph 1.heic similarity index 100% rename from HandsWidth/Supporting files/Assets.xcassets/graph1.imageset/graph 1.heic rename to HandsRuler/Supporting files/Assets/Assets.xcassets/graph1.imageset/graph 1.heic diff --git a/HandsWidth/Supporting files/Assets.xcassets/graph2.imageset/Contents.json b/HandsRuler/Supporting files/Assets/Assets.xcassets/graph2.imageset/Contents.json similarity index 100% rename from HandsWidth/Supporting files/Assets.xcassets/graph2.imageset/Contents.json rename to HandsRuler/Supporting files/Assets/Assets.xcassets/graph2.imageset/Contents.json diff --git a/HandsWidth/Supporting files/Assets.xcassets/graph2.imageset/graph.heic b/HandsRuler/Supporting files/Assets/Assets.xcassets/graph2.imageset/graph.heic similarity index 100% rename from HandsWidth/Supporting files/Assets.xcassets/graph2.imageset/graph.heic rename to HandsRuler/Supporting files/Assets/Assets.xcassets/graph2.imageset/graph.heic diff --git a/HandsRuler/Supporting files/Assets/Developer_Publisher.xcassets/Contents.json b/HandsRuler/Supporting files/Assets/Developer_Publisher.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/HandsRuler/Supporting files/Assets/Developer_Publisher.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/HandsRuler/Supporting files/Assets/Developer_Publisher.xcassets/Developer_Publisher.imageset/Contents.json b/HandsRuler/Supporting files/Assets/Developer_Publisher.xcassets/Developer_Publisher.imageset/Contents.json new file mode 100644 index 0000000..2620adb --- /dev/null +++ b/HandsRuler/Supporting files/Assets/Developer_Publisher.xcassets/Developer_Publisher.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "Developer_Publisher.heic", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/HandsRuler/Supporting files/Assets/Developer_Publisher.xcassets/Developer_Publisher.imageset/Developer_Publisher.heic b/HandsRuler/Supporting files/Assets/Developer_Publisher.xcassets/Developer_Publisher.imageset/Developer_Publisher.heic new file mode 100644 index 0000000..2d149d0 Binary files /dev/null and b/HandsRuler/Supporting files/Assets/Developer_Publisher.xcassets/Developer_Publisher.imageset/Developer_Publisher.heic differ diff --git a/HandsWidth/Supporting files/sound1.m4a b/HandsRuler/Supporting files/Assets/sound1.m4a similarity index 100% rename from HandsWidth/Supporting files/sound1.m4a rename to HandsRuler/Supporting files/Assets/sound1.m4a diff --git a/HandsWidth/Supporting files/sound2.m4a b/HandsRuler/Supporting files/Assets/sound2.m4a similarity index 100% rename from HandsWidth/Supporting files/sound2.m4a rename to HandsRuler/Supporting files/Assets/sound2.m4a diff --git a/HandsWidth/Supporting files/Info.plist b/HandsRuler/Supporting files/Info.plist similarity index 100% rename from HandsWidth/Supporting files/Info.plist rename to HandsRuler/Supporting files/Info.plist diff --git a/HandsWidth/Supporting files/README assets/appstore_badge.svg b/HandsRuler/Supporting files/README assets/appstore_badge.svg similarity index 100% rename from HandsWidth/Supporting files/README assets/appstore_badge.svg rename to HandsRuler/Supporting files/README assets/appstore_badge.svg diff --git a/HandsRuler/Supporting files/README assets/icon.png b/HandsRuler/Supporting files/README assets/icon.png new file mode 100644 index 0000000..37a3485 Binary files /dev/null and b/HandsRuler/Supporting files/README assets/icon.png differ diff --git a/HandsWidth/Supporting files/README assets/screenshot1280w.jpg b/HandsRuler/Supporting files/README assets/screenshot1280w.jpg similarity index 100% rename from HandsWidth/Supporting files/README assets/screenshot1280w.jpg rename to HandsRuler/Supporting files/README assets/screenshot1280w.jpg diff --git a/HandsWidth/Supporting files/README assets/screenshot1280w2.jpg b/HandsRuler/Supporting files/README assets/screenshot1280w2.jpg similarity index 100% rename from HandsWidth/Supporting files/README assets/screenshot1280w2.jpg rename to HandsRuler/Supporting files/README assets/screenshot1280w2.jpg diff --git a/HandsWidth/Supporting files/README assets/screenshot1280w3.jpg b/HandsRuler/Supporting files/README assets/screenshot1280w3.jpg similarity index 100% rename from HandsWidth/Supporting files/README assets/screenshot1280w3.jpg rename to HandsRuler/Supporting files/README assets/screenshot1280w3.jpg diff --git a/HandsWidth/Supporting files/InfoPlist.xcstrings "b/HandsRuler/Supporting files/\360\237\214\220Localization/InfoPlist.xcstrings" similarity index 84% rename from HandsWidth/Supporting files/InfoPlist.xcstrings rename to "HandsRuler/Supporting files/\360\237\214\220Localization/InfoPlist.xcstrings" index 3d78683..ba88c02 100644 --- a/HandsWidth/Supporting files/InfoPlist.xcstrings +++ "b/HandsRuler/Supporting files/\360\237\214\220Localization/InfoPlist.xcstrings" @@ -8,13 +8,13 @@ "en" : { "stringUnit" : { "state" : "new", - "value" : "HandsWidth" + "value" : "HandsRuler" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "手がメジャー" + "value" : "HandsRuler" } } } diff --git a/HandsWidth/Supporting files/Localizable.xcstrings "b/HandsRuler/Supporting files/\360\237\214\220Localization/Localizable.xcstrings" similarity index 81% rename from HandsWidth/Supporting files/Localizable.xcstrings rename to "HandsRuler/Supporting files/\360\237\214\220Localization/Localizable.xcstrings" index 8dc89d6..40d1300 100644 --- a/HandsWidth/Supporting files/Localizable.xcstrings +++ "b/HandsRuler/Supporting files/\360\237\214\220Localization/Localizable.xcstrings" @@ -11,6 +11,26 @@ } } }, + "About App" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "アプリについて" + } + } + } + }, + "Apple Vision Pro" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + } + } + }, "Exit" : { "localizations" : { "ja" : { @@ -41,12 +61,12 @@ } } }, - "HandsWidth" : { + "HandsRuler" : { "localizations" : { "ja" : { "stringUnit" : { "state" : "translated", - "value" : "手がメジャー" + "value" : "HandsRuler" } } } diff --git "a/HandsRuler/Supporting files/\360\237\214\220Localization/\360\237\214\220AboutApp.xcstrings" "b/HandsRuler/Supporting files/\360\237\214\220Localization/\360\237\214\220AboutApp.xcstrings" new file mode 100644 index 0000000..8a9dbec --- /dev/null +++ "b/HandsRuler/Supporting files/\360\237\214\220Localization/\360\237\214\220AboutApp.xcstrings" @@ -0,0 +1,577 @@ +{ + "sourceLanguage" : "en", + "strings" : { + "(Mirror)" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "(Mirror)" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "(ミラー)" + } + } + } + }, + "← Select file" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "← Select file" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "← ファイルを選択して下さい" + } + } + } + }, + "about 29" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "about 29" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "約29才" + } + } + } + }, + "About App" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "About App" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "アプリについて" + } + } + } + }, + "age" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "age" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "年齢" + } + } + } + }, + "As of 2023" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "As of 2023" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "2023年時点" + } + } + } + }, + "background" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "background" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "バックグラウンド" + } + } + } + }, + "bug report, feature request, impression..." : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "不具合レポート、機能リクエスト、感想など" + } + } + } + }, + "builded on %@" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "builded on %@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ にビルドしました" + } + } + } + }, + "Copy" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "コピー" + } + } + } + }, + "country" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "country" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "国" + } + } + } + }, + "Description" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Description" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "概要" + } + } + } + }, + "Developer / Publisher" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Developer / Publisher" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "開発 / パブリッシャー" + } + } + } + }, + "Feedback" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "フィードバック" + } + } + } + }, + "Feedback from mail app" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "「メール」アプリからフィードバックを送る" + } + } + } + }, + "Git repository is public on GitHub.com" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Git repository is public on GitHub.com" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "GitリポジトリをGitHub.comで公開しています" + } + } + } + }, + "If you are interested in hiring or acquiring, please contact me." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "If you are interested in hiring or acquiring, please contact me." + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "もし雇用や買収に興味がある場合は、下記のメールアドレスに連絡してください" + } + } + } + }, + "Image" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Image" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "写真" + } + } + } + }, + "Individual" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Individual" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "個人系" + } + } + } + }, + "Japan" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Japan" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "日本" + } + } + } + }, + "Japanese" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Japanese" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "日本語" + } + } + } + }, + "Job hunting now!" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Job hunting now!" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "職探し中!" + } + } + } + }, + "Name" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Name" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "名前" + } + } + } + }, + "native language" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "native language" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ネイティブ言語" + } + } + } + }, + "OK" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "OK" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "了解しました" + } + } + } + }, + "only one person" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "only one person" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "1人のみ" + } + } + } + }, + "Open App Store page" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Open App Store page" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "App Storeページを開く" + } + } + } + }, + "Privacy Policy" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Privacy Policy" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "プライバシーポリシー" + } + } + } + }, + "released on %@" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "released on %@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ にリリースしました" + } + } + } + }, + "Review on App Store" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Review on App Store" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "App Storeでレビューを書く" + } + } + } + }, + "Source code" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Source code" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ソースコード" + } + } + } + }, + "Taken on 2021-11" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Taken on 2021-11" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "2021年11月に撮影" + } + } + } + }, + "The System" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "The System" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "組織構成" + } + } + } + }, + "Timeline" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Timeline" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "タイムライン" + } + } + } + }, + "Version" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Version" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "バージョン" + } + } + } + }, + "Version History" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Version History" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "バージョン履歴" + } + } + } + }, + "Web Repository" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Web Repository" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "Web リポジトリー" + } + } + } + } + }, + "version" : "1.0" +} \ No newline at end of file diff --git "a/HandsRuler/Supporting files/\360\237\214\220Localization/\360\237\214\220AppStoreDescription.xcstrings" "b/HandsRuler/Supporting files/\360\237\214\220Localization/\360\237\214\220AppStoreDescription.xcstrings" new file mode 100644 index 0000000..7b31842 --- /dev/null +++ "b/HandsRuler/Supporting files/\360\237\214\220Localization/\360\237\214\220AppStoreDescription.xcstrings" @@ -0,0 +1,22 @@ +{ + "sourceLanguage" : "en", + "strings" : { + "current" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Measure the distance between both hands intuitively.\n\nApp shows the measurement of the distance between the tips of the index fingers, from the left hand to the right hand.\n\nUnit option\n- centiMeters\n- meters\n- inches\n- feet\n- yards\n\nSub function\n- Fix a pointer by indirect tap." + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "両手を使って直感的に距離を測定!\n\n両手の人差し指の先端同士の距離を表示します。\n\n単位オプション\n・センチメートル(cm)\n・メートル(m)\n・インチ(in)\n・フィート(ft)\n・ヤード(yd)\n\nおまけ機能\n・ポインターを間接タップして位置を固定する" + } + } + } + } + }, + "version" : "1.0" +} \ No newline at end of file diff --git "a/HandsRuler/Supporting files/\360\237\214\220Localization/\360\237\214\220Timeline.xcstrings" "b/HandsRuler/Supporting files/\360\237\214\220Localization/\360\237\214\220Timeline.xcstrings" new file mode 100644 index 0000000..1610d36 --- /dev/null +++ "b/HandsRuler/Supporting files/\360\237\214\220Localization/\360\237\214\220Timeline.xcstrings" @@ -0,0 +1,262 @@ +{ + "sourceLanguage" : "en", + "strings" : { + "2013-04" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Finished from high school in Okayama Prefecture. Entranced into University-of-the-Ryukyus/faculty-of-engineering in Okinawa Prefecture." + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "岡山県の高等学校を卒業。沖縄県の琉球大学工学部に入学。" + } + } + } + }, + "2018-06" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Final year as an undergraduate student. Developed an iOS application(FlipByBlink) as software for the purpose of research experiments." + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "大学学部生として最終学年。研究実験を目的としたiOSアプリ(FlipByBlink)の開発を行う。" + } + } + } + }, + "2019-01" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Released ebook reader app \"FlipByBlink\" ver 1.0 on App Store. Special feature is to turn a page by slightly-longish-voluntary-blink." + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "特殊なまばたきでページめくりができる電子書籍リーダーアプリ「FlipByBlink」をver1.0としてApp Storeにリリース。" + } + } + } + }, + "2019-03" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Graduated from University-of-the-Ryukyus." + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "琉球大学を卒業。" + } + } + } + }, + "2019-05" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Released alarm clock app with taking a long time \"FadeInAlarm\" ver 1.0. First paid app." + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "時間をかけて徐々に音が大きくなるアラームアプリ「FadeInAlarm」ver1.0をリリース。初めてとなる有料アプリ。" + } + } + } + }, + "2019-07" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Migrated to Okayama Prefecture." + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "岡山に移住。" + } + } + } + }, + "2021-12" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Released FlipByBlink ver 3.0 for the first time in three years since ver 2.0." + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "FlipByBlink、ver2.0以来 約3年ぶりとなるver3.0をリリース。" + } + } + } + }, + "2022-02" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Released FadeInAlarm ver 2.0 for the first time in three years since ver 1.0." + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "FadeInAlarm、ver1.0以来 約3年ぶりとなるver2.0をリリース。" + } + } + } + }, + "2022-04" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Released simple shogi board app \"PlainShogiBoard\" ver 1.0." + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "シンプルな将棋盤アプリ「Plain将棋盤」ver1.0をリリース。" + } + } + } + }, + "2022-05" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Released body weight registration app \"TapWeight\" ver 1.0." + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "体重登録アプリ「TapWeight」ver1.0をリリース。" + } + } + } + }, + "2022-06" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Released body temperature registration app \"TapTemperature\" ver 1.0.\nAdopted In-App Purchase model for the first time on TapWeight ver 1.1.1." + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "体温登録アプリ「TapTemperature」ver1.0をリリース。\nTapWeight、有料課金モデルを初めて採用したver1.1.1をリリース。" + } + } + } + }, + "2022-09" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Released LockInNote and MemorizeWidget on iOS16 release occasion." + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "iOS16のリリースに合わせて「ロックノート」と「暗記ウィジェット」をリリース。" + } + } + } + }, + "2023-02" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Released Apple Watch app version of \"TapTemperature\"." + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "「TapTemperature」のApple Watch向けアプリをリリース。" + } + } + } + }, + "2023-04" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Released Mac version of \"MemorizeWidget\"." + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "「暗記ウィジェット」のMac向けアプリをリリース。" + } + } + } + }, + "2023-05" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Released Apple TV app version of \"PlainShogiBoard\"." + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "「Plain将棋盤」のApple TV向けアプリをリリース。" + } + } + } + }, + "2024-02" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Released Apple Vision Pro apps on the release occasion." + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "Apple Vision Pro発売に合わせてApple Vision Pro向けアプリを複数リリース。" + } + } + } + } + }, + "version" : "1.0" +} \ No newline at end of file diff --git "a/HandsRuler/Supporting files/\360\237\214\220Localization/\360\237\214\220VersionHistory.xcstrings" "b/HandsRuler/Supporting files/\360\237\214\220Localization/\360\237\214\220VersionHistory.xcstrings" new file mode 100644 index 0000000..af6c15f --- /dev/null +++ "b/HandsRuler/Supporting files/\360\237\214\220Localization/\360\237\214\220VersionHistory.xcstrings" @@ -0,0 +1,40 @@ +{ + "sourceLanguage" : "en", + "strings" : { + "1.0" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Initial release" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "1回目のリリース" + } + } + } + }, + "1.0.1" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rename app.\n\"HandsWidth\" → \"HandsRuler\"" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "アプリ名を変更。\n\"HandsWidth\" → \"HandsRuler\"" + } + } + } + } + }, + "version" : "1.0" +} \ No newline at end of file diff --git "a/HandsWidth/\360\237\214\220RealityView.swift" "b/HandsRuler/\360\237\214\220RealityView.swift" similarity index 100% rename from "HandsWidth/\360\237\214\220RealityView.swift" rename to "HandsRuler/\360\237\214\220RealityView.swift" diff --git "a/HandsWidth/\360\237\223\217Unit.swift" "b/HandsRuler/\360\237\223\217Unit.swift" similarity index 100% rename from "HandsWidth/\360\237\223\217Unit.swift" rename to "HandsRuler/\360\237\223\217Unit.swift" diff --git "a/HandsRuler/\360\237\233\240\357\270\217Menu/\360\237\233\240\357\270\217About/\342\204\271\357\270\217AboutApp.swift" "b/HandsRuler/\360\237\233\240\357\270\217Menu/\360\237\233\240\357\270\217About/\342\204\271\357\270\217AboutApp.swift" new file mode 100644 index 0000000..8b04c0d --- /dev/null +++ "b/HandsRuler/\360\237\233\240\357\270\217Menu/\360\237\233\240\357\270\217About/\342\204\271\357\270\217AboutApp.swift" @@ -0,0 +1,480 @@ +//MARK: iOS, iPadOS, Mac Catalyst, visionOS + +import SwiftUI + +struct ℹ️AboutAppContent: View { + var body: some View { + 📰AppStoreDescriptionSection() + .navigationTitle(String(localized: "About App", table: "🌐AboutApp")) + 📜VersionHistoryLink() + 👤PrivacyPolicySection() + 🏬AppStoreSection() + 📓SourceCodeLink() + 🧑‍💻AboutDeveloperPublisherLink() + 📧FeedbackLink() + } +} + +struct ℹ️IconAndName: View { + var body: some View { + HStack { + Spacer() + VStack(spacing: 8) { + Image(.aboutAppIcon) + .resizable() + .frame(width: 100, height: 100) + VStack(spacing: 6) { + Text(🗒️StaticInfo.appName) + .font(.system(.headline, design: .rounded)) + .lineLimit(1) + .tracking(1.5) + .opacity(0.75) + Text(🗒️StaticInfo.appSubTitle) + .font(.footnote) + .fontWeight(.medium) + .lineLimit(2) + .multilineTextAlignment(.center) + .foregroundStyle(.secondary) + } + .minimumScaleFactor(0.6) + } + .padding(32) + Spacer() + } + .alignmentGuide(.listRowSeparatorLeading) { $0[.leading] } + } +} + +struct ℹ️AppStoreLink: View { + @Environment(\.openURL) var openURL + var body: some View { + Button { + self.openURL(🗒️StaticInfo.appStoreProductURL) + } label: { + LabeledContent { + Image(systemName: "arrow.up.forward.app") + } label: { + Label(String(localized: "Open App Store page", table: "🌐AboutApp"), + systemImage: "link") + } + } + } +} + +private struct 📰AppStoreDescriptionSection: View { + var body: some View { + Section { + NavigationLink { + ScrollView { + Text("current", tableName: "🌐AppStoreDescription") + .padding(UIDevice.current.userInterfaceIdiom == .pad ? 32 : 16) + .frame(maxWidth: .infinity) + } + .navigationBarTitle(.init("Description", tableName: "🌐AboutApp")) + .textSelection(.enabled) + } label: { + Text(self.textWithoutEmptyLines) + .font(.subheadline) + .lineSpacing(5) + .lineLimit(7) + .padding(8) + .accessibilityLabel(.init("Description", tableName: "🌐AboutApp")) + } + } header: { + Text("Description", tableName: "🌐AboutApp") + } + } + private var textWithoutEmptyLines: String { + String(localized: "current", table: "🌐AppStoreDescription") + .replacingOccurrences(of: "\n\n", with: "\n") + .replacingOccurrences(of: "\n\n", with: "\n") + } +} + +private struct 🏬AppStoreSection: View { + @Environment(\.openURL) var openURL + var body: some View { + Section { + ℹ️AppStoreLink() + Button { + self.openURL(🗒️StaticInfo.appStoreUserReviewURL) + } label: { + LabeledContent { + Image(systemName: "arrow.up.forward.app") + } label: { + Label(String(localized: "Review on App Store", table: "🌐AboutApp"), + systemImage: "star.bubble") + } + } + } footer: { + Text(verbatim: "\(🗒️StaticInfo.appStoreProductURL)") + } + } +} + +private struct 👤PrivacyPolicySection: View { + var body: some View { + Section { + NavigationLink { + ScrollView { + Text(🗒️StaticInfo.privacyPolicyDescription) + .padding(24) + .textSelection(.enabled) + .frame(maxWidth: .infinity) + } + .navigationTitle(.init("Privacy Policy", tableName: "🌐AboutApp")) + } label: { + Label(String(localized: "Privacy Policy", table: "🌐AboutApp"), + systemImage: "person.text.rectangle") + } + } + } +} + +private struct 📜VersionHistoryLink: View { + var body: some View { + Section { + NavigationLink { + List { + ForEach(🗒️StaticInfo.versionInfos, id: \.version) { ⓘnfo in + Section { + Text(LocalizedStringKey(ⓘnfo.version), tableName: "🌐VersionHistory") + .font(.subheadline) + .padding() + .textSelection(.enabled) + } header: { + Text(ⓘnfo.version) + } footer: { + if 🗒️StaticInfo.versionInfos.first?.version == ⓘnfo.version { + Text("builded on \(ⓘnfo.date)", tableName: "🌐AboutApp") + } else { + Text("released on \(ⓘnfo.date)", tableName: "🌐AboutApp") + } + } + .headerProminence(.increased) + } + } + .navigationBarTitle(.init("Version History", tableName: "🌐AboutApp")) + } label: { + Label(String(localized: "Version", table: "🌐AboutApp"), + systemImage: "signpost.left") + .badge(🗒️StaticInfo.versionInfos.first?.version ?? "🐛") + } + .accessibilityLabel(.init("Version History", tableName: "🌐AboutApp")) + } + } +} + +private var 📓sourceCodeFolderURL: URL { +#if targetEnvironment(macCatalyst) + Bundle.main.bundleURL.appendingPathComponent("Contents/Resources/📁SourceCode") +#else + Bundle.main.bundleURL.appendingPathComponent("📁SourceCode") +#endif +} + +private struct 📓SourceCodeLink: View { + var body: some View { + NavigationLink { + List { + Self.DebugView() + ForEach(🗒️StaticInfo.SourceCodeCategory.allCases) { Self.CodeSection($0) } + Self.bundleMainInfoDictionary() + Self.RepositoryLinks() + } + .navigationTitle(.init("Source code", tableName: "🌐AboutApp")) + } label: { + Label(String(localized: "Source code", table: "🌐AboutApp"), + systemImage: "doc.plaintext") + } + } + private struct DebugView: View { + private var fileCounts: Int? { + try? FileManager.default + .contentsOfDirectory(atPath: 📓sourceCodeFolderURL.path(percentEncoded: false)) + .count + } + private var caseCounts: Int { + 🗒️StaticInfo.SourceCodeCategory.allCases.reduce(into: 0) { $0 += $1.fileNames.count } + } + var body: some View { + if let fileCounts { + if fileCounts != self.caseCounts { + Section { + Text(verbatim: "⚠️ mismatch fileCounts") + LabeledContent(String("fileCounts"), + value: self.fileCounts.debugDescription) + LabeledContent(String("caseCounts"), + value: self.caseCounts.description) + } + } + } else { + Text(verbatim: "⚠️ contentsOfDirectory failure") + } + } + } + private struct CodeSection: View { + private var category: 🗒️StaticInfo.SourceCodeCategory + var body: some View { + Section { + ForEach(self.category.fileNames, id: \.self) { ⓕileName in + let ⓤrl = 📓sourceCodeFolderURL.appendingPathComponent(ⓕileName) + if let ⓒode = try? String(contentsOf: ⓤrl) { + NavigationLink(ⓕileName) { self.sourceCodeView(ⓒode, ⓕileName) } + } else { + Text(verbatim: "🐛") + } + } + if self.category.fileNames.isEmpty { Text(verbatim: "🐛") } + } header: { + Text(self.category.rawValue) + .textCase(.none) + } + } + init(_ category: 🗒️StaticInfo.SourceCodeCategory) { + self.category = category + } + private func sourceCodeView(_ ⓣext: String, _ ⓣitle: String) -> some View { + ScrollView { + ScrollView(.horizontal, showsIndicators: false) { + Text(ⓣext) + .padding() + } + } + .environment(\.layoutDirection, .leftToRight) + .navigationBarTitle(LocalizedStringKey(ⓣitle)) + .font(.caption.monospaced()) + .textSelection(.enabled) + } + } + private static func bundleMainInfoDictionary() -> some View { + Section { + NavigationLink(String("Bundle.main.infoDictionary")) { + List { + if let ⓓictionary = Bundle.main.infoDictionary { + ForEach(ⓓictionary.map({$0.key}).sorted(), id: \.self) { + LabeledContent($0, value: String(describing: ⓓictionary[$0] ?? "🐛")) + } + } + } + .navigationBarTitle(.init(verbatim: "Bundle.main.infoDictionary")) + .textSelection(.enabled) + } + } + } + private struct RepositoryLinks: View { + @Environment(\.openURL) var openURL + var body: some View { + Section { + Button { + self.openURL(🗒️StaticInfo.webRepositoryURL) + } label: { + LabeledContent { + Image(systemName: "arrow.up.forward.app") + } label: { + Label(String(localized: "Web Repository", table: "🌐AboutApp"), + systemImage: "link") + } + } + } footer: { + Text(verbatim: "\(🗒️StaticInfo.webRepositoryURL)") + } + Section { + Button { + self.openURL(🗒️StaticInfo.webMirrorRepositoryURL) + } label: { + LabeledContent { + Image(systemName: "arrow.up.forward.app") + } label: { + HStack { + Label(String(localized: "Web Repository", table: "🌐AboutApp"), + systemImage: "link") + Text("(Mirror)", tableName: "🌐AboutApp") + .font(.subheadline.bold()) + .foregroundStyle(.secondary) + } + } + } + } footer: { + Text(verbatim: "\(🗒️StaticInfo.webMirrorRepositoryURL)") + } + } + } +} + +private struct 🧑‍💻AboutDeveloperPublisherLink: View { + var body: some View { + NavigationLink { + List { + Section { + LabeledContent { + Text("only one person", tableName: "🌐AboutApp") + } label: { + Text("Individual", tableName: "🌐AboutApp") + } + } header: { + Text("The System", tableName: "🌐AboutApp") + } + Section { + LabeledContent(String("山下 亮"), value: "Yamashita Ryo") + .modifier(Self.TypeSettingLanguage()) + } header: { + Text("Name", tableName: "🌐AboutApp") + } + Section { + Text("age", tableName: "🌐AboutApp") + .badge(Text("about 29", tableName: "🌐AboutApp")) + Text("country", tableName: "🌐AboutApp") + .badge(Text("Japan", tableName: "🌐AboutApp")) + Text("native language", tableName: "🌐AboutApp") + .badge(Text("Japanese", tableName: "🌐AboutApp")) + } header: { + Text("background", tableName: "🌐AboutApp") + } footer: { + Text("As of 2023", tableName: "🌐AboutApp") + } + Self.TimelineSection() + Section { + Image(.developerPublisher) + .resizable() + .frame(width: 90, height: 90) + .clipShape(RoundedRectangle(cornerRadius: 8)) + .padding() + .opacity(0.6) + } header: { + Text("Image", tableName: "🌐AboutApp") + } footer: { + Text("Taken on 2021-11", tableName: "🌐AboutApp") + } + Self.jobHuntSection() + } + .navigationTitle(.init("Developer / Publisher", tableName: "🌐AboutApp")) + } label: { + Label(String(localized: "Developer / Publisher", table: "🌐AboutApp"), + systemImage: "person") + } + } + private struct TypeSettingLanguage: ViewModifier { + func body(content: Content) -> some View { + if #available(iOS 17.0, *) { + content.typesettingLanguage(.init(languageCode: .japanese)) + } else { + content + } + } + } + private struct TimelineSection: View { + private static var localizedStringResources: [LocalizedStringResource] { + [ + .init("2013-04", table: "🌐Timeline"), + .init("2018-06", table: "🌐Timeline"), + .init("2019-01", table: "🌐Timeline"), + .init("2019-03", table: "🌐Timeline"), + .init("2019-05", table: "🌐Timeline"), + .init("2019-07", table: "🌐Timeline"), + .init("2021-12", table: "🌐Timeline"), + .init("2022-02", table: "🌐Timeline"), + .init("2022-04", table: "🌐Timeline"), + .init("2022-05", table: "🌐Timeline"), + .init("2022-06", table: "🌐Timeline"), //two lines + .init("2022-09", table: "🌐Timeline"), + .init("2023-02", table: "🌐Timeline"), + .init("2023-04", table: "🌐Timeline"), + .init("2023-05", table: "🌐Timeline"), + .init("2024-02", table: "🌐Timeline"), + ] + } + var body: some View { + Section { + ForEach(Self.localizedStringResources, id: \.self.key) { ⓡesource in + HStack { + Text(ⓡesource.key) + .font(.caption2.monospacedDigit()) + .padding(8) + Text(ⓡesource) + .font(.caption) + } + } + } header: { + Text("Timeline", tableName: "🌐AboutApp") + } + } + } + private static func jobHuntSection() -> some View { + Section { + VStack(spacing: 8) { + Text("Job hunting now!", tableName: "🌐AboutApp") + .font(.headline.italic()) + Text("If you are interested in hiring or acquiring, please contact me.", + tableName: "🌐AboutApp") + .font(.subheadline) + Text(🗒️StaticInfo.contactAddress) + .textSelection(.enabled) + .italic() + .foregroundStyle(.secondary) + } + .padding(12) + .frame(maxWidth: .infinity) + } + } +} + +private struct 📧FeedbackLink: View { + var body: some View { + Section { + NavigationLink { + Self.Destination() + } label: { + Label(String(localized: "Feedback", table: "🌐AboutApp"), + systemImage: "envelope") + } + } + } + private struct Destination: View { + @State private var copied: Bool = false + @Environment(\.openURL) var openURL + var body: some View { + List { + Section { + Button { + var ⓤrlString = "mailto:" + 🗒️StaticInfo.contactAddress + ⓤrlString += "?subject=" + let ⓣitle = "\(🗒️StaticInfo.appName) feedback" + ⓤrlString += ⓣitle.addingPercentEncoding(withAllowedCharacters: .urlPathAllowed)! + ⓤrlString += "&body=Input%20here" + self.openURL(.init(string: ⓤrlString)!) + } label: { + Label(String(localized: "Feedback from mail app", table: "🌐AboutApp"), + systemImage: "envelope") + .badge(Text(Image(systemName: "arrow.up.forward.app"))) + } + VStack { + HStack { + Spacer() + Text(🗒️StaticInfo.contactAddress) + .textSelection(.enabled) + .italic() + Spacer() + } + Button(String(localized: "Copy", table: "🌐AboutApp")) { + UIPasteboard.general.string = 🗒️StaticInfo.contactAddress + withAnimation { self.copied = true } + } + .opacity(self.copied ? 0.3 : 1) + .buttonStyle(.bordered) + .overlay { + if self.copied { + Image(systemName: "checkmark") + .bold() + } + } + } + .padding(.vertical) + } footer: { + Text("bug report, feature request, impression...", tableName: "🌐AboutApp") + } + } + .navigationBarTitle(String(localized: "Feedback", table: "🌐AboutApp")) + } + } +} diff --git "a/HandsRuler/\360\237\233\240\357\270\217Menu/\360\237\233\240\357\270\217About/\360\237\227\222\357\270\217StaticInfo.swift" "b/HandsRuler/\360\237\233\240\357\270\217Menu/\360\237\233\240\357\270\217About/\360\237\227\222\357\270\217StaticInfo.swift" new file mode 100644 index 0000000..38d2e9d --- /dev/null +++ "b/HandsRuler/\360\237\233\240\357\270\217Menu/\360\237\233\240\357\270\217About/\360\237\227\222\357\270\217StaticInfo.swift" @@ -0,0 +1,61 @@ +import SwiftUI + +enum 🗒️StaticInfo { + static let appName: LocalizedStringKey = "HandsRuler" + static var appSubTitle: LocalizedStringKey { "Apple Vision Pro" } + + static let appStoreProductURL: URL = .init(string: "https://apps.apple.com/app/id6475769879")! + static var appStoreUserReviewURL: URL { .init(string: "\(Self.appStoreProductURL)?action=write-review")! } + + static var contactAddress: String { "sear_pandora_0x@icloud.com" } + + static let privacyPolicyDescription = """ + 2024-02-02 + + + English + + This application don't collect user infomation. + + + 日本語(Japanese) + + このアプリ自身において、ユーザーの情報を一切収集しません。 + """ + + static let webRepositoryURL: URL = .init(string: "https://github.com/FlipByBlink/HandsRuler")! + static let webMirrorRepositoryURL: URL = .init(string: "https://gitlab.com/FlipByBlink/HandsRuler_Mirror")! +} + +extension 🗒️StaticInfo { + static let versionInfos: [(version: String, date: String)] = [("1.0.1", "2024-02-15"), + ("1.0", "2024-02-02")] //降順。先頭の方が新しい + + enum SourceCodeCategory: String, CaseIterable, Identifiable { + case main, 🛠️Menu + var id: Self { self } + var fileNames: [String] { + switch self { + case .main: [ + "App.swift", + "ContentView.swift", + "🥽AppModel.swift", + "🌐RealityView.swift", + "🧩Entity.swift", + "🧩Name.swift", + "🧩Model.swift", + "🧑HeadTrackingComponent&System.swift", + "📏Unit.swift" + ] + case .🛠️Menu: [ + "🛠️MenuTop.swift", + "🛠️Panel.swift", + "🛠️SettingPanel.swift", + "🛠️AboutPanel.swift", + "🗒️StaticInfo.swift", + "ℹ️AboutApp.swift" + ] + } + } + } +} diff --git "a/HandsRuler/\360\237\233\240\357\270\217Menu/\360\237\233\240\357\270\217About/\360\237\233\240\357\270\217AboutPanel.swift" "b/HandsRuler/\360\237\233\240\357\270\217Menu/\360\237\233\240\357\270\217About/\360\237\233\240\357\270\217AboutPanel.swift" new file mode 100644 index 0000000..6994979 --- /dev/null +++ "b/HandsRuler/\360\237\233\240\357\270\217Menu/\360\237\233\240\357\270\217About/\360\237\233\240\357\270\217AboutPanel.swift" @@ -0,0 +1,70 @@ +import SwiftUI + +struct 🛠️AboutPanel: View { + @EnvironmentObject var model: 🥽AppModel + var body: some View { + NavigationStack { + List { + Section { + HStack(spacing: 20) { + Image(.graph1) + .resizable() + .aspectRatio(contentMode: .fit) + .frame(width: 300) + .clipShape(.rect(cornerRadius: 8, style: .continuous)) + Text("Measurement of the distance between the fingers.") + .font(.caption) + .multilineTextAlignment(.center) + } + .padding(4) + } + Section { + HStack(spacing: 20) { + Image(.graph2) + .resizable() + .aspectRatio(contentMode: .fit) + .frame(width: 300) + .clipShape(.rect(cornerRadius: 8, style: .continuous)) + Text("Fix / Unfix a pointer by indirect tap.") + .font(.caption) + .multilineTextAlignment(.center) + } + .padding(4) + } + switch self.model.authorizationStatus { + case .notDetermined, .denied: + HStack(spacing: 24) { + Text("Hand tracking authorization:") + .fontWeight(.semibold) + Text(self.model.authorizationStatus?.description ?? "nil") + } + .font(.caption) + .foregroundStyle(.secondary) + default: + EmptyView() + } + Section { + NavigationLink { + List { + ℹ️AboutAppContent() + } + } label: { + Label("About App", systemImage: "questionmark") + } + } + } + .navigationTitle("About") + .toolbar { + Button { + self.model.presentPanel = nil + } label: { + Image(systemName: "arrow.down.right.and.arrow.up.left") + .padding(8) + } + .buttonBorderShape(.circle) + .buttonStyle(.plain) + } + } + .frame(width: 640, height: 500) + } +} diff --git "a/HandsWidth/\360\237\233\240\357\270\217Menu/\360\237\233\240\357\270\217MenuTop.swift" "b/HandsRuler/\360\237\233\240\357\270\217Menu/\360\237\233\240\357\270\217MenuTop.swift" similarity index 76% rename from "HandsWidth/\360\237\233\240\357\270\217Menu/\360\237\233\240\357\270\217MenuTop.swift" rename to "HandsRuler/\360\237\233\240\357\270\217Menu/\360\237\233\240\357\270\217MenuTop.swift" index 148a92f..8dc6293 100644 --- "a/HandsWidth/\360\237\233\240\357\270\217Menu/\360\237\233\240\357\270\217MenuTop.swift" +++ "b/HandsRuler/\360\237\233\240\357\270\217Menu/\360\237\233\240\357\270\217MenuTop.swift" @@ -53,37 +53,15 @@ struct 🛠️MenuTop: View { } ZStack(alignment: .top) { 🛠️SettingPanel() - .overlay(alignment: .topTrailing) { self.hideButton() } - .padding(32) - .padding(.horizontal) - .fixedSize() .glassBackgroundEffect() .opacity(self.model.presentPanel == .setting ? 1 : 0) 🛠️AboutPanel() - .overlay(alignment: .topTrailing) { self.hideButton() } - .padding(24) - .padding(.horizontal) - .fixedSize() .glassBackgroundEffect() .opacity(self.model.presentPanel == .about ? 1 : 0) } } .animation(.default, value: self.model.presentPanel) - .offset(y: -2000) + .offset(y: -1750) .offset(z: -700) } } - -private extension 🛠️MenuTop { - private func hideButton() -> some View { - Button { - self.model.presentPanel = nil - } label: { - Image(systemName: "arrow.down.right.and.arrow.up.left") - .padding() - } - .buttonBorderShape(.circle) - .buttonStyle(.plain) - .frame(width: 60, height: 60) - } -} diff --git "a/HandsWidth/\360\237\233\240\357\270\217Menu/\360\237\233\240\357\270\217Panel.swift" "b/HandsRuler/\360\237\233\240\357\270\217Menu/\360\237\233\240\357\270\217Panel.swift" similarity index 100% rename from "HandsWidth/\360\237\233\240\357\270\217Menu/\360\237\233\240\357\270\217Panel.swift" rename to "HandsRuler/\360\237\233\240\357\270\217Menu/\360\237\233\240\357\270\217Panel.swift" diff --git "a/HandsRuler/\360\237\233\240\357\270\217Menu/\360\237\233\240\357\270\217SettingPanel.swift" "b/HandsRuler/\360\237\233\240\357\270\217Menu/\360\237\233\240\357\270\217SettingPanel.swift" new file mode 100644 index 0000000..06f1394 --- /dev/null +++ "b/HandsRuler/\360\237\233\240\357\270\217Menu/\360\237\233\240\357\270\217SettingPanel.swift" @@ -0,0 +1,34 @@ +import SwiftUI + +struct 🛠️SettingPanel: View { + @EnvironmentObject var model: 🥽AppModel + var body: some View { + NavigationStack { + VStack { + Spacer() + Picker("Unit", selection: self.$model.unit) { + ForEach(📏Unit.allCases) { + Text($0.value.symbol) + } + } + .pickerStyle(.segmented) + .frame(width: 360) + .padding(.bottom, 12) + Spacer() + } + .navigationTitle("Unit") + .toolbar { + Button { + self.model.presentPanel = nil + } label: { + Image(systemName: "arrow.down.right.and.arrow.up.left") + .padding(8) + } + .buttonBorderShape(.circle) + .buttonStyle(.plain) + } + } + .frame(height: 240) + .frame(width: 450) + } +} diff --git "a/HandsWidth/\360\237\245\275AppModel.swift" "b/HandsRuler/\360\237\245\275AppModel.swift" similarity index 100% rename from "HandsWidth/\360\237\245\275AppModel.swift" rename to "HandsRuler/\360\237\245\275AppModel.swift" diff --git "a/HandsWidth/\360\237\247\221HeadTrackingComponent&System.swift" "b/HandsRuler/\360\237\247\221HeadTrackingComponent&System.swift" similarity index 100% rename from "HandsWidth/\360\237\247\221HeadTrackingComponent&System.swift" rename to "HandsRuler/\360\237\247\221HeadTrackingComponent&System.swift" diff --git "a/HandsWidth/\360\237\247\251Entity.swift" "b/HandsRuler/\360\237\247\251Entity.swift" similarity index 100% rename from "HandsWidth/\360\237\247\251Entity.swift" rename to "HandsRuler/\360\237\247\251Entity.swift" diff --git "a/HandsWidth/\360\237\247\251Model.swift" "b/HandsRuler/\360\237\247\251Model.swift" similarity index 100% rename from "HandsWidth/\360\237\247\251Model.swift" rename to "HandsRuler/\360\237\247\251Model.swift" diff --git "a/HandsWidth/\360\237\247\251Name.swift" "b/HandsRuler/\360\237\247\251Name.swift" similarity index 100% rename from "HandsWidth/\360\237\247\251Name.swift" rename to "HandsRuler/\360\237\247\251Name.swift" diff --git a/HandsWidth/ContentView.swift b/HandsWidth/ContentView.swift deleted file mode 100644 index aeb2b13..0000000 --- a/HandsWidth/ContentView.swift +++ /dev/null @@ -1,36 +0,0 @@ -import SwiftUI - -struct ContentView: View { - @Environment(\.openImmersiveSpace) var openImmersiveSpace - @Environment(\.dismissWindow) var dismissWindow - var body: some View { - VStack(spacing: 32) { - Text("HandsWidth") - .font(.largeTitle.weight(.semibold)) - HStack(spacing: 28) { - Image(.graph1) - .resizable() - .aspectRatio(contentMode: .fit) - .frame(width: 300) - .clipShape(.rect(cornerRadius: 24)) - Image(.graph2) - .resizable() - .aspectRatio(contentMode: .fit) - .frame(width: 300) - .clipShape(.rect(cornerRadius: 24)) - } - Button { - Task { - await self.openImmersiveSpace(id: "immersiveSpace") - self.dismissWindow() - } - } label: { - Text("Start") - .font(.largeTitle) - .padding(.vertical, 12) - .padding(.horizontal, 4) - } - } - .padding(32) - } -} diff --git "a/HandsWidth/\360\237\233\240\357\270\217Menu/\360\237\233\240\357\270\217AboutPanel.swift" "b/HandsWidth/\360\237\233\240\357\270\217Menu/\360\237\233\240\357\270\217AboutPanel.swift" deleted file mode 100644 index f165146..0000000 --- "a/HandsWidth/\360\237\233\240\357\270\217Menu/\360\237\233\240\357\270\217AboutPanel.swift" +++ /dev/null @@ -1,51 +0,0 @@ -import SwiftUI - -struct 🛠️AboutPanel: View { - @EnvironmentObject var model: 🥽AppModel - var body: some View { - VStack(spacing: 24) { - HStack { - Spacer() - Text("HandsWidth") - .font(.largeTitle.weight(.semibold)) - Spacer() - } - .frame(height: 60) - HStack(spacing: 32) { - VStack(spacing: 12) { - Image(.graph1) - .resizable() - .aspectRatio(contentMode: .fit) - .frame(width: 300) - .clipShape(.rect(cornerRadius: 24)) - Text("Measurement of the distance between the fingers.") - .font(.caption) - .multilineTextAlignment(.center) - } - VStack(spacing: 12) { - Image(.graph2) - .resizable() - .aspectRatio(contentMode: .fit) - .frame(width: 300) - .clipShape(.rect(cornerRadius: 24)) - Text("Fix / Unfix a pointer by indirect tap.") - .font(.caption) - .multilineTextAlignment(.center) - } - } - .padding(.horizontal) - switch self.model.authorizationStatus { - case .notDetermined, .denied: - HStack(spacing: 24) { - Text("Hand tracking authorization:") - .fontWeight(.semibold) - Text(self.model.authorizationStatus?.description ?? "nil") - } - .font(.caption) - .foregroundStyle(.secondary) - default: - EmptyView() - } - } - } -} diff --git "a/HandsWidth/\360\237\233\240\357\270\217Menu/\360\237\233\240\357\270\217SettingPanel.swift" "b/HandsWidth/\360\237\233\240\357\270\217Menu/\360\237\233\240\357\270\217SettingPanel.swift" deleted file mode 100644 index 597107b..0000000 --- "a/HandsWidth/\360\237\233\240\357\270\217Menu/\360\237\233\240\357\270\217SettingPanel.swift" +++ /dev/null @@ -1,24 +0,0 @@ -import SwiftUI - -struct 🛠️SettingPanel: View { - @EnvironmentObject var model: 🥽AppModel - var body: some View { - VStack(spacing: 24) { - HStack { - Spacer() - Text("Unit") - .font(.largeTitle.weight(.semibold)) - Spacer() - } - .frame(height: 60) - Picker("Unit", selection: self.$model.unit) { - ForEach(📏Unit.allCases) { - Text($0.value.symbol) - } - } - .pickerStyle(.segmented) - .frame(height: 60) - .frame(width: 360) - } - } -} diff --git a/README.md b/README.md index 2d771d2..bf52ff7 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,16 @@ -HandsWidth +HandsRuler =========== __Measure app by hand tracking for Apple Vision Pro__ -_Hands is ruler._ +_Hands is measure._ - + - + - + Description @@ -29,9 +29,9 @@ Unit option Sub function - Fix a pointer by indirect tap. - + - + App Store link @@ -41,10 +41,10 @@ App Store link Source code link ----------------- -[github.com/FlipByBlink/HandsWidth](https://github.com/FlipByBlink/HandsWidth) +[github.com/FlipByBlink/HandsRuler](https://github.com/FlipByBlink/HandsRuler) ### Source code (Mirror) link -[gitlab.com/FlipByBlink/HandsWidth_Mirror](https://gitlab.com/FlipByBlink/HandsWidth_Mirror) +[gitlab.com/FlipByBlink/HandsRuler_Mirror](https://gitlab.com/FlipByBlink/HandsRuler_Mirror) Contact @@ -78,6 +78,6 @@ This application don't collect user infomation. - + - +