From dc600492433db345606e1c9ab724a3d03505a5cd Mon Sep 17 00:00:00 2001 From: Daniel Barber Date: Fri, 28 Jun 2019 14:58:38 -0400 Subject: [PATCH] Add convenience initializer to NSPasteboardItem --- Persephone.xcodeproj/project.pbxproj | 4 +++ .../DataSources/AlbumTracksDataSource.swift | 23 +++++---------- Persephone/DataSources/QueueDataSource.swift | 23 ++++++--------- Persephone/Extensions/NSPasteboardItem.swift | 29 +++++++++++++++++++ 4 files changed, 50 insertions(+), 29 deletions(-) create mode 100644 Persephone/Extensions/NSPasteboardItem.swift diff --git a/Persephone.xcodeproj/project.pbxproj b/Persephone.xcodeproj/project.pbxproj index 9dcaa2b..cafb356 100644 --- a/Persephone.xcodeproj/project.pbxproj +++ b/Persephone.xcodeproj/project.pbxproj @@ -40,6 +40,7 @@ E435E3E2221CD4E200184CFC /* NSFont.swift in Sources */ = {isa = PBXBuildFile; fileRef = E435E3E1221CD4E200184CFC /* NSFont.swift */; }; E435E3E4221CD75D00184CFC /* NSImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = E435E3E3221CD75D00184CFC /* NSImage.swift */; }; E439109822640213002982E9 /* SongNotifierService.swift in Sources */ = {isa = PBXBuildFile; fileRef = E439109722640213002982E9 /* SongNotifierService.swift */; }; + E43AC1F122C68E6A001E483C /* NSPasteboardItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = E43AC1F022C68E6A001E483C /* NSPasteboardItem.swift */; }; E43B67AA22909793007DCF55 /* AlbumDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E43B67A822909793007DCF55 /* AlbumDetailView.swift */; }; E43B67AB22909793007DCF55 /* AlbumDetailView.xib in Resources */ = {isa = PBXBuildFile; fileRef = E43B67A922909793007DCF55 /* AlbumDetailView.xib */; }; E43B67AD229194CD007DCF55 /* AlbumTracksDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = E43B67AC229194CD007DCF55 /* AlbumTracksDataSource.swift */; }; @@ -260,6 +261,7 @@ E435E3E1221CD4E200184CFC /* NSFont.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSFont.swift; sourceTree = ""; }; E435E3E3221CD75D00184CFC /* NSImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSImage.swift; sourceTree = ""; }; E439109722640213002982E9 /* SongNotifierService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SongNotifierService.swift; sourceTree = ""; }; + E43AC1F022C68E6A001E483C /* NSPasteboardItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSPasteboardItem.swift; sourceTree = ""; }; E43B67A822909793007DCF55 /* AlbumDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlbumDetailView.swift; sourceTree = ""; }; E43B67A922909793007DCF55 /* AlbumDetailView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = AlbumDetailView.xib; sourceTree = ""; }; E43B67AC229194CD007DCF55 /* AlbumTracksDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlbumTracksDataSource.swift; sourceTree = ""; }; @@ -460,6 +462,7 @@ E408D3B8220DE98F0006D9BE /* NSUserInterfaceItemIdentifier.swift */, E489E39822B85D0400CA8CBD /* NSPasteboard.swift */, E489E39C22B9CF0000CA8CBD /* NSView.swift */, + E43AC1F022C68E6A001E483C /* NSPasteboardItem.swift */, ); path = Extensions; sourceTree = ""; @@ -979,6 +982,7 @@ E4B11B61226A4C000075461B /* PlayerReducer.swift in Sources */, E4FF71922276029000D4C412 /* PreferencesActions.swift in Sources */, E489E39922B85D0400CA8CBD /* NSPasteboard.swift in Sources */, + E43AC1F122C68E6A001E483C /* NSPasteboardItem.swift in Sources */, E465049A21E94DF500A70F4C /* WindowController.swift in Sources */, E41B22C621FB932700D544F6 /* MPDClient.swift in Sources */, E47E2FDD2220A6D100F747E6 /* Time.swift in Sources */, diff --git a/Persephone/DataSources/AlbumTracksDataSource.swift b/Persephone/DataSources/AlbumTracksDataSource.swift index d751653..d87570f 100644 --- a/Persephone/DataSources/AlbumTracksDataSource.swift +++ b/Persephone/DataSources/AlbumTracksDataSource.swift @@ -45,20 +45,14 @@ class AlbumTracksDataSource: NSObject, NSTableViewDataSource { guard let song = albumSongItem.song else { return nil } - let pasteboardItem = NSPasteboardItem() - - let draggedSong = DraggedSong( - type: .albumSongItem(song.mpdSong.uriString), - title: song.title, - artist: song.artist + return NSPasteboardItem( + draggedSong: DraggedSong( + type: .albumSongItem(song.mpdSong.uriString), + title: song.title, + artist: song.artist + ), + ofType: .songPasteboardType ) - - let encoder = PropertyListEncoder() - let data = try! encoder.encode(draggedSong) - - pasteboardItem.setData(data, forType: .songPasteboardType) - - return pasteboardItem } func numberOfRows(in tableView: NSTableView) -> Int { @@ -73,8 +67,7 @@ class AlbumTracksDataSource: NSObject, NSTableViewDataSource { searchOptions: [:] ) { draggingItem, index, stop in guard let item = draggingItem.item as? NSPasteboardItem, - let data = item.data(forType: .songPasteboardType), - let draggedSong = try? PropertyListDecoder().decode(DraggedSong.self, from: data), + let draggedSong = item.draggedSong(forType: .songPasteboardType), case let (title?, artist?) = (draggedSong.title, draggedSong.artist) else { return } diff --git a/Persephone/DataSources/QueueDataSource.swift b/Persephone/DataSources/QueueDataSource.swift index 6a6ea3a..4ee13e9 100644 --- a/Persephone/DataSources/QueueDataSource.swift +++ b/Persephone/DataSources/QueueDataSource.swift @@ -43,19 +43,14 @@ class QueueDataSource: NSObject, NSOutlineViewDataSource { guard let queueItem = item as? QueueItem else { return nil } - let pasteboardItem = NSPasteboardItem() - - let draggedSong = DraggedSong( - type: .queueItem(queueItem.queuePos), - title: queueItem.song.title, - artist: queueItem.song.artist + return NSPasteboardItem( + draggedSong: DraggedSong( + type: .queueItem(queueItem.queuePos), + title: queueItem.song.title, + artist: queueItem.song.artist + ), + ofType: .songPasteboardType ) - - let data = try! PropertyListEncoder().encode(draggedSong) - - pasteboardItem.setData(data, forType: .songPasteboardType) - - return pasteboardItem } func outlineView(_ outlineView: NSOutlineView, validateDrop info: NSDraggingInfo, proposedItem item: Any?, proposedChildIndex index: Int) -> NSDragOperation { @@ -64,8 +59,8 @@ class QueueDataSource: NSObject, NSOutlineViewDataSource { guard newQueuePos >= 0, let draggingTypes = info.draggingPasteboard.types, draggingTypes.contains(.songPasteboardType), - let data = info.draggingPasteboard.data(forType: .songPasteboardType), - let draggedSong = try? PropertyListDecoder().decode(DraggedSong.self, from: data) + let pasteboardItem = info.draggingPasteboard.pasteboardItems?.first, + let draggedSong = pasteboardItem.draggedSong(forType: .songPasteboardType) else { return [] } switch draggedSong.type { diff --git a/Persephone/Extensions/NSPasteboardItem.swift b/Persephone/Extensions/NSPasteboardItem.swift new file mode 100644 index 0000000..e28303d --- /dev/null +++ b/Persephone/Extensions/NSPasteboardItem.swift @@ -0,0 +1,29 @@ +// +// NSPasteboardItem.swift +// Persephone +// +// Created by Daniel Barber on 2019/6/28. +// Copyright © 2019 Dan Barber. All rights reserved. +// + +import AppKit + +extension NSPasteboardItem { + convenience init(draggedSong: DraggedSong, ofType type: NSPasteboard.PasteboardType) { + self.init() + self.setDraggedSong(draggedSong, forType: type) + } + + func setDraggedSong(_ draggedSong: DraggedSong, forType type: NSPasteboard.PasteboardType) { + let data = try! PropertyListEncoder().encode(draggedSong) + + setData(data, forType: type) + } + + func draggedSong(forType type: NSPasteboard.PasteboardType) -> DraggedSong? { + guard let itemData = data(forType: type) + else { return nil } + + return try? PropertyListDecoder().decode(DraggedSong.self, from: itemData) + } +}