diff --git a/Cores/DeltaCore b/Cores/DeltaCore index 5fd73cc..bcedcc2 160000 --- a/Cores/DeltaCore +++ b/Cores/DeltaCore @@ -1 +1 @@ -Subproject commit 5fd73cc46963b506ec077dfd9f66d7e5d997acfb +Subproject commit bcedcc293badfc9e4f07f3c66f496bf828450874 diff --git a/Delta.xcodeproj/project.pbxproj b/Delta.xcodeproj/project.pbxproj index 411f8f3..f4984b9 100644 --- a/Delta.xcodeproj/project.pbxproj +++ b/Delta.xcodeproj/project.pbxproj @@ -1320,9 +1320,11 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 15; DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = "Delta/Supporting Files/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MARKETING_VERSION = 1.1; OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" -DDEBUG"; PRODUCT_BUNDLE_IDENTIFIER = com.rileytestut.Delta; PROVISIONING_PROFILE = ""; @@ -1343,9 +1345,11 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 15; DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = "Delta/Supporting Files/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MARKETING_VERSION = 1.1; OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" -DIMPACTOR"; PRODUCT_BUNDLE_IDENTIFIER = com.rileytestut.Delta; PROVISIONING_PROFILE = ""; 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/Importing/Import Options/PhotoLibraryImportOption.swift b/Delta/Importing/Import Options/PhotoLibraryImportOption.swift index 918d084..4639c01 100644 --- a/Delta/Importing/Import Options/PhotoLibraryImportOption.swift +++ b/Delta/Importing/Import Options/PhotoLibraryImportOption.swift @@ -30,6 +30,7 @@ class PhotoLibraryImportOption: NSObject, ImportOption let imagePickerController = UIImagePickerController() imagePickerController.delegate = self + imagePickerController.modalPresentationStyle = .fullScreen imagePickerController.sourceType = .photoLibrary imagePickerController.mediaTypes = [kUTTypeImage as String] imagePickerController.view.backgroundColor = .white diff --git a/Delta/Importing/ImportController.swift b/Delta/Importing/ImportController.swift index c57ac3a..0c7d878 100644 --- a/Delta/Importing/ImportController.swift +++ b/Delta/Importing/ImportController.swift @@ -120,6 +120,7 @@ class ImportController: NSObject let documentBrowserViewController = UIDocumentBrowserViewController(forOpeningFilesWithContentTypes: Array(self.documentTypes)) documentBrowserViewController.delegate = self + documentBrowserViewController.modalPresentationStyle = .fullScreen documentBrowserViewController.browserUserInterfaceStyle = .dark documentBrowserViewController.allowsPickingMultipleItems = true documentBrowserViewController.allowsDocumentCreation = false diff --git a/Delta/Pause Menu/Cheats/CheatTextView.swift b/Delta/Pause Menu/Cheats/CheatTextView.swift index d545c9c..b3cb25b 100644 --- a/Delta/Pause Menu/Cheats/CheatTextView.swift +++ b/Delta/Pause Menu/Cheats/CheatTextView.swift @@ -33,9 +33,6 @@ class CheatTextView: UITextView super.init(coder: aDecoder) self.layoutManager.delegate = self - - self.textContainer.widthTracksTextView = false - self.textContainer.heightTracksTextView = false } } diff --git a/Delta/Pause Menu/Save States/SaveStatesCollectionHeaderView.swift b/Delta/Pause Menu/Save States/SaveStatesCollectionHeaderView.swift index b4f8ec7..26ec89a 100644 --- a/Delta/Pause Menu/Save States/SaveStatesCollectionHeaderView.swift +++ b/Delta/Pause Menu/Save States/SaveStatesCollectionHeaderView.swift @@ -55,7 +55,7 @@ class SaveStatesCollectionHeaderView: UICollectionReusableView self.textLabel.font = UIFont(descriptor: fontDescriptor, size: 0.0) self.textLabel.textAlignment = .center - self.vibrancyView.contentView.addSubview(self.textLabel) + self.addSubview(self.textLabel) // Auto Layout self.textLabel.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: 20).isActive = true diff --git a/Delta/Pause Menu/Save States/SaveStatesViewController.swift b/Delta/Pause Menu/Save States/SaveStatesViewController.swift index 6d84722..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 - @@ -267,12 +271,16 @@ private extension SaveStatesViewController } headerView.textLabel.text = title - headerView.textLabel.textColor = UIColor.white switch self.theme { - case .opaque: headerView.isTextLabelVibrancyEnabled = false - case .translucent: headerView.isTextLabelVibrancyEnabled = true + case .opaque: + headerView.textLabel.textColor = UIColor.lightGray + headerView.isTextLabelVibrancyEnabled = false + + case .translucent: + headerView.textLabel.textColor = UIColor.white + headerView.isTextLabelVibrancyEnabled = true } } @@ -429,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 } diff --git a/Delta/Supporting Files/Info.plist b/Delta/Supporting Files/Info.plist index 44b0217..c5c64f4 100644 --- a/Delta/Supporting Files/Info.plist +++ b/Delta/Supporting Files/Info.plist @@ -128,7 +128,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.1 + $(MARKETING_VERSION) CFBundleSignature ???? CFBundleURLTypes @@ -161,7 +161,7 @@ CFBundleVersion - 14 + $(CURRENT_PROJECT_VERSION) Fabric APIKey @@ -222,6 +222,8 @@ UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight + UIUserInterfaceStyle + Light UTExportedTypeDeclarations @@ -369,7 +371,5 @@ - UIUserInterfaceStyle - Light