Save which cards are favorite
This commit is contained in:
		| @@ -45,6 +45,7 @@ | |||||||
| 		6CEF7FA12BC88F6000E205F6 /* Flashcard+CoreDataProperties.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Flashcard+CoreDataProperties.swift"; sourceTree = "<group>"; }; | 		6CEF7FA12BC88F6000E205F6 /* Flashcard+CoreDataProperties.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Flashcard+CoreDataProperties.swift"; sourceTree = "<group>"; }; | ||||||
| 		6CEF7FA42BC95F0300E205F6 /* WordAX0.0.3.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = WordAX0.0.3.xcdatamodel; sourceTree = "<group>"; }; | 		6CEF7FA42BC95F0300E205F6 /* WordAX0.0.3.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = WordAX0.0.3.xcdatamodel; sourceTree = "<group>"; }; | ||||||
| 		6CEF7FA52BC96F2B00E205F6 /* ButtonHStackView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ButtonHStackView.swift; sourceTree = "<group>"; }; | 		6CEF7FA52BC96F2B00E205F6 /* ButtonHStackView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ButtonHStackView.swift; sourceTree = "<group>"; }; | ||||||
|  | 		6CF12F1A2BDFF888000762CC /* WordAX0.0.4.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = WordAX0.0.4.xcdatamodel; sourceTree = "<group>"; }; | ||||||
| 		6CF4394E2B83541D004C3543 /* WordAX.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WordAX.app; sourceTree = BUILT_PRODUCTS_DIR; }; | 		6CF4394E2B83541D004C3543 /* WordAX.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WordAX.app; sourceTree = BUILT_PRODUCTS_DIR; }; | ||||||
| 		6CF439512B83541D004C3543 /* WordAXApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WordAXApp.swift; sourceTree = "<group>"; }; | 		6CF439512B83541D004C3543 /* WordAXApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WordAXApp.swift; sourceTree = "<group>"; }; | ||||||
| 		6CF439532B83541D004C3543 /* MainView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainView.swift; sourceTree = "<group>"; }; | 		6CF439532B83541D004C3543 /* MainView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainView.swift; sourceTree = "<group>"; }; | ||||||
| @@ -424,12 +425,13 @@ | |||||||
| 		6CEF7F7F2BC4694900E205F6 /* WordAXCD.xcdatamodeld */ = { | 		6CEF7F7F2BC4694900E205F6 /* WordAXCD.xcdatamodeld */ = { | ||||||
| 			isa = XCVersionGroup; | 			isa = XCVersionGroup; | ||||||
| 			children = ( | 			children = ( | ||||||
|  | 				6CF12F1A2BDFF888000762CC /* WordAX0.0.4.xcdatamodel */, | ||||||
| 				6CEF7FA42BC95F0300E205F6 /* WordAX0.0.3.xcdatamodel */, | 				6CEF7FA42BC95F0300E205F6 /* WordAX0.0.3.xcdatamodel */, | ||||||
| 				6CEF7F9F2BC88F3900E205F6 /* WordAX0.0.2.xcdatamodel */, | 				6CEF7F9F2BC88F3900E205F6 /* WordAX0.0.2.xcdatamodel */, | ||||||
| 				6CEF7F962BC6B45F00E205F6 /* WordAX0.0.1.xcdatamodel */, | 				6CEF7F962BC6B45F00E205F6 /* WordAX0.0.1.xcdatamodel */, | ||||||
| 				6CEF7F802BC4694900E205F6 /* WordAX.xcdatamodel */, | 				6CEF7F802BC4694900E205F6 /* WordAX.xcdatamodel */, | ||||||
| 			); | 			); | ||||||
| 			currentVersion = 6CEF7F802BC4694900E205F6 /* WordAX.xcdatamodel */; | 			currentVersion = 6CF12F1A2BDFF888000762CC /* WordAX0.0.4.xcdatamodel */; | ||||||
| 			path = WordAXCD.xcdatamodeld; | 			path = WordAXCD.xcdatamodeld; | ||||||
| 			sourceTree = "<group>"; | 			sourceTree = "<group>"; | ||||||
| 			versionGroupType = wrapper.xcdatamodel; | 			versionGroupType = wrapper.xcdatamodel; | ||||||
|   | |||||||
| @@ -24,6 +24,7 @@ extension Flashcard { | |||||||
|     @NSManaged public var nextSpacedRepetitionMilestone: Int64 |     @NSManaged public var nextSpacedRepetitionMilestone: Int64 | ||||||
|     @NSManaged public var shown: Bool |     @NSManaged public var shown: Bool | ||||||
|     @NSManaged public var shownCount: Int64 |     @NSManaged public var shownCount: Int64 | ||||||
|  |     @NSManaged public var favorite: Bool | ||||||
| } | } | ||||||
|  |  | ||||||
| extension Flashcard : Identifiable { | extension Flashcard : Identifiable { | ||||||
|   | |||||||
| @@ -3,6 +3,6 @@ | |||||||
| <plist version="1.0"> | <plist version="1.0"> | ||||||
| <dict> | <dict> | ||||||
| 	<key>_XCCurrentVersionName</key> | 	<key>_XCCurrentVersionName</key> | ||||||
| 	<string>WordAX.xcdatamodel</string> | 	<string>WordAX0.0.4.xcdatamodel</string> | ||||||
| </dict> | </dict> | ||||||
| </plist> | </plist> | ||||||
|   | |||||||
| @@ -0,0 +1,14 @@ | |||||||
|  | <?xml version="1.0" encoding="UTF-8" standalone="yes"?> | ||||||
|  | <model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="22757" systemVersion="23D60" minimumToolsVersion="Automatic" sourceLanguage="Swift" usedWithSwiftData="YES" userDefinedModelVersionIdentifier=""> | ||||||
|  |     <entity name="Flashcard" representedClassName="Flashcard" syncable="YES"> | ||||||
|  |         <attribute name="dateAdded" optional="YES" attributeType="Date" usesScalarValueType="NO"/> | ||||||
|  |         <attribute name="desc" optional="YES" attributeType="String"/> | ||||||
|  |         <attribute name="favorite" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/> | ||||||
|  |         <attribute name="id" optional="YES" attributeType="UUID" usesScalarValueType="NO"/> | ||||||
|  |         <attribute name="lastSeenOn" optional="YES" attributeType="Date" usesScalarValueType="NO"/> | ||||||
|  |         <attribute name="name" optional="YES" attributeType="String"/> | ||||||
|  |         <attribute name="nextSpacedRepetitionMilestone" optional="YES" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="YES"/> | ||||||
|  |         <attribute name="shown" optional="YES" attributeType="Boolean" usesScalarValueType="YES"/> | ||||||
|  |         <attribute name="shownCount" optional="YES" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="YES"/> | ||||||
|  |     </entity> | ||||||
|  | </model> | ||||||
| @@ -126,6 +126,5 @@ struct AnkiView: View { | |||||||
|  |  | ||||||
| #Preview { | #Preview { | ||||||
|     AnkiView() |     AnkiView() | ||||||
|         .environmentObject(WordAXModelView()) |  | ||||||
|         .environment(\.managedObjectContext, DataController.preview.container.viewContext) |         .environment(\.managedObjectContext, DataController.preview.container.viewContext) | ||||||
| } | } | ||||||
|   | |||||||
| @@ -8,26 +8,32 @@ | |||||||
| import SwiftUI | import SwiftUI | ||||||
|  |  | ||||||
| struct FlashCardListRowView: View { | struct FlashCardListRowView: View { | ||||||
|     @EnvironmentObject var model: WordAXModelView |     @State var flashcard: Flashcard | ||||||
|     var flashcard: Flashcard |     @State private var refresh: UUID = UUID() | ||||||
|     @State var favorite = true |  | ||||||
|     var body: some View { |     var body: some View { | ||||||
|         HStack { |         HStack { | ||||||
|             Group { |             Group { | ||||||
|                 if favorite { |                 if !flashcard.favorite { | ||||||
|                     Image(systemName: "star") |                     Image(systemName: "star") | ||||||
|                 } else { |                 } else { | ||||||
|                     ZStack { |                     ZStack { | ||||||
|                         Image(systemName: "star.fill") |                         Image(systemName: "star.fill") | ||||||
|                             .foregroundStyle(.yellow) |                             .foregroundStyle(.yellow) | ||||||
|                         Image(systemName: "star") |                         Image(systemName: "star") | ||||||
|                             .opacity(0.4) |                             .opacity(0) | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             .onTapGesture { |             .onTapGesture { | ||||||
|                 self.favorite = !self.favorite |                 flashcard.favorite.toggle() | ||||||
|  |                 do { | ||||||
|  |                     try flashcard.managedObjectContext?.save() | ||||||
|  |                 } catch { | ||||||
|  |                     print("Something went wrong while saving favorite cards, please try again") | ||||||
|  |                 } | ||||||
|  |                 refresh = UUID() | ||||||
|             } |             } | ||||||
|  |             .id(refresh) | ||||||
|             .padding(.trailing) |             .padding(.trailing) | ||||||
|             VStack { |             VStack { | ||||||
|                 Text(flashcard.name ?? "Unknown") |                 Text(flashcard.name ?? "Unknown") | ||||||
| @@ -41,7 +47,6 @@ struct FlashCardListRowView: View { | |||||||
|                     .lineLimit(1) |                     .lineLimit(1) | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|          |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -8,7 +8,6 @@ | |||||||
| import SwiftUI | import SwiftUI | ||||||
|  |  | ||||||
| struct FlashCardListView: View { | struct FlashCardListView: View { | ||||||
|     @EnvironmentObject var model: WordAXModelView |  | ||||||
|     @State var showDescription = true |     @State var showDescription = true | ||||||
|     @State var addFlashcard = false |     @State var addFlashcard = false | ||||||
|     @FetchRequest(sortDescriptors: [NSSortDescriptor(key: "dateAdded", ascending: false)]) var flashcards: FetchedResults<Flashcard> |     @FetchRequest(sortDescriptors: [NSSortDescriptor(key: "dateAdded", ascending: false)]) var flashcards: FetchedResults<Flashcard> | ||||||
| @@ -34,8 +33,7 @@ struct FlashCardListView: View { | |||||||
|                                  |                                  | ||||||
|                             }) |                             }) | ||||||
|                         } |                         } | ||||||
|                     } |                     } else { | ||||||
|                     else { |  | ||||||
|                         Text("You currently don't have any flashcards. To add flashcards, either click at the '+' button at the top or you can download them from the store (coming soon)") |                         Text("You currently don't have any flashcards. To add flashcards, either click at the '+' button at the top or you can download them from the store (coming soon)") | ||||||
|                             .padding() |                             .padding() | ||||||
|                             .background(.purple) |                             .background(.purple) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user