diff --git a/DouShouQi_App/DouShouQi_App.xcodeproj/project.pbxproj b/DouShouQi_App/DouShouQi_App.xcodeproj/project.pbxproj index a32fdea..79ff41e 100644 --- a/DouShouQi_App/DouShouQi_App.xcodeproj/project.pbxproj +++ b/DouShouQi_App/DouShouQi_App.xcodeproj/project.pbxproj @@ -57,6 +57,9 @@ EC62C5292C1974000048CD0B /* PlayersVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC62C5282C1974000048CD0B /* PlayersVM.swift */; }; EC62C52D2C197ED10048CD0B /* Player.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC62C52C2C197ED10048CD0B /* Player.swift */; }; EC62C5332C1C188F0048CD0B /* DSQ.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = EC62C5322C1C188F0048CD0B /* DSQ.xcframework */; }; + EC62C5382C1C64EE0048CD0B /* CoreManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC62C5372C1C64EE0048CD0B /* CoreManager.swift */; }; + EC62C53D2C1C69200048CD0B /* DouShouQi_App.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = EC62C53B2C1C69200048CD0B /* DouShouQi_App.xcdatamodeld */; }; + EC62C53F2C1C6D1A0048CD0B /* CDPlayerExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC62C53E2C1C6D1A0048CD0B /* CDPlayerExtension.swift */; }; EC99D5C12C089F6B00731B62 /* GameResumeFrame.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC99D5C02C089F6B00731B62 /* GameResumeFrame.swift */; }; ECB6364E2C04628E007CD5E2 /* SpriteMeeple.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECB6364D2C04628E007CD5E2 /* SpriteMeeple.swift */; }; ECB636512C046379007CD5E2 /* MusicPlayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECB636502C046379007CD5E2 /* MusicPlayer.swift */; }; @@ -136,6 +139,9 @@ EC62C5282C1974000048CD0B /* PlayersVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlayersVM.swift; sourceTree = ""; }; EC62C52C2C197ED10048CD0B /* Player.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Player.swift; sourceTree = ""; }; EC62C5322C1C188F0048CD0B /* DSQ.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = DSQ.xcframework; path = ../../SwiftUI_ARKit_2024/XCFramework/DSQ.xcframework; sourceTree = ""; }; + EC62C5372C1C64EE0048CD0B /* CoreManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoreManager.swift; sourceTree = ""; }; + EC62C53C2C1C69200048CD0B /* DouShouQi_App.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = DouShouQi_App.xcdatamodel; sourceTree = ""; }; + EC62C53E2C1C6D1A0048CD0B /* CDPlayerExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CDPlayerExtension.swift; sourceTree = ""; }; EC99D5C02C089F6B00731B62 /* GameResumeFrame.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GameResumeFrame.swift; sourceTree = ""; }; ECB6364D2C04628E007CD5E2 /* SpriteMeeple.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpriteMeeple.swift; sourceTree = ""; }; ECB636502C046379007CD5E2 /* MusicPlayer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MusicPlayer.swift; sourceTree = ""; }; @@ -206,6 +212,7 @@ 6458345B2BF5F92300E18321 /* DouShouQi_AppApp.swift */, 6458345D2BF5F92300E18321 /* ContentView.swift */, 6458345F2BF5F92500E18321 /* Assets.xcassets */, + EC62C53B2C1C69200048CD0B /* DouShouQi_App.xcdatamodeld */, 645834612BF5F92500E18321 /* Preview Content */, ); path = DouShouQi_App; @@ -421,6 +428,7 @@ EC62C5232C0F68730048CD0B /* Extensions */ = { isa = PBXGroup; children = ( + EC62C53E2C1C6D1A0048CD0B /* CDPlayerExtension.swift */, ); path = Extensions; sourceTree = ""; @@ -433,10 +441,12 @@ ); path = Players; sourceTree = ""; + tabWidth = 4; }; EC62C52B2C197EA80048CD0B /* Class */ = { isa = PBXGroup; children = ( + ECE7770E2C1C6FB200D354B0 /* CoreData */, EC62C52C2C197ED10048CD0B /* Player.swift */, ); path = Class; @@ -451,6 +461,14 @@ path = SoundPlayerClass; sourceTree = ""; }; + ECE7770E2C1C6FB200D354B0 /* CoreData */ = { + isa = PBXGroup; + children = ( + EC62C5372C1C64EE0048CD0B /* CoreManager.swift */, + ); + path = CoreData; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -606,13 +624,16 @@ 649B59A42BF64574002BAE38 /* TitlePageFrame.swift in Sources */, EC0540C42C08A13E0032E9EF /* GameView.swift in Sources */, EC05BFC42C04C3C4000F7B19 /* SettingsView.swift in Sources */, + EC62C53D2C1C69200048CD0B /* DouShouQi_App.xcdatamodeld in Sources */, EC62C50F2C05D06A0048CD0B /* AddPlayerView.swift in Sources */, + EC62C53F2C1C6D1A0048CD0B /* CDPlayerExtension.swift in Sources */, 64FC4D6B2C09C7C900D08B8B /* SelectPlayerButtonView.swift in Sources */, 646F04C12C0F5C11003C8600 /* Language.swift in Sources */, EC05BFC82C04D832000F7B19 /* CustomSwitchButton.swift in Sources */, 64D992722C06281B002ACBC6 /* SystemIcons.swift in Sources */, 645B4C252BFCD3C600FD658A /* ScoreBoardView.swift in Sources */, 649ABF602BF60F2D002E8894 /* MainMenuButton.swift in Sources */, + EC62C5382C1C64EE0048CD0B /* CoreManager.swift in Sources */, EC62C5252C0F68830048CD0B /* PlayerVM.swift in Sources */, EC62C51B2C09D1790048CD0B /* PlayerStatView.swift in Sources */, 649B59B22BF65392002BAE38 /* TextStyles.swift in Sources */, @@ -951,6 +972,19 @@ defaultConfigurationName = Release; }; /* End XCConfigurationList section */ + +/* Begin XCVersionGroup section */ + EC62C53B2C1C69200048CD0B /* DouShouQi_App.xcdatamodeld */ = { + isa = XCVersionGroup; + children = ( + EC62C53C2C1C69200048CD0B /* DouShouQi_App.xcdatamodel */, + ); + currentVersion = EC62C53C2C1C69200048CD0B /* DouShouQi_App.xcdatamodel */; + path = DouShouQi_App.xcdatamodeld; + sourceTree = ""; + versionGroupType = wrapper.xcdatamodel; + }; +/* End XCVersionGroup section */ }; rootObject = 645834502BF5F92300E18321 /* Project object */; } diff --git a/DouShouQi_App/DouShouQi_App/AppModelAndExtension/Class/CoreData/CoreManager.swift b/DouShouQi_App/DouShouQi_App/AppModelAndExtension/Class/CoreData/CoreManager.swift new file mode 100644 index 0000000..78d07da --- /dev/null +++ b/DouShouQi_App/DouShouQi_App/AppModelAndExtension/Class/CoreData/CoreManager.swift @@ -0,0 +1,58 @@ +// +// CoreManger.swift +// DouShouQi_App +// +// Created by étudiant on 14/06/2024. +// + +import Foundation +import CoreData +import DouShouQiModel +import Combine + +class CoreDataManager { + static let shared = CoreDataManager() + private init() {} + + lazy var persistentContainer: NSPersistentContainer = { + let container = NSPersistentContainer(name: "DouShouQi_App") // Remplacez par le nom de votre modèle + container.loadPersistentStores { (storeDescription, error) in + if let error = error as NSError? { + fatalError("Unresolved error \(error), \(error.userInfo)") + } + } + return container + }() + + var context: NSManagedObjectContext { + return persistentContainer.viewContext + } + + func saveContext() { + if context.hasChanges { + do { + try context.save() + } catch { + let nserror = error as NSError + fatalError("Unresolved error \(nserror), \(nserror.userInfo)") + } + } + } + + func savePlayer(playerVM: PlayerVM) { + let player = CDPlayer(context: context) + player.name = playerVM.player.name + player.photo = playerVM.player.photo + saveContext() + } + + func fetchPlayers() -> [CDPlayer] { + let fetchRequest: NSFetchRequest = CDPlayer.fetchRequest() + do { + return try context.fetch(fetchRequest) + } catch { + print("Failed to fetch players: \(error)") + return [] + } + } +} diff --git a/DouShouQi_App/DouShouQi_App/AppModelAndExtension/Extensions/CDPlayerExtension.swift b/DouShouQi_App/DouShouQi_App/AppModelAndExtension/Extensions/CDPlayerExtension.swift new file mode 100644 index 0000000..9916d7f --- /dev/null +++ b/DouShouQi_App/DouShouQi_App/AppModelAndExtension/Extensions/CDPlayerExtension.swift @@ -0,0 +1,22 @@ +// +// CDPlayerExtension.swift +// DouShouQi_App +// +// Created by étudiant on 14/06/2024. +// + +import Foundation +import CoreData + +extension CDPlayer { + func toModel() -> Player { + return Player(name: self.name ?? "", photo: self.photo ?? "") + } + + convenience init(name: String, photo: String, context: NSManagedObjectContext){ + self.init(context: context) + self.name = name + self.photo = photo + } +} + diff --git a/DouShouQi_App/DouShouQi_App/DouShouQi_App.xcdatamodeld/DouShouQi_App.xcdatamodel/contents b/DouShouQi_App/DouShouQi_App/DouShouQi_App.xcdatamodeld/DouShouQi_App.xcdatamodel/contents new file mode 100644 index 0000000..0d70375 --- /dev/null +++ b/DouShouQi_App/DouShouQi_App/DouShouQi_App.xcdatamodeld/DouShouQi_App.xcdatamodel/contents @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/DouShouQi_App/DouShouQi_App/DouShouQi_AppApp.swift b/DouShouQi_App/DouShouQi_App/DouShouQi_AppApp.swift index 83e554c..111893b 100644 --- a/DouShouQi_App/DouShouQi_App/DouShouQi_AppApp.swift +++ b/DouShouQi_App/DouShouQi_App/DouShouQi_AppApp.swift @@ -8,7 +8,7 @@ import SwiftUI -@main + @main struct DouShouQi_AppApp: App { // Create an instance of SettingsVM @StateObject private var settingsVM = SettingsVM() diff --git a/DouShouQi_App/DouShouQi_App/ViewModel/Players/PlayersVM.swift b/DouShouQi_App/DouShouQi_App/ViewModel/Players/PlayersVM.swift index 615e18d..ec46dfc 100644 --- a/DouShouQi_App/DouShouQi_App/ViewModel/Players/PlayersVM.swift +++ b/DouShouQi_App/DouShouQi_App/ViewModel/Players/PlayersVM.swift @@ -7,6 +7,8 @@ import Foundation import DouShouQiModel +import CoreData +import Combine public class PlayersVM: ObservableObject{ @@ -15,24 +17,31 @@ public class PlayersVM: ObservableObject{ public func SavePlayer(player: PlayerVM){ players.append(player) + CoreDataManager.shared.savePlayer(playerVM: player) } public func contains(where predicate: (PlayerVM) -> Bool) -> Bool { - return players.contains(where: predicate) - } + return players.contains(where: predicate) + } - //public func getAllPlayer(): [PlayerVM]{} + public func getAllPlayer() -> [PlayerVM]{ + let coreDataPlayers = CoreDataManager.shared.fetchPlayers() + self.players = coreDataPlayers.map { PlayerVM(player: $0.toModel()) } + return players + } - init() { + init() { players = [] - let player = PlayerVM(player: Player(name: "Rayhan", photo: "")) + players = getAllPlayer() + + /* let player = PlayerVM(player: Player(name: "Rayhan", photo: "")) players.append(player) - let player2 = PlayerVM(player: Player(name: "Nathan", photo: "")) - players.append(player2) - let player3 = PlayerVM(player: Player(name: "ayoub", photo: "")) - players.append(player3) + let player2 = PlayerVM(player: Player(name: "Nathan", photo: "")) + players.append(player2) + let player3 = PlayerVM(player: Player(name: "ayoub", photo: "")) + players.append(player3) */ } } diff --git a/DouShouQi_App/DouShouQi_App/Views/Player/PlayersView.swift b/DouShouQi_App/DouShouQi_App/Views/Player/PlayersView.swift index c4b1337..ac6a060 100644 --- a/DouShouQi_App/DouShouQi_App/Views/Player/PlayersView.swift +++ b/DouShouQi_App/DouShouQi_App/Views/Player/PlayersView.swift @@ -36,7 +36,7 @@ struct PlayersView: View { SearchBar(text: $searchText) .padding(.horizontal) - + List { ForEach(groupedPlayers.keys.sorted(), id: \.self) { key in Section(header: Text(key)) {