1
1
mirror of https://github.com/danbee/persephone synced 2025-03-04 08:39:11 +00:00
persephone/Persephone/Controllers/WindowController.swift
Dan Barber 5d0e1c4719
Spacebar triggers play/pause
Use the responder chain to handle the keypress.
2019-02-22 11:58:56 -05:00

78 lines
2.2 KiB
Swift

//
// WindowController.swift
// Persephone
//
// Created by Daniel Barber on 2019/1/11.
// Copyright © 2019 Dan Barber. All rights reserved.
//
import Cocoa
class WindowController: NSWindowController {
enum TransportAction: Int {
case prevTrack, playPause, stop, nextTrack
}
let playIcon = NSImage(named: "playButton")
let pauseIcon = NSImage(named: "pauseButton")
override func windowDidLoad() {
super.windowDidLoad()
window?.titleVisibility = .hidden
NotificationCenter.default.addObserver(
self,
selector: #selector(stateChanged(_:)),
name: Notification.stateChanged,
object: AppDelegate.mpdClient
)
}
override func keyDown(with event: NSEvent) {
switch event.keyCode {
case NSEvent.keyCodeSpace:
AppDelegate.mpdClient.playPause()
default:
nextResponder?.keyDown(with: event)
}
}
@objc func stateChanged(_ notification: Notification) {
guard let state = notification.userInfo?[Notification.stateKey] as? MPDClient.Status.State
else { return }
setTransportControlState(state)
}
func setTransportControlState(_ state: MPDClient.Status.State) {
transportControls.setEnabled(state.isOneOf([.playing, .paused]), forSegment: 0)
transportControls.setEnabled(state.isOneOf([.playing, .paused, .stopped]), forSegment: 1)
transportControls.setEnabled(state.isOneOf([.playing, .paused]), forSegment: 2)
transportControls.setEnabled(state.isOneOf([.playing, .paused]), forSegment: 3)
if state.isOneOf([.paused, .stopped, .unknown]) {
transportControls.setImage(playIcon, forSegment: 1)
} else {
transportControls.setImage(pauseIcon, forSegment: 1)
}
}
@IBAction func handleTransportControl(_ sender: NSSegmentedControl) {
guard let transportAction = TransportAction(rawValue: sender.selectedSegment)
else { return }
switch transportAction {
case .prevTrack:
AppDelegate.mpdClient.prevTrack()
case .playPause:
AppDelegate.mpdClient.playPause()
case .stop:
AppDelegate.mpdClient.stop()
case .nextTrack:
AppDelegate.mpdClient.nextTrack()
}
}
@IBOutlet var transportControls: NSSegmentedCell!
}