From 8c6dabfdf902fe98a09dd36623a95c3a074aa23d Mon Sep 17 00:00:00 2001 From: Jean Bovet Date: Wed, 14 Dec 2022 17:57:39 -0800 Subject: [PATCH] Fixed iOS build --- BChess.xcodeproj/project.pbxproj | 32 +++++++++--- .../xcschemes/BChess (macOS).xcscheme | 2 +- Shared/Actions.swift | 33 +++++++++++- Shared/ActionsToolbar.swift | 18 +++++++ Shared/Bridge/FEngine.h | 2 +- Shared/Bridge/FEngine.mm | 2 +- Shared/ChessDocument.swift | 10 ++-- Shared/Views/ContentView.swift | 4 +- ...nView.swift => NavigationActionView.swift} | 6 +-- Shared/Views/NewGameView_iOS.swift | 4 +- iOS/Info.plist | 51 +++++++++++++++++-- macOS/Info.plist | 16 ++++-- 12 files changed, 148 insertions(+), 32 deletions(-) rename Shared/Views/{NavigationView.swift => NavigationActionView.swift} (91%) diff --git a/BChess.xcodeproj/project.pbxproj b/BChess.xcodeproj/project.pbxproj index 46cd5d4..390eb62 100644 --- a/BChess.xcodeproj/project.pbxproj +++ b/BChess.xcodeproj/project.pbxproj @@ -33,8 +33,8 @@ A72E2B57200496CD006CBB1C /* BoardHashTests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A72E2B56200496CC006CBB1C /* BoardHashTests.cpp */; }; A731BD3720009856004C13EF /* Tournament.swift in Sources */ = {isa = PBXBuildFile; fileRef = A731BD3620009856004C13EF /* Tournament.swift */; }; A731BD392000A513004C13EF /* TournamentEngines.swift in Sources */ = {isa = PBXBuildFile; fileRef = A731BD382000A513004C13EF /* TournamentEngines.swift */; }; - A746997C2637CCF7007E0058 /* NavigationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A746997B2637CCF7007E0058 /* NavigationView.swift */; }; - A746997D2637CCF7007E0058 /* NavigationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A746997B2637CCF7007E0058 /* NavigationView.swift */; }; + A746997C2637CCF7007E0058 /* NavigationActionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A746997B2637CCF7007E0058 /* NavigationActionView.swift */; }; + A746997D2637CCF7007E0058 /* NavigationActionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A746997B2637CCF7007E0058 /* NavigationActionView.swift */; }; A746C244200148E9001F4437 /* ChessBoardHash.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A746C242200148E9001F4437 /* ChessBoardHash.cpp */; }; A746C245200148ED001F4437 /* ChessBoardHash.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A746C242200148E9001F4437 /* ChessBoardHash.cpp */; }; A746C2492001707F001F4437 /* GameHistory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A746C2472001707F001F4437 /* GameHistory.cpp */; }; @@ -229,7 +229,7 @@ A72E2B56200496CC006CBB1C /* BoardHashTests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BoardHashTests.cpp; sourceTree = ""; }; A731BD3620009856004C13EF /* Tournament.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tournament.swift; sourceTree = ""; }; A731BD382000A513004C13EF /* TournamentEngines.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TournamentEngines.swift; sourceTree = ""; }; - A746997B2637CCF7007E0058 /* NavigationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationView.swift; sourceTree = ""; }; + A746997B2637CCF7007E0058 /* NavigationActionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationActionView.swift; sourceTree = ""; }; A746C242200148E9001F4437 /* ChessBoardHash.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = ChessBoardHash.cpp; sourceTree = ""; }; A746C243200148E9001F4437 /* ChessBoardHash.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = ChessBoardHash.hpp; sourceTree = ""; }; A746C2472001707F001F4437 /* GameHistory.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = GameHistory.cpp; sourceTree = ""; }; @@ -590,7 +590,7 @@ A72C3E012650D78100CB9DB7 /* VariationSelectionView.swift */, A77F66AE25A832240030E61D /* ContentView.swift */, A7A30F2E25B2BAFC00729432 /* PromotionView.swift */, - A746997B2637CCF7007E0058 /* NavigationView.swift */, + A746997B2637CCF7007E0058 /* NavigationActionView.swift */, A712C255265377C000E05408 /* Arrow.swift */, ); path = Views; @@ -760,7 +760,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 1230; - LastUpgradeCheck = 1230; + LastUpgradeCheck = 1410; ORGANIZATIONNAME = "Jean Bovet"; TargetAttributes = { A7712D131FB916E900E7E802 = { @@ -920,7 +920,7 @@ A712C25326522F6000E05408 /* FullMove.swift in Sources */, A791117F264B92E500F97FA7 /* FEngineGame+Private.h in Sources */, A795162225ABE59900AEA95F /* PlayAgainst.swift in Sources */, - A746997C2637CCF7007E0058 /* NavigationView.swift in Sources */, + A746997C2637CCF7007E0058 /* NavigationActionView.swift in Sources */, A7FE324E25AAD61200A75936 /* FEngineUtility.mm in Sources */, A79515F625ABE44000AEA95F /* PiecesView.swift in Sources */, A7BC72E42636003F008FBBB4 /* NewGameView.swift in Sources */, @@ -978,7 +978,7 @@ A712C25426522F6000E05408 /* FullMove.swift in Sources */, A7911180264B92E500F97FA7 /* FEngineGame+Private.h in Sources */, A7FE31CB25AA96A800A75936 /* FEngineUtility.mm in Sources */, - A746997D2637CCF7007E0058 /* NavigationView.swift in Sources */, + A746997D2637CCF7007E0058 /* NavigationActionView.swift in Sources */, A79515F725ABE44000AEA95F /* PiecesView.swift in Sources */, A758BB0725AC119C0092714E /* Actions.swift in Sources */, A716976D262BFF8C00156BD6 /* SettingsView.swift in Sources */, @@ -1086,6 +1086,7 @@ CLANG_WARN_ASSIGN_ENUM = YES; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; + DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = 28XRU7S6GA; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -1097,6 +1098,7 @@ ); INFOPLIST_FILE = BChessTests/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; PRODUCT_BUNDLE_IDENTIFIER = "ch.arizona-software.BChessTests"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "BChess/BChess-Bridging-Header.h"; @@ -1109,6 +1111,7 @@ CLANG_WARN_ASSIGN_ENUM = YES; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; + DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = 28XRU7S6GA; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -1120,6 +1123,7 @@ ); INFOPLIST_FILE = BChessTests/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; PRODUCT_BUNDLE_IDENTIFIER = "ch.arizona-software.BChessTests"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "BChess/BChess-Bridging-Header.h"; @@ -1139,6 +1143,7 @@ INFOPLIST_FILE = iOS/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; MARKETING_VERSION = 0.2; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; @@ -1164,6 +1169,7 @@ INFOPLIST_FILE = iOS/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; MARKETING_VERSION = 0.2; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = "ch.arizona-software.BChess"; @@ -1187,6 +1193,7 @@ CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; CURRENT_PROJECT_VERSION = 110; + DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = 28XRU7S6GA; ENABLE_HARDENED_RUNTIME = YES; ENABLE_PREVIEWS = YES; @@ -1215,6 +1222,7 @@ CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; CURRENT_PROJECT_VERSION = 110; + DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = 28XRU7S6GA; ENABLE_HARDENED_RUNTIME = YES; ENABLE_PREVIEWS = YES; @@ -1241,6 +1249,7 @@ INFOPLIST_FILE = "Tests iOS/Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 14.3; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = "ch.arizona-software.Tests-iOS"; @@ -1262,6 +1271,7 @@ INFOPLIST_FILE = "Tests iOS/Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 14.3; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = "ch.arizona-software.Tests-iOS"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1280,6 +1290,7 @@ CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; + DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = 28XRU7S6GA; INFOPLIST_FILE = "Tests macOS/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; @@ -1300,6 +1311,7 @@ CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; + DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = 28XRU7S6GA; INFOPLIST_FILE = "Tests macOS/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; @@ -1346,6 +1358,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "Mac Developer"; COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; @@ -1407,6 +1420,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "Mac Developer"; COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; @@ -1432,8 +1446,10 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Automatic; + DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = 28XRU7S6GA; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "BChess/BChess-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -1446,8 +1462,10 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Automatic; + DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = 28XRU7S6GA; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "BChess/BChess-Bridging-Header.h"; }; diff --git a/BChess.xcodeproj/xcshareddata/xcschemes/BChess (macOS).xcscheme b/BChess.xcodeproj/xcshareddata/xcschemes/BChess (macOS).xcscheme index 571e9bf..315f3a2 100644 --- a/BChess.xcodeproj/xcshareddata/xcschemes/BChess (macOS).xcscheme +++ b/BChess.xcodeproj/xcshareddata/xcschemes/BChess (macOS).xcscheme @@ -1,6 +1,6 @@ Bool { return engine.canMove(to: to); } @@ -124,7 +155,7 @@ struct Actions { pb.declareTypes([.string], owner: nil) pb.setString(engine.getPGNCurrentGame(), forType: .string) #else - UIPasteboard.general.string = engine.pgn() + UIPasteboard.general.string = engine.getPGNCurrentGame() #endif } diff --git a/Shared/ActionsToolbar.swift b/Shared/ActionsToolbar.swift index debf1cd..54af725 100644 --- a/Shared/ActionsToolbar.swift +++ b/Shared/ActionsToolbar.swift @@ -79,6 +79,24 @@ struct RotateBoard: View { } } +struct UndoMoveButton: View { + @Binding var document: ChessDocument + var body: some View { + Button(action: { Actions(document: $document).undoMove() }) { + Label("Undo Move", systemImage: "arrow.uturn.backward.square") + }.disabled(!document.engine.canMove(to: .backward)) + } +} + +struct RedoMoveButton: View { + @Binding var document: ChessDocument + var body: some View { + Button(action: { Actions(document: $document).redoMove() }) { + Label("Redo Move", systemImage: "arrow.uturn.forward.square") + }.disabled(!document.engine.canMove(to: .forward)) + } +} + struct CopyFENButton: View { @Binding var document: ChessDocument var body: some View { diff --git a/Shared/Bridge/FEngine.h b/Shared/Bridge/FEngine.h index 105cded..9f377e9 100644 --- a/Shared/Bridge/FEngine.h +++ b/Shared/Bridge/FEngine.h @@ -68,7 +68,7 @@ typedef NS_ENUM(NSInteger, Direction){ // Perform the next move given the direction and variation index - (void)moveTo:(Direction)direction variation:(NSUInteger)variation; // Returns the next move UUID given the direction -- (UInt)moveUUID:(Direction)direction; +- (NSUInteger)moveUUID:(Direction)direction; - (void)move:(NSString* _Nonnull)from to:(NSString* _Nonnull)to; diff --git a/Shared/Bridge/FEngine.mm b/Shared/Bridge/FEngine.mm index 69af909..f207873 100644 --- a/Shared/Bridge/FEngine.mm +++ b/Shared/Bridge/FEngine.mm @@ -235,7 +235,7 @@ - (void)moveTo:(Direction)direction variation:(NSUInteger)variation { [self fireUpdate:self.stateIndex]; } -- (UInt)moveUUID:(Direction)direction { +- (NSUInteger)moveUUID:(Direction)direction { auto nextIndexes = engine.game().moveIndexesTo([self gameDirection:direction]); return engine.game().getMoveUUID(nextIndexes); } diff --git a/Shared/ChessDocument.swift b/Shared/ChessDocument.swift index 057f47f..17c32c8 100644 --- a/Shared/ChessDocument.swift +++ b/Shared/ChessDocument.swift @@ -10,8 +10,8 @@ import SwiftUI import UniformTypeIdentifiers extension UTType { - static var exampleText: UTType { - UTType(importedAs: "com.example.plain-text") + static var json: UTType { + UTType(importedAs: "ch.arizona-software.chess.json") } static var pgn: UTType { UTType(importedAs: "com.apple.chess.pgn") @@ -137,14 +137,14 @@ struct ChessDocument: FileDocument { assert(result) } - static var readableContentTypes: [UTType] { [.exampleText, .pgn] } + static var readableContentTypes: [UTType] { [.json, .pgn] } init(configuration: ReadConfiguration) throws { guard let data = configuration.file.regularFileContents else { throw CocoaError(.fileReadCorruptFile) } - if configuration.contentType == .exampleText { + if configuration.contentType == .json { let decoder = JSONDecoder() let state = try decoder.decode(GameState.self, from: data) @@ -161,7 +161,7 @@ struct ChessDocument: FileDocument { func fileWrapper(configuration: WriteConfiguration) throws -> FileWrapper { let pgnToWrite = mode.value != .play ? mode.pgnBeforeAnalyzing : pgn switch configuration.contentType { - case .exampleText: + case .json: let state = GameState(pgn: pgnToWrite, rotated: rotated, white: whitePlayer, black: blackPlayer) let encoder = JSONEncoder() let data = try encoder.encode(state) diff --git a/Shared/Views/ContentView.swift b/Shared/Views/ContentView.swift index ac2235b..a790c8c 100644 --- a/Shared/Views/ContentView.swift +++ b/Shared/Views/ContentView.swift @@ -38,11 +38,13 @@ struct ContentView: View { } if (showInfo) { +#if os(macOS) VStack(alignment: .leading, spacing: 10) { - NavigationView(document: $document) + NavigationActionView(document: $document) InformationView(document: $document) } .frame(minWidth: 350, idealWidth: 350, maxWidth: 350, alignment: .leading) +#endif } } .padding() diff --git a/Shared/Views/NavigationView.swift b/Shared/Views/NavigationActionView.swift similarity index 91% rename from Shared/Views/NavigationView.swift rename to Shared/Views/NavigationActionView.swift index a4f2501..4eb7ae0 100644 --- a/Shared/Views/NavigationView.swift +++ b/Shared/Views/NavigationActionView.swift @@ -8,7 +8,7 @@ import SwiftUI -struct NavigationView: View { +struct NavigationActionView: View { @Binding var document: ChessDocument @@ -49,9 +49,9 @@ struct NavigationView: View { } } -struct NavigationView_Previews: PreviewProvider { +struct NavigationActionView_Previews: PreviewProvider { static var previews: some View { let doc = try! ChessDocument() - NavigationView(document: .constant(doc)) + NavigationActionView(document: .constant(doc)) } } diff --git a/Shared/Views/NewGameView_iOS.swift b/Shared/Views/NewGameView_iOS.swift index 3730b3c..35e1ecb 100644 --- a/Shared/Views/NewGameView_iOS.swift +++ b/Shared/Views/NewGameView_iOS.swift @@ -89,11 +89,11 @@ struct NewGameView_iOS: View { struct NewGameView_iOS_Previews: PreviewProvider { static var previews: some View { Group { - let doc = ChessDocument() + let doc = try! ChessDocument() NewGameView_iOS(document: .constant(doc), editMode: false) } Group { - let doc = ChessDocument() + let doc = try! ChessDocument() NewGameView_iOS(document: .constant(doc), editMode: true) } } diff --git a/iOS/Info.plist b/iOS/Info.plist index c783b9d..6b5db5b 100644 --- a/iOS/Info.plist +++ b/iOS/Info.plist @@ -7,12 +7,30 @@ CFBundleDocumentTypes + CFBundleTypeName + BChess + CFBundleTypeRole + Editor + LSHandlerRank + Default LSItemContentTypes - com.example.plain-text + ch.arizona-software.chess.json NSUbiquitousDocumentUserActivityType - $(PRODUCT_BUNDLE_IDENTIFIER).example-document + $(PRODUCT_BUNDLE_IDENTIFIER).json + + + CFBundleTypeName + Portable Game Notation + CFBundleTypeRole + Editor + LSHandlerRank + Default + LSItemContentTypes + + com.apple.chess.pgn + CFBundleExecutable @@ -63,20 +81,43 @@ UTImportedTypeDeclarations + + UTTypeConformsTo + + public.json + + UTTypeDescription + Chess Format + UTTypeIconFiles + + UTTypeIcons + + UTTypeIdentifier + ch.arizona-software.chess.json + UTTypeTagSpecification + + public.filename-extension + + json + + + UTTypeConformsTo public.plain-text UTTypeDescription - Example Text + Portable Game Notation + UTTypeIcons + UTTypeIdentifier - com.example.plain-text + com.apple.chess.pgn UTTypeTagSpecification public.filename-extension - exampletext + pgn diff --git a/macOS/Info.plist b/macOS/Info.plist index 40928cb..7c2c270 100644 --- a/macOS/Info.plist +++ b/macOS/Info.plist @@ -7,14 +7,18 @@ CFBundleDocumentTypes + CFBundleTypeName + BChess CFBundleTypeRole Editor + LSHandlerRank + Default LSItemContentTypes - com.example.plain-text + ch.arizona-software.chess.json NSUbiquitousDocumentUserActivityType - $(PRODUCT_BUNDLE_IDENTIFIER).example-document + $(PRODUCT_BUNDLE_IDENTIFIER).json CFBundleTypeName @@ -57,14 +61,16 @@ public.plain-text UTTypeDescription - Example Text + JSON + UTTypeIcons + UTTypeIdentifier - com.example.plain-text + public.json UTTypeTagSpecification public.filename-extension - exampletext + json