[ABANDONED] Mastodon iOS client.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

136 lines
4.6 KiB

6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
4 years ago
6 years ago
  1. //
  2. // TimelineViewController.swift
  3. // elpha-ios
  4. //
  5. // Created by Dwayne Harris on 10/28/18.
  6. // Copyright © 2018 Elpha. All rights reserved.
  7. //
  8. import CoreData
  9. import UIKit
  10. protocol TimelinesViewControllerDelegate: class {
  11. func didSelect(_ sender: Any, timeline: TimelineMO)
  12. }
  13. class TimelinesViewController: UIViewController {
  14. @IBOutlet var tableView: UITableView!
  15. weak var delegate: TimelinesViewControllerDelegate?
  16. var fetchedResultsController: NSFetchedResultsController<TimelineMO>?
  17. override func viewDidLoad() {
  18. super.viewDidLoad()
  19. tableView.dataSource = self
  20. tableView.delegate = self
  21. tableView.layer.cornerRadius = 20
  22. tableView.layer.masksToBounds = true
  23. initializeFetchedResultsController()
  24. }
  25. func initializeFetchedResultsController() {
  26. let request = NSFetchRequest<TimelineMO>(entityName: "Timeline")
  27. request.sortDescriptors = [
  28. NSSortDescriptor(key: "order", ascending: true),
  29. ]
  30. fetchedResultsController = NSFetchedResultsController(
  31. fetchRequest: request,
  32. managedObjectContext: CoreDataManager.shared.context,
  33. sectionNameKeyPath: nil,
  34. cacheName: nil
  35. )
  36. fetchedResultsController!.delegate = self
  37. do {
  38. try fetchedResultsController!.performFetch()
  39. } catch {
  40. print("\(error)")
  41. }
  42. }
  43. }
  44. extension TimelinesViewController: NSFetchedResultsControllerDelegate {
  45. func controllerWillChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
  46. tableView.beginUpdates()
  47. }
  48. func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
  49. switch type {
  50. case NSFetchedResultsChangeType.insert:
  51. tableView.insertRows(at: [newIndexPath!], with: UITableView.RowAnimation.fade)
  52. case NSFetchedResultsChangeType.delete:
  53. tableView.deleteRows(at: [indexPath!], with: UITableView.RowAnimation.fade)
  54. case NSFetchedResultsChangeType.update:
  55. return
  56. case NSFetchedResultsChangeType.move:
  57. tableView.deleteRows(at: [indexPath!], with: UITableView.RowAnimation.fade)
  58. tableView.insertRows(at: [newIndexPath!], with: UITableView.RowAnimation.fade)
  59. }
  60. }
  61. func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
  62. tableView.endUpdates()
  63. }
  64. }
  65. extension TimelinesViewController: UITableViewDataSource, UITableViewDelegate {
  66. func numberOfSections(in tableView: UITableView) -> Int {
  67. return 1
  68. }
  69. func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  70. guard let count = fetchedResultsController?.fetchedObjects?.count else {
  71. return 0
  72. }
  73. return count
  74. }
  75. func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  76. guard let cell = tableView.dequeueReusableCell(withIdentifier: "TimelinesTableViewCell", for: indexPath) as? TimelinesTableViewCell else {
  77. fatalError("Unable to find reusable cell")
  78. }
  79. guard let timeline = fetchedResultsController?.object(at: indexPath) else {
  80. fatalError("CoreData error")
  81. }
  82. let selectedTimeline = AuthenticationManager.session?.timeline
  83. cell.timelineLabel.text = timeline.name
  84. if selectedTimeline == timeline {
  85. cell.accessoryType = UITableViewCell.AccessoryType.checkmark
  86. }
  87. switch TimelineCategory(rawValue: timeline.category!)! {
  88. case .home:
  89. cell.timelineImageView.image = UIImage(named: "Home")
  90. case .local:
  91. cell.timelineImageView.image = UIImage(named: "Users")
  92. case .federated:
  93. cell.timelineImageView.image = UIImage(named: "Globe")
  94. case .favorites:
  95. cell.timelineImageView.image = UIImage(named: "Star Regular")
  96. case .tag:
  97. cell.timelineImageView.image = UIImage(named: "Tag")
  98. }
  99. return cell
  100. }
  101. func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
  102. guard let timeline = fetchedResultsController?.object(at: indexPath) else {
  103. fatalError("CoreData error")
  104. }
  105. delegate?.didSelect(self, timeline: timeline)
  106. dismiss(animated: true)
  107. }
  108. }