diff --git a/Zockerhoehle/CDModel/Console+CoreDataProperties.swift b/Zockerhoehle/CDModel/Console+CoreDataProperties.swift index 18f41bb..5eadfc6 100644 --- a/Zockerhoehle/CDModel/Console+CoreDataProperties.swift +++ b/Zockerhoehle/CDModel/Console+CoreDataProperties.swift @@ -19,7 +19,7 @@ extension Console { @NSManaged public var generation: Int64 @NSManaged public var manufacturer: String? - @NSManaged public var name: String? + @NSManaged public var name: String @NSManaged public var shortName: String? @NSManaged public var uuid: UUID @NSManaged public var accessories: NSSet? diff --git a/Zockerhoehle/CDModel/Game+CoreDataClass.swift b/Zockerhoehle/CDModel/Game+CoreDataClass.swift index f932828..12a52c6 100644 --- a/Zockerhoehle/CDModel/Game+CoreDataClass.swift +++ b/Zockerhoehle/CDModel/Game+CoreDataClass.swift @@ -49,6 +49,7 @@ extension Game : Encodable { case createdAt case publisher case isFinished + case finishedDate case inWishlist case console case cover_icloud_path @@ -67,6 +68,7 @@ extension Game : Encodable { try container.encode(pickupDescription ?? "", forKey: .pickupDescription) try container.encode(publisher ?? "", forKey: .publisher) try container.encode(isFinished, forKey: .isFinished) + try container.encode(finishedDate, forKey: .finishedDate) try container.encode(inWishlist, forKey: .inWishlist) try container.encode(cover_icloud_path ?? "", forKey: .cover_icloud_path) diff --git a/Zockerhoehle/CDModel/Game+CoreDataProperties.swift b/Zockerhoehle/CDModel/Game+CoreDataProperties.swift index d17528a..b974bb3 100644 --- a/Zockerhoehle/CDModel/Game+CoreDataProperties.swift +++ b/Zockerhoehle/CDModel/Game+CoreDataProperties.swift @@ -23,8 +23,9 @@ extension Game { @NSManaged public var inWishlist: Bool @NSManaged public var isDigital: Bool @NSManaged public var isFinished: Bool + @NSManaged public var finishedDate : Date? @NSManaged public var lentTo: String? - @NSManaged public var name: String? + @NSManaged public var name: String @NSManaged public var notes: String? @NSManaged public var publisher: String? @NSManaged public var uuid: UUID diff --git a/Zockerhoehle/Utils/LibraryImport.swift b/Zockerhoehle/Utils/LibraryImport.swift index f8e9f50..9f16d32 100644 --- a/Zockerhoehle/Utils/LibraryImport.swift +++ b/Zockerhoehle/Utils/LibraryImport.swift @@ -71,13 +71,15 @@ class LibraryImport { private func makeCDGame(from game: BHLGame, _ gameDict: inout [UUID : Game], _ cdConsole: Console) { let cdGame = Game(context: CDManager.shared.viewContext) gameDict[game.uuid] = cdGame - cdGame.name = game.name + cdGame.name = game.name ?? "n/a" cdGame.uuid = game.uuid cdGame.inWishlist = game.inWishlist cdGame.isFinished = game.isFinished + cdGame.finishedDate = game.finishedDate cdGame.lentTo = game.lentTo cdGame.cover_icloud_path = game.cover_icloud_path cdGame.pickupDescription = game.pickupDescription + cdGame.isDigital = game.isDigital if let date = Date.from(string: game.createdAt) { cdGame.createdAt = date @@ -85,8 +87,6 @@ class LibraryImport { print("Could not decode date '\(game.createdAt)' for game '\(cdGame.name)'") } - //TODO: cdGame.createdAt = game.createdAt. - cdConsole.addToGames(cdGame) cdGame.console = cdConsole print("Imported: \(cdGame.name) for \(cdConsole.name)") @@ -108,7 +108,7 @@ class LibraryImport { private func makeCDConsole(from console : BHLConsole) -> Console { let cdConsole = Console(context: CDManager.shared.viewContext) - cdConsole.name = console.name + cdConsole.name = console.name ?? "n/a" cdConsole.uuid = console.uuid cdConsole.manufacturer = console.manufacturer cdConsole.shortName = console.shortName @@ -190,11 +190,12 @@ struct BHLibrary : Decodable { struct BHLGame : Decodable { let uuid : UUID - let name : String + let name : String? let lentTo : String? let isDigital : Bool let inWishlist : Bool let isFinished : Bool + let finishedDate : Date? let notes : String? let createdAt : String let pickupDescription : String? @@ -222,7 +223,7 @@ struct BHLGameSeries : Decodable { struct BHLConsole : Decodable { let uuid : UUID - let name : String + let name : String? let logo_icloud_path : String? let manufacturer : String? let releaseDate : Date diff --git a/Zockerhoehle/Views/ConsoleAllView.swift b/Zockerhoehle/Views/ConsoleAllView.swift index 08cfad7..06a5d78 100644 --- a/Zockerhoehle/Views/ConsoleAllView.swift +++ b/Zockerhoehle/Views/ConsoleAllView.swift @@ -125,13 +125,13 @@ struct GridCell: View { .scaledToFit() //.shadow(color: .primary, radius: 5) .padding([.horizontal, .top], 7) - Text(console.shortName ?? console.name!).lineLimit(1) + Text(console.shortName ?? console.name).lineLimit(1) } }.buttonStyle(PlainButtonStyle()) }else{ NavigationLink(destination: ConsoleLibraryView(console: console)) { - Text(console.shortName ?? console.name!) + Text(console.shortName ?? console.name) } } } diff --git a/Zockerhoehle/Views/ConsoleEditView.swift b/Zockerhoehle/Views/ConsoleEditView.swift index b933858..b0200d0 100644 --- a/Zockerhoehle/Views/ConsoleEditView.swift +++ b/Zockerhoehle/Views/ConsoleEditView.swift @@ -16,7 +16,7 @@ struct ConsoleEditView: View { var body: some View { Form { - TextField("Name der Konsole", text: $console.name ?? "n/a") + TextField("Name der Konsole", text: $console.name) TextField("Abkürzung", text: $console.shortName ?? "") TextField("Hersteller", text: $console.manufacturer ?? "") DatePicker(selection: $console.releaseDate, in: ...Date(), displayedComponents: .date) { diff --git a/Zockerhoehle/Views/GameDetailView.swift b/Zockerhoehle/Views/GameDetailView.swift index 5326b58..7782cc0 100644 --- a/Zockerhoehle/Views/GameDetailView.swift +++ b/Zockerhoehle/Views/GameDetailView.swift @@ -42,18 +42,42 @@ struct GameSeriesPicker: View { struct GameDetailView : View { @ObservedObject var game : Game - - @State private var showDeleteAlert : Bool = false - @State var hasFinishedDate : Bool = false - @State var playthroughDate : Date = Date() - @Environment(\.presentationMode) var presentationMode: Binding + @State private var showDeleteAlert : Bool = false + @State var isImportingCover : Bool = false - @State var isLent : Bool = false let defaultImage = UIImage() + @State var hasFinishedDate_raw : Bool = false + private var hasFinishedDate: Binding { + Binding( + get: { self.hasFinishedDate_raw || self.game.finishedDate != .none }, + set: { + hasFinishedDate_raw = $0 + if !$0 { self.game.finishedDate = .none } + } + ) + } + + @State var isLent_raw : Bool = false + private var isLent: Binding { + Binding( + get: { self.isLent_raw || (self.game.lentTo != .none && self.game.lentTo != "") }, + set: { + isLent_raw = $0 + if !$0 { self.game.lentTo = .none } + } + ) + } + + var finishedDateBinding: Binding { + Binding( + get: { self.game.finishedDate ?? Date() }, + set: { self.game.finishedDate = $0 }) + } + var GameIsFinished : some View { Group { Toggle(isOn: $game.isFinished , label: { @@ -61,16 +85,16 @@ struct GameDetailView : View { }) if game.isFinished { - Toggle(isOn: $hasFinishedDate, label: { + Toggle(isOn: hasFinishedDate, label: { Text("Gibts ein Datum") }) } - if hasFinishedDate && game.isFinished { + if self.hasFinishedDate.wrappedValue && game.isFinished { DatePicker("Durchgezockt am", - selection: $playthroughDate, - in: ...Date(), - displayedComponents: [.date]) + selection: finishedDateBinding, + in: ...Date(), + displayedComponents: [.date]) } } } @@ -78,7 +102,7 @@ struct GameDetailView : View { var body: some View { Form { Section { - TextField("Videogame name", text: $game.name ?? "") + TextField("Videogame name", text: $game.name) //Gray color should indicate immutable data Text("\(game.console?.name ?? "No console")").foregroundColor(.gray) @@ -101,15 +125,11 @@ struct GameDetailView : View { Text("In Wunschliste") }) - Toggle(isOn: $isLent, label: { + Toggle(isOn: isLent, label: { Text("Verliehen?") - }).onReceive(game.objectWillChange) { _ in - self.isLent = self.game.lentTo != ""; - }.onAppear() { - self.isLent = self.game.lentTo != ""; - } + }) - if isLent { + if isLent.wrappedValue { TextField("Verliehen an", text: $game.lentTo ?? "") } diff --git a/Zockerhoehle/Views/GamePickupsView.swift b/Zockerhoehle/Views/GamePickupsView.swift index 5240020..2e181eb 100644 --- a/Zockerhoehle/Views/GamePickupsView.swift +++ b/Zockerhoehle/Views/GamePickupsView.swift @@ -24,7 +24,7 @@ struct GamePickupsView: View { var body: some View { List(games) { game in NavigationLink(destination: GameDetailView(game: game)) { - Text("\(game.name!)") + Text("\(game.name)") } } .padding(.top) // Workaround, damit die Liste beim scrollen nicht unter der NavigationView angezeigt wird diff --git a/Zockerhoehle/Views/GameSeriesLibraryView.swift b/Zockerhoehle/Views/GameSeriesLibraryView.swift index c5f7df5..476187e 100644 --- a/Zockerhoehle/Views/GameSeriesLibraryView.swift +++ b/Zockerhoehle/Views/GameSeriesLibraryView.swift @@ -30,7 +30,7 @@ struct GameSeriesLibraryView: View { var body: some View { List(games) { game in NavigationLink(destination: GameDetailView(game: game)) { - Text("\(game.name!)") + Text("\(game.name)") if game.isDigital { Image("digitalGame") diff --git a/Zockerhoehle/Views/Overview.swift b/Zockerhoehle/Views/Overview.swift index 3874762..1d525bd 100644 --- a/Zockerhoehle/Views/Overview.swift +++ b/Zockerhoehle/Views/Overview.swift @@ -83,12 +83,13 @@ struct Overview: View { Group { Image(uiImage: ICloudManager.imageFrom(path: console.logo_icloud_path) ?? defaultImage) .resizable() + .scaledToFit() .padding(10) .cornerRadius(5) } .frame(width: 100, height: 100) - Text("\(console.name!)") + Text("\(console.name)") .font(.caption) .frame(width: 100) @@ -122,7 +123,7 @@ struct Overview: View { } .frame(width: 100, height: 100) - Text("\(game.name!)") + Text("\(game.name)") .font(.caption) .frame(width: 100) diff --git a/Zockerhoehle/Zockerhoehle.xcdatamodeld/Zockerhoehle.xcdatamodel/contents b/Zockerhoehle/Zockerhoehle.xcdatamodeld/Zockerhoehle.xcdatamodel/contents index 7496269..6c3fd90 100644 --- a/Zockerhoehle/Zockerhoehle.xcdatamodeld/Zockerhoehle.xcdatamodel/contents +++ b/Zockerhoehle/Zockerhoehle.xcdatamodeld/Zockerhoehle.xcdatamodel/contents @@ -24,6 +24,7 @@ + @@ -51,7 +52,7 @@ - +