Adds button to change save states sort order

This commit is contained in:
Riley Testut 2019-10-14 18:55:47 -07:00
parent bcfbb7d7a0
commit 63a8dfd5b9
4 changed files with 63 additions and 14 deletions

View File

@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14868" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="Dt0-nV-isV"> <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="15400" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="Dt0-nV-isV">
<device id="retina4_7" orientation="portrait" appearance="light"/> <device id="retina4_7" orientation="portrait" appearance="light"/>
<dependencies> <dependencies>
<deployment identifier="iOS"/> <deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14824"/> <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15404"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies> </dependencies>
<scenes> <scenes>
@ -160,13 +160,28 @@
</connections> </connections>
</collectionView> </collectionView>
<navigationItem key="navigationItem" title="Save State" id="BoG-k2-aR2"> <navigationItem key="navigationItem" title="Save State" id="BoG-k2-aR2">
<barButtonItem key="rightBarButtonItem" systemItem="add" id="lKg-Ks-hWN"> <rightBarButtonItems>
<connections> <barButtonItem systemItem="add" id="lKg-Ks-hWN">
<action selector="addSaveState" destination="OOk-k7-INg" id="xY2-94-EOr"/> <connections>
</connections> <action selector="addSaveState" destination="OOk-k7-INg" id="xY2-94-EOr"/>
</barButtonItem> </connections>
</barButtonItem>
<barButtonItem style="plain" id="has-I3-HDZ">
<button key="customView" opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="y2a-9f-EFz">
<rect key="frame" x="288.5" y="13" width="30" height="30"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<state key="normal" title="▼"/>
<connections>
<action selector="changeSortOrder:" destination="OOk-k7-INg" eventType="primaryActionTriggered" id="qQn-uw-SN1"/>
</connections>
</button>
</barButtonItem>
</rightBarButtonItems>
</navigationItem> </navigationItem>
<simulatedNavigationBarMetrics key="simulatedTopBarMetrics" barStyle="black" prompted="NO"/> <simulatedNavigationBarMetrics key="simulatedTopBarMetrics" barStyle="black" prompted="NO"/>
<connections>
<outlet property="sortButton" destination="y2a-9f-EFz" id="Zbo-Q0-bVL"/>
</connections>
</collectionViewController> </collectionViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="cL5-DH-K3b" userLabel="First Responder" sceneMemberID="firstResponder"/> <placeholder placeholderIdentifier="IBFirstResponder" id="cL5-DH-K3b" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects> </objects>

View File

@ -24,7 +24,7 @@ class SaveStatesStoryboardSegue: UIStoryboardSegue
saveStatesViewController.loadViewIfNeeded() saveStatesViewController.loadViewIfNeeded()
let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(SaveStatesStoryboardSegue.handleDoneButton)) 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 } guard saveStatesViewController.theme == .translucent else { return }

View File

@ -54,7 +54,7 @@ class SaveStatesViewController: UICollectionViewController
didSet { didSet {
if self.isViewLoaded if self.isViewLoaded
{ {
self.updateTheme() self.update()
} }
} }
} }
@ -70,6 +70,8 @@ class SaveStatesViewController: UICollectionViewController
private var emulatorCoreSaveState: SaveStateProtocol? private var emulatorCoreSaveState: SaveStateProtocol?
@IBOutlet private var sortButton: UIButton!
required init?(coder aDecoder: NSCoder) required init?(coder aDecoder: NSCoder)
{ {
self.dataSource = RSTFetchedResultsCollectionViewPrefetchingDataSource<SaveState, UIImage>(fetchedResultsController: NSFetchedResultsController()) self.dataSource = RSTFetchedResultsCollectionViewPrefetchingDataSource<SaveState, UIImage>(fetchedResultsController: NSFetchedResultsController())
@ -106,7 +108,7 @@ extension SaveStatesViewController
case .loading: case .loading:
self.title = NSLocalizedString("Load State", comment: "") 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.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 // Manually update prototype cell properties
@ -123,7 +125,7 @@ extension SaveStatesViewController
self.navigationController?.navigationBar.barStyle = .blackTranslucent self.navigationController?.navigationBar.barStyle = .blackTranslucent
self.navigationController?.toolbar.barStyle = .blackTranslucent self.navigationController?.toolbar.barStyle = .blackTranslucent
self.updateTheme() self.update()
} }
override func viewWillDisappear(_ animated: Bool) override func viewWillDisappear(_ animated: Bool)
@ -195,12 +197,12 @@ private extension SaveStatesViewController
let fetchRequest: NSFetchRequest<SaveState> = SaveState.fetchRequest() let fetchRequest: NSFetchRequest<SaveState> = SaveState.fetchRequest()
fetchRequest.returnsObjectsAsFaults = false fetchRequest.returnsObjectsAsFaults = false
fetchRequest.predicate = NSPredicate(format: "%K == %@", #keyPath(SaveState.game), self.game) 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) self.dataSource.fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: DatabaseManager.shared.viewContext, sectionNameKeyPath: #keyPath(SaveState.type), cacheName: nil)
} }
func updateTheme() func update()
{ {
switch self.theme switch self.theme
{ {
@ -220,6 +222,8 @@ private extension SaveStatesViewController
self.placeholderView.textLabel.textColor = UIColor.white self.placeholderView.textLabel.textColor = UIColor.white
self.placeholderView.detailTextLabel.textColor = UIColor.white self.placeholderView.detailTextLabel.textColor = UIColor.white
} }
self.sortButton.transform = CGAffineTransform.identity.rotated(by: Settings.sortSaveStatesByOldestFirst ? 0 : .pi)
} }
//MARK: - Configure Views - //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 - //MARK: - Convenience Methods -
func correctedSectionForSectionIndex(_ section: Int) -> Section func correctedSectionForSectionIndex(_ section: Int) -> Section

View File

@ -54,7 +54,8 @@ struct Settings
let defaults = [#keyPath(UserDefaults.translucentControllerSkinOpacity): 0.7, let defaults = [#keyPath(UserDefaults.translucentControllerSkinOpacity): 0.7,
#keyPath(UserDefaults.gameShortcutsMode): GameShortcutsMode.recent.rawValue, #keyPath(UserDefaults.gameShortcutsMode): GameShortcutsMode.recent.rawValue,
#keyPath(UserDefaults.isButtonHapticFeedbackEnabled): true, #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) 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? static func preferredControllerSkin(for system: System, traits: DeltaCore.ControllerSkin.Traits) -> ControllerSkin?
{ {
guard let userDefaultsKey = self.preferredControllerSkinKey(for: system, traits: traits) else { return nil } 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 isButtonHapticFeedbackEnabled: Bool
@NSManaged var isThumbstickHapticFeedbackEnabled: Bool @NSManaged var isThumbstickHapticFeedbackEnabled: Bool
@NSManaged var sortSaveStatesByOldestFirst: Bool
} }