diff --git a/Persephone/Controllers/QueueViewController.swift b/Persephone/Controllers/QueueViewController.swift
index 518109f..db9d275 100644
--- a/Persephone/Controllers/QueueViewController.swift
+++ b/Persephone/Controllers/QueueViewController.swift
@@ -22,7 +22,6 @@ class QueueViewController: NSViewController {
$0.select { $0.queueState }
}
-// queueView.dataSource = dataSource
queueView.columnAutoresizingStyle = .sequentialColumnAutoresizingStyle
queueView.registerForDraggedTypes([REORDER_PASTEBOARD_TYPE])
queueView.draggingDestinationFeedbackStyle = .regular
diff --git a/Persephone/DataSources/QueueDataSource.swift b/Persephone/DataSources/QueueDataSource.swift
index 2298e1f..4649ae7 100644
--- a/Persephone/DataSources/QueueDataSource.swift
+++ b/Persephone/DataSources/QueueDataSource.swift
@@ -45,17 +45,26 @@ class QueueDataSource: NSObject, NSOutlineViewDataSource {
guard let queueItem = item as? QueueItem
else { return nil }
- let pbItem = NSPasteboardItem()
+ let pasteboardItem = NSPasteboardItem()
- pbItem.setPropertyList(["queuePos": queueItem.queuePos], forType: REORDER_PASTEBOARD_TYPE)
+ pasteboardItem.setPropertyList(["queuePos": queueItem.queuePos], forType: REORDER_PASTEBOARD_TYPE)
- return pbItem
+ return pasteboardItem
}
func outlineView(_ outlineView: NSOutlineView, validateDrop info: NSDraggingInfo, proposedItem item: Any?, proposedChildIndex index: Int) -> NSDragOperation {
+ var newQueuePos = index - 1
+
guard let draggingTypes = info.draggingPasteboard.types,
draggingTypes.contains(REORDER_PASTEBOARD_TYPE),
- index >= 0
+ let payload = info.draggingPasteboard.propertyList(forType: REORDER_PASTEBOARD_TYPE) as? [String: Int],
+ let queuePos = payload["queuePos"],
+ newQueuePos >= 0
+ else { return [] }
+
+ if newQueuePos > queuePos { newQueuePos -= 1 }
+
+ guard queuePos != newQueuePos
else { return [] }
return .move
@@ -70,7 +79,8 @@ class QueueDataSource: NSObject, NSOutlineViewDataSource {
if newQueuePos > queuePos { newQueuePos -= 1 }
- guard queuePos != newQueuePos else { return false }
+ guard queuePos != newQueuePos
+ else { return false }
App.store.dispatch(MPDMoveSongInQueue(oldQueuePos: queuePos, newQueuePos: newQueuePos))
diff --git a/Persephone/Models/QueueItem.swift b/Persephone/Models/QueueItem.swift
index c048510..8a98214 100644
--- a/Persephone/Models/QueueItem.swift
+++ b/Persephone/Models/QueueItem.swift
@@ -8,8 +8,14 @@
import AppKit
-struct QueueItem: Equatable {
+struct QueueItem: Hashable {
var song: Song
var queuePos: Int
var isPlaying: Bool
+
+ func hash(into hasher: inout Hasher) {
+ hasher.combine(song)
+ hasher.combine(queuePos)
+ hasher.combine(isPlaying)
+ }
}
diff --git a/Persephone/Models/Song.swift b/Persephone/Models/Song.swift
index 5b0a2a8..0d283fe 100644
--- a/Persephone/Models/Song.swift
+++ b/Persephone/Models/Song.swift
@@ -43,3 +43,13 @@ extension Song: Equatable {
(lhs.album == rhs.album)
}
}
+
+extension Song: Hashable {
+ func hash(into hasher: inout Hasher) {
+ hasher.combine(mpdSong.uriString)
+ hasher.combine(trackNumber)
+ hasher.combine(title)
+ hasher.combine(artist)
+ hasher.combine(album.title)
+ }
+}
diff --git a/Persephone/Resources/Base.lproj/Main.storyboard b/Persephone/Resources/Base.lproj/Main.storyboard
index a2c4322..3263598 100644
--- a/Persephone/Resources/Base.lproj/Main.storyboard
+++ b/Persephone/Resources/Base.lproj/Main.storyboard
@@ -578,17 +578,17 @@
-
+
-
+
-
+
@@ -606,7 +606,7 @@
-
+
@@ -627,7 +627,7 @@
-
+
@@ -687,7 +687,7 @@
-
+