mirror of
https://github.com/danbee/persephone
synced 2025-03-04 08:39:11 +00:00
For some reason we're not seeing the insert indicator, and I can't figure out why.
80 lines
2.2 KiB
Swift
80 lines
2.2 KiB
Swift
//
|
|
// QueueDataSource.swift
|
|
// Persephone
|
|
//
|
|
// Created by Daniel Barber on 2019/2/20.
|
|
// Copyright © 2019 Dan Barber. All rights reserved.
|
|
//
|
|
|
|
import AppKit
|
|
|
|
let REORDER_PASTEBOARD_TYPE = NSPasteboard.PasteboardType("me.danbarber.persephone")
|
|
|
|
class QueueDataSource: NSObject, NSOutlineViewDataSource {
|
|
var queue: [QueueItem] = []
|
|
var queueIcon: NSImage? = nil
|
|
|
|
func setQueueIcon(_ state: QueueState) {
|
|
switch state.state {
|
|
case .playing?:
|
|
queueIcon = .playIcon
|
|
case .paused?:
|
|
queueIcon = .pauseIcon
|
|
default:
|
|
queueIcon = nil
|
|
}
|
|
}
|
|
|
|
func outlineView(_ outlineView: NSOutlineView, numberOfChildrenOfItem item: Any?) -> Int {
|
|
return queue.count + 1
|
|
}
|
|
|
|
func outlineView(_ outlineView: NSOutlineView, isItemExpandable item: Any) -> Bool {
|
|
return false
|
|
}
|
|
|
|
func outlineView(_ outlineView: NSOutlineView, child index: Int, ofItem item: Any?) -> Any {
|
|
if index > 0 {
|
|
return queue[index - 1]
|
|
} else {
|
|
return ""
|
|
}
|
|
}
|
|
|
|
func outlineView(_ outlineView: NSOutlineView, pasteboardWriterForItem item: Any) -> NSPasteboardWriting? {
|
|
guard let queueItem = item as? QueueItem
|
|
else { return nil }
|
|
|
|
let pbItem = NSPasteboardItem()
|
|
|
|
pbItem.setPropertyList(["queuePos": queueItem.queuePos], forType: REORDER_PASTEBOARD_TYPE)
|
|
|
|
return pbItem
|
|
}
|
|
|
|
func outlineView(_ outlineView: NSOutlineView, validateDrop info: NSDraggingInfo, proposedItem item: Any?, proposedChildIndex index: Int) -> NSDragOperation {
|
|
guard let draggingTypes = info.draggingPasteboard.types,
|
|
draggingTypes.contains(REORDER_PASTEBOARD_TYPE),
|
|
index >= 0
|
|
else { return [] }
|
|
|
|
return .move
|
|
}
|
|
|
|
func outlineView(_ outlineView: NSOutlineView, acceptDrop info: NSDraggingInfo, item: Any?, childIndex index: Int) -> Bool {
|
|
var newQueuePos = index - 1
|
|
|
|
guard let payload = info.draggingPasteboard.propertyList(forType: REORDER_PASTEBOARD_TYPE) as? [String: Int],
|
|
let queuePos = payload["queuePos"]
|
|
else { return false }
|
|
|
|
if newQueuePos > queuePos { newQueuePos -= 1 }
|
|
|
|
guard queuePos != newQueuePos else { return false }
|
|
|
|
App.store.dispatch(MPDMoveSongInQueue(oldQueuePos: queuePos, newQueuePos: newQueuePos))
|
|
|
|
return true
|
|
}
|
|
}
|