This commit is contained in:
2024-05-01 13:42:39 +02:00
parent 6b0644bbef
commit db38b28f42
12 changed files with 14 additions and 51 deletions

View File

@@ -10,7 +10,7 @@
6C4A87D22BE25D260074E0A9 /* Deck+CoreDataClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C4A87D02BE25D260074E0A9 /* Deck+CoreDataClass.swift */; };
6C4A87D32BE25D260074E0A9 /* Deck+CoreDataProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C4A87D12BE25D260074E0A9 /* Deck+CoreDataProperties.swift */; };
6C8184FE2B88C9580033CF46 /* WordAX.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C8184FD2B88C9580033CF46 /* WordAX.swift */; };
6C8185002B88C9660033CF46 /* WordAXModelView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C8184FF2B88C9660033CF46 /* WordAXModelView.swift */; };
6C8185002B88C9660033CF46 /* Miscellaneous.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C8184FF2B88C9660033CF46 /* Miscellaneous.swift */; };
6C8185022B88C9FB0033CF46 /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C8185012B88C9FB0033CF46 /* SettingsView.swift */; };
6C8185042B88CA210033CF46 /* AnkiView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C8185032B88CA210033CF46 /* AnkiView.swift */; };
6C8185062B8A537F0033CF46 /* FlashCardView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C8185052B8A537F0033CF46 /* FlashCardView.swift */; };
@@ -33,7 +33,7 @@
6C4A87D02BE25D260074E0A9 /* Deck+CoreDataClass.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Deck+CoreDataClass.swift"; sourceTree = "<group>"; };
6C4A87D12BE25D260074E0A9 /* Deck+CoreDataProperties.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Deck+CoreDataProperties.swift"; sourceTree = "<group>"; };
6C8184FD2B88C9580033CF46 /* WordAX.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WordAX.swift; sourceTree = "<group>"; };
6C8184FF2B88C9660033CF46 /* WordAXModelView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WordAXModelView.swift; sourceTree = "<group>"; };
6C8184FF2B88C9660033CF46 /* Miscellaneous.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Miscellaneous.swift; sourceTree = "<group>"; };
6C8185012B88C9FB0033CF46 /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = "<group>"; };
6C8185032B88CA210033CF46 /* AnkiView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnkiView.swift; sourceTree = "<group>"; };
6C8185052B8A537F0033CF46 /* FlashCardView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FlashCardView.swift; sourceTree = "<group>"; };
@@ -138,7 +138,7 @@
6CF439512B83541D004C3543 /* WordAXApp.swift */,
6C4632342BC2D99E003ED0E9 /* Views */,
6C8184FD2B88C9580033CF46 /* WordAX.swift */,
6C8184FF2B88C9660033CF46 /* WordAXModelView.swift */,
6C8184FF2B88C9660033CF46 /* Miscellaneous.swift */,
6CF439552B83541E004C3543 /* Assets.xcassets */,
6CF439572B83541E004C3543 /* Preview Content */,
);
@@ -230,7 +230,7 @@
6CEF7FA32BC88F6000E205F6 /* Flashcard+CoreDataProperties.swift in Sources */,
6C81850A2B8BA5740033CF46 /* FlashCardListView.swift in Sources */,
6CEF7FA62BC96F2B00E205F6 /* ButtonHStackView.swift in Sources */,
6C8185002B88C9660033CF46 /* WordAXModelView.swift in Sources */,
6C8185002B88C9660033CF46 /* Miscellaneous.swift in Sources */,
6C8185042B88CA210033CF46 /* AnkiView.swift in Sources */,
6CEF7F7D2BC457E600E205F6 /* DataController.swift in Sources */,
6CF439522B83541D004C3543 /* WordAXApp.swift in Sources */,

View File

@@ -1,5 +1,5 @@
//
// WordAXModelView.swift
// Miscellaneous.swift
// WordAX
//
// Created by Oliver Hnát on 23.02.2024.
@@ -8,28 +8,14 @@
import Foundation
import SwiftUI
class WordAXModelView: ObservableObject {
class Miscellaneous {
typealias SpacedRepetitionMilestoneEnum = Flashcard.SpacedRepetitionMilestoneEnum
let settings: Settings
init() {
static var dateFormatter: DateFormatter {
let hourString = DateFormatter.dateFormat(fromTemplate: "j", options: 0, locale: NSLocale.current)
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd/MM/YYYY \(hourString?.contains("a") ?? true ? "hh" : "HH"):mm\(hourString?.contains("a") ?? true ? " a" : "")"
self.settings = Settings(dateFormatter: dateFormatter)
}
struct Settings {
var dateFormatter: DateFormatter
}
public func getFlashcards(moc: DataController) -> [Flashcard] {
moc.getAllFlashcards()
}
public func getDateFormatter() -> DateFormatter {
self.settings.dateFormatter
return dateFormatter
}
}

View File

@@ -10,7 +10,6 @@ import CoreData
class DataController: ObservableObject {
let container = NSPersistentContainer(name: "WordAXCD")
// static let shared = DataController()
typealias SpacedRepetitionMilestoneEnum = Flashcard.SpacedRepetitionMilestoneEnum
var viewContext: NSManagedObjectContext {
@@ -57,20 +56,6 @@ class DataController: ObservableObject {
}
}
}
public func getAllFlashcards(predicate: NSPredicate? = nil) -> [Flashcard]{
let request = NSFetchRequest<Flashcard>(entityName: "Flashcard")
if predicate != nil {
request.predicate = predicate
}
do {
return try viewContext.fetch(request)
} catch {
return []
}
}
}

View File

@@ -18,13 +18,15 @@ extension Flashcard {
@NSManaged public var dateAdded: Date?
@NSManaged public var desc: String?
@NSManaged public var favorite: Bool
@NSManaged public var id: UUID?
@NSManaged public var lastSeenOn: Date?
@NSManaged public var name: String?
@NSManaged public var nextSpacedRepetitionMilestone: Int64
@NSManaged public var shown: Bool
@NSManaged public var shownCount: Int64
@NSManaged public var favorite: Bool
@NSManaged public var deck: Deck?
}
extension Flashcard : Identifiable {

View File

@@ -3,7 +3,7 @@
<entity name="Deck" representedClassName="Deck" syncable="YES" coreSpotlightDisplayNameExpression="Deck">
<attribute name="id" attributeType="UUID" usesScalarValueType="NO"/>
<attribute name="name" attributeType="String"/>
<relationship name="flashcards" optional="YES" toMany="YES" deletionRule="Cascade" destinationEntity="Flashcard"/>
<relationship name="flashcards" optional="YES" toMany="YES" deletionRule="Cascade" destinationEntity="Flashcard" inverseName="deck" inverseEntity="Flashcard"/>
</entity>
<entity name="Flashcard" representedClassName="Flashcard" syncable="YES" coreSpotlightDisplayNameExpression="Card">
<attribute name="dateAdded" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
@@ -15,5 +15,6 @@
<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"/>
<relationship name="deck" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Deck" inverseName="flashcards" inverseEntity="Deck"/>
</entity>
</model>

View File

@@ -54,13 +54,10 @@ struct FlashCardListRowView: View {
let flashcard = try? DataController.preview.viewContext.fetch(Flashcard.fetchRequest()).first
return Group {
FlashCardListRowView(flashcard: flashcard!)
.environmentObject(WordAXModelView())
.environment(\.managedObjectContext, DataController.preview.container.viewContext)
FlashCardListRowView(flashcard: flashcard!)
.environmentObject(WordAXModelView())
.environment(\.managedObjectContext, DataController.preview.container.viewContext)
FlashCardListRowView(flashcard: flashcard!)
.environmentObject(WordAXModelView())
.environment(\.managedObjectContext, DataController.preview.container.viewContext)
}
}

View File

@@ -67,6 +67,5 @@ struct FlashCardListView: View {
#Preview {
FlashCardListView()
.environmentObject(WordAXModelView())
.environment(\.managedObjectContext, DataController.preview.container.viewContext)
}

View File

@@ -12,7 +12,6 @@ import CoreData
struct FlashCardView: View {
var flashcard: Flashcard
@Binding var showDescription: Bool
@EnvironmentObject var model: WordAXModelView
@Environment(\.colorScheme) var colorScheme
@@ -23,7 +22,7 @@ struct FlashCardView: View {
VStack {
// TODO: Figure out if this and create/edit menu could be more similar?
if flashcard.lastSeenOn != nil {
Text("Last seen: " + model.getDateFormatter().string(from: flashcard.lastSeenOn!))
Text("Last seen: " + Miscellaneous.dateFormatter.string(from: flashcard.lastSeenOn!))
.font(.subheadline)
}
if showDescription {
@@ -56,6 +55,5 @@ struct FlashCardView: View {
@State var showDescription = true
let flashcard = try? DataController.preview.viewContext.fetch(Flashcard.fetchRequest()).first
return FlashCardView(flashcard: flashcard!, showDescription: $showDescription)
.environmentObject(WordAXModelView())
.environment(\.managedObjectContext, DataController.preview.container.viewContext)
}

View File

@@ -44,6 +44,5 @@ struct MainView: View {
#Preview {
MainView()
.environmentObject(WordAXModelView())
.environment(\.managedObjectContext, DataController.preview.container.viewContext)
}

View File

@@ -64,6 +64,5 @@ extension ShapeStyle where Self == Color {
// @State var showDescription = false
// let flashcard = try? DataController.preview.viewContext.fetch(Flashcard.fetchRequest()).first
// return NextRepetitionButtonView(buttonText: "Excellent", nextMilestone: Flashcard.SpacedRepetitionMilestoneEnum.OneDay, showDescription: $showDescription)
// .environmentObject(WordAXModelView())
// .environment(\.managedObjectContext, DataController.preview.container.viewContext)
//}

View File

@@ -43,6 +43,5 @@ extension UTType {
#Preview {
SettingsView()
.environmentObject(WordAXModelView())
.environment(\.managedObjectContext, DataController.preview.container.viewContext)
}

View File

@@ -9,12 +9,10 @@ import SwiftUI
@main
struct WordAXApp: App {
@StateObject private var model = WordAXModelView()
@StateObject private var dataControler = DataController()
var body: some Scene {
WindowGroup {
MainView()
.environmentObject(model)
.environment(\.managedObjectContext, dataControler.container.viewContext)
}
}