From 63a8dfd5b9c1477ba41f9560bc7d7294c5509329 Mon Sep 17 00:00:00 2001 From: Riley Testut Date: Mon, 14 Oct 2019 18:55:47 -0700 Subject: [PATCH] Adds button to change save states sort order --- Delta/Base.lproj/PauseMenu.storyboard | 29 ++++++++++++---- .../Segues/SaveStatesStoryboardSegue.swift | 2 +- .../SaveStatesViewController.swift | 33 ++++++++++++++++--- Delta/Settings/Settings.swift | 13 +++++++- 4 files changed, 63 insertions(+), 14 deletions(-) diff --git a/Delta/Base.lproj/PauseMenu.storyboard b/Delta/Base.lproj/PauseMenu.storyboard index 3f5661f..d91da9a 100644 --- a/Delta/Base.lproj/PauseMenu.storyboard +++ b/Delta/Base.lproj/PauseMenu.storyboard @@ -1,9 +1,9 @@ - + - + @@ -160,13 +160,28 @@ - - - - - + + + + + + + + + + + + + diff --git a/Delta/Game Selection/Segues/SaveStatesStoryboardSegue.swift b/Delta/Game Selection/Segues/SaveStatesStoryboardSegue.swift index 517ee61..c4862dd 100644 --- a/Delta/Game Selection/Segues/SaveStatesStoryboardSegue.swift +++ b/Delta/Game Selection/Segues/SaveStatesStoryboardSegue.swift @@ -24,7 +24,7 @@ class SaveStatesStoryboardSegue: UIStoryboardSegue saveStatesViewController.loadViewIfNeeded() let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(SaveStatesStoryboardSegue.handleDoneButton)) - saveStatesViewController.navigationItem.rightBarButtonItem = doneButton + saveStatesViewController.navigationItem.leftBarButtonItem = doneButton guard saveStatesViewController.theme == .translucent else { return } diff --git a/Delta/Pause Menu/Save States/SaveStatesViewController.swift b/Delta/Pause Menu/Save States/SaveStatesViewController.swift index 29e2d57..85bd353 100644 --- a/Delta/Pause Menu/Save States/SaveStatesViewController.swift +++ b/Delta/Pause Menu/Save States/SaveStatesViewController.swift @@ -54,7 +54,7 @@ class SaveStatesViewController: UICollectionViewController didSet { if self.isViewLoaded { - self.updateTheme() + self.update() } } } @@ -70,6 +70,8 @@ class SaveStatesViewController: UICollectionViewController private var emulatorCoreSaveState: SaveStateProtocol? + @IBOutlet private var sortButton: UIButton! + required init?(coder aDecoder: NSCoder) { self.dataSource = RSTFetchedResultsCollectionViewPrefetchingDataSource(fetchedResultsController: NSFetchedResultsController()) @@ -106,7 +108,7 @@ extension SaveStatesViewController case .loading: self.title = NSLocalizedString("Load State", comment: "") self.placeholderView.detailTextLabel.text = NSLocalizedString("You can create a new save state by pressing the Save State option in the pause menu.", comment: "") - self.navigationItem.rightBarButtonItem = nil + self.navigationItem.rightBarButtonItems?.removeFirst() } // Manually update prototype cell properties @@ -123,7 +125,7 @@ extension SaveStatesViewController self.navigationController?.navigationBar.barStyle = .blackTranslucent self.navigationController?.toolbar.barStyle = .blackTranslucent - self.updateTheme() + self.update() } override func viewWillDisappear(_ animated: Bool) @@ -195,12 +197,12 @@ private extension SaveStatesViewController let fetchRequest: NSFetchRequest = SaveState.fetchRequest() fetchRequest.returnsObjectsAsFaults = false fetchRequest.predicate = NSPredicate(format: "%K == %@", #keyPath(SaveState.game), self.game) - fetchRequest.sortDescriptors = [NSSortDescriptor(key: #keyPath(SaveState.type), ascending: true), NSSortDescriptor(key: #keyPath(SaveState.creationDate), ascending: true)] + fetchRequest.sortDescriptors = [NSSortDescriptor(key: #keyPath(SaveState.type), ascending: true), NSSortDescriptor(key: #keyPath(SaveState.creationDate), ascending: Settings.sortSaveStatesByOldestFirst)] self.dataSource.fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: DatabaseManager.shared.viewContext, sectionNameKeyPath: #keyPath(SaveState.type), cacheName: nil) } - func updateTheme() + func update() { switch self.theme { @@ -220,6 +222,8 @@ private extension SaveStatesViewController self.placeholderView.textLabel.textColor = UIColor.white self.placeholderView.detailTextLabel.textColor = UIColor.white } + + self.sortButton.transform = CGAffineTransform.identity.rotated(by: Settings.sortSaveStatesByOldestFirst ? 0 : .pi) } //MARK: - Configure Views - @@ -433,6 +437,25 @@ private extension SaveStatesViewController } } + @IBAction func changeSortOrder(_ sender: UIButton) + { + Settings.sortSaveStatesByOldestFirst.toggle() + + UIView.transition(with: self.collectionView, duration: 0.4, options: .transitionCrossDissolve, animations: { + self.updateDataSource() + }, completion: nil) + + UIView.animate(withDuration: 0.4) { + self.update() + } + + let toastView = RSTToastView() + toastView.textLabel.text = Settings.sortSaveStatesByOldestFirst ? NSLocalizedString("Oldest First", comment: "") : NSLocalizedString("Newest First", comment: "") + toastView.presentationEdge = .top + toastView.tintColor = UIColor.deltaPurple + toastView.show(in: self.view, duration: 2.0) + } + //MARK: - Convenience Methods - func correctedSectionForSectionIndex(_ section: Int) -> Section diff --git a/Delta/Settings/Settings.swift b/Delta/Settings/Settings.swift index bbfd789..63c4b5b 100644 --- a/Delta/Settings/Settings.swift +++ b/Delta/Settings/Settings.swift @@ -54,7 +54,8 @@ struct Settings let defaults = [#keyPath(UserDefaults.translucentControllerSkinOpacity): 0.7, #keyPath(UserDefaults.gameShortcutsMode): GameShortcutsMode.recent.rawValue, #keyPath(UserDefaults.isButtonHapticFeedbackEnabled): true, - #keyPath(UserDefaults.isThumbstickHapticFeedbackEnabled): true] as [String : Any] + #keyPath(UserDefaults.isThumbstickHapticFeedbackEnabled): true, + #keyPath(UserDefaults.sortSaveStatesByOldestFirst): true] as [String : Any] UserDefaults.standard.register(defaults: defaults) } } @@ -168,6 +169,14 @@ extension Settings } } + static var sortSaveStatesByOldestFirst: Bool { + set { UserDefaults.standard.sortSaveStatesByOldestFirst = newValue } + get { + let sortByOldestFirst = UserDefaults.standard.sortSaveStatesByOldestFirst + return sortByOldestFirst + } + } + static func preferredControllerSkin(for system: System, traits: DeltaCore.ControllerSkin.Traits) -> ControllerSkin? { guard let userDefaultsKey = self.preferredControllerSkinKey(for: system, traits: traits) else { return nil } @@ -270,4 +279,6 @@ private extension UserDefaults @NSManaged var isButtonHapticFeedbackEnabled: Bool @NSManaged var isThumbstickHapticFeedbackEnabled: Bool + + @NSManaged var sortSaveStatesByOldestFirst: Bool }