mirror of
https://github.com/Ranchero-Software/NetNewsWire
synced 2025-08-12 06:26:36 +00:00
Write dragged feeds with various UTI types, including a custom feed type.
This commit is contained in:
100
Evergreen/MainWindow/Sidebar/FeedPasteboardWriter.swift
Normal file
100
Evergreen/MainWindow/Sidebar/FeedPasteboardWriter.swift
Normal file
@@ -0,0 +1,100 @@
|
||||
//
|
||||
// FeedPasteboardWriter.swift
|
||||
// Evergreen
|
||||
//
|
||||
// Created by Brent Simmons on 11/7/17.
|
||||
// Copyright © 2017 Ranchero Software. All rights reserved.
|
||||
//
|
||||
|
||||
import Cocoa
|
||||
import Data
|
||||
|
||||
@objc final class FeedPasteboardWriter: NSObject, NSPasteboardWriting {
|
||||
|
||||
private let feed: Feed
|
||||
static let feedUTI = "com.ranchero.feed"
|
||||
static let feedUTIType = NSPasteboard.PasteboardType(rawValue: feedUTI)
|
||||
static let feedUTIInternal = "com.ranchero.evergreen.internal.feed";
|
||||
static let feedUTIInternalType = NSPasteboard.PasteboardType(rawValue: feedUTIInternal)
|
||||
|
||||
init(feed: Feed) {
|
||||
|
||||
self.feed = feed
|
||||
}
|
||||
|
||||
// MARK: - NSPasteboardWriting
|
||||
|
||||
func writableTypes(for pasteboard: NSPasteboard) -> [NSPasteboard.PasteboardType] {
|
||||
|
||||
return [.string, .URL, FeedPasteboardWriter.feedUTIType, FeedPasteboardWriter.feedUTIInternalType]
|
||||
}
|
||||
|
||||
func pasteboardPropertyList(forType type: NSPasteboard.PasteboardType) -> Any? {
|
||||
|
||||
let plist: Any?
|
||||
|
||||
switch type {
|
||||
case .string:
|
||||
plist = feed.nameForDisplay
|
||||
case .URL:
|
||||
plist = feed.url
|
||||
case FeedPasteboardWriter.feedUTIType:
|
||||
plist = exportDictionary()
|
||||
case FeedPasteboardWriter.feedUTIInternalType:
|
||||
plist = internalDictionary()
|
||||
default:
|
||||
plist = nil
|
||||
}
|
||||
|
||||
return plist
|
||||
}
|
||||
}
|
||||
|
||||
private extension FeedPasteboardWriter {
|
||||
|
||||
private struct Key {
|
||||
|
||||
static let url = "URL"
|
||||
static let homePageURL = "homePageURL"
|
||||
static let name = "name"
|
||||
|
||||
// Internal
|
||||
static let accountID = "accountID"
|
||||
static let feedID = "feedID"
|
||||
static let editedName = "editedName"
|
||||
static let unreadCount = "unreadCount"
|
||||
}
|
||||
|
||||
func exportDictionary() -> [String: String] {
|
||||
|
||||
var d = [String: String]()
|
||||
|
||||
d[Key.url] = feed.url
|
||||
d[Key.homePageURL] = feed.homePageURL ?? ""
|
||||
d[Key.name] = feed.nameForDisplay
|
||||
|
||||
return d
|
||||
}
|
||||
|
||||
func internalDictionary() -> [String: Any] {
|
||||
|
||||
var d = [String: Any]()
|
||||
|
||||
d[Key.url] = feed.url
|
||||
if let homePageURL = feed.homePageURL {
|
||||
d[Key.homePageURL] = homePageURL
|
||||
}
|
||||
if let name = feed.name {
|
||||
d[Key.name] = name
|
||||
}
|
||||
if let editedName = feed.editedName {
|
||||
d[Key.editedName] = editedName
|
||||
}
|
||||
if feed.unreadCount > 0 {
|
||||
d[Key.unreadCount] = feed.unreadCount
|
||||
}
|
||||
|
||||
return d
|
||||
|
||||
}
|
||||
}
|
||||
@@ -27,7 +27,9 @@ import RSCore
|
||||
override func viewDidLoad() {
|
||||
|
||||
outlineView.sidebarViewController = self
|
||||
|
||||
outlineView.setDraggingSourceOperationMask(.move, forLocal: true)
|
||||
outlineView.setDraggingSourceOperationMask(.copy, forLocal: false)
|
||||
|
||||
NotificationCenter.default.addObserver(self, selector: #selector(unreadCountDidChange(_:)), name: .UnreadCountDidChange, object: nil)
|
||||
NotificationCenter.default.addObserver(self, selector: #selector(containerChildrenDidChange(_:)), name: .ChildrenDidChange, object: nil)
|
||||
NotificationCenter.default.addObserver(self, selector: #selector(userDidAddFeed(_:)), name: .UserDidAddFeed, object: nil)
|
||||
@@ -140,7 +142,7 @@ import RSCore
|
||||
}
|
||||
}
|
||||
|
||||
//MARK: NSOutlineViewDataSource
|
||||
// MARK: NSOutlineViewDataSource
|
||||
|
||||
func outlineView(_ outlineView: NSOutlineView, numberOfChildrenOfItem item: Any?) -> Int {
|
||||
|
||||
@@ -156,6 +158,15 @@ import RSCore
|
||||
|
||||
return nodeForItem(item as AnyObject?).canHaveChildNodes
|
||||
}
|
||||
|
||||
func outlineView(_ outlineView: NSOutlineView, pasteboardWriterForItem item: Any) -> NSPasteboardWriting? {
|
||||
|
||||
let node = nodeForItem(item as AnyObject?)
|
||||
if let feed = node.representedObject as? Feed {
|
||||
return FeedPasteboardWriter(feed: feed)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
//MARK: - Private
|
||||
|
||||
@@ -69,7 +69,6 @@ class TimelineViewController: NSViewController, KeyboardDelegate, UndoableComman
|
||||
tableView.target = self
|
||||
tableView.doubleAction = #selector(openArticleInBrowser(_:))
|
||||
tableView.keyboardDelegate = self
|
||||
tableView.setDraggingSourceOperationMask(.copy, forLocal: true)
|
||||
tableView.setDraggingSourceOperationMask(.copy, forLocal: false)
|
||||
|
||||
if !didRegisterForNotifications {
|
||||
|
||||
Reference in New Issue
Block a user