diff --git a/Frameworks/Account/Account.swift b/Frameworks/Account/Account.swift index 5972c28d0..3d60bda46 100644 --- a/Frameworks/Account/Account.swift +++ b/Frameworks/Account/Account.swift @@ -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 { diff --git a/Frameworks/Account/AccountDelegate.swift b/Frameworks/Account/AccountDelegate.swift index 33dace1a3..cfb685f64 100644 --- a/Frameworks/Account/AccountDelegate.swift +++ b/Frameworks/Account/AccountDelegate.swift @@ -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 } diff --git a/Frameworks/Account/Feedbin/FeedbinAccountDelegate.swift b/Frameworks/Account/Feedbin/FeedbinAccountDelegate.swift index 7520d0642..798abeee3 100644 --- a/Frameworks/Account/Feedbin/FeedbinAccountDelegate.swift +++ b/Frameworks/Account/Feedbin/FeedbinAccountDelegate.swift @@ -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 diff --git a/Frameworks/Account/LocalAccount/LocalAccountDelegate.swift b/Frameworks/Account/LocalAccount/LocalAccountDelegate.swift index 10e5ce446..34f1c86aa 100644 --- a/Frameworks/Account/LocalAccount/LocalAccountDelegate.swift +++ b/Frameworks/Account/LocalAccount/LocalAccountDelegate.swift @@ -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 diff --git a/Mac/MainWindow/Sidebar/SidebarOutlineDataSource.swift b/Mac/MainWindow/Sidebar/SidebarOutlineDataSource.swift index aa85636de..19090392c 100644 --- a/Mac/MainWindow/Sidebar/SidebarOutlineDataSource.swift +++ b/Mac/MainWindow/Sidebar/SidebarOutlineDataSource.swift @@ -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) -> 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)