Issue #410

import AppKit
import Anchors

class DraggingView: NSView {
    var didDrag: ((FileInfo) -> Void)?
    let highlightView = NSView()

    override init(frame frameRect: NSRect) {
        super.init(frame: frameRect)

        registerForDraggedTypes([
            .fileURL
        ])

        highlightView.isHidden = true
        addSubview(highlightView)
        activate(highlightView.anchor.edges)
        highlightView.wantsLayer = true
        highlightView.layer?.borderColor = NSColor(hex: "#FF6CA8").cgColor
        highlightView.layer?.borderWidth = 6
    }

    required init?(coder decoder: NSCoder) {
        fatalError()
    }

    override func draggingEntered(_ sender: NSDraggingInfo) -> NSDragOperation {
        highlightView.isHidden = false
        return NSDragOperation()
    }

    override func draggingEnded(_ sender: NSDraggingInfo) {
        guard let pathAlias = sender.draggingPasteboard.propertyList(forType: .fileURL) as? String else {
            return
        }

        let url = URL(fileURLWithPath: pathAlias).standardized
        let fileInfo = FileInfo(url: url)
        didDrag?(fileInfo)
    }

    override func draggingExited(_ sender: NSDraggingInfo?) {
        highlightView.isHidden = true
    }

    override func draggingUpdated(_ sender: NSDraggingInfo) -> NSDragOperation {
        return NSDragOperation()
    }
}

To get information about multiple files

override func draggingEnded(_ sender: NSDraggingInfo) {
    guard let pasteBoardItems = sender.draggingPasteboard.pasteboardItems else {
        return
    }

    let fileInfos: [FileInfo] = pasteBoardItems
        .compactMap({
            return $0.propertyList(forType: .fileURL) as? String
        })
        .map({
            let url = URL(fileURLWithPath: $0).standardized
            return FileInfo(url: url)
        })

    didDrag(fileInfos)
}