From 907d4d1b4e327c4e9cc73177b3d24a504fea0ac6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=85=D0=B0=D0=B8=D0=BB=20=D0=9A=D0=B0=D0=BF?= =?UTF-8?q?=D0=B5=D0=BB=D1=8C=D0=BA=D0=BE?= Date: Mon, 22 May 2023 20:04:42 +0300 Subject: [PATCH] d --- iOS/app/MMMemory.xcodeproj/project.pbxproj | 4 +++ .../UserInterfaceState.xcuserstate | Bin 25943 -> 27964 bytes iOS/src/Model.swift | 28 ++++++++++++++++++ 3 files changed, 32 insertions(+) create mode 100644 iOS/src/Model.swift diff --git a/iOS/app/MMMemory.xcodeproj/project.pbxproj b/iOS/app/MMMemory.xcodeproj/project.pbxproj index 0f7c78b..cf84228 100644 --- a/iOS/app/MMMemory.xcodeproj/project.pbxproj +++ b/iOS/app/MMMemory.xcodeproj/project.pbxproj @@ -10,6 +10,7 @@ 1F083A14C69F20A6BA92A63E /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F16A7DD61EF6CD4FB4E3DE25 /* AppDelegate.swift */; }; 3D03666F3BC2B1F2CBB49530 /* Main.SectionSelection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D5F2B2E3A26F03F6825608E /* Main.SectionSelection.swift */; }; 79FB208C9DADDA6179E588C3 /* Main.SectionGrid.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AC22F19366076CF4168BFBD /* Main.SectionGrid.swift */; }; + 89086E3972F560A9A1A76CE4 /* Model.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C71EDBDFFDBC96F6E8E7762 /* Model.swift */; }; B19B3998FA2BA651ACB1E53C /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C1742EFC5A1E818780679340 /* Assets.xcassets */; }; CAFD870CA84084E45011CC23 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4E32B0495E4BCEA4EE0508D4 /* LaunchScreen.storyboard */; }; D505E64F4CD6EAEB530BF851 /* Main.Section16Buttons.swift in Sources */ = {isa = PBXBuildFile; fileRef = A38A1AA6B57483F6B44CDF78 /* Main.Section16Buttons.swift */; }; @@ -22,6 +23,7 @@ 4E32B0495E4BCEA4EE0508D4 /* LaunchScreen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = ""; }; 6D5F2B2E3A26F03F6825608E /* Main.SectionSelection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Main.SectionSelection.swift; sourceTree = ""; }; 9AC22F19366076CF4168BFBD /* Main.SectionGrid.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Main.SectionGrid.swift; sourceTree = ""; }; + 9C71EDBDFFDBC96F6E8E7762 /* Model.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Model.swift; sourceTree = ""; }; 9D774FEE86833E8A0A74387C /* App.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = App.app; sourceTree = BUILT_PRODUCTS_DIR; }; A355A898E25602F45B88CCBA /* Main.Platform.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Main.Platform.swift; sourceTree = ""; }; A38A1AA6B57483F6B44CDF78 /* Main.Section16Buttons.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Main.Section16Buttons.swift; sourceTree = ""; }; @@ -41,6 +43,7 @@ 9AC22F19366076CF4168BFBD /* Main.SectionGrid.swift */, 6D5F2B2E3A26F03F6825608E /* Main.SectionSelection.swift */, 0DF762100A8EDF105B6E136D /* Main.swift */, + 9C71EDBDFFDBC96F6E8E7762 /* Model.swift */, ); name = src; path = ../src; @@ -130,6 +133,7 @@ 79FB208C9DADDA6179E588C3 /* Main.SectionGrid.swift in Sources */, 3D03666F3BC2B1F2CBB49530 /* Main.SectionSelection.swift in Sources */, DB1010B8A246D47BEC6B3FA6 /* Main.swift in Sources */, + 89086E3972F560A9A1A76CE4 /* Model.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/iOS/app/MMMemory.xcodeproj/project.xcworkspace/xcuserdata/mk.xcuserdatad/UserInterfaceState.xcuserstate b/iOS/app/MMMemory.xcodeproj/project.xcworkspace/xcuserdata/mk.xcuserdatad/UserInterfaceState.xcuserstate index 1c6ecbb997ab7e6749a4fdf9958634142346201f..f7b47a20a8bdbbcb5454d29ad776fd80d39bf09f 100644 GIT binary patch delta 13489 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 diff --git a/iOS/src/Model.swift b/iOS/src/Model.swift new file mode 100644 index 0000000..0e25dc3 --- /dev/null +++ b/iOS/src/Model.swift @@ -0,0 +1,28 @@ +import Foundation + +protocol MItemsCount { + var itemsCount: Int { get } +} + +func memorySide() -> CGFloat { + return 50 +} + +func memorySpace() -> CGFloat { + return 20 +} + +func memoryGap() -> CGFloat { + return memorySide() + memorySpace() +} + +func memoryItemPositions(M: MItemsCount) -> [(CGFloat, CGFloat)] { + var pos = [(CGFloat, CGFloat)]() + for i in stride(from: 0, to: M.itemsCount, by: 1) { + let row = floor(Double(i) / 4) + let x = memoryGap() + (Double(i) - row * 4) * memoryGap() + let y = memoryGap() + row * memoryGap() + pos.append((x, y)) + } + return pos +}