From 31d306e95fe904b6a7651a94489b1fe43c790b69 Mon Sep 17 00:00:00 2001 From: Riley Testut Date: Fri, 6 Sep 2019 18:58:43 -0700 Subject: [PATCH] =?UTF-8?q?Adds=20=E2=80=9CNo=20Connected=20Controllers?= =?UTF-8?q?=E2=80=9D=20cell=20when=20there=20are=20no=20game=20controllers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Delta/Base.lproj/Settings.storyboard | 17 +++ .../ControllersSettingsViewController.swift | 140 +++++++----------- 2 files changed, 73 insertions(+), 84 deletions(-) diff --git a/Delta/Base.lproj/Settings.storyboard b/Delta/Base.lproj/Settings.storyboard index 7dc19c8..ae6413f 100644 --- a/Delta/Base.lproj/Settings.storyboard +++ b/Delta/Base.lproj/Settings.storyboard @@ -480,6 +480,23 @@ + + + + + + + + + + + diff --git a/Delta/Settings/Controllers/ControllersSettingsViewController.swift b/Delta/Settings/Controllers/ControllersSettingsViewController.swift index f281fbe..5e193db 100644 --- a/Delta/Settings/Controllers/ControllersSettingsViewController.swift +++ b/Delta/Settings/Controllers/ControllersSettingsViewController.swift @@ -15,7 +15,6 @@ extension ControllersSettingsViewController { private enum Section: Int { - case none case localDevice case externalControllers case customizeControls @@ -56,7 +55,12 @@ class ControllersSettingsViewController: UITableViewController } else { - oldValue?.playerIndex = nil + // Ensure it's still a discovered controller, or else it might crash when setting player index. + if ExternalGameControllerManager.shared.connectedControllers.contains(where: { $0 === oldValue }) + { + oldValue?.playerIndex = nil + } + self.gameController?.playerIndex = self.playerIndex } } @@ -126,14 +130,6 @@ private extension ControllersSettingsViewController switch Section(rawValue: indexPath.section)! { - case .none: - cell.textLabel?.text = NSLocalizedString("None", comment: "") - - if Settings.localControllerPlayerIndex != self.playerIndex && !self.connectedControllers.contains(where: { $0.playerIndex == self.playerIndex }) - { - cell.accessoryType = .checkmark - } - case .localDevice, .externalControllers: let controller: GameController @@ -158,10 +154,7 @@ private extension ControllersSettingsViewController } else { - if let playerIndex = controller.playerIndex - { - cell.detailTextLabel?.text = NSLocalizedString("Player \(playerIndex + 1)", comment: "") - } + cell.accessoryType = .none } case .customizeControls: @@ -188,66 +181,56 @@ private extension ControllersSettingsViewController self.connectedControllers.append(controller) } + self.tableView.beginUpdates() + if let index = self.connectedControllers.firstIndex(where: { $0 == controller }) { - self.tableView.beginUpdates() - - if self.connectedControllers.count == 1 + if self.connectedControllers.count == 1 && self.connectedControllers.first?.playerIndex == self.playerIndex { - self.tableView.insertSections(IndexSet(integer: Section.externalControllers.rawValue), with: .fade) - - if self.connectedControllers.first?.playerIndex == self.playerIndex - { - self.tableView.insertSections(IndexSet(integer: Section.customizeControls.rawValue), with: .fade) - } - } - else - { - self.tableView.insertRows(at: [IndexPath(row: index, section: Section.externalControllers.rawValue)], with: .automatic) + self.tableView.deleteRows(at: [IndexPath(row: 0, section: Section.externalControllers.rawValue)], with: .automatic) } - self.tableView.endUpdates() + self.tableView.insertRows(at: [IndexPath(row: index, section: Section.externalControllers.rawValue)], with: .automatic) } if controller.playerIndex == self.playerIndex { - self.tableView.reloadSections(IndexSet(integer: Section.none.rawValue), with: .none) + self.gameController = controller + self.tableView.reloadSections(IndexSet(integer: Section.localDevice.rawValue), with: .none) + self.tableView.insertSections(IndexSet(integer: Section.customizeControls.rawValue), with: .none) } + + self.tableView.endUpdates() } @objc func externalGameControllerDidDisconnect(_ notification: Notification) { guard let controller = notification.object as? GameController else { return } + self.tableView.beginUpdates() + if let index = self.connectedControllers.firstIndex(where: { $0 == controller }) { self.connectedControllers.remove(at: index) - self.tableView.beginUpdates() - - if self.connectedControllers.count == 0 + if self.connectedControllers.count == 0 && controller.playerIndex != nil { - self.tableView.deleteSections(IndexSet(integer: Section.externalControllers.rawValue), with: .fade) - - if controller.playerIndex != nil - { - self.tableView.deleteSections(IndexSet(integer: Section.customizeControls.rawValue), with: .fade) - } - } - else - { - self.tableView.deleteRows(at: [IndexPath(row: index, section: Section.externalControllers.rawValue)], with: .automatic) + self.tableView.insertRows(at: [IndexPath(row: 0, section: Section.externalControllers.rawValue)], with: .automatic) } - self.tableView.endUpdates() + self.tableView.deleteRows(at: [IndexPath(row: index, section: Section.externalControllers.rawValue)], with: .automatic) } if controller.playerIndex == self.playerIndex { - self.tableView.reloadSections(IndexSet(integer: Section.none.rawValue), with: .none) + self.gameController = self.localDeviceController + self.tableView.reloadSections(IndexSet(integer: Section.localDevice.rawValue), with: .none) + self.tableView.deleteSections(IndexSet(integer: Section.customizeControls.rawValue), with: .none) } + + self.tableView.endUpdates() } } @@ -255,65 +238,66 @@ extension ControllersSettingsViewController { override func numberOfSections(in tableView: UITableView) -> Int { - if self.connectedControllers.count == 0 + if self.gameController == self.localDeviceController { return 2 } - - if self.gameController == nil || Settings.localControllerPlayerIndex == self.playerIndex - { - return 3 - } - return 4 + return 3 } override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { switch Section(rawValue: section)! { - case .none: return 0 case .localDevice: return 1 - case .externalControllers: return self.connectedControllers.count + case .externalControllers: return self.connectedControllers.isEmpty ? 1 : self.connectedControllers.count case .customizeControls: return 1 } } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - let cell = tableView.dequeueReusableCell(withIdentifier: RSTCellContentGenericCellIdentifier, for: indexPath) - - self.configure(cell, for: indexPath) - - return cell + switch Section(rawValue: indexPath.section)! + { + case .externalControllers where self.connectedControllers.isEmpty: + let cell = tableView.dequeueReusableCell(withIdentifier: "NoControllers", for: indexPath) + return cell + + default: + let cell = tableView.dequeueReusableCell(withIdentifier: RSTCellContentGenericCellIdentifier, for: indexPath) + self.configure(cell, for: indexPath) + return cell + } } override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { switch Section(rawValue: section)! { - case .none: return nil - case .localDevice: return NSLocalizedString("Local Device", comment: "") - case .externalControllers: return self.connectedControllers.count > 0 ? NSLocalizedString("External Controllers", comment: "") : "" + case .localDevice: return NSLocalizedString("This Device", comment: "") + case .externalControllers: return NSLocalizedString("Game Controllers", comment: "") case .customizeControls: return nil } } - - override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat - { - if section == Section.none.rawValue - { - return 1 - } - - return UITableView.automaticDimension - } } extension ControllersSettingsViewController { override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + switch Section(rawValue: indexPath.section)! + { + case .localDevice: self.gameController = self.localDeviceController + case .externalControllers where self.connectedControllers.isEmpty: return + case .externalControllers: self.gameController = self.connectedControllers[indexPath.row] + case .customizeControls: + guard let cell = tableView.cellForRow(at: indexPath) else { return } + self.performSegue(withIdentifier: "controllerInputsSegue", sender: cell) + + return + } + let previousIndexPath: IndexPath? if let gameController = self.gameController @@ -333,19 +317,7 @@ extension ControllersSettingsViewController } else { - previousIndexPath = IndexPath(row: 0, section: Section.none.rawValue) - } - - switch Section(rawValue: indexPath.section)! - { - case .none: self.gameController = nil - case .localDevice: self.gameController = self.localDeviceController - case .externalControllers: self.gameController = self.connectedControllers[indexPath.row] - case .customizeControls: - guard let cell = tableView.cellForRow(at: indexPath) else { return } - self.performSegue(withIdentifier: "controllerInputsSegue", sender: cell) - - return + previousIndexPath = nil } self.tableView.beginUpdates()