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 @@ - +