1
0
mirror of https://github.com/yattee/yattee.git synced 2024-12-13 22:00:31 +05:30
yattee/Model/Player/PlayerControlsModel.swift

139 lines
3.7 KiB
Swift
Raw Permalink Normal View History

import Combine
2022-02-17 01:53:11 +05:30
import CoreMedia
2022-07-11 22:00:12 +05:30
import Defaults
2022-02-17 01:53:11 +05:30
import Foundation
import SwiftUI
final class PlayerControlsModel: ObservableObject {
2022-09-01 23:31:01 +05:30
static var shared = PlayerControlsModel()
2022-05-22 02:28:11 +05:30
@Published var isLoadingVideo = false
2022-02-17 01:53:11 +05:30
@Published var isPlaying = true
@Published var presentingControls = false { didSet { handlePresentationChange() } }
2022-07-11 22:00:12 +05:30
@Published var presentingDetailsOverlay = false { didSet { handleDetailsOverlayPresentationChange() } }
2022-08-14 22:23:03 +05:30
var timer: Timer?
2022-02-17 01:53:11 +05:30
#if os(tvOS)
2023-06-17 17:39:51 +05:30
private(set) var reporter = PassthroughSubject<String, Never>() // swiftlint:disable:this private_subject
#endif
2022-12-18 17:41:06 +05:30
var player: PlayerModel! { .shared }
2022-09-02 04:35:31 +05:30
private var controlsOverlayModel = ControlOverlaysModel.shared
2022-02-17 01:53:11 +05:30
init(
isLoadingVideo: Bool = false,
isPlaying: Bool = true,
presentingControls: Bool = false,
2022-07-10 23:21:46 +05:30
presentingDetailsOverlay: Bool = false,
2022-09-02 04:35:31 +05:30
timer: Timer? = nil
) {
self.isLoadingVideo = isLoadingVideo
self.isPlaying = isPlaying
self.presentingControls = presentingControls
2022-07-10 23:21:46 +05:30
self.presentingDetailsOverlay = presentingDetailsOverlay
self.timer = timer
2022-02-17 01:53:11 +05:30
}
func handlePresentationChange() {
2022-09-28 19:57:01 +05:30
guard let player else { return }
2022-08-24 02:44:13 +05:30
if presentingControls {
2022-08-24 02:59:50 +05:30
DispatchQueue.main.async(qos: .userInteractive) { [weak self] in
player.backend.startControlsUpdates()
self?.resetTimer()
}
2022-08-24 02:44:13 +05:30
} else {
#if os(macOS)
NSCursor.setHiddenUntilMouseMoves(player.playingFullScreen)
#endif
2022-08-24 02:44:13 +05:30
if !player.musicMode {
2022-08-24 02:59:50 +05:30
DispatchQueue.main.async(qos: .userInteractive) { [weak self] in
player.backend.stopControlsUpdates()
self?.removeTimer()
}
2022-07-10 23:21:46 +05:30
} else {
2022-08-24 02:59:50 +05:30
DispatchQueue.main.async(qos: .userInteractive) { [weak self] in
self?.presentingControls = true
}
2022-02-17 01:53:11 +05:30
}
}
}
2022-07-11 22:00:12 +05:30
func handleSettingsOverlayPresentationChange() {
2022-09-02 04:35:31 +05:30
player?.backend.setNeedsNetworkStateUpdates(controlsOverlayModel.presenting && Defaults[.showMPVPlaybackStats])
2022-06-25 05:09:29 +05:30
}
2022-08-24 02:44:13 +05:30
func handleDetailsOverlayPresentationChange() {}
2022-07-11 22:00:12 +05:30
2022-07-10 23:21:46 +05:30
var presentingOverlays: Bool {
2022-09-02 04:35:31 +05:30
presentingDetailsOverlay || controlsOverlayModel.presenting
2022-07-10 23:21:46 +05:30
}
func hideOverlays() {
presentingDetailsOverlay = false
2022-11-18 03:17:45 +05:30
controlsOverlayModel.hide()
2022-07-10 23:21:46 +05:30
}
2022-02-17 01:53:11 +05:30
func show() {
2022-09-02 04:35:31 +05:30
guard !player.currentItem.isNil, !presentingControls else {
2022-03-28 00:54:32 +05:30
return
}
2022-02-22 02:27:12 +05:30
2022-06-16 23:14:39 +05:30
player.backend.updateControls()
2022-02-17 01:53:11 +05:30
withAnimation(PlayerControls.animation) {
presentingControls = true
}
}
func hide() {
2022-09-28 19:57:01 +05:30
guard let player,
2022-06-08 02:57:48 +05:30
!player.musicMode
else {
return
}
2022-03-28 00:54:32 +05:30
2022-11-11 02:17:32 +05:30
player.backend?.stopControlsUpdates()
2022-06-08 02:57:48 +05:30
guard !player.currentItem.isNil else {
2022-03-28 00:54:32 +05:30
return
}
guard presentingControls else {
return
}
2022-02-17 01:53:11 +05:30
withAnimation(PlayerControls.animation) {
presentingControls = false
}
}
func toggle() {
2023-06-17 17:39:51 +05:30
if presentingControls {
hide()
} else {
show()
}
2022-02-17 01:53:11 +05:30
}
func resetTimer() {
removeTimer()
2022-06-08 02:57:48 +05:30
2022-09-28 19:57:01 +05:30
guard let player, !player.musicMode else {
2022-06-08 02:57:48 +05:30
return
}
2022-02-17 01:53:11 +05:30
timer = Timer.scheduledTimer(withTimeInterval: 5.0, repeats: false) { _ in
withAnimation(PlayerControls.animation) { [weak self] in
self?.presentingControls = false
}
}
}
func removeTimer() {
timer?.invalidate()
timer = nil
}
2022-09-02 04:35:31 +05:30
func update() {
player?.backend.updateControls()
}
2022-02-17 01:53:11 +05:30
}