Start work on drop validation.

This commit is contained in:
Brent Simmons 2018-09-19 13:22:22 -07:00
parent 0a20b26ed5
commit f29f690625
1 changed files with 24 additions and 8 deletions

View File

@ -10,10 +10,12 @@ import AppKit
import RSTree
import Articles
import RSCore
import Account
@objc final class SidebarOutlineDataSource: NSObject, NSOutlineViewDataSource {
let treeController: TreeController
static let dragOperationNone = NSDragOperation(rawValue: 0)
init(treeController: TreeController) {
self.treeController = treeController
@ -38,22 +40,21 @@ import RSCore
func outlineView(_ outlineView: NSOutlineView, pasteboardWriterForItem item: Any) -> NSPasteboardWriting? {
let node = nodeForItem(item as AnyObject?)
guard !(node.representedObject is PseudoFeed) else {
// We dont allow the built-in smart feeds to be dragged.
// This will have to be revisited later when there are user-created smart feeds that *can* be dragged.
guard nodeRepresentsDraggableItem(node) else {
return nil
}
return (node.representedObject as? PasteboardWriterOwner)?.pasteboardWriter
}
// MARK: - Drag and Drop
func outlineView(_ outlineView: NSOutlineView, validateDrop info: NSDraggingInfo, proposedItem item: Any?, proposedChildIndex index: Int) -> NSDragOperation {
// let draggingSourceOutlineView = info.draggingSource() as? NSOutlineView
// let isLocalDrop = draggingSourceOutlineView == outlineView
return NSDragOperation(rawValue: 0)
let draggingSourceOutlineView = info.draggingSource() as? NSOutlineView
let isLocalDrop = draggingSourceOutlineView == outlineView
if isLocalDrop {
return validateLocalDrop(info, proposedItem: item, proposedChildIndex: index)
}
return SidebarOutlineDataSource.dragOperationNone
}
func outlineView(_ outlineView: NSOutlineView, acceptDrop info: NSDraggingInfo, item: Any?, childIndex index: Int) -> Bool {
@ -72,4 +73,19 @@ private extension SidebarOutlineDataSource {
}
return item as! Node
}
func nodeRepresentsDraggableItem(_ node: Node) -> Bool {
// Dont allow PseudoFeed or Folder to be dragged.
// This will have to be revisited later. For instance,
// user-created smart feeds should be draggable, maybe.
// And we might allow dragging folders between accounts.
return node.representedObject is Feed
}
func validateLocalDrop(_ info: NSDraggingInfo, proposedItem item: Any?, proposedChildIndex index: Int) -> NSDragOperation {
// let node = nodeForItem(item)
return SidebarOutlineDataSource.dragOperationNone
}
}