From 129cef9cb833e1a9b21b1414029ccf9317ed8f9a Mon Sep 17 00:00:00 2001 From: Riley Testut Date: Mon, 14 Mar 2016 19:22:16 -0500 Subject: [PATCH] Adds ability to delete save states via long press --- Common/Database/DatabaseManager.swift | 40 ++++++++++---- .../SaveStatesViewController.swift | 53 +++++++++++++++++-- 2 files changed, 79 insertions(+), 14 deletions(-) diff --git a/Common/Database/DatabaseManager.swift b/Common/Database/DatabaseManager.swift index 14a18fb..0920abc 100644 --- a/Common/Database/DatabaseManager.swift +++ b/Common/Database/DatabaseManager.swift @@ -45,6 +45,7 @@ class DatabaseManager self.validationManagedObjectContext.parentContext = self.managedObjectContext self.validationManagedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy + NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("managedObjectContextWillSave:"), name: NSManagedObjectContextWillSaveNotification, object: nil) NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("managedObjectContextDidSave:"), name: NSManagedObjectContextDidSaveNotification, object: nil) } @@ -286,18 +287,31 @@ private extension DatabaseManager // MARK: - Validation - - func validateManagedObjectSaveWithUserInfo(userInfo: [NSObject : AnyObject]) + func validateManagedObjectContextSave(managedObjectContext: NSManagedObjectContext) { - // Remove deleted games from disk - if let deletedObjects = userInfo[NSDeletedObjectsKey] as? Set + // Remove deleted files from disk + for object in managedObjectContext.deletedObjects { - let games = deletedObjects.filter({ $0 is Game }).map({ self.validationManagedObjectContext.objectWithID($0.objectID) as! Game }) + var fileURLs = Set() - for game in games + let temporaryObject = self.validationManagedObjectContext.objectWithID(object.objectID) + switch temporaryObject + { + case let game as Game: + fileURLs.insert(game.fileURL) + + case let saveState as SaveState: + fileURLs.insert(saveState.fileURL) + fileURLs.insert(saveState.imageFileURL) + + default: break + } + + for URL in fileURLs { do { - try NSFileManager.defaultManager().removeItemAtURL(game.fileURL) + try NSFileManager.defaultManager().removeItemAtURL(URL) } catch let error as NSError { @@ -317,16 +331,22 @@ private extension DatabaseManager // MARK: - Notifications - - dynamic func managedObjectContextDidSave(notification: NSNotification) + @objc func managedObjectContextWillSave(notification: NSNotification) { guard let managedObjectContext = notification.object as? NSManagedObjectContext where managedObjectContext.parentContext == self.validationManagedObjectContext else { return } self.validationManagedObjectContext.performBlockAndWait { - self.validateManagedObjectSaveWithUserInfo(notification.userInfo ?? [:]) - self.save() + self.validateManagedObjectContextSave(managedObjectContext) } } + @objc func managedObjectContextDidSave(notification: NSNotification) + { + guard let managedObjectContext = notification.object as? NSManagedObjectContext where managedObjectContext.parentContext == self.validationManagedObjectContext else { return } + + self.save() + } + // MARK: - File Management - class func createDirectoryAtURLIfNeeded(URL: NSURL) @@ -340,4 +360,4 @@ private extension DatabaseManager print(error) } } -} +} \ No newline at end of file diff --git a/Delta/Pause Menu/Save States/SaveStatesViewController.swift b/Delta/Pause Menu/Save States/SaveStatesViewController.swift index 39dda0b..ab9717e 100644 --- a/Delta/Pause Menu/Save States/SaveStatesViewController.swift +++ b/Delta/Pause Menu/Save States/SaveStatesViewController.swift @@ -98,6 +98,9 @@ extension SaveStatesViewController self.prototypeCellWidthConstraint = self.prototypeCell.contentView.widthAnchor.constraintEqualToConstant(collectionViewLayout.itemWidth) self.prototypeCellWidthConstraint.active = true + let longPressGestureRecognizer = UILongPressGestureRecognizer(target: self, action: "handleLongPressGesture:") + self.collectionView?.addGestureRecognizer(longPressGestureRecognizer) + self.updateBackgroundView() } @@ -128,6 +131,8 @@ extension SaveStatesViewController private extension SaveStatesViewController { + //MARK: - Update - + func updateFetchedResultsController() { let game = self.delegate.saveStatesViewControllerActiveGame(self) @@ -181,10 +186,27 @@ private extension SaveStatesViewController let name = saveState.name ?? self.dateFormatter.stringFromDate(saveState.modifiedDate) cell.textLabel.text = name } -} - -private extension SaveStatesViewController -{ + + //MARK: - Gestures - + + @objc func handleLongPressGesture(gestureRecognizer: UILongPressGestureRecognizer) + { + guard gestureRecognizer.state == .Began else { return } + + guard let indexPath = self.collectionView?.indexPathForItemAtPoint(gestureRecognizer.locationInView(self.collectionView)) else { return } + + let alertController = UIAlertController(title: nil, message: nil, preferredStyle: .ActionSheet) + alertController.addAction(UIAlertAction(title: NSLocalizedString("Delete Save State", comment: ""), style: .Destructive, handler: { action in + let saveState = self.fetchedResultsController.objectAtIndexPath(indexPath) as! SaveState + self.deleteSaveState(saveState) + })) + alertController.addAction(UIAlertAction(title: NSLocalizedString("Cancel", comment: ""), style: .Cancel, handler: nil)) + + self.presentViewController(alertController, animated: true, completion: nil) + } + + //MARK: - Save States - + @IBAction func addSaveState() { let backgroundContext = DatabaseManager.sharedManager.backgroundManagedObjectContext() @@ -212,8 +234,28 @@ private extension SaveStatesViewController self.delegate?.saveStatesViewController(self, updateSaveState: saveState) saveState.managedObjectContext?.saveWithErrorLogging() } + + func deleteSaveState(saveState: SaveState) + { + let confirmationAlertController = UIAlertController(title: NSLocalizedString("Confirm Deletion", comment: ""), message: NSLocalizedString("Are you sure you want to delete this save state? This cannot be undone.", comment: ""), preferredStyle: .Alert) + confirmationAlertController.addAction(UIAlertAction(title: "Delete", style: .Default, handler: { action in + + let backgroundContext = DatabaseManager.sharedManager.backgroundManagedObjectContext() + backgroundContext.performBlock { + let temporarySaveState = backgroundContext.objectWithID(saveState.objectID) + backgroundContext.deleteObject(temporarySaveState) + backgroundContext.saveWithErrorLogging() + } + + + })) + confirmationAlertController.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: nil)) + + self.presentViewController(confirmationAlertController, animated: true, completion: nil) + } } +//MARK: - - extension SaveStatesViewController { override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int @@ -230,6 +272,7 @@ extension SaveStatesViewController } } +//MARK: - - extension SaveStatesViewController { override func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) @@ -245,6 +288,7 @@ extension SaveStatesViewController } } +//MARK: - - extension SaveStatesViewController: UICollectionViewDelegateFlowLayout { func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize @@ -256,6 +300,7 @@ extension SaveStatesViewController: UICollectionViewDelegateFlowLayout } } +//MARK: - - extension SaveStatesViewController: NSFetchedResultsControllerDelegate { func controllerDidChangeContent(controller: NSFetchedResultsController)