Write dragged feeds with various UTI types, including a custom feed type.

This commit is contained in:
Brent Simmons
2017-11-07 21:14:58 -08:00
parent 06de21776a
commit 51825f8f05
4 changed files with 117 additions and 3 deletions

View 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
}
}

View File

@@ -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

View File

@@ -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 {