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

104 lines
2.9 KiB
Swift

//
// QueueDataSource.swift
// Persephone
//
// Created by Daniel Barber on 2019/2/20.
// Copyright © 2019 Dan Barber. All rights reserved.
//
import AppKit
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 pasteboardItem = NSPasteboardItem()
pasteboardItem.setPropertyList(["queuePos": queueItem.queuePos], forType: .songPasteboardType)
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(.songPasteboardType)
else { return [] }
if let payload = info.draggingPasteboard.propertyList(forType: .songPasteboardType) as? [String: Int],
let queuePos = payload["queuePos"],
newQueuePos >= 0 {
if newQueuePos > queuePos { newQueuePos -= 1 }
guard queuePos != newQueuePos
else { return [] }
return .move
} else if let payload = info.draggingPasteboard.propertyList(forType: .songPasteboardType) as? [String: String],
let _ = payload["songUri"],
newQueuePos >= 0 {
return .copy
}
return []
}
func outlineView(_ outlineView: NSOutlineView, acceptDrop info: NSDraggingInfo, item: Any?, childIndex index: Int) -> Bool {
var newQueuePos = index - 1
if let payload = info.draggingPasteboard.propertyList(forType: .songPasteboardType) as? [String: Int],
let queuePos = payload["queuePos"] {
if newQueuePos > queuePos { newQueuePos -= 1 }
guard queuePos != newQueuePos
else { return false }
App.store.dispatch(MPDMoveSongInQueue(oldQueuePos: queuePos, newQueuePos: newQueuePos))
return true
} else if let payload = info.draggingPasteboard.propertyList(forType: .songPasteboardType) as? [String: String],
let songUri = payload["songUri"] {
App.store.dispatch(MPDAddSongToQueue(songUri: songUri, queuePos: newQueuePos))
return true
}
return false
}
}