mirror of
https://github.com/FBukovina/Atoll.git
synced 2026-10-28 15:44:32 +00:00
Add Gesture controls for media skip and forward
This commit is contained in:
parent
48b3266e76
commit
d70569e32f
9 changed files with 267 additions and 21 deletions
|
|
@ -28,6 +28,19 @@ let defaultImage: NSImage = .init(
|
|||
)!
|
||||
|
||||
class MusicManager: ObservableObject {
|
||||
enum SkipDirection: Equatable {
|
||||
case backward
|
||||
case forward
|
||||
}
|
||||
|
||||
struct SkipGesturePulse: Equatable {
|
||||
let token: Int
|
||||
let direction: SkipDirection
|
||||
let behavior: MusicSkipBehavior
|
||||
}
|
||||
|
||||
static let skipGestureSeekInterval: TimeInterval = 10
|
||||
|
||||
// MARK: - Properties
|
||||
static let shared = MusicManager()
|
||||
private var cancellables = Set<AnyCancellable>()
|
||||
|
|
@ -61,6 +74,7 @@ class MusicManager: ObservableObject {
|
|||
@Published var isLiveStream: Bool = false
|
||||
@ObservedObject var coordinator = DynamicIslandViewCoordinator.shared
|
||||
@Published var usingAppIconForArtwork: Bool = false
|
||||
@Published private(set) var skipGesturePulse: SkipGesturePulse?
|
||||
|
||||
// MARK: - Lyrics Properties
|
||||
@Published var currentLyrics: String = ""
|
||||
|
|
@ -89,6 +103,7 @@ class MusicManager: ObservableObject {
|
|||
|
||||
@Published var isTransitioning: Bool = false
|
||||
private var transitionWorkItem: DispatchWorkItem?
|
||||
private var skipGestureToken: Int = 0
|
||||
|
||||
// MARK: - Initialization
|
||||
init() {
|
||||
|
|
@ -556,6 +571,34 @@ class MusicManager: ObservableObject {
|
|||
seek(to: target)
|
||||
}
|
||||
|
||||
@MainActor
|
||||
func handleSkipGesture(direction: SkipDirection) {
|
||||
guard Defaults[.enableHorizontalMusicGestures] else { return }
|
||||
guard !isPlayerIdle || bundleIdentifier != nil else { return }
|
||||
|
||||
let behavior = Defaults[.musicGestureBehavior]
|
||||
|
||||
switch behavior {
|
||||
case .track:
|
||||
if direction == .forward {
|
||||
nextTrack()
|
||||
} else {
|
||||
previousTrack()
|
||||
}
|
||||
case .tenSecond:
|
||||
let interval = Self.skipGestureSeekInterval
|
||||
let offset = direction == .forward ? interval : -interval
|
||||
seek(by: offset)
|
||||
}
|
||||
|
||||
skipGestureToken = skipGestureToken &+ 1
|
||||
skipGesturePulse = SkipGesturePulse(
|
||||
token: skipGestureToken,
|
||||
direction: direction,
|
||||
behavior: behavior
|
||||
)
|
||||
}
|
||||
|
||||
func openMusicApp() {
|
||||
guard let bundleID = bundleIdentifier else {
|
||||
print("Error: appBundleIdentifier is nil")
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue