VideoOptionsControlBar.swift 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. /*****************************************************************************
  2. * VideoOptionsControlBar.swift
  3. *
  4. * Copyright © 2019 VLC authors and VideoLAN
  5. *
  6. * Authors: Robert Gordon <robwaynegordon@gmail.com>
  7. *
  8. *
  9. * Refer to the COPYING file of the official project for license.
  10. *****************************************************************************/
  11. @objc (VLCVideoOptionsControlBarDelegate)
  12. protocol VideoOptionsControlBarDelegate: class {
  13. func didToggleFullScreen(_ optionsBar: VideoOptionsControlBar)
  14. func didToggleRepeat(_ optionsBar: VideoOptionsControlBar)
  15. func didSelectSubtitle(_ optionsBar: VideoOptionsControlBar)
  16. func didSelectMoreOptions(_ optionsBar: VideoOptionsControlBar)
  17. func didToggleInterfaceLock(_ optionsBar: VideoOptionsControlBar)
  18. }
  19. @objc (VLCVideoOptionsControlBar)
  20. @objcMembers class VideoOptionsControlBar: UIStackView {
  21. // MARK: Instance variables
  22. weak var delegate: VideoOptionsControlBarDelegate?
  23. var subtitleToggled: Bool {
  24. didSet {
  25. selectSubtitleButton.tintColor = subtitleToggled ? .orange : .white
  26. }
  27. }
  28. var interfaceDisabled: Bool {
  29. didSet {
  30. interfaceLockButton.tintColor = interfaceDisabled ? .orange : .white
  31. }
  32. }
  33. var repeatMode: VLCRepeatMode {
  34. didSet {
  35. switch repeatMode {
  36. case .repeatCurrentItem:
  37. repeatButton.setImage(UIImage(named: "iconRepeatOne"), for: .normal)
  38. case .repeatAllItems:
  39. repeatButton.setImage(UIImage(named: "iconRepeat"), for: .normal)
  40. case .doNotRepeat:
  41. repeatButton.setImage(UIImage(named: "iconNoRepeat"), for: .normal)
  42. default:
  43. assertionFailure("unhandled repeatmode")
  44. }
  45. repeatButton.tintColor = (repeatMode == .doNotRepeat) ? .white : .orange // highlight the colors that are not the default (.doNotRepeat)
  46. }
  47. }
  48. lazy var toggleFullScreenButton: UIButton = {
  49. var toggle = UIButton(type: .system)
  50. toggle.setImage(UIImage(named: "iconExpand"), for: .normal)
  51. toggle.addTarget(self, action: #selector(toggleFullscreen), for: .touchUpInside)
  52. toggle.tintColor = .white
  53. toggle.accessibilityLabel = NSLocalizedString("VIDEO_ASPECT_RATIO_BUTTON", comment: "")
  54. toggle.accessibilityHint = NSLocalizedString("VIDEO_ASPECT_RATIO_HINT", comment: "")
  55. return toggle
  56. }()
  57. lazy var selectSubtitleButton: UIButton = {
  58. var subbutton = UIButton(type: .system)
  59. subbutton.setImage(UIImage(named: "iconSubtitle"), for: .normal)
  60. subbutton.addTarget(self, action: #selector(selectSubtitle), for: .touchUpInside)
  61. subbutton.tintColor = .white
  62. subbutton.accessibilityHint = NSLocalizedString("CHOOSE_SUBTITLE_TRACK", comment: "")
  63. subbutton.accessibilityLabel = NSLocalizedString("SUBTITLES", comment: "")
  64. return subbutton
  65. }()
  66. lazy var repeatButton: UIButton = {
  67. var rptButton = UIButton(type: .system)
  68. rptButton.addTarget(self, action: #selector(toggleRepeat), for: .touchUpInside)
  69. rptButton.setImage(UIImage(named: "iconNoRepeat"), for: .normal)
  70. rptButton.tintColor = .white
  71. rptButton.accessibilityHint = NSLocalizedString("REPEAT_MODE", comment: "")
  72. rptButton.accessibilityLabel = NSLocalizedString("REPEAT_MODE_HINT", comment: "")
  73. return rptButton
  74. }()
  75. lazy var interfaceLockButton: UIButton = {
  76. var interfaceLockButton = UIButton(type: .system)
  77. interfaceLockButton.setImage(UIImage(named: "iconLock"), for: .normal)
  78. interfaceLockButton.addTarget(self, action: #selector(toggleInterfaceLock), for: .touchUpInside)
  79. interfaceLockButton.tintColor = .white
  80. interfaceLockButton.accessibilityHint = NSLocalizedString("INTERFACE_LOCK_HINT", comment: "")
  81. interfaceLockButton.accessibilityLabel = NSLocalizedString("INTERFACE_LOCK_BUTTON", comment: "")
  82. return interfaceLockButton
  83. }()
  84. lazy var moreOptionsButton: UIButton = {
  85. var moreOptionsButton = UIButton(type: .system)
  86. moreOptionsButton.setImage(UIImage(named: "iconMoreOptions"), for: .normal)
  87. moreOptionsButton.addTarget(self, action: #selector(selectMoreOptions), for: .touchUpInside)
  88. moreOptionsButton.tintColor = .white
  89. moreOptionsButton.accessibilityHint = NSLocalizedString("MORE_OPTIONS_HINT", comment: "")
  90. moreOptionsButton.accessibilityLabel = NSLocalizedString("MORE_OPTIONS_BUTTON", comment: "")
  91. return moreOptionsButton
  92. }()
  93. // MARK: Class Initializers
  94. required init(coder aDecoder: NSCoder) {
  95. fatalError("init(coder aDecoder: NSCoder) not implemented")
  96. }
  97. private func setupView() {
  98. addArrangedSubview(toggleFullScreenButton)
  99. addArrangedSubview(selectSubtitleButton)
  100. addArrangedSubview(repeatButton)
  101. addArrangedSubview(interfaceLockButton)
  102. addArrangedSubview(moreOptionsButton)
  103. axis = .horizontal
  104. spacing = 32
  105. translatesAutoresizingMaskIntoConstraints = false
  106. }
  107. override init(frame: CGRect) {
  108. repeatMode = .doNotRepeat
  109. subtitleToggled = false
  110. interfaceDisabled = false
  111. super.init(frame: frame)
  112. setupView()
  113. }
  114. // MARK: Button Actions
  115. func toggleFullscreen() {
  116. delegate?.didToggleFullScreen(self)
  117. }
  118. func selectSubtitle() {
  119. delegate?.didSelectSubtitle(self)
  120. }
  121. func selectMoreOptions() {
  122. delegate?.didSelectMoreOptions(self)
  123. }
  124. func toggleRepeat() {
  125. delegate?.didToggleRepeat(self)
  126. }
  127. func toggleInterfaceLock() {
  128. delegate?.didToggleInterfaceLock(self)
  129. }
  130. }