Initial Commit
This commit is contained in:
		@@ -0,0 +1,11 @@
 | 
			
		||||
{
 | 
			
		||||
  "colors" : [
 | 
			
		||||
    {
 | 
			
		||||
      "idiom" : "universal"
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "info" : {
 | 
			
		||||
    "author" : "xcode",
 | 
			
		||||
    "version" : 1
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										58
									
								
								KlipperMon/Assets.xcassets/AppIcon.appiconset/Contents.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								KlipperMon/Assets.xcassets/AppIcon.appiconset/Contents.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,58 @@
 | 
			
		||||
{
 | 
			
		||||
  "images" : [
 | 
			
		||||
    {
 | 
			
		||||
      "idiom" : "mac",
 | 
			
		||||
      "scale" : "1x",
 | 
			
		||||
      "size" : "16x16"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "idiom" : "mac",
 | 
			
		||||
      "scale" : "2x",
 | 
			
		||||
      "size" : "16x16"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "idiom" : "mac",
 | 
			
		||||
      "scale" : "1x",
 | 
			
		||||
      "size" : "32x32"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "idiom" : "mac",
 | 
			
		||||
      "scale" : "2x",
 | 
			
		||||
      "size" : "32x32"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "idiom" : "mac",
 | 
			
		||||
      "scale" : "1x",
 | 
			
		||||
      "size" : "128x128"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "idiom" : "mac",
 | 
			
		||||
      "scale" : "2x",
 | 
			
		||||
      "size" : "128x128"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "idiom" : "mac",
 | 
			
		||||
      "scale" : "1x",
 | 
			
		||||
      "size" : "256x256"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "idiom" : "mac",
 | 
			
		||||
      "scale" : "2x",
 | 
			
		||||
      "size" : "256x256"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "idiom" : "mac",
 | 
			
		||||
      "scale" : "1x",
 | 
			
		||||
      "size" : "512x512"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "idiom" : "mac",
 | 
			
		||||
      "scale" : "2x",
 | 
			
		||||
      "size" : "512x512"
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "info" : {
 | 
			
		||||
    "author" : "xcode",
 | 
			
		||||
    "version" : 1
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										6
									
								
								KlipperMon/Assets.xcassets/Contents.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								KlipperMon/Assets.xcassets/Contents.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
  "info" : {
 | 
			
		||||
    "author" : "xcode",
 | 
			
		||||
    "version" : 1
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										85
									
								
								KlipperMon/ContentView.swift
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								KlipperMon/ContentView.swift
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,85 @@
 | 
			
		||||
//
 | 
			
		||||
//  ContentView.swift
 | 
			
		||||
//  KlipperMon
 | 
			
		||||
//
 | 
			
		||||
//  Created by maddiefuzz on 2/7/23.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
import SwiftUI
 | 
			
		||||
import CoreData
 | 
			
		||||
 | 
			
		||||
struct ContentView: View {
 | 
			
		||||
    @Environment(\.managedObjectContext) private var viewContext
 | 
			
		||||
 | 
			
		||||
    @FetchRequest(
 | 
			
		||||
        sortDescriptors: [NSSortDescriptor(keyPath: \Item.timestamp, ascending: true)],
 | 
			
		||||
        animation: .default)
 | 
			
		||||
    private var items: FetchedResults<Item>
 | 
			
		||||
 | 
			
		||||
    var body: some View {
 | 
			
		||||
        NavigationView {
 | 
			
		||||
            List {
 | 
			
		||||
                ForEach(items) { item in
 | 
			
		||||
                    NavigationLink {
 | 
			
		||||
                        Text("Item at \(item.timestamp!, formatter: itemFormatter)")
 | 
			
		||||
                    } label: {
 | 
			
		||||
                        Text(item.timestamp!, formatter: itemFormatter)
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                .onDelete(perform: deleteItems)
 | 
			
		||||
            }
 | 
			
		||||
            .toolbar {
 | 
			
		||||
                ToolbarItem {
 | 
			
		||||
                    Button(action: addItem) {
 | 
			
		||||
                        Label("Add Item", systemImage: "plus")
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            Text("Select an item")
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private func addItem() {
 | 
			
		||||
        withAnimation {
 | 
			
		||||
            let newItem = Item(context: viewContext)
 | 
			
		||||
            newItem.timestamp = Date()
 | 
			
		||||
 | 
			
		||||
            do {
 | 
			
		||||
                try viewContext.save()
 | 
			
		||||
            } catch {
 | 
			
		||||
                // Replace this implementation with code to handle the error appropriately.
 | 
			
		||||
                // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
 | 
			
		||||
                let nsError = error as NSError
 | 
			
		||||
                fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private func deleteItems(offsets: IndexSet) {
 | 
			
		||||
        withAnimation {
 | 
			
		||||
            offsets.map { items[$0] }.forEach(viewContext.delete)
 | 
			
		||||
 | 
			
		||||
            do {
 | 
			
		||||
                try viewContext.save()
 | 
			
		||||
            } catch {
 | 
			
		||||
                // Replace this implementation with code to handle the error appropriately.
 | 
			
		||||
                // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
 | 
			
		||||
                let nsError = error as NSError
 | 
			
		||||
                fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
private let itemFormatter: DateFormatter = {
 | 
			
		||||
    let formatter = DateFormatter()
 | 
			
		||||
    formatter.dateStyle = .short
 | 
			
		||||
    formatter.timeStyle = .medium
 | 
			
		||||
    return formatter
 | 
			
		||||
}()
 | 
			
		||||
 | 
			
		||||
struct ContentView_Previews: PreviewProvider {
 | 
			
		||||
    static var previews: some View {
 | 
			
		||||
        ContentView().environment(\.managedObjectContext, PersistenceController.preview.container.viewContext)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										10
									
								
								KlipperMon/KlipperMon.entitlements
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								KlipperMon/KlipperMon.entitlements
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 | 
			
		||||
<plist version="1.0">
 | 
			
		||||
<dict>
 | 
			
		||||
    <key>com.apple.security.app-sandbox</key>
 | 
			
		||||
    <true/>
 | 
			
		||||
    <key>com.apple.security.files.user-selected.read-only</key>
 | 
			
		||||
    <true/>
 | 
			
		||||
</dict>
 | 
			
		||||
</plist>
 | 
			
		||||
							
								
								
									
										8
									
								
								KlipperMon/KlipperMon.xcdatamodeld/.xccurrentversion
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								KlipperMon/KlipperMon.xcdatamodeld/.xccurrentversion
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,8 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 | 
			
		||||
<plist version="1.0">
 | 
			
		||||
<dict>
 | 
			
		||||
	<key>_XCCurrentVersionName</key>
 | 
			
		||||
	<string>KlipperMon.xcdatamodel</string>
 | 
			
		||||
</dict>
 | 
			
		||||
</plist>
 | 
			
		||||
@@ -0,0 +1,9 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 | 
			
		||||
<model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="1" systemVersion="11A491" minimumToolsVersion="Automatic" sourceLanguage="Swift" usedWithCloudKit="false" userDefinedModelVersionIdentifier="">
 | 
			
		||||
    <entity name="Item" representedClassName="Item" syncable="YES" codeGenerationType="class">
 | 
			
		||||
        <attribute name="timestamp" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
 | 
			
		||||
    </entity>
 | 
			
		||||
    <elements>
 | 
			
		||||
        <element name="Item" positionX="-63" positionY="-18" width="128" height="44"/>
 | 
			
		||||
    </elements>
 | 
			
		||||
</model>
 | 
			
		||||
							
								
								
									
										20
									
								
								KlipperMon/KlipperMonApp.swift
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								KlipperMon/KlipperMonApp.swift
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,20 @@
 | 
			
		||||
//
 | 
			
		||||
//  KlipperMonApp.swift
 | 
			
		||||
//  KlipperMon
 | 
			
		||||
//
 | 
			
		||||
//  Created by maddiefuzz on 2/7/23.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
import SwiftUI
 | 
			
		||||
 | 
			
		||||
@main
 | 
			
		||||
struct KlipperMonApp: App {
 | 
			
		||||
    let persistenceController = PersistenceController.shared
 | 
			
		||||
 | 
			
		||||
    var body: some Scene {
 | 
			
		||||
        WindowGroup {
 | 
			
		||||
            ContentView()
 | 
			
		||||
                .environment(\.managedObjectContext, persistenceController.container.viewContext)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										56
									
								
								KlipperMon/Persistence.swift
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								KlipperMon/Persistence.swift
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,56 @@
 | 
			
		||||
//
 | 
			
		||||
//  Persistence.swift
 | 
			
		||||
//  KlipperMon
 | 
			
		||||
//
 | 
			
		||||
//  Created by maddiefuzz on 2/7/23.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
import CoreData
 | 
			
		||||
 | 
			
		||||
struct PersistenceController {
 | 
			
		||||
    static let shared = PersistenceController()
 | 
			
		||||
 | 
			
		||||
    static var preview: PersistenceController = {
 | 
			
		||||
        let result = PersistenceController(inMemory: true)
 | 
			
		||||
        let viewContext = result.container.viewContext
 | 
			
		||||
        for _ in 0..<10 {
 | 
			
		||||
            let newItem = Item(context: viewContext)
 | 
			
		||||
            newItem.timestamp = Date()
 | 
			
		||||
        }
 | 
			
		||||
        do {
 | 
			
		||||
            try viewContext.save()
 | 
			
		||||
        } catch {
 | 
			
		||||
            // Replace this implementation with code to handle the error appropriately.
 | 
			
		||||
            // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
 | 
			
		||||
            let nsError = error as NSError
 | 
			
		||||
            fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
 | 
			
		||||
        }
 | 
			
		||||
        return result
 | 
			
		||||
    }()
 | 
			
		||||
 | 
			
		||||
    let container: NSPersistentContainer
 | 
			
		||||
 | 
			
		||||
    init(inMemory: Bool = false) {
 | 
			
		||||
        container = NSPersistentContainer(name: "KlipperMon")
 | 
			
		||||
        if inMemory {
 | 
			
		||||
            container.persistentStoreDescriptions.first!.url = URL(fileURLWithPath: "/dev/null")
 | 
			
		||||
        }
 | 
			
		||||
        container.loadPersistentStores(completionHandler: { (storeDescription, error) in
 | 
			
		||||
            if let error = error as NSError? {
 | 
			
		||||
                // Replace this implementation with code to handle the error appropriately.
 | 
			
		||||
                // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
 | 
			
		||||
 | 
			
		||||
                /*
 | 
			
		||||
                 Typical reasons for an error here include:
 | 
			
		||||
                 * The parent directory does not exist, cannot be created, or disallows writing.
 | 
			
		||||
                 * The persistent store is not accessible, due to permissions or data protection when the device is locked.
 | 
			
		||||
                 * The device is out of space.
 | 
			
		||||
                 * The store could not be migrated to the current model version.
 | 
			
		||||
                 Check the error message to determine what the actual problem was.
 | 
			
		||||
                 */
 | 
			
		||||
                fatalError("Unresolved error \(error), \(error.userInfo)")
 | 
			
		||||
            }
 | 
			
		||||
        })
 | 
			
		||||
        container.viewContext.automaticallyMergesChangesFromParent = true
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
  "info" : {
 | 
			
		||||
    "author" : "xcode",
 | 
			
		||||
    "version" : 1
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user