Enforce tag specific drop validation (can't copy to the account level)

This commit is contained in:
Maurice Parker 2019-05-28 17:42:19 -05:00
parent 83652c40de
commit 0648053417
5 changed files with 36 additions and 0 deletions

View File

@ -167,6 +167,10 @@ public final class Account: DisplayNameProvider, UnreadCountProvider, Container,
}
}
public var usesTags: Bool {
return delegate.usesTags
}
var refreshInProgress = false {
didSet {
if refreshInProgress != oldValue {

View File

@ -14,6 +14,7 @@ protocol AccountDelegate {
// Local account does not; some synced accounts might.
var supportsSubFolders: Bool { get }
var usesTags: Bool { get }
var opmlImportInProgress: Bool { get }
var server: String? { get }

View File

@ -31,6 +31,7 @@ final class FeedbinAccountDelegate: AccountDelegate {
private var log = OSLog(subsystem: Bundle.main.bundleIdentifier!, category: "Feedbin")
let supportsSubFolders = false
let usesTags = true
let server: String? = "api.feedbin.com"
var opmlImportInProgress = false

View File

@ -19,6 +19,7 @@ public enum LocalAccountDelegateError: String, Error {
final class LocalAccountDelegate: AccountDelegate {
let supportsSubFolders = false
let usesTags = false
let opmlImportInProgress = false
let server: String? = nil

View File

@ -176,6 +176,9 @@ private extension SidebarOutlineDataSource {
if nodeHasChildRepresentingDraggedFeed(dropTargetNode, draggedFeed) {
return SidebarOutlineDataSource.dragOperationNone
}
if violatesTagSpecificBehavior(dropTargetNode, draggedFeed) {
return SidebarOutlineDataSource.dragOperationNone
}
let dragOperation: NSDragOperation = localFeedsDropOperation(dropTargetNode, Set([draggedFeed]))
if parentNode == dropTargetNode && index == NSOutlineViewDropOnItemIndex {
return dragOperation
@ -195,6 +198,9 @@ private extension SidebarOutlineDataSource {
if nodeHasChildRepresentingAnyDraggedFeed(dropTargetNode, draggedFeeds) {
return SidebarOutlineDataSource.dragOperationNone
}
if violatesTagSpecificBehavior(dropTargetNode, draggedFeeds) {
return SidebarOutlineDataSource.dragOperationNone
}
if parentNode !== dropTargetNode || index != NSOutlineViewDropOnItemIndex {
outlineView.setDropItem(dropTargetNode, dropChildIndex: NSOutlineViewDropOnItemIndex)
}
@ -483,6 +489,29 @@ private extension SidebarOutlineDataSource {
return false
}
func violatesTagSpecificBehavior(_ parentNode: Node, _ draggedFeed: PasteboardFeed) -> Bool {
return violatesTagSpecificBehavior(parentNode, Set([draggedFeed]))
}
func violatesTagSpecificBehavior(_ parentNode: Node, _ draggedFeeds: Set<PasteboardFeed>) -> Bool {
guard let parentAccount = nodeAccount(parentNode), parentAccount.usesTags else {
return false
}
for draggedFeed in draggedFeeds {
if parentAccount.accountID != draggedFeed.accountID {
return false
}
}
// Can't copy to the account when using tags
if parentNode.representedObject is Account && (NSApplication.shared.currentEvent?.modifierFlags.contains(.option) ?? false) {
return true
}
return false
}
func indexWhereDraggedFeedWouldAppear(_ parentNode: Node, _ draggedFeed: PasteboardFeed) -> Int {
let draggedFeedWrapper = PasteboardFeedObjectWrapper(pasteboardFeed: draggedFeed)
let draggedFeedNode = Node(representedObject: draggedFeedWrapper, parent: nil)