Adds ability to delete save states via long press
This commit is contained in:
parent
e08cc1c331
commit
129cef9cb8
@ -45,6 +45,7 @@ class DatabaseManager
|
|||||||
self.validationManagedObjectContext.parentContext = self.managedObjectContext
|
self.validationManagedObjectContext.parentContext = self.managedObjectContext
|
||||||
self.validationManagedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
|
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)
|
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("managedObjectContextDidSave:"), name: NSManagedObjectContextDidSaveNotification, object: nil)
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -286,18 +287,31 @@ private extension DatabaseManager
|
|||||||
|
|
||||||
// MARK: - Validation -
|
// MARK: - Validation -
|
||||||
|
|
||||||
func validateManagedObjectSaveWithUserInfo(userInfo: [NSObject : AnyObject])
|
func validateManagedObjectContextSave(managedObjectContext: NSManagedObjectContext)
|
||||||
{
|
{
|
||||||
// Remove deleted games from disk
|
// Remove deleted files from disk
|
||||||
if let deletedObjects = userInfo[NSDeletedObjectsKey] as? Set<NSManagedObject>
|
for object in managedObjectContext.deletedObjects
|
||||||
{
|
{
|
||||||
let games = deletedObjects.filter({ $0 is Game }).map({ self.validationManagedObjectContext.objectWithID($0.objectID) as! Game })
|
var fileURLs = Set<NSURL>()
|
||||||
|
|
||||||
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
|
do
|
||||||
{
|
{
|
||||||
try NSFileManager.defaultManager().removeItemAtURL(game.fileURL)
|
try NSFileManager.defaultManager().removeItemAtURL(URL)
|
||||||
}
|
}
|
||||||
catch let error as NSError
|
catch let error as NSError
|
||||||
{
|
{
|
||||||
@ -317,16 +331,22 @@ private extension DatabaseManager
|
|||||||
|
|
||||||
// MARK: - Notifications -
|
// 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 }
|
guard let managedObjectContext = notification.object as? NSManagedObjectContext where managedObjectContext.parentContext == self.validationManagedObjectContext else { return }
|
||||||
|
|
||||||
self.validationManagedObjectContext.performBlockAndWait {
|
self.validationManagedObjectContext.performBlockAndWait {
|
||||||
self.validateManagedObjectSaveWithUserInfo(notification.userInfo ?? [:])
|
self.validateManagedObjectContextSave(managedObjectContext)
|
||||||
self.save()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@objc func managedObjectContextDidSave(notification: NSNotification)
|
||||||
|
{
|
||||||
|
guard let managedObjectContext = notification.object as? NSManagedObjectContext where managedObjectContext.parentContext == self.validationManagedObjectContext else { return }
|
||||||
|
|
||||||
|
self.save()
|
||||||
|
}
|
||||||
|
|
||||||
// MARK: - File Management -
|
// MARK: - File Management -
|
||||||
|
|
||||||
class func createDirectoryAtURLIfNeeded(URL: NSURL)
|
class func createDirectoryAtURLIfNeeded(URL: NSURL)
|
||||||
@ -340,4 +360,4 @@ private extension DatabaseManager
|
|||||||
print(error)
|
print(error)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -98,6 +98,9 @@ extension SaveStatesViewController
|
|||||||
self.prototypeCellWidthConstraint = self.prototypeCell.contentView.widthAnchor.constraintEqualToConstant(collectionViewLayout.itemWidth)
|
self.prototypeCellWidthConstraint = self.prototypeCell.contentView.widthAnchor.constraintEqualToConstant(collectionViewLayout.itemWidth)
|
||||||
self.prototypeCellWidthConstraint.active = true
|
self.prototypeCellWidthConstraint.active = true
|
||||||
|
|
||||||
|
let longPressGestureRecognizer = UILongPressGestureRecognizer(target: self, action: "handleLongPressGesture:")
|
||||||
|
self.collectionView?.addGestureRecognizer(longPressGestureRecognizer)
|
||||||
|
|
||||||
self.updateBackgroundView()
|
self.updateBackgroundView()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -128,6 +131,8 @@ extension SaveStatesViewController
|
|||||||
|
|
||||||
private extension SaveStatesViewController
|
private extension SaveStatesViewController
|
||||||
{
|
{
|
||||||
|
//MARK: - Update -
|
||||||
|
|
||||||
func updateFetchedResultsController()
|
func updateFetchedResultsController()
|
||||||
{
|
{
|
||||||
let game = self.delegate.saveStatesViewControllerActiveGame(self)
|
let game = self.delegate.saveStatesViewControllerActiveGame(self)
|
||||||
@ -181,10 +186,27 @@ private extension SaveStatesViewController
|
|||||||
let name = saveState.name ?? self.dateFormatter.stringFromDate(saveState.modifiedDate)
|
let name = saveState.name ?? self.dateFormatter.stringFromDate(saveState.modifiedDate)
|
||||||
cell.textLabel.text = name
|
cell.textLabel.text = name
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
//MARK: - Gestures -
|
||||||
private extension SaveStatesViewController
|
|
||||||
{
|
@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()
|
@IBAction func addSaveState()
|
||||||
{
|
{
|
||||||
let backgroundContext = DatabaseManager.sharedManager.backgroundManagedObjectContext()
|
let backgroundContext = DatabaseManager.sharedManager.backgroundManagedObjectContext()
|
||||||
@ -212,8 +234,28 @@ private extension SaveStatesViewController
|
|||||||
self.delegate?.saveStatesViewController(self, updateSaveState: saveState)
|
self.delegate?.saveStatesViewController(self, updateSaveState: saveState)
|
||||||
saveState.managedObjectContext?.saveWithErrorLogging()
|
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: - <UICollectionViewDataSource> -
|
||||||
extension SaveStatesViewController
|
extension SaveStatesViewController
|
||||||
{
|
{
|
||||||
override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
|
override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
|
||||||
@ -230,6 +272,7 @@ extension SaveStatesViewController
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//MARK: - <UICollectionViewDelegate> -
|
||||||
extension SaveStatesViewController
|
extension SaveStatesViewController
|
||||||
{
|
{
|
||||||
override func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath)
|
override func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath)
|
||||||
@ -245,6 +288,7 @@ extension SaveStatesViewController
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//MARK: - <UICollectionViewDelegateFlowLayout> -
|
||||||
extension SaveStatesViewController: UICollectionViewDelegateFlowLayout
|
extension SaveStatesViewController: UICollectionViewDelegateFlowLayout
|
||||||
{
|
{
|
||||||
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize
|
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize
|
||||||
@ -256,6 +300,7 @@ extension SaveStatesViewController: UICollectionViewDelegateFlowLayout
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//MARK: - <NSFetchedResultsControllerDelegate> -
|
||||||
extension SaveStatesViewController: NSFetchedResultsControllerDelegate
|
extension SaveStatesViewController: NSFetchedResultsControllerDelegate
|
||||||
{
|
{
|
||||||
func controllerDidChangeContent(controller: NSFetchedResultsController)
|
func controllerDidChangeContent(controller: NSFetchedResultsController)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user