diff --git a/Delta.xcodeproj/project.pbxproj b/Delta.xcodeproj/project.pbxproj index 807d697..0e3850f 100644 --- a/Delta.xcodeproj/project.pbxproj +++ b/Delta.xcodeproj/project.pbxproj @@ -31,6 +31,10 @@ BF353FFF1C5DA3C500C1184C /* PausePresentationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF353FFD1C5DA3C500C1184C /* PausePresentationController.swift */; }; BF3540001C5DA3C500C1184C /* PausePresentationControllerContentView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BF353FFE1C5DA3C500C1184C /* PausePresentationControllerContentView.xib */; }; BF3540021C5DA3D500C1184C /* PauseStoryboardSegue.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF3540011C5DA3D500C1184C /* PauseStoryboardSegue.swift */; }; + BF3540051C5DA70400C1184C /* SaveStatesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF3540041C5DA70400C1184C /* SaveStatesViewController.swift */; }; + BF3540061C5DA70400C1184C /* SaveStatesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF3540041C5DA70400C1184C /* SaveStatesViewController.swift */; }; + BF3540081C5DAFAD00C1184C /* PauseTransitionCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF3540071C5DAFAD00C1184C /* PauseTransitionCoordinator.swift */; }; + BF3540091C5DAFAD00C1184C /* PauseTransitionCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF3540071C5DAFAD00C1184C /* PauseTransitionCoordinator.swift */; }; BF4566E81BC090B6007BFA1A /* Model.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = BF4566E61BC090B6007BFA1A /* Model.xcdatamodeld */; }; BF4566E91BC090B6007BFA1A /* Model.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = BF4566E61BC090B6007BFA1A /* Model.xcdatamodeld */; }; BF5E7F441B9A650B00AE44F8 /* SettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF5E7F431B9A650B00AE44F8 /* SettingsViewController.swift */; }; @@ -134,6 +138,8 @@ BF353FFD1C5DA3C500C1184C /* PausePresentationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = PausePresentationController.swift; path = "Pause Menu/Presentation Controller/PausePresentationController.swift"; sourceTree = ""; }; BF353FFE1C5DA3C500C1184C /* PausePresentationControllerContentView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = PausePresentationControllerContentView.xib; path = "Pause Menu/Presentation Controller/PausePresentationControllerContentView.xib"; sourceTree = ""; }; BF3540011C5DA3D500C1184C /* PauseStoryboardSegue.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = PauseStoryboardSegue.swift; path = "Pause Menu/Segues/PauseStoryboardSegue.swift"; sourceTree = ""; }; + BF3540041C5DA70400C1184C /* SaveStatesViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SaveStatesViewController.swift; path = "Pause Menu/Save States/SaveStatesViewController.swift"; sourceTree = ""; }; + BF3540071C5DAFAD00C1184C /* PauseTransitionCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = PauseTransitionCoordinator.swift; path = "Pause Menu/Segues/PauseTransitionCoordinator.swift"; sourceTree = ""; }; BF4566E71BC090B6007BFA1A /* Model.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = Model.xcdatamodel; sourceTree = ""; }; BF5E7F431B9A650B00AE44F8 /* SettingsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SettingsViewController.swift; sourceTree = ""; }; BF5E7F451B9A652600AE44F8 /* Settings.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Settings.storyboard; sourceTree = ""; }; @@ -230,6 +236,14 @@ name = "Presentation Controller"; sourceTree = ""; }; + BF3540031C5DA6D800C1184C /* Save States */ = { + isa = PBXGroup; + children = ( + BF3540041C5DA70400C1184C /* SaveStatesViewController.swift */, + ); + name = "Save States"; + sourceTree = ""; + }; BF4566E31BC09026007BFA1A /* Common */ = { isa = PBXGroup; children = ( @@ -299,6 +313,7 @@ BF353FF11C5D7FB000C1184C /* PauseViewController.swift */, BF7AE8041C2E858400B1B5BC /* PauseMenuViewController.swift */, BF353FF81C5D870B00C1184C /* PauseItem.swift */, + BF3540031C5DA6D800C1184C /* Save States */, BF353FFB1C5DA2F600C1184C /* Presentation Controller */, BF912E481C5CB5D50041527C /* Segues */, ); @@ -317,6 +332,7 @@ isa = PBXGroup; children = ( BF3540011C5DA3D500C1184C /* PauseStoryboardSegue.swift */, + BF3540071C5DAFAD00C1184C /* PauseTransitionCoordinator.swift */, ); name = Segues; sourceTree = ""; @@ -667,9 +683,11 @@ BFB141191BE46934004FBF46 /* GameCollectionViewDataSource.swift in Sources */, BFF1E5651BE04CAF000E9EF6 /* BoxArtImageView.swift in Sources */, BF353FFA1C5D870B00C1184C /* PauseItem.swift in Sources */, + BF3540061C5DA70400C1184C /* SaveStatesViewController.swift in Sources */, BF353FF31C5D7FB000C1184C /* PauseViewController.swift in Sources */, BF6BB23F1BB73FE800CCF94A /* AppDelegate.swift in Sources */, BF4566E91BC090B6007BFA1A /* Model.xcdatamodeld in Sources */, + BF3540091C5DAFAD00C1184C /* PauseTransitionCoordinator.swift in Sources */, BF762EAC1BC1B076002C8866 /* NSManagedObject+Conveniences.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -678,6 +696,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + BF3540081C5DAFAD00C1184C /* PauseTransitionCoordinator.swift in Sources */, BFAA1FED1B8AA4FA00495943 /* Settings.swift in Sources */, BF7AE8241C2E984300B1B5BC /* GridCollectionViewLayout.swift in Sources */, BFB141181BE46934004FBF46 /* GameCollectionViewDataSource.swift in Sources */, @@ -705,6 +724,7 @@ BFDB28451BC9DA7B001D0C83 /* GamePickerController.swift in Sources */, BFDE393A1BC0CEDF003F72E8 /* Game+CoreDataProperties.swift in Sources */, BF7AE8081C2E858400B1B5BC /* PauseMenuViewController.swift in Sources */, + BF3540051C5DA70400C1184C /* SaveStatesViewController.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Delta/Base.lproj/PauseMenu.storyboard b/Delta/Base.lproj/PauseMenu.storyboard index bd60e35..639f869 100644 --- a/Delta/Base.lproj/PauseMenu.storyboard +++ b/Delta/Base.lproj/PauseMenu.storyboard @@ -66,12 +66,13 @@ + - + @@ -139,5 +140,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Delta/Emulation/EmulationViewController.swift b/Delta/Emulation/EmulationViewController.swift index ddda9bc..9c93a3c 100644 --- a/Delta/Emulation/EmulationViewController.swift +++ b/Delta/Emulation/EmulationViewController.swift @@ -147,14 +147,20 @@ class EmulationViewController: UIViewController pauseViewController.dismiss() } - let saveStateItem = PauseItem(image: UIImage(named: "SmallPause")!, text: NSLocalizedString("Save State", comment: ""), action: dismissAction) - let loadStateItem = PauseItem(image: UIImage(named: "SmallPause")!, text: NSLocalizedString("Load State", comment: ""), action: dismissAction) + let saveStateItem = PauseItem(image: UIImage(named: "SmallPause")!, text: NSLocalizedString("Save State", comment: ""), action: { _ in + pauseViewController.presentSaveStateViewController() + }) + + let loadStateItem = PauseItem(image: UIImage(named: "SmallPause")!, text: NSLocalizedString("Load State", comment: ""), action: { _ in + pauseViewController.presentSaveStateViewController() + }) + let cheatCodesItem = PauseItem(image: UIImage(named: "SmallPause")!, text: NSLocalizedString("Cheat Codes", comment: ""), action: dismissAction) let sustainButtonItem = PauseItem(image: UIImage(named: "SmallPause")!, text: NSLocalizedString("Sustain Button", comment: ""), action: dismissAction) var fastForwardItem = PauseItem(image: UIImage(named: "FastForward")!, text: NSLocalizedString("Fast Forward", comment: ""), action: { [weak self] item in self?.emulatorCore.fastForwarding = item.selected - }) + }) fastForwardItem.selected = self.emulatorCore.fastForwarding pauseViewController.items = [saveStateItem, loadStateItem, cheatCodesItem, fastForwardItem, sustainButtonItem] diff --git a/Delta/Pause Menu/PauseMenuViewController.swift b/Delta/Pause Menu/PauseMenuViewController.swift index a625cc0..12bee94 100644 --- a/Delta/Pause Menu/PauseMenuViewController.swift +++ b/Delta/Pause Menu/PauseMenuViewController.swift @@ -31,11 +31,15 @@ class PauseMenuViewController: UICollectionViewController } private var prototypeCell = GridCollectionViewCell() - + private var previousIndexPath: NSIndexPath? = nil +} + +extension PauseMenuViewController +{ override func viewDidLoad() { super.viewDidLoad() - + let collectionViewLayout = self.collectionViewLayout as! GridCollectionViewLayout collectionViewLayout.itemWidth = 90 collectionViewLayout.usesEqualHorizontalSpacingDistributionForSingleRow = true @@ -43,6 +47,18 @@ class PauseMenuViewController: UICollectionViewController // Manually update prototype cell properties self.prototypeCell.contentView.widthAnchor.constraintEqualToConstant(collectionViewLayout.itemWidth).active = true } + + override func viewDidAppear(animated: Bool) + { + super.viewDidAppear(animated) + + if let indexPath = self.previousIndexPath + { + UIView.animateWithDuration(0.2) { + self.toggleSelectedStateForPauseItemAtIndexPath(indexPath) + } + } + } } private extension PauseMenuViewController @@ -125,6 +141,8 @@ extension PauseMenuViewController override func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { + self.previousIndexPath = indexPath + self.toggleSelectedStateForPauseItemAtIndexPath(indexPath) let pauseItem = self.items[indexPath.item] diff --git a/Delta/Pause Menu/PauseViewController.swift b/Delta/Pause Menu/PauseViewController.swift index 80cfae9..eff2887 100644 --- a/Delta/Pause Menu/PauseViewController.swift +++ b/Delta/Pause Menu/PauseViewController.swift @@ -31,6 +31,10 @@ class PauseViewController: UIViewController, PauseInfoProvidable } } + override var navigationController: UINavigationController? { + return self.pauseNavigationController + } + private var pauseNavigationController: UINavigationController! } @@ -59,11 +63,16 @@ extension PauseViewController self.pauseNavigationController.navigationBar.frame = CGRect(x: 0, y: 0, width: self.view.bounds.width, height: self.pauseNavigationController.navigationBar.bounds.height) } + override func targetViewControllerForAction(action: Selector, sender: AnyObject?) -> UIViewController? { + return self.pauseNavigationController + } + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if segue.identifier == "embedNavigationController" { self.pauseNavigationController = segue.destinationViewController as! UINavigationController + self.pauseNavigationController.delegate = self self.pauseNavigationController.navigationBar.tintColor = UIColor.deltaLightPurpleColor() self.pauseNavigationController.view.backgroundColor = UIColor.clearColor() @@ -82,4 +91,19 @@ extension PauseViewController { self.performSegueWithIdentifier("unwindFromPauseMenu", sender: self) } + + func presentSaveStateViewController() + { + self.performSegueWithIdentifier("saveState", sender: self) + } +} + +extension PauseViewController: UINavigationControllerDelegate +{ + func navigationController(navigationController: UINavigationController, animationControllerForOperation operation: UINavigationControllerOperation, fromViewController fromVC: UIViewController, toViewController toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? + { + let transitionCoordinator = PauseTransitionCoordinator(presentationController: self.presentationController!) + transitionCoordinator.presenting = (operation == .Push) + return transitionCoordinator + } } \ No newline at end of file diff --git a/Delta/Pause Menu/Presentation Controller/PausePresentationController.swift b/Delta/Pause Menu/Presentation Controller/PausePresentationController.swift index 73fec50..19764da 100644 --- a/Delta/Pause Menu/Presentation Controller/PausePresentationController.swift +++ b/Delta/Pause Menu/Presentation Controller/PausePresentationController.swift @@ -111,6 +111,12 @@ class PausePresentationController: UIPresentationController let currentY = self.contentView.frame.minY self.contentView.frame = self.containerView!.bounds self.contentView.frame.origin.y = currentY + + if self.presentedView()!.frame.minY == 0 + { + // Temporarily offset top of presentedView by a small amount to prevent navigation bar from growing when rotating from landscape to portrait + self.presentedView()?.frame.origin.y = 0.5 + } } override func containerViewDidLayoutSubviews() diff --git a/Delta/Pause Menu/Presentation Controller/PausePresentationControllerContentView.xib b/Delta/Pause Menu/Presentation Controller/PausePresentationControllerContentView.xib index fc98d62..08bf7a7 100644 --- a/Delta/Pause Menu/Presentation Controller/PausePresentationControllerContentView.xib +++ b/Delta/Pause Menu/Presentation Controller/PausePresentationControllerContentView.xib @@ -1,5 +1,5 @@ - + @@ -17,7 +17,7 @@ - + @@ -28,7 +28,7 @@