1
1
mirror of https://github.com/danbee/persephone synced 2025-03-04 08:39:11 +00:00

Shuffle/repeat buttons change server state

This commit is contained in:
Daniel Barber 2019-05-17 22:50:21 -04:00
parent d211651e16
commit ad04250760
Signed by: danbarber
GPG Key ID: 931D8112E0103DD8
21 changed files with 130 additions and 8 deletions

View File

@ -18,7 +18,7 @@ class AppDelegate: NSObject,
func applicationDidFinishLaunching(_ aNotification: Notification) {
App.mpdServerController.connect()
_ = App.userNotificationsController
instantiateUserNotificationsController()
mediaKeyTap = MediaKeyTap(delegate: self)
mediaKeyTap?.start()
@ -30,6 +30,10 @@ class AppDelegate: NSObject,
}
}
func instantiateUserNotificationsController() {
_ = App.userNotificationsController
}
func applicationWillTerminate(_ aNotification: Notification) {
App.mpdServerController.disconnect()
}

View File

@ -17,6 +17,16 @@ class WindowController: NSWindowController {
var state: MPDClient.MPDStatus.State?
var trackTimer: Timer?
@IBOutlet var transportControls: NSSegmentedCell!
@IBOutlet var trackProgress: NSTextField!
@IBOutlet var trackProgressBar: NSSlider!
@IBOutlet var trackRemaining: NSTextField!
@IBOutlet var databaseUpdatingIndicator: NSProgressIndicator!
@IBOutlet var shuffleState: NSButton!
@IBOutlet var repeatState: NSButton!
override func windowDidLoad() {
super.windowDidLoad()
window?.titleVisibility = .hidden
@ -137,12 +147,14 @@ class WindowController: NSWindowController {
}
}
@IBOutlet var transportControls: NSSegmentedCell!
@IBOutlet var trackProgress: NSTextField!
@IBOutlet var trackProgressBar: NSSlider!
@IBOutlet var trackRemaining: NSTextField!
@IBOutlet var databaseUpdatingIndicator: NSProgressIndicator!
@IBAction func handleShuffleButton(_ sender: NSButton) {
App.store.dispatch(MPDSetShuffleAction(shuffleState: sender.state == .on))
}
@IBAction func handleRepeatButton(_ sender: NSButton) {
App.store.dispatch(MPDSetRepeatAction(repeatState: sender.state == .on))
}
}
extension WindowController: NSWindowDelegate {

View File

@ -29,6 +29,16 @@ extension MPDClient {
else { return }
sendSeekCurrentSong(timeInSeconds: timeInSeconds)
case .setShuffleState:
guard let shuffleState = userData["shuffleState"] as? Bool
else { return }
sendShuffleState(shuffleState: shuffleState)
case .setRepeatState:
guard let repeatState = userData["repeatState"] as? Bool
else { return }
sendRepeatState(repeatState: repeatState)
// Database commands
case .updateDatabase:
sendUpdateDatabase()

View File

@ -33,6 +33,20 @@ extension MPDClient {
)
}
func setShuffleState(shuffleState: Bool) {
enqueueCommand(
command: .setShuffleState,
userData: ["shuffleState": shuffleState]
)
}
func setRepeatState(repeatState: Bool) {
enqueueCommand(
command: .setRepeatState,
userData: ["repeatState": repeatState]
)
}
func sendNextTrack() {
guard let state = status?.state,
state.isOneOf([.playing, .paused])
@ -64,4 +78,12 @@ extension MPDClient {
func sendSeekCurrentSong(timeInSeconds: Float) {
mpd_run_seek_current(self.connection, timeInSeconds, false)
}
func sendShuffleState(shuffleState: Bool) {
mpd_run_random(self.connection, shuffleState)
}
func sendRepeatState(repeatState: Bool) {
mpd_run_repeat(self.connection, repeatState)
}
}

View File

@ -17,6 +17,9 @@ extension MPDClient {
case stop
case seekCurrentSong
case setShuffleState
case setRepeatState
// Database commands
case updateDatabase

View File

@ -222,9 +222,44 @@
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
</progressIndicator>
</toolbarItem>
<toolbarItem implicitItemIdentifier="A07933B6-4770-4B28-856B-B98DB5C6EB55" label="" paletteLabel="Shuffle" image="shuffleButton" selectable="YES" id="gF4-mh-Nzd">
<nil key="toolTip"/>
<size key="minSize" width="42" height="24"/>
<size key="maxSize" width="42" height="24"/>
<button key="view" verticalHuggingPriority="750" id="E8L-uK-XT0">
<rect key="frame" x="2" y="14" width="42" height="24"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="roundTextured" bezelStyle="texturedRounded" image="shuffleButton" imagePosition="only" alignment="center" lineBreakMode="truncatingTail" borderStyle="border" inset="2" id="YNb-hd-ax8">
<behavior key="behavior" pushIn="YES" changeContents="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="handleShuffleButton:" target="B8D-0N-5wS" id="THd-0g-fmb"/>
</connections>
</button>
</toolbarItem>
<toolbarItem implicitItemIdentifier="4B55BD96-797D-4F30-B582-2D917823879F" label="" paletteLabel="Repeat" image="repeatButton" id="MwO-i4-shF">
<nil key="toolTip"/>
<size key="minSize" width="42" height="25"/>
<size key="maxSize" width="42" height="25"/>
<button key="view" verticalHuggingPriority="750" id="OqH-lV-sAg">
<rect key="frame" x="1" y="14" width="42" height="25"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="roundTextured" bezelStyle="texturedRounded" image="repeatButton" imagePosition="only" alignment="center" lineBreakMode="truncatingTail" borderStyle="border" inset="2" id="1bu-vK-3Hb">
<behavior key="behavior" pushIn="YES" changeContents="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="handleRepeatButton:" target="B8D-0N-5wS" id="EN2-u4-DNl"/>
</connections>
</button>
</toolbarItem>
</allowedToolbarItems>
<defaultToolbarItems>
<toolbarItem reference="p3r-ty-Pxf"/>
<toolbarItem reference="mhg-16-CNM"/>
<toolbarItem reference="gF4-mh-Nzd"/>
<toolbarItem reference="MwO-i4-shF"/>
<toolbarItem reference="fw4-Lp-bWJ"/>
<toolbarItem reference="9ol-aR-mzv"/>
<toolbarItem reference="n52-8S-6kR"/>
@ -239,6 +274,8 @@
</window>
<connections>
<outlet property="databaseUpdatingIndicator" destination="LpV-iM-o6t" id="y0T-eR-ygY"/>
<outlet property="repeatState" destination="OqH-lV-sAg" id="DPC-Ff-Srr"/>
<outlet property="shuffleState" destination="E8L-uK-XT0" id="dCF-hm-dBs"/>
<outlet property="trackProgress" destination="kx6-xm-TAN" id="XDv-Th-Agj"/>
<outlet property="trackProgressBar" destination="KMy-xf-rmN" id="a67-JU-cyQ"/>
<outlet property="trackRemaining" destination="9WZ-ij-lrb" id="0pH-d7-wvD"/>
@ -749,6 +786,8 @@
<image name="nextTrackButton" width="17" height="17"/>
<image name="playButton" width="17" height="17"/>
<image name="prevTrackButton" width="17" height="17"/>
<image name="repeatButton" width="17" height="17"/>
<image name="shuffleButton" width="17" height="17"/>
<image name="stopButton" width="17" height="17"/>
</resources>
</document>

View File

@ -29,3 +29,11 @@ struct MPDSeekCurrentSong: Action {
}
struct MPDUpdateDatabaseAction: Action {}
struct MPDSetShuffleAction: Action {
let shuffleState: Bool
}
struct MPDSetRepeatAction: Action {
let repeatState: Bool
}

View File

@ -24,3 +24,11 @@ struct UpdateElapsedTimeAction: Action {
struct UpdateStatusAction: Action {
var status: MPDClient.MPDStatus
}
struct UpdateShuffleAction: Action {
var shuffleState: Bool
}
struct UpdateRepeatAction: Action {
var repeatState: Bool
}

View File

@ -15,6 +15,8 @@ struct PlayerState: StateType {
var currentArtwork: NSImage?
var state: MPDClient.MPDStatus.State?
var shuffleState: Bool = false
var repeatState: Bool = false
var totalTime: UInt?
var elapsedTimeMs: UInt?
@ -24,6 +26,8 @@ extension PlayerState: Equatable {
static func == (lhs: PlayerState, rhs: PlayerState) -> Bool {
return (lhs.state == rhs.state) &&
(lhs.totalTime == rhs.totalTime) &&
(lhs.elapsedTimeMs == rhs.elapsedTimeMs)
(lhs.elapsedTimeMs == rhs.elapsedTimeMs) &&
(lhs.shuffleState == rhs.shuffleState) &&
(lhs.repeatState == rhs.repeatState)
}
}

View File

@ -39,6 +39,12 @@ func mpdReducer(action: Action, state: MPDState?) -> MPDState {
case let action as MPDSeekCurrentSong:
App.mpdClient.seekCurrentSong(timeInSeconds: action.timeInSeconds)
case let action as MPDSetShuffleAction:
App.mpdClient.setShuffleState(shuffleState: action.shuffleState)
case let action as MPDSetRepeatAction:
App.mpdClient.setRepeatState(repeatState: action.repeatState)
case is MPDUpdateDatabaseAction:
App.mpdClient.updateDatabase()

View File

@ -60,6 +60,12 @@ func playerReducer(action: Action, state: PlayerState?) -> PlayerState {
case let action as UpdateElapsedTimeAction:
state.elapsedTimeMs = action.elapsedTimeMs
case let action as UpdateShuffleAction:
state.shuffleState = action.shuffleState
case let action as UpdateRepeatAction:
state.repeatState = action.repeatState
default:
break
}

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 299 B

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 344 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 353 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.