mirror of
https://github.com/danbee/persephone
synced 2025-03-04 08:39:11 +00:00
Compare commits
2 Commits
44afb98f89
...
dbb5d28084
| Author | SHA1 | Date | |
|---|---|---|---|
| dbb5d28084 | |||
| 5b39158492 |
@ -18,6 +18,7 @@
|
||||
E408D3C2220E134F0006D9BE /* AlbumViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E408D3C1220E134F0006D9BE /* AlbumViewController.swift */; };
|
||||
E408D3CB220E341D0006D9BE /* AlbumViewItem.xib in Resources */ = {isa = PBXBuildFile; fileRef = E408D3C9220E341D0006D9BE /* AlbumViewItem.xib */; };
|
||||
E40FE71B221B904300A4223F /* NSEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = E40FE71A221B904300A4223F /* NSEvent.swift */; };
|
||||
E4120D6C22AD8139004CB1F8 /* QueueView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4120D6B22AD8139004CB1F8 /* QueueView.swift */; };
|
||||
E419E2872249B96600216A8C /* Song.swift in Sources */ = {isa = PBXBuildFile; fileRef = E419E2862249B96600216A8C /* Song.swift */; };
|
||||
E41B22C621FB932700D544F6 /* MPDClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = E41B22C521FB932700D544F6 /* MPDClient.swift */; };
|
||||
E41E52FD223BF87300173814 /* MPDClient+Connection.swift in Sources */ = {isa = PBXBuildFile; fileRef = E41E52FC223BF87300173814 /* MPDClient+Connection.swift */; };
|
||||
@ -192,6 +193,7 @@
|
||||
E408D3C1220E134F0006D9BE /* AlbumViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlbumViewController.swift; sourceTree = "<group>"; };
|
||||
E408D3C9220E341D0006D9BE /* AlbumViewItem.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = AlbumViewItem.xib; sourceTree = "<group>"; };
|
||||
E40FE71A221B904300A4223F /* NSEvent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSEvent.swift; sourceTree = "<group>"; };
|
||||
E4120D6B22AD8139004CB1F8 /* QueueView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QueueView.swift; sourceTree = "<group>"; };
|
||||
E419E2862249B96600216A8C /* Song.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Song.swift; sourceTree = "<group>"; };
|
||||
E41B22BF21FB6BBA00D544F6 /* libmpdclient.2.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libmpdclient.2.dylib; path = libmpdclient/output/libmpdclient.2.dylib; sourceTree = "<group>"; };
|
||||
E41B22C421FB715A00D544F6 /* module.modulemap */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; path = module.modulemap; sourceTree = "<group>"; };
|
||||
@ -472,6 +474,7 @@
|
||||
E423563F228623D2001216D6 /* QueueSongTitleView.swift */,
|
||||
E45878372296173C00586A1C /* AlbumDetailSongRowView.swift */,
|
||||
E4A3A6A022A457B600EA2C40 /* AlbumDetailSongListView.swift */,
|
||||
E4120D6B22AD8139004CB1F8 /* QueueView.swift */,
|
||||
);
|
||||
path = Views;
|
||||
sourceTree = "<group>";
|
||||
@ -969,6 +972,7 @@
|
||||
E47E2FD122205C4600F747E6 /* MainSplitViewController.swift in Sources */,
|
||||
E4B11BB8227538FA0075461B /* CurrentCoverArtView.swift in Sources */,
|
||||
E4E8CC9A22075D370024217A /* MPDSong.swift in Sources */,
|
||||
E4120D6C22AD8139004CB1F8 /* QueueView.swift in Sources */,
|
||||
E41EA46C221636AF0068EF46 /* GeneralPrefsViewController.swift in Sources */,
|
||||
E4E8CC902204EC7F0024217A /* Delegate.swift in Sources */,
|
||||
E4A83BF4222207D50098FED6 /* CoverArtService.swift in Sources */,
|
||||
|
||||
@ -140,19 +140,20 @@ class AppDelegate: NSObject,
|
||||
else { return }
|
||||
|
||||
App.store.dispatch(MPDRemoveTrack(queuePos: queueItem.queuePos))
|
||||
App.store.dispatch(SetSelectedQueueItem(selectedQueueItem: nil))
|
||||
}
|
||||
@IBAction func clearQueueMenuAction(_ sender: NSMenuItem) {
|
||||
let alert = NSAlert()
|
||||
alert.alertStyle = .informational
|
||||
alert.alertStyle = .warning
|
||||
alert.messageText = "Are you sure you want to clear the queue?"
|
||||
alert.informativeText = "You can’t undo this action."
|
||||
alert.addButton(withTitle: "Clear")
|
||||
alert.addButton(withTitle: "Clear Queue")
|
||||
alert.addButton(withTitle: "Cancel")
|
||||
|
||||
let result = alert.runModal()
|
||||
|
||||
if result == .alertFirstButtonReturn {
|
||||
App.store.dispatch(UpdateQueueAction(queue: []))
|
||||
App.store.dispatch(MPDClearQueue())
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -54,6 +54,8 @@ extension MPDClient {
|
||||
guard let queuePos = userData["queuePos"] as? Int
|
||||
else { return }
|
||||
sendPlayTrack(at: queuePos)
|
||||
case .clearQueue:
|
||||
sendClearQueue()
|
||||
case .replaceQueue:
|
||||
guard let songs = userData["songs"] as? [MPDSong]
|
||||
else { return }
|
||||
|
||||
@ -14,6 +14,10 @@ extension MPDClient {
|
||||
sendCommand(command: .fetchQueue)
|
||||
}
|
||||
|
||||
func clearQueue() {
|
||||
enqueueCommand(command: .clearQueue)
|
||||
}
|
||||
|
||||
func playTrack(at queuePos: Int) {
|
||||
enqueueCommand(command: .playTrack, userData: ["queuePos": queuePos])
|
||||
}
|
||||
@ -40,6 +44,10 @@ extension MPDClient {
|
||||
}
|
||||
}
|
||||
|
||||
func sendClearQueue() {
|
||||
mpd_run_clear(self.connection)
|
||||
}
|
||||
|
||||
func sendReplaceQueue(_ songs: [MPDSong]) {
|
||||
mpd_run_clear(self.connection)
|
||||
|
||||
|
||||
@ -29,6 +29,7 @@ extension MPDClient {
|
||||
// Queue commands
|
||||
case fetchQueue
|
||||
case playTrack
|
||||
case clearQueue
|
||||
case replaceQueue
|
||||
case appendSong
|
||||
case removeSong
|
||||
|
||||
@ -585,7 +585,7 @@
|
||||
<rect key="frame" x="0.0" y="0.0" width="328" height="219"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<outlineView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" selectionHighlightStyle="sourceList" multipleSelection="NO" autosaveColumns="NO" rowSizeStyle="automatic" viewBased="YES" indentationPerLevel="16" outlineTableColumn="0Co-uF-CCB" id="jEJ-jg-fll">
|
||||
<outlineView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" selectionHighlightStyle="sourceList" multipleSelection="NO" autosaveColumns="NO" rowSizeStyle="automatic" viewBased="YES" indentationPerLevel="16" outlineTableColumn="0Co-uF-CCB" id="jEJ-jg-fll" customClass="QueueView" customModule="Persephone" customModuleProvider="target">
|
||||
<rect key="frame" x="0.0" y="0.0" width="328" height="219"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<size key="intercellSpacing" width="3" height="2"/>
|
||||
@ -765,7 +765,7 @@
|
||||
</connections>
|
||||
</viewController>
|
||||
<customObject id="du4-e9-TfX" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
|
||||
<menu id="dYA-Jm-eOa">
|
||||
<menu identifier="queueViewMenu" id="dYA-Jm-eOa">
|
||||
<items>
|
||||
<menuItem title="Play" id="kp1-XJ-9CL">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
|
||||
@ -16,6 +16,8 @@ struct MPDStopAction: Action {}
|
||||
struct MPDNextTrackAction: Action {}
|
||||
struct MPDPrevTrackAction: Action {}
|
||||
|
||||
struct MPDClearQueue: Action {}
|
||||
|
||||
struct MPDAppendTrack: Action {
|
||||
let song: MPDClient.MPDSong
|
||||
}
|
||||
|
||||
@ -30,6 +30,9 @@ func mpdReducer(action: Action, state: MPDState?) -> MPDState {
|
||||
case is MPDPrevTrackAction:
|
||||
App.mpdClient.prevTrack()
|
||||
|
||||
case is MPDClearQueue:
|
||||
App.mpdClient.clearQueue()
|
||||
|
||||
case let action as MPDAppendTrack:
|
||||
App.mpdClient.appendSong(action.song)
|
||||
|
||||
|
||||
23
Persephone/Views/QueueView.swift
Normal file
23
Persephone/Views/QueueView.swift
Normal file
@ -0,0 +1,23 @@
|
||||
//
|
||||
// QueueView.swift
|
||||
// Persephone
|
||||
//
|
||||
// Created by Daniel Barber on 2019/6/09.
|
||||
// Copyright © 2019 Dan Barber. All rights reserved.
|
||||
//
|
||||
|
||||
import AppKit
|
||||
|
||||
class QueueView: NSOutlineView {
|
||||
override func menu(for event: NSEvent) -> NSMenu? {
|
||||
let point = convert(event.locationInWindow, from: nil)
|
||||
|
||||
let currentRow = row(at: point)
|
||||
|
||||
if currentRow > 0 {
|
||||
return super.menu(for: event)
|
||||
} else {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user