diff --git a/PlayerUI/Definitions/Images.swift b/PlayerUI/Definitions/Images.swift index 658279e4..930eb88c 100644 --- a/PlayerUI/Definitions/Images.swift +++ b/PlayerUI/Definitions/Images.swift @@ -26,6 +26,10 @@ extension NSImage { return playerBundle.image(forResource: "airplay")! } + static var PUIBack15s: NSImage { + return playerBundle.image(forResource: "back15s")! + } + static var PUIBack30s: NSImage { return playerBundle.image(forResource: "back30s")! } @@ -34,6 +38,10 @@ extension NSImage { return playerBundle.image(forResource: "bookmark")! } + static var PUIForward15s: NSImage { + return playerBundle.image(forResource: "forward15s")! + } + static var PUIForward30s: NSImage { return playerBundle.image(forResource: "forward30s")! } diff --git a/PlayerUI/Resources/Media.xcassets/back15s.imageset/Contents.json b/PlayerUI/Resources/Media.xcassets/back15s.imageset/Contents.json new file mode 100644 index 00000000..7788ee08 --- /dev/null +++ b/PlayerUI/Resources/Media.xcassets/back15s.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "back15s.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "back15s@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "back15s@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/PlayerUI/Resources/Media.xcassets/back15s.imageset/back15s.png b/PlayerUI/Resources/Media.xcassets/back15s.imageset/back15s.png new file mode 100644 index 00000000..b729c07f Binary files /dev/null and b/PlayerUI/Resources/Media.xcassets/back15s.imageset/back15s.png differ diff --git a/PlayerUI/Resources/Media.xcassets/back15s.imageset/back15s@2x.png b/PlayerUI/Resources/Media.xcassets/back15s.imageset/back15s@2x.png new file mode 100644 index 00000000..dfef0b1f Binary files /dev/null and b/PlayerUI/Resources/Media.xcassets/back15s.imageset/back15s@2x.png differ diff --git a/PlayerUI/Resources/Media.xcassets/back15s.imageset/back15s@3x.png b/PlayerUI/Resources/Media.xcassets/back15s.imageset/back15s@3x.png new file mode 100644 index 00000000..7ccf504f Binary files /dev/null and b/PlayerUI/Resources/Media.xcassets/back15s.imageset/back15s@3x.png differ diff --git a/PlayerUI/Resources/Media.xcassets/back30s.imageset/back30s.png b/PlayerUI/Resources/Media.xcassets/back30s.imageset/back30s.png index 580e3617..58cde350 100644 Binary files a/PlayerUI/Resources/Media.xcassets/back30s.imageset/back30s.png and b/PlayerUI/Resources/Media.xcassets/back30s.imageset/back30s.png differ diff --git a/PlayerUI/Resources/Media.xcassets/back30s.imageset/back30s@2x.png b/PlayerUI/Resources/Media.xcassets/back30s.imageset/back30s@2x.png index 0c6f1e3f..5ee6f996 100644 Binary files a/PlayerUI/Resources/Media.xcassets/back30s.imageset/back30s@2x.png and b/PlayerUI/Resources/Media.xcassets/back30s.imageset/back30s@2x.png differ diff --git a/PlayerUI/Resources/Media.xcassets/back30s.imageset/back30s@3x.png b/PlayerUI/Resources/Media.xcassets/back30s.imageset/back30s@3x.png index c2dbbb2a..098ea8d3 100644 Binary files a/PlayerUI/Resources/Media.xcassets/back30s.imageset/back30s@3x.png and b/PlayerUI/Resources/Media.xcassets/back30s.imageset/back30s@3x.png differ diff --git a/PlayerUI/Resources/Media.xcassets/forward15s.imageset/Contents.json b/PlayerUI/Resources/Media.xcassets/forward15s.imageset/Contents.json new file mode 100644 index 00000000..06def79f --- /dev/null +++ b/PlayerUI/Resources/Media.xcassets/forward15s.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "forward15s.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "forward15s@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "forward15s@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/PlayerUI/Resources/Media.xcassets/forward15s.imageset/forward15s.png b/PlayerUI/Resources/Media.xcassets/forward15s.imageset/forward15s.png new file mode 100644 index 00000000..9f22c6b9 Binary files /dev/null and b/PlayerUI/Resources/Media.xcassets/forward15s.imageset/forward15s.png differ diff --git a/PlayerUI/Resources/Media.xcassets/forward15s.imageset/forward15s@2x.png b/PlayerUI/Resources/Media.xcassets/forward15s.imageset/forward15s@2x.png new file mode 100644 index 00000000..3ed35643 Binary files /dev/null and b/PlayerUI/Resources/Media.xcassets/forward15s.imageset/forward15s@2x.png differ diff --git a/PlayerUI/Resources/Media.xcassets/forward15s.imageset/forward15s@3x.png b/PlayerUI/Resources/Media.xcassets/forward15s.imageset/forward15s@3x.png new file mode 100644 index 00000000..bd196ce0 Binary files /dev/null and b/PlayerUI/Resources/Media.xcassets/forward15s.imageset/forward15s@3x.png differ diff --git a/PlayerUI/Resources/Media.xcassets/forward30s.imageset/forward30s.png b/PlayerUI/Resources/Media.xcassets/forward30s.imageset/forward30s.png index 41a7e3fc..90cd768f 100644 Binary files a/PlayerUI/Resources/Media.xcassets/forward30s.imageset/forward30s.png and b/PlayerUI/Resources/Media.xcassets/forward30s.imageset/forward30s.png differ diff --git a/PlayerUI/Resources/Media.xcassets/forward30s.imageset/forward30s@2x.png b/PlayerUI/Resources/Media.xcassets/forward30s.imageset/forward30s@2x.png index 093137f1..19f73314 100644 Binary files a/PlayerUI/Resources/Media.xcassets/forward30s.imageset/forward30s@2x.png and b/PlayerUI/Resources/Media.xcassets/forward30s.imageset/forward30s@2x.png differ diff --git a/PlayerUI/Resources/Media.xcassets/forward30s.imageset/forward30s@3x.png b/PlayerUI/Resources/Media.xcassets/forward30s.imageset/forward30s@3x.png index af0323cc..20b5f544 100644 Binary files a/PlayerUI/Resources/Media.xcassets/forward30s.imageset/forward30s@3x.png and b/PlayerUI/Resources/Media.xcassets/forward30s.imageset/forward30s@3x.png differ diff --git a/PlayerUI/Views/PUIPlayerView.swift b/PlayerUI/Views/PUIPlayerView.swift index 16fd4ba8..8d6d2055 100644 --- a/PlayerUI/Views/PUIPlayerView.swift +++ b/PlayerUI/Views/PUIPlayerView.swift @@ -511,23 +511,45 @@ public final class PUIPlayerView: NSView { return b }() - private lazy var backButton: PUIButton = { + private lazy var backButton15: PUIButton = { + let b = PUIButton(frame: .zero) + + b.image = .PUIBack15s + b.target = self + b.action = #selector(goBackInTime15(_:)) + b.toolTip = "Go back 15s" + + return b + }() + + private lazy var backButton30: PUIButton = { let b = PUIButton(frame: .zero) b.image = .PUIBack30s b.target = self - b.action = #selector(goBackInTime(_:)) + b.action = #selector(goBackInTime30(_:)) b.toolTip = "Go back 30s" return b }() - private lazy var forwardButton: PUIButton = { + private lazy var forwardButton15: PUIButton = { + let b = PUIButton(frame: .zero) + + b.image = .PUIForward15s + b.target = self + b.action = #selector(goForwardInTime15(_:)) + b.toolTip = "Go forward 15s" + + return b + }() + + private lazy var forwardButton30: PUIButton = { let b = PUIButton(frame: .zero) b.image = .PUIForward30s b.target = self - b.action = #selector(goForwardInTime(_:)) + b.action = #selector(goForwardInTime30(_:)) b.toolTip = "Go forward 30s" return b @@ -619,11 +641,13 @@ public final class PUIPlayerView: NSView { centerButtonsContainerView.setCustomSpacing(6, after: volumeButton) // Center controls (play, annotations, forward, backward) - centerButtonsContainerView.addView(backButton, in: .center) + centerButtonsContainerView.addView(backButton15, in: .center) + centerButtonsContainerView.addView(backButton30, in: .center) centerButtonsContainerView.addView(previousAnnotationButton, in: .center) centerButtonsContainerView.addView(playButton, in: .center) centerButtonsContainerView.addView(nextAnnotationButton, in: .center) - centerButtonsContainerView.addView(forwardButton, in: .center) + centerButtonsContainerView.addView(forwardButton30, in: .center) + centerButtonsContainerView.addView(forwardButton15, in: .center) // Trailing controls (speed, add annotation, pip) centerButtonsContainerView.addView(speedButton, in: .trailing) @@ -639,10 +663,12 @@ public final class PUIPlayerView: NSView { centerButtonsContainerView.setVisibilityPriority(NSStackViewVisibilityPriorityDetachOnlyIfNecessary, for: volumeButton) centerButtonsContainerView.setVisibilityPriority(NSStackViewVisibilityPriorityDetachOnlyIfNecessary, for: volumeSlider) centerButtonsContainerView.setVisibilityPriority(NSStackViewVisibilityPriorityDetachOnlyIfNecessary, for: subtitlesButton) - centerButtonsContainerView.setVisibilityPriority(NSStackViewVisibilityPriorityDetachOnlyIfNecessary, for: backButton) + centerButtonsContainerView.setVisibilityPriority(NSStackViewVisibilityPriorityDetachOnlyIfNecessary, for: backButton15) + centerButtonsContainerView.setVisibilityPriority(NSStackViewVisibilityPriorityDetachOnlyIfNecessary, for: backButton30) centerButtonsContainerView.setVisibilityPriority(NSStackViewVisibilityPriorityDetachOnlyIfNecessary, for: previousAnnotationButton) centerButtonsContainerView.setVisibilityPriority(NSStackViewVisibilityPriorityMustHold, for: playButton) - centerButtonsContainerView.setVisibilityPriority(NSStackViewVisibilityPriorityDetachOnlyIfNecessary, for: forwardButton) + centerButtonsContainerView.setVisibilityPriority(NSStackViewVisibilityPriorityDetachOnlyIfNecessary, for: forwardButton30) + centerButtonsContainerView.setVisibilityPriority(NSStackViewVisibilityPriorityDetachOnlyIfNecessary, for: forwardButton15) centerButtonsContainerView.setVisibilityPriority(NSStackViewVisibilityPriorityDetachOnlyIfNecessary, for: nextAnnotationButton) centerButtonsContainerView.setVisibilityPriority(NSStackViewVisibilityPriorityDetachOnlyIfNecessary, for: speedButton) centerButtonsContainerView.setVisibilityPriority(NSStackViewVisibilityPriorityDetachOnlyIfNecessary, for: addAnnotationButton) @@ -709,8 +735,10 @@ public final class PUIPlayerView: NSView { nextAnnotationButton.isHidden = disableAnnotationControls let disableBackAndForward = !d.playerViewShouldShowBackAndForwardControls(self) - backButton.isHidden = disableBackAndForward - forwardButton.isHidden = disableBackAndForward + backButton15.isHidden = disableBackAndForward + backButton30.isHidden = disableBackAndForward + forwardButton30.isHidden = disableBackAndForward + forwardButton15.isHidden = disableBackAndForward updateExternalPlaybackControlsAvailability() @@ -839,11 +867,19 @@ public final class PUIPlayerView: NSView { seek(to: annotation) } - @IBAction public func goBackInTime(_ sender: Any?) { + @IBAction public func goBackInTime15(_ sender: Any?) { + modifyCurrentTime(with: 15, using: CMTimeSubtract) + } + + @IBAction public func goForwardInTime15(_ sender: Any?) { + modifyCurrentTime(with: 15, using: CMTimeAdd) + } + + @IBAction public func goBackInTime30(_ sender: Any?) { modifyCurrentTime(with: 30, using: CMTimeSubtract) } - @IBAction public func goForwardInTime(_ sender: Any?) { + @IBAction public func goForwardInTime30(_ sender: Any?) { modifyCurrentTime(with: 30, using: CMTimeAdd) } @@ -1230,8 +1266,10 @@ public final class PUIPlayerView: NSView { pipButton.isEnabled = false subtitlesButton.isEnabled = false speedButton.isEnabled = false - forwardButton.isEnabled = false - backButton.isEnabled = false + forwardButton15.isEnabled = false + forwardButton30.isEnabled = false + backButton30.isEnabled = false + backButton15.isEnabled = false controlsContainerView.alphaValue = 0.5 } @@ -1242,8 +1280,10 @@ public final class PUIPlayerView: NSView { pipButton.isEnabled = true subtitlesButton.isEnabled = true speedButton.isEnabled = true - forwardButton.isEnabled = true - backButton.isEnabled = true + forwardButton15.isEnabled = true + forwardButton30.isEnabled = true + backButton30.isEnabled = true + backButton15.isEnabled = true controlsContainerView.alphaValue = 1