AllMediaViewController.swift 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. import UIKit
  2. import DcCore
  3. class AllMediaViewController: UIPageViewController {
  4. private struct Page {
  5. let headerTitle: String
  6. let type1: Int32
  7. let type2: Int32
  8. let type3: Int32
  9. }
  10. private let dcContext: DcContext
  11. private let chatId: Int
  12. private var prevIndex: Int = 0
  13. private func getPages() -> [Page] {
  14. let webxdcReallyInUse = dcContext.getChatMedia(chatId: chatId, messageType: DC_MSG_WEBXDC, messageType2: 0, messageType3: 0).count
  15. >= (chatId == 0 ? 5 : 1)
  16. pages.append(Page(
  17. headerTitle: String.localized("files"),
  18. type1: DC_MSG_FILE, type2: webxdcReallyInUse ? 0 : DC_MSG_WEBXDC, type3: 0
  19. ))
  20. if webxdcReallyInUse {
  21. pages.append(Page(
  22. headerTitle: String.localized("webxdc_apps"),
  23. type1: DC_MSG_WEBXDC, type2: 0, type3: 0
  24. ))
  25. }
  26. pages.append(Page(
  27. headerTitle: String.localized("audio"),
  28. type1: DC_MSG_AUDIO, type2: DC_MSG_VOICE, type3: 0
  29. ))
  30. pages.append(Page(
  31. headerTitle: String.localized("gallery"),
  32. type1: DC_MSG_IMAGE, type2: DC_MSG_GIF, type3: DC_MSG_VIDEO
  33. ))
  34. return pages
  35. }
  36. private var pages: [Page] = []
  37. private lazy var segmentControl: UISegmentedControl = {
  38. let control = UISegmentedControl(items: pages.map({$0.headerTitle}))
  39. control.tintColor = DcColors.primary
  40. control.addTarget(self, action: #selector(segmentControlChanged), for: .valueChanged)
  41. control.selectedSegmentIndex = 0
  42. return control
  43. }()
  44. init(dcContext: DcContext, chatId: Int = 0) {
  45. self.dcContext = dcContext
  46. self.chatId = chatId
  47. super.init(transitionStyle: .scroll, navigationOrientation: .horizontal, options: [:])
  48. self.pages = self.getPages()
  49. }
  50. required init?(coder: NSCoder) {
  51. fatalError("init(coder:) has not been implemented")
  52. }
  53. // MARK: - lifecycle
  54. override func viewDidLoad() {
  55. super.viewDidLoad()
  56. dataSource = self
  57. delegate = self
  58. navigationItem.titleView = segmentControl
  59. setViewControllers(
  60. [makeViewController(pages[0])],
  61. direction: .forward,
  62. animated: true,
  63. completion: nil
  64. )
  65. if #available(iOS 13, *) {
  66. self.navigationController?.navigationBar.scrollEdgeAppearance = self.navigationController?.navigationBar.standardAppearance
  67. }
  68. }
  69. // MARK: - actions
  70. @objc private func segmentControlChanged(_ sender: UISegmentedControl) {
  71. if sender.selectedSegmentIndex < pages.count {
  72. let page = pages[sender.selectedSegmentIndex]
  73. setViewControllers([makeViewController(page)],
  74. direction: sender.selectedSegmentIndex > prevIndex ? .forward : .reverse, animated: true, completion: nil)
  75. prevIndex = sender.selectedSegmentIndex
  76. }
  77. }
  78. // MARK: - factory
  79. private func makeViewController(_ page: Page) -> UIViewController {
  80. if page.type1 == DC_MSG_IMAGE {
  81. let allMedia = dcContext.getChatMedia(chatId: chatId, messageType: page.type1, messageType2: page.type2, messageType3: page.type3)
  82. return GalleryViewController(context: dcContext, chatId: chatId, mediaMessageIds: allMedia.reversed())
  83. } else {
  84. return FilesViewController(context: dcContext, chatId: chatId, type1: page.type1, type2: page.type2, type3: page.type3)
  85. }
  86. }
  87. }
  88. // MARK: - UIPageViewControllerDataSource, UIPageViewControllerDelegate
  89. extension AllMediaViewController: UIPageViewControllerDataSource, UIPageViewControllerDelegate {
  90. func getIndexFromObject(_ viewController: UIViewController) -> Int {
  91. let type1: Int32
  92. if let filesViewContoller = viewController as? FilesViewController {
  93. type1 = filesViewContoller.type1
  94. } else {
  95. type1 = DC_MSG_IMAGE
  96. }
  97. for (index, page) in pages.enumerated() {
  98. if page.type1 == type1 {
  99. return index
  100. }
  101. }
  102. return 0
  103. }
  104. func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
  105. let i = getIndexFromObject(viewController)
  106. if i > 0 {
  107. return makeViewController(pages[i - 1])
  108. }
  109. return nil
  110. }
  111. func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
  112. let i = getIndexFromObject(viewController)
  113. if i < (pages.count - 1) {
  114. return makeViewController(pages[i + 1])
  115. }
  116. return nil
  117. }
  118. func pageViewController(_ pageViewController: UIPageViewController, willTransitionTo pendingViewControllers: [UIViewController]) {
  119. if let viewController = pendingViewControllers.first {
  120. let i = getIndexFromObject(viewController)
  121. segmentControl.selectedSegmentIndex = i
  122. prevIndex = i
  123. }
  124. }
  125. func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
  126. if let viewController = previousViewControllers.first, !completed {
  127. let i = getIndexFromObject(viewController)
  128. segmentControl.selectedSegmentIndex = i
  129. prevIndex = i
  130. }
  131. }
  132. }