diff --git a/iOS/Master/MasterViewController.swift b/iOS/Master/MasterViewController.swift index a9c9d4080..4cb6cb1b9 100644 --- a/iOS/Master/MasterViewController.swift +++ b/iOS/Master/MasterViewController.swift @@ -137,11 +137,11 @@ class MasterViewController: UITableViewController, UndoableCommandRunner { // MARK: Table View override func numberOfSections(in tableView: UITableView) -> Int { - return navState.shadowTable.count + return navState.numberOfSections } override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return navState.shadowTable[section].count + return navState.rowsInSection(section) } override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { @@ -168,7 +168,7 @@ class MasterViewController: UITableViewController, UndoableCommandRunner { } headerView.tag = section - headerView.disclosureExpanded = navState.expandedNodes.contains(sectionNode) + headerView.disclosureExpanded = navState.isExpanded(sectionNode) let tap = UITapGestureRecognizer(target: self, action:#selector(self.toggleSectionHeader(_:))) headerView.addGestureRecognizer(tap) @@ -275,7 +275,7 @@ class MasterViewController: UITableViewController, UndoableCommandRunner { } // If this is a folder and isn't expanded or doesn't have any entries, let the users drop on it - if destNode.representedObject is Folder && (destNode.numberOfChildNodes == 0 || !navState.expandedNodes.contains(destNode)) { + if destNode.representedObject is Folder && (destNode.numberOfChildNodes == 0 || !navState.isExpanded(destNode)) { let movementAdjustment = sourceIndexPath > destIndexPath ? 1 : 0 return IndexPath(row: destIndexPath.row + movementAdjustment, section: destIndexPath.section) } @@ -458,7 +458,7 @@ class MasterViewController: UITableViewController, UndoableCommandRunner { return } - if navState.expandedNodes.contains(sectionNode) { + if navState.isExpanded(sectionNode) { headerView.disclosureExpanded = false navState.collapse(section: sectionIndex) { [weak self] indexPaths in self?.tableView.beginUpdates() @@ -486,7 +486,7 @@ class MasterViewController: UITableViewController, UndoableCommandRunner { } else { cell.indentationLevel = 0 } - cell.disclosureExpanded = navState.expandedNodes.contains(node) + cell.disclosureExpanded = navState.isExpanded(node) cell.allowDisclosureSelection = node.canHaveChildNodes cell.name = nameFor(node) @@ -534,13 +534,13 @@ class MasterViewController: UITableViewController, UndoableCommandRunner { return } - navState.animatingChanges = true + navState.beginUpdates() runCommand(deleteCommand) navState.rebuildShadowTable() tableView.deleteRows(at: [indexPath], with: .automatic) - navState.animatingChanges = false + navState.endUpdates() } diff --git a/iOS/NavigationStateController.swift b/iOS/NavigationStateController.swift index e6d29aa69..9a6216309 100644 --- a/iOS/NavigationStateController.swift +++ b/iOS/NavigationStateController.swift @@ -27,10 +27,9 @@ class NavigationStateController { private var articleRowMap = [String: Int]() // articleID: rowIndex - // Eventually I want these to be private too -Maurice - var animatingChanges = false - var expandedNodes = [Node]() - var shadowTable = [[Node]]() + private var animatingChanges = false + private var expandedNodes = [Node]() + private var shadowTable = [[Node]]() private var sortDirection = AppDefaults.timelineSortDirection { didSet { @@ -49,6 +48,10 @@ class NavigationStateController { return treeController.rootNode } + var numberOfSections: Int { + return shadowTable.count + } + var showFeedNames = false { didSet { NotificationCenter.default.post(name: .ShowFeedNamesDidChange, object: self, userInfo: nil) @@ -178,7 +181,19 @@ class NavigationStateController { } // MARK: API + + func beginUpdates() { + animatingChanges = true + } + func endUpdates() { + animatingChanges = false + } + + func rowsInSection(_ section: Int) -> Int { + return shadowTable[section].count + } + func rebuildBackingStores() { if !animatingChanges && !BatchUpdate.shared.isPerforming { treeController.rebuild() @@ -210,6 +225,10 @@ class NavigationStateController { } + func isExpanded(_ node: Node) -> Bool { + return expandedNodes.contains(node) + } + func nodeFor(_ indexPath: IndexPath) -> Node? { guard indexPath.section < shadowTable.count || indexPath.row < shadowTable[indexPath.section].count else { return nil