137 lines
5.7 KiB
Swift
137 lines
5.7 KiB
Swift
//
|
|
// AppDelegate.swift
|
|
// YAPS
|
|
//
|
|
// Created by Gerrit Linnemann on 21.07.20.
|
|
// Copyright © 2020 Adawim UG (haftungsbeschränkt). All rights reserved.
|
|
//
|
|
|
|
import Cocoa
|
|
import SwiftUI
|
|
|
|
@NSApplicationMain
|
|
class AppDelegate: NSObject, NSApplicationDelegate {
|
|
|
|
var window: NSWindow!
|
|
|
|
|
|
func applicationDidFinishLaunching(_ aNotification: Notification) {
|
|
// Create the SwiftUI view and set the context as the value for the managedObjectContext environment keyPath.
|
|
// Add `@Environment(\.managedObjectContext)` in the views that will need the context.
|
|
let contentView = ContentView().environment(\.managedObjectContext, persistentContainer.viewContext)
|
|
|
|
// Create the window and set the content view.
|
|
window = NSWindow(
|
|
contentRect: NSRect(x: 0, y: 0, width: 480, height: 300),
|
|
styleMask: [.titled, .closable, .miniaturizable, .resizable, .fullSizeContentView],
|
|
backing: .buffered, defer: false)
|
|
window.center()
|
|
window.setFrameAutosaveName("Main Window")
|
|
window.contentView = NSHostingView(rootView: contentView)
|
|
window.makeKeyAndOrderFront(nil)
|
|
}
|
|
|
|
func applicationWillTerminate(_ aNotification: Notification) {
|
|
// Insert code here to tear down your application
|
|
}
|
|
|
|
// MARK: - Core Data stack
|
|
|
|
lazy var persistentContainer: NSPersistentContainer = {
|
|
/*
|
|
The persistent container for the application. This implementation
|
|
creates and returns a container, having loaded the store for the
|
|
application to it. This property is optional since there are legitimate
|
|
error conditions that could cause the creation of the store to fail.
|
|
*/
|
|
let container = NSPersistentContainer(name: "YAPS")
|
|
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
|
|
if let error = error {
|
|
// 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)")
|
|
}
|
|
})
|
|
return container
|
|
}()
|
|
|
|
// MARK: - Core Data Saving and Undo support
|
|
|
|
@IBAction func saveAction(_ sender: AnyObject?) {
|
|
// Performs the save action for the application, which is to send the save: message to the application's managed object context. Any encountered errors are presented to the user.
|
|
let context = persistentContainer.viewContext
|
|
|
|
if !context.commitEditing() {
|
|
NSLog("\(NSStringFromClass(type(of: self))) unable to commit editing before saving")
|
|
}
|
|
if context.hasChanges {
|
|
do {
|
|
try context.save()
|
|
} catch {
|
|
// Customize this code block to include application-specific recovery steps.
|
|
let nserror = error as NSError
|
|
NSApplication.shared.presentError(nserror)
|
|
}
|
|
}
|
|
}
|
|
|
|
func windowWillReturnUndoManager(window: NSWindow) -> UndoManager? {
|
|
// Returns the NSUndoManager for the application. In this case, the manager returned is that of the managed object context for the application.
|
|
return persistentContainer.viewContext.undoManager
|
|
}
|
|
|
|
func applicationShouldTerminate(_ sender: NSApplication) -> NSApplication.TerminateReply {
|
|
// Save changes in the application's managed object context before the application terminates.
|
|
let context = persistentContainer.viewContext
|
|
|
|
if !context.commitEditing() {
|
|
NSLog("\(NSStringFromClass(type(of: self))) unable to commit editing to terminate")
|
|
return .terminateCancel
|
|
}
|
|
|
|
if !context.hasChanges {
|
|
return .terminateNow
|
|
}
|
|
|
|
do {
|
|
try context.save()
|
|
} catch {
|
|
let nserror = error as NSError
|
|
|
|
// Customize this code block to include application-specific recovery steps.
|
|
let result = sender.presentError(nserror)
|
|
if (result) {
|
|
return .terminateCancel
|
|
}
|
|
|
|
let question = NSLocalizedString("Could not save changes while quitting. Quit anyway?", comment: "Quit without saves error question message")
|
|
let info = NSLocalizedString("Quitting now will lose any changes you have made since the last successful save", comment: "Quit without saves error question info");
|
|
let quitButton = NSLocalizedString("Quit anyway", comment: "Quit anyway button title")
|
|
let cancelButton = NSLocalizedString("Cancel", comment: "Cancel button title")
|
|
let alert = NSAlert()
|
|
alert.messageText = question
|
|
alert.informativeText = info
|
|
alert.addButton(withTitle: quitButton)
|
|
alert.addButton(withTitle: cancelButton)
|
|
|
|
let answer = alert.runModal()
|
|
if answer == .alertSecondButtonReturn {
|
|
return .terminateCancel
|
|
}
|
|
}
|
|
// If we got here, it is time to quit.
|
|
return .terminateNow
|
|
}
|
|
|
|
}
|
|
|