AllMediaViewController.swift 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. import UIKit
  2. import DcCore
  3. class AllMediaViewController: UIPageViewController {
  4. private let dcContext: DcContext
  5. private var selectedIndex: Int = 0
  6. private lazy var segmentControl: UISegmentedControl = {
  7. let control = UISegmentedControl(
  8. items: [dcContext.hasWebxdc(chatId: 0) ? String.localized("files_and_webxdx_apps") : String.localized("files"),
  9. String.localized("images_and_videos")]
  10. )
  11. control.tintColor = DcColors.primary
  12. control.addTarget(self, action: #selector(segmentControlChanged), for: .valueChanged)
  13. control.selectedSegmentIndex = 0
  14. return control
  15. }()
  16. init(dcAccounts: DcAccounts) {
  17. self.dcContext = dcAccounts.getSelected()
  18. super.init(transitionStyle: .scroll, navigationOrientation: .horizontal, options: [:])
  19. }
  20. required init?(coder: NSCoder) {
  21. fatalError("init(coder:) has not been implemented")
  22. }
  23. // MARK: - lifecycle
  24. override func viewDidLoad() {
  25. super.viewDidLoad()
  26. dataSource = self
  27. delegate = self
  28. navigationItem.titleView = segmentControl
  29. setViewControllers(
  30. [makeFilesViewController()],
  31. direction: .forward,
  32. animated: true,
  33. completion: nil
  34. )
  35. if #available(iOS 13, *) {
  36. self.navigationController?.navigationBar.scrollEdgeAppearance = self.navigationController?.navigationBar.standardAppearance
  37. }
  38. }
  39. override func viewWillAppear(_ animated: Bool) {
  40. // viewWillAppear() is on called on section change, not on main-tab change
  41. super.viewWillAppear(animated)
  42. }
  43. override func viewWillDisappear(_ animated: Bool) {
  44. // viewWillDisappear() is on called on section change, not on main-tab change
  45. super.viewWillDisappear(animated)
  46. }
  47. // MARK: - actions
  48. @objc private func segmentControlChanged(_ sender: UISegmentedControl) {
  49. if sender.selectedSegmentIndex == 0 {
  50. setViewControllers([makeFilesViewController()], direction: .reverse, animated: true, completion: nil)
  51. } else {
  52. setViewControllers([makeGalleryViewController()], direction: .forward, animated: true, completion: nil)
  53. }
  54. }
  55. // MARK: - factory
  56. private func makeGalleryViewController() -> UIViewController {
  57. let allMedia = dcContext.getChatMedia(chatId: 0, messageType: DC_MSG_IMAGE, messageType2: DC_MSG_GIF, messageType3: DC_MSG_VIDEO)
  58. return GalleryViewController(context: dcContext, chatId: 0, mediaMessageIds: allMedia.reversed())
  59. }
  60. private func makeFilesViewController() -> UIViewController {
  61. let allMedia = dcContext.getChatMedia(chatId: 0, messageType: DC_MSG_FILE, messageType2: DC_MSG_AUDIO, messageType3: DC_MSG_WEBXDC)
  62. return DocumentGalleryController(context: dcContext, chatId: 0, fileMessageIds: allMedia.reversed(), hasWebxdc: false)
  63. }
  64. }
  65. // MARK: - UIPageViewControllerDataSource, UIPageViewControllerDelegate
  66. extension AllMediaViewController: UIPageViewControllerDataSource, UIPageViewControllerDelegate {
  67. func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
  68. if viewController is DocumentGalleryController {
  69. return nil
  70. }
  71. return makeFilesViewController()
  72. }
  73. func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
  74. if viewController is DocumentGalleryController {
  75. return makeGalleryViewController()
  76. }
  77. return nil
  78. }
  79. func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
  80. if completed {
  81. if previousViewControllers.first is DocumentGalleryController {
  82. segmentControl.selectedSegmentIndex = 1
  83. } else {
  84. segmentControl.selectedSegmentIndex = 0
  85. }
  86. }
  87. }
  88. }