Skip to content

Instantly share code, notes, and snippets.

@minsOne
Forked from fpg1503/DragView.swift
Created August 17, 2016 16:29
Show Gist options
  • Save minsOne/ee82d874941ffa9619151fed84f7556e to your computer and use it in GitHub Desktop.
Save minsOne/ee82d874941ffa9619151fed84f7556e to your computer and use it in GitHub Desktop.
Drag and Drop View on macOS
protocol DragViewDelegate {
var acceptedFileExtensions: [String] { get }
func dragView(dragView: DragView, didDragFileWith URL: NSURL)
}
class DragView: NSView {
required init?(coder: NSCoder) {
super.init(coder: coder)
registerForDraggedTypes([NSFilenamesPboardType, NSURLPboardType])
}
private var fileTypeIsOk = false
private var acceptedFileExtensions: [String] {
return delegate?.acceptedFileExtensions ?? []
}
var delegate: DragViewDelegate?
override func draggingEntered(sender: NSDraggingInfo) -> NSDragOperation {
if checkExtension(sender) {
fileTypeIsOk = true
return .Copy
} else {
fileTypeIsOk = false
return .None
}
}
override func draggingUpdated(sender: NSDraggingInfo) -> NSDragOperation {
if fileTypeIsOk {
return .Copy
} else {
return .None
}
}
override func performDragOperation(sender: NSDraggingInfo) -> Bool {
guard let draggedFileURL = sender.draggedFileURL else {
return false
}
delegate?.dragView(self, didDragFileWith: draggedFileURL)
return true
}
func checkExtension(drag: NSDraggingInfo) -> Bool {
guard let fileExtension = drag.draggedFileURL?.pathExtension?.lowercaseString else {
return false
}
return acceptedFileExtensions.contains(fileExtension)
}
}
extension NSDraggingInfo {
var draggedFileURL: NSURL? {
let filenames = draggingPasteboard().propertyListForType(NSFilenamesPboardType) as? [String]
let path = filenames?.first
return path.map(NSURL.init)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment