MediaViewController.swift 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. /*****************************************************************************
  2. * MediaViewController.swift
  3. * VLC for iOS
  4. *****************************************************************************
  5. * Copyright (c) 2018 VideoLAN. All rights reserved.
  6. * $Id$
  7. *
  8. * Authors: Carola Nitz <caro # videolan.org>
  9. *
  10. * Refer to the COPYING file of the official project for license.
  11. *****************************************************************************/
  12. import UIKit
  13. class MediaViewController: VLCPagingViewController<VLCLabelCell> {
  14. var services: Services
  15. private var rendererButton: UIButton
  16. private(set) lazy var sortButton: UIBarButtonItem = {
  17. let sortButton = setupSortbutton()
  18. sortButton.addTarget(self, action: #selector(handleSort), for: .touchUpInside)
  19. sortButton.addGestureRecognizer(UILongPressGestureRecognizer(target: self,
  20. action: #selector(handleSortShortcut(sender:))))
  21. return UIBarButtonItem(customView: sortButton)
  22. }()
  23. private lazy var editButton: UIBarButtonItem = {
  24. var editButton = UIBarButtonItem(image: UIImage(named: "edit"),
  25. style: .plain, target: self,
  26. action: #selector(customSetEditing))
  27. editButton.tintColor = PresentationTheme.current.colors.orangeUI
  28. editButton.accessibilityLabel = NSLocalizedString("BUTTON_EDIT", comment: "")
  29. editButton.accessibilityHint = NSLocalizedString("BUTTON_EDIT_HINT", comment: "")
  30. return editButton
  31. }()
  32. private lazy var doneButton: UIBarButtonItem = {
  33. return UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(customSetEditing))
  34. }()
  35. private var rightBarButtons: [UIBarButtonItem]?
  36. private var leftBarButton: UIBarButtonItem?
  37. init(services: Services) {
  38. self.services = services
  39. rendererButton = services.rendererDiscovererManager.setupRendererButton()
  40. super.init(nibName: nil, bundle: nil)
  41. rightBarButtons = [editButton, UIBarButtonItem(customView: rendererButton)]
  42. leftBarButton = sortButton
  43. }
  44. override func viewDidLoad() {
  45. changeCurrentIndexProgressive = { (oldCell: VLCLabelCell?, newCell: VLCLabelCell?, progressPercentage: CGFloat, changeCurrentIndex: Bool, animated: Bool) in
  46. guard changeCurrentIndex == true else { return }
  47. oldCell?.iconLabel.textColor = PresentationTheme.current.colors.cellDetailTextColor
  48. newCell?.iconLabel.textColor = PresentationTheme.current.colors.orangeUI
  49. }
  50. super.viewDidLoad()
  51. viewControllers.forEach {
  52. ($0 as? MediaCategoryViewController)?.delegate = self
  53. }
  54. setupNavigationBar()
  55. }
  56. private func setupSortbutton() -> UIButton {
  57. let sortButton = UIButton(frame: CGRect(x: 0, y: 0, width: 44, height: 44))
  58. sortButton.setImage(UIImage(named: "sort"), for: .normal)
  59. // It seems that using a custom view, UIBarButtonItem have a offset of 16, therefore adding a large margin
  60. if UIView.userInterfaceLayoutDirection(for: sortButton.semanticContentAttribute) == .rightToLeft {
  61. sortButton.imageEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: -16)
  62. } else {
  63. sortButton.imageEdgeInsets = UIEdgeInsets(top: 0, left: -16, bottom: 0, right: 0)
  64. }
  65. sortButton.tintColor = PresentationTheme.current.colors.orangeUI
  66. sortButton.accessibilityLabel = NSLocalizedString("BUTTON_SORT", comment: "")
  67. sortButton.accessibilityHint = NSLocalizedString("BUTTON_SORT_HINT", comment: "")
  68. return sortButton
  69. }
  70. private func setupNavigationBar() {
  71. if #available(iOS 11.0, *) {
  72. navigationController?.navigationBar.prefersLargeTitles = false
  73. }
  74. navigationController?.navigationBar.isTranslucent = false
  75. updateButtonsFor(viewControllers[currentIndex])
  76. }
  77. // MARK: - PagerTabStripDataSource
  78. override func viewControllers(for pagerTabStripController: PagerTabStripViewController) -> [UIViewController] {
  79. fatalError("this should only be used as subclass")
  80. }
  81. func updateButtonsFor(_ viewController: UIViewController) {
  82. var showButtons = false
  83. if let mediaCategoryViewController = viewController as? MediaCategoryViewController,
  84. !mediaCategoryViewController.isSearching {
  85. showButtons = true
  86. }
  87. navigationItem.rightBarButtonItems = showButtons ? rightBarButtons : nil
  88. navigationItem.leftBarButtonItem = showButtons ? leftBarButton : nil
  89. }
  90. override func configure(cell: VLCLabelCell, for indicatorInfo: IndicatorInfo) {
  91. cell.iconLabel.text = indicatorInfo.title
  92. cell.accessibilityIdentifier = indicatorInfo.accessibilityIdentifier
  93. }
  94. override func updateIndicator(for viewController: PagerTabStripViewController, fromIndex: Int, toIndex: Int, withProgressPercentage progressPercentage: CGFloat, indexWasChanged: Bool) {
  95. if indexWasChanged {
  96. updateButtonsFor(viewControllers[toIndex])
  97. }
  98. super.updateIndicator(for: viewController, fromIndex: fromIndex, toIndex: toIndex, withProgressPercentage: progressPercentage, indexWasChanged: indexWasChanged)
  99. }
  100. override var preferredStatusBarStyle: UIStatusBarStyle {
  101. return PresentationTheme.current.colors.statusBarStyle
  102. }
  103. }
  104. // MARK: - MediaCatgoryViewControllerDelegate
  105. extension MediaViewController: MediaCategoryViewControllerDelegate {
  106. func needsToUpdateNavigationbarIfNeeded(_ viewController: MediaCategoryViewController) {
  107. if viewController == viewControllers[currentIndex] {
  108. updateButtonsFor(viewController)
  109. }
  110. }
  111. func enableCategorySwitching(for viewController: MediaCategoryViewController, enable: Bool) {
  112. scrollingEnabled(enable)
  113. }
  114. func setEditingStateChanged(for viewController: MediaCategoryViewController, editing: Bool) {
  115. customSetEditing()
  116. }
  117. }
  118. // MARK: - Edit
  119. extension MediaViewController {
  120. @objc private func customSetEditing() {
  121. isEditing = !isEditing
  122. rightBarButtons = isEditing ? [doneButton] : [editButton, UIBarButtonItem(customView: rendererButton)]
  123. leftBarButton = isEditing ? nil : sortButton
  124. navigationItem.rightBarButtonItems = rightBarButtons
  125. navigationItem.leftBarButtonItem = leftBarButton
  126. }
  127. override func setEditing(_ editing: Bool, animated: Bool) {
  128. super.setEditing(editing, animated: animated)
  129. scrollingEnabled(!editing)
  130. viewControllers[currentIndex].setEditing(editing, animated: animated)
  131. }
  132. }
  133. // MARK: - Sort
  134. extension MediaViewController {
  135. @objc func handleSort() {
  136. if let mediaCategoryViewController = viewControllers[currentIndex] as? MediaCategoryViewController {
  137. mediaCategoryViewController.handleSort()
  138. }
  139. }
  140. @objc func handleSortShortcut(sender: UILongPressGestureRecognizer) {
  141. if let mediaCategoryViewController = viewControllers[currentIndex] as? MediaCategoryViewController {
  142. mediaCategoryViewController.handleSortLongPress(sender: sender)
  143. }
  144. }
  145. }